This is unixfasl-hp800.c in view mode; [Download] [Up]
/* round up i to be a multiple of (n) */ #define ROUND_UP(i,n) ((((int) (i) + n-1)/(n)) *(n)) #define MAXPATHLEN 512 int init_address = 0; #ifdef HPUX_SOM #include <a.out.h> #define GET_HEADERS(fp) \ struct header hdr; \ struct som_exec_auxhdr somhdr; \ if (sizeof(hdr) !=fread(&hdr,1,sizeof(hdr),fp)) \ {FEerror("could not read header");} \ if (hdr.aux_header_size) \ {fseek(fp,hdr.aux_header_location,0); \ if (sizeof(somhdr) != fread(&somhdr,1,sizeof(somhdr),fp)) \ {FEerror("could not read header");}} \ else { somhdr.exec_tsize=0;somhdr.exec_dsize=0;somhdr.exec_bsize=0;} #define SET_TOTAL_SPACE(total,fp) \ total= ROUND_UP(somhdr.exec_tsize,sizeof(double)) \ + somhdr.exec_dsize + somhdr.exec_bsize;\ #define READ_FASL_TO_MEMORY(memory,fp) \ do{ char *p = memory->cfd.cfd_start; \ init_address = ((char *)somhdr.exec_entry - p); \ if (init_address > 1000) printf("entry is offset at %x(%d)",init_address); \ fseek(fp,somhdr.exec_tfile,0) ; \ fread(p,1,somhdr.exec_tsize,fp); \ fseek(fp,somhdr.exec_dfile,0) ; \ if ((int)(p + *data_off) != somhdr.exec_dmem) \ FEerror("bad data offset");\ fread(p+ *data_off,1, \ somhdr.exec_dsize,fp); \ }while(0) #define TXT_ALIGN 4096 #undef BSD #endif #ifdef BSD #include <a.out.h> #define GET_HEADERS(fp) \ struct exec hdr; fseek(fp,0,0);\ fread(&hdr,1,sizeof(hdr),fp); \ #define SET_TOTAL_SPACE(total,fp) \ total = hdr.a_txtsize + hdr.a_datasize + header.a_bss; #define READ_FASL_TO_MEMORY(memory,fp) \ fseek(fp,sizeof(struct header) ,0); \ fread(memory->cfd.cfd_start,1,memory->cfd.cfd_size,fp); \ #endif read_text_and_data(memory,fp,data_off) object memory; FILE *fp; int *data_off; { int total; GET_HEADERS(fp); SET_TOTAL_SPACE(total,fp); *data_off = ROUND_UP(somhdr.exec_tsize,sizeof(double)); if (total > memory->cfd.cfd_size) { memory->cfd.cfd_size = total; return 0;} READ_FASL_TO_MEMORY(memory,fp); return 1; } #ifndef TXT_ALIGN #define TXT_ALIGN sizeof(double) #endif static fasload_help(faslfile,lib_string) object faslfile; char *lib_string; { char filename[MAXPATHLEN],tmpfile[MAXPATHLEN]; char command [2*MAXPATHLEN]; int total; object memory ; FILE *fp; faslfile = open_stream(faslfile, smm_input, Cnil, Kerror); fp = faslfile->sm.sm_fp; { int data_off = 0; GET_HEADERS(fp); SET_TOTAL_SPACE(total,fp); memory=alloc_object(t_cfdata); memory->cfd.cfd_self = 0; memory->cfd.cfd_start = 0; memory->cfd.cfd_size = total; sprintf(tmpfile,"/tmp/fasl%d",getpid()); AGAIN: memory->cfd.cfd_start = ALLOC_ALIGNED(alloc_contblock, memory->cfd.cfd_size,TXT_ALIGN); coerce_to_filename(faslfile, filename); LD_COMMAND(command, kcl_self, memory->cfd.cfd_start, filename, (lib_string ? lib_string : " "), tmpfile); if (system(command) != 0) { FEerror("The linkage editor failed.", 0);} if(symbol_value(Vload_verbose)==Vload_verbose) { printf("%s\n",command); fflush(stdout);} {FILE *fp1 = fopen(tmpfile,"r"); if (fp1==0) {FEerror("Couldn't open tmpfile");} if(read_text_and_data(memory,fp1,&data_off) ==0) {fclose(fp1); goto AGAIN;} fclose(fp1); }} unlink(tmpfile); SEEK_TO_END_OFILE(fp); call_init(init_address,memory,read_fasl_vector(faslfile)); close_stream (faslfile,TRUE); if(symbol_value(Vload_verbose)!=Cnil) printf("start address -T %x ",memory->cfd.cfd_start); return(memory->cfd.cfd_size); } fasload(faslfile) object faslfile; {return fasload_help(faslfile,0);} #define FASLINK siLfaslink() { object *base = vs_base; check_arg(2); vs_base[0] = make_fixnum(fasload_help(base[0],object_to_string(base[1]))); printf("done link"); fflush(stdout); vs_top = vs_base+1; return ; } int faslink(faslfile, ldargstring) object faslfile, ldargstring; {printf("later");}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.