void process(FILE *f,long namepos,unsigned long datapos) { byte name[1040]; byte namelen; static int count=0; FILE *out; int i; unsigned long len; if(namepos==-1) sprintf(name,"%s%d.data",thename,count++); else { myseek(f,namepos); namelen=getbyte(f); if((int)fread(name,1,namelen,f)!=(int)namelen) err("Error reading resource name\n"); name[namelen]=0; for(i=0;i<namelen;i++) { if(name[i]>126 || name[i]<32 || name[i]=='\\' || name[i]=='?' || name[i]==':' || name[i]=='/' || name[i]=='%' || name[i]=='<' || name[i]=='>' || name[i]=='*' || name[i]=='"') name[i]='_'; } strcat(name,".data"); } out=myfopen(name,"wb"); printf("Extracting: %s\n",name); myseek(f,datapos); len=getdword(f); while(len--) fputc(myfgetc(f),out); fclose(out); }
int Cstore::adjust_actpoint(long offset) { if(actpoint()==offset) return 0; if(maxlen<offset) return -2; if(myseek(offset)!=offset) return -2; return 1; }
main(int argc, char **argv) { int i; char name[1024]; char rsrc[5]="NFNT"; char s[5]; char *p; unsigned short n; int rsrconly=0; FILE *in,*out; unsigned long dforklen,rforklen,pos; if(argc!=2 && argc!=3) err("getmacfont filename [RSRC]\n" " This extracts all the bitmapped font (NFNT) resources\n" " from the specified MacBinary encoded file.\n" " You can also use it to extract any other type of resource\n" " by supplying the resource type on the commandline,\n" " for instance: getmacfont input.bin FOND.\n" " Each resource found gets saved into a separate file with\n" " filename ending in .data.\n"); strcpy(name,argv[1]); if(strlen(argv[1])>5 && !strcmp(argv[1]+strlen(argv[1])-5,".rsrc")) rsrconly=1; if(argc==3) { if(strlen(argv[2])!=4) err("Resource name should be four characters.\n"); strcpy(rsrc,argv[2]); } in=myfopen(name,"rb"); strcpy(thename,name); if((p=strrchr(thename,'.'))!=NULL) *p=0; if(!rsrconly) { myseek(in,83); dforklen=getdword(in); rforklen=getdword(in); printf("Data fork length = %lu\n" "Resource fork length = %lu\n", dforklen,rforklen); myseek(in,rforkpos=128+dforklen); } else { rforkpos=0; } rdatapos=rforkpos+getdword(in); rmappos=rforkpos+getdword(in); rdatalen=getdword(in); rmaplen=getdword(in); myseek(in,rmappos+16+4+2+2); /* printf("%lx\n",rmappos); */ rtypepos=rmappos+getword(in); /* printf("%lx\n",rtypepos); */ rnamepos=rmappos+getword(in); /* printf("%lx\n",rnamepos); */ myseek(in,rtypepos); numtypes=getword(in)+1; for(i=0;i<numtypes;i++) { read4bytes(in,s); if(!strcmp(rsrc,s)) break; getword(in); getword(in); } if(i==numtypes) err("Cannot find resources of type %s.\n",rsrc); myresnum=1+getword(in); myreflistpos=rtypepos+getword(in); myseek(in,myreflistpos); for(i=0;i<(int)myresnum;i++) { getword(in); /* Resource ID */ mynamepos=rnamepos+(n=getword(in)); getbyte(in); /* Resource attributes */ mydatapos=rdatapos+get3bytes(in); getdword(in); pos=ftell(in); process(in,n==65535?-1:mynamepos,mydatapos); myseek(in,pos); } fclose(in); return 0; }