diff options
author | George Williams <gww@silcom.com> | 2002-03-01 08:06:33 +0000 |
---|---|---|
committer | George Williams <gww@silcom.com> | 2002-03-01 08:06:33 +0000 |
commit | 58fd65191ad0ccec6f1b02443ab5ccc3eefdee19 (patch) | |
tree | 62396fb961481a082d1347ff9c7febbdbad422c4 | |
parent | ab91f319ed6c18c05d640d3c4498b37144ac1ca4 (diff) |
fondu will now read mac resource forks on mac OS/X
-rw-r--r-- | fondu.c | 44 | ||||
-rw-r--r-- | showfond.c | 45 |
2 files changed, 88 insertions, 1 deletions
@@ -699,6 +699,45 @@ return( false ); return( true ); } +#ifdef __Mac +#include "MacFiles.h" + +static int HasResourceFork(char *filename) { + /* If we're on a mac, we can try to see if we've got a real resource fork */ + FSRef ref; + FSSpec spec; + short res; + int cnt, ret; + FILE *temp; + char *buf; + + if ( FSPathMakeRef( (unsigned char *) filename,&ref,NULL)!=noErr ) +return( 0 ); + if ( FSGetCatalogInfo(&ref,0,NULL,NULL,&spec,NULL)!=noErr ) +return( 0 ); + if ( FSpOpenRF(&spec,fsRdPerm,&res)!=noErr ) +return( 0 ); + temp = tmpfile(); + buf = malloc(8192); + while ( 1 ) { + cnt = 8192; + ret = FSRead(res,&cnt,buf); + if ( cnt!=0 ) + fwrite(buf,1,cnt,temp); + if ( ret==eofErr ) + break; + if ( ret!=noErr ) + break; + } + free(buf); + FSClose(res); + rewind(temp); + ret = IsResourceFork(temp,0); + fclose(temp); +return( ret ); +} +#endif + static int IsResourceInBinary(FILE *f) { unsigned char header[128]; unsigned long offset; @@ -800,7 +839,6 @@ return( false ); ret = IsResourceFork(binary,ftell(binary)+dlen+2); - rewind(binary); fclose(binary); return( ret ); } @@ -832,6 +870,10 @@ return( true ); ret = IsResourceFork(f,0); fclose(f); +#ifdef __Mac + if ( !ret ) + ret = HasResourceFork(filename); +#endif return( ret ); } @@ -507,6 +507,47 @@ return( false ); return( true ); } +#ifdef __Mac +#include "MacFiles.h" + +static int HasResourceFork(char *filename) { + /* If we're on a mac, we can try to see if we've got a real resource fork */ + Str255 p_file; + FSSpec spec; + short res; + int cnt, ret; + FILE *temp; + char *buf; + + if ( strlen( filename )>255 ) +return( 0 ); + p_file[0] = strlen(filename); + strncpy((char *) p_file+1,filename,strlen(filename)); + if ( FSMakeFSSpec(0,0,p_file,&spec)!=noErr ) +return( 0 ); + if ( FSpOpenRF(&spec,fsRdPerm,&res)!=noErr ) +return( 0 ); + temp = tmpfile(); + buf = malloc(8192); + while ( 1 ) { + cnt = 8192; + ret = FSRead(res,&cnt,buf); + if ( cnt!=0 ) + fwrite(buf,1,cnt,temp); + if ( ret==eofErr ) + break; + if ( ret!=noErr ) + break; + } + free(buf); + FSClose(res); + rewind(temp); + ret = IsResourceFork(temp,0); + fclose(temp); +return( ret ); +} +#endif + static int IsResourceInBinary(FILE *f) { unsigned char header[128]; unsigned long offset; @@ -638,6 +679,10 @@ return( true ); ret = IsResourceFork(f,0); fclose(f); +#ifdef __Mac + if ( !ret ) + ret = HasResourceFork(filename); +#endif return( ret ); } |