static void expand_heap(UINT new_size, heap *aheap) { UINT i; if (new_size <= aheap->end - aheap->start) return; ASSERT_ALIGN(new_size); if (aheap->start + new_size > aheap->memend) return; for (i = aheap->end - aheap->start; i < new_size; i += FRAME_SIZE) make_page(aheap->start + i, aheap->pageflags, kernel_directory, 1); aheap->end = aheap->start + new_size; }
void n_addrec (NDX *n, char *r, unsigned long index_num) { unsigned char i, num; char *rs; int cmp, top; unsigned long page_index; bool changed[64], header_changed; NDX_NODE* key; key=(NDX_NODE*)malloc(8+n->key_length); rs=(char*)malloc(n->key_length); strscpy(rs,r,n->key_length); memset(changed,0,sizeof(changed)); header_changed=false; page_index=n->root_page; top=-1; while (page_index) { get_page(n,page_index,++top); if (pages[top].keys[0]->index) break; for (i=0;i<pages[top].key_num;i++) { cmp=memcmp(rs,pages[top].keys[i]->key_data,n->key_length); if ((cmp<0) || (cmp==0 && index_num<pages[top].keys[i]->index)) { page_index=pages[top].keys[i]->left_page; break; } } if (i==pages[top].key_num) { memcpy(pages[top].keys[--i],rs,n->key_length); changed[i]=true; page_index=pages[top].keys[--i]->left_page; } } key=make_node(n,0,index_num,rs); addrec(n,num=top,key); changed[top]=true; while (pages[num].key_num>n->max_keys && num>1) { spilt_page(n,num,++top); header_changed=true; addrec(n,num-1,get_last(n,num)); changed[num]=changed[top]=true; } if (pages[num].key_num>n->max_keys) { spilt_page(n,num,++top); header_changed=true; changed[num]=changed[top]=true; make_page(n,num,top,top+1); top++; changed[top]=true; } for (i=0;i<=top;i++) { if (changed[i]) put_page(n,i); dispose_page(i); } if (header_changed) write_total(n); }
int elf_load_segment(char *image, elf32_phdr* seg) { /*FIXME: By know I don't know how to cope p_vaddr AND p_align, So I ignore the latter and also p_flags which are only for ONE FRAME */ UINT i,size=seg->p_filesz; for (i=ALIGN_DOWN(seg->p_vaddr);i<seg->p_vaddr+seg->p_memsz;i+=FRAME_SIZE) make_page(i,PAGE_FLAG_PRESENT | PAGE_FLAG_WRITE | PAGE_FLAG_USERMODE,current_task->directory,1); flush_tlb(); //TODO: If make_page() fails we need a "not enough core" if (size>seg->p_memsz) size=seg->p_memsz; memcpy((void *)seg->p_vaddr,(void *)((UINT)image+seg->p_offset),size); if (seg->p_filesz<size) memset((void *)((UINT)image+seg->p_offset+seg->p_filesz),0,size-seg->p_filesz); return 0; }
main(int argc, char *argv[]) { int fd; use_lod2 = 0; // use_lod2 = 1; img_filename = strdup("disk.img"); mcr_filename = strdup("ucadr.mcr.841"); lod1_filename = strdup("partition-78.48.lod1"); lod2_filename = strdup("partition-sys210.lod2"); #if 0 mcr_filename = strdup("ucadr.mcr.979"); #endif #if 0 use_lod2 = 1; mcr_filename = strdup("ucadr.mcr.979"); lod1_filename = strdup("partition-sys210.lod2"); #endif #if 0 use_lod2 = 1; mcr_filename = strdup("ucadr.mcr.896"); lod1_filename = strdup("partition-sys210.lod2"); #endif fd = open(img_filename, O_RDWR | O_CREAT, 0666); if (fd < 0) { perror(img_filename); exit(1); } make_labl(fd); make_mcr1(fd); make_page(fd); make_lod1(fd); if (use_lod2) { make_lod2(fd); } make_file(fd); exit(0); }
/* * Parameters: <hundred_dpi> <basename_> <titlestring> <bottom_html_code> * <pageoffset> [first page number] */ int main(int argc, char **argv) { int a,z; if (argc<7){ fprintf(stderr,"Usage: pbm2png <hundred_dpi> <basename_> <titlestring> <bottom_html_code> <pageoffset> <ifname> [starting_filenumber]\n"); return 0; } dpi=atof(argv[1])/10; ppm=dpi*1000/25.4; basename_=argv[2]; titlestring=argv[3]; bottom=argv[4]; pageoffset=atol(argv[5]); filename=argv[6]; again0: ifd=open(filename,O_RDONLY); if (ifd<0){ if (errno==EAGAIN||errno==EINTR||errno==EWOULDBLOCK) goto again0; else { perror(""); exit(1); } } fprintf(stderr,"filename %s, %d\n",filename,ifd); if (argc>=8){ filenumber=atol(argv[7]); } gentables(); again: fprintf(stderr,"\nFile %i\n",filenumber); if (read_header()){ for (a=0;a<filenumber;a++) make_page(a); make_index(); return 0; } lw=(x+15)>>4; lb=(x+7)>>3; ox=x/17; oy=y/15; fprintf(stderr,"Input: %i*%i pixels, %f*%f dpi, %.1fMB.\n",x,y,dpi*17,dpi*15,(float)lb*y/1048576); fprintf(stderr,"Ouput: %i*%i pixels, %f*%f dpi, %.1fKB raw data.\n",ox,oy,dpi,dpi,(float)ox*oy/1024); l1=(unsigned char*)malloc(lw*2); l2=(unsigned long*)malloc(lw*sizeof(unsigned long)); l4=(unsigned long long*)malloc(lw*sizeof(unsigned long long)); sprintf(string,"%s%d.png",basename_,filenumber); filenumber++; of=fopen(string,"w"); open_png(); for (z=oy;z;z--){ if (!(z&15)){ fprintf(stderr,"."); fflush(stderr); } load_to_4(); export_from_4(); } close_png(); fprintf(stderr,"\nWritten %lu bytes of data, ratio %.1f%%\n",ftell(of),(float)ftell(of)*100/ox/oy); fclose(of); for (a=y%15;a;a--) load(); free(l1); free(l2); free(l4); goto again; }