Example #1
0
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);
}
Example #2
0
int Cstore::adjust_actpoint(long offset)
{
  if(actpoint()==offset) return 0;
  if(maxlen<offset) return -2;
  if(myseek(offset)!=offset) return -2;
  return 1;
}
Example #3
0
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;
}