home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1993 SPDsoft
- *
- */
-
- #include "ThePrefs.h"
- #include "MacErrors.h"
-
- #include <string.h>
- #include <stdio.h>
- #include <ctype.h>
-
- #include "tailor.h"
-
- #define EMPTY_STR "\0 "
-
- long GvRefNum;
-
- typedef struct {
- OSType Type;
- OSType Creator;
- short Binary;
- short BinHex;
- char Suffix[32];
- #ifdef GET_DESC
- char Description[256]; /* useless for me */
- #endif
- Boolean Found;
- } TSufMap;
-
- TSufMap SufMap;
-
-
- extern int gzip_main (int argc, char **argv);
- int AsciiMode(char *name, int ascii, int compress);
- void FixMacFile( char* name, int ascii, int decompress);
-
-
- OSErr DoOpen( Str255 fName, long vRefNum)
- {
- int argc;
- char *argv[5]={"gzip",EMPTY_STR,NULL,NULL,NULL};
-
- char sTemp[256], *c;
- int result;
- Boolean Compress;
- extern Boolean modKey;
-
- ParamBlockRec myParamBlock;
- FInfo vFInfo;
- extern char *get_suffix(char *name);
- extern char z_suffix[MAX_SUFFIX+1]; /* default suffix (can be set with --suffix) */
- extern int z_len; /* strlen(z_suffix) */
-
- strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix)-1);
- if ( *currPrefs.suffix != 0x00 )
- sprintf(z_suffix,"%#s",(char*)currPrefs.suffix);
-
- z_len = strlen(z_suffix);
-
-
-
- GvRefNum=vRefNum;
-
- /*********** ResFork ***************/
-
- myParamBlock.fileParam.ioCompletion=NULL;
- myParamBlock.fileParam.ioNamePtr=fName;
- myParamBlock.fileParam.ioVRefNum=vRefNum;
- myParamBlock.fileParam.ioFRefNum=0;
- myParamBlock.fileParam.ioFDirIndex=0 ;
-
- sprintf(sTemp,"Discard Resource Fork: %#s?",fName);
-
- PBGetFInfo( &myParamBlock, false );
- if ( myParamBlock.fileParam.ioFlRLgLen != 0 )
- {
- if ( Cask( sTemp ) == cancel )
- return(128);
- }
-
- if((currPrefs.StKeysAlt)&&(modKey))
- {
- Compress = true;
- }
- else
- {
- switch(currPrefs.WhenCompress)
- {
- case NonMacGzip:
- GetFInfo(fName,GvRefNum,&vFInfo);
-
- Compress = (vFInfo.fdType != 'Gzip') && (vFInfo.fdType != 'ZIVU') &&
- (vFInfo.fdType != 'pZIP');
-
-
-
- if (Compress) /* check suffixes */
- {
- sprintf(sTemp,"%#s",fName);
-
- c=get_suffix(sTemp);
-
- if ( c == NULL )
- {
- Compress = true;
- }
- else
- {
- Compress = (*c == 0x00);
- }
- }
- break;
-
- case G_UseMenu:
-
- Compress = currPrefs.compress;
- break;
- }
- }
-
-
- /*********** args ***************/
- argc=1;
-
- /*********** 1st arg ***************/
-
- strcpy(argv[argc],"-N");
-
- if (!Compress) /* gunzip */
- {
- strcat(argv[argc], "d" );
-
- /* when decompress, asci is set in create_outfile */
- }
- else /* gzip */
- {
- sprintf(argv[argc],"-%d",currPrefs.level ); /* # */
- if( AsciiMode((char *)fName, currPrefs.ascii, currPrefs.compress))
- strcat(argv[argc],"a"); /* ascii */
-
- }
-
-
- if(currPrefs.force)
- strcat(argv[argc],"f"); /* force */
-
- argc++;
-
- /*********** 2nd arg ?**************/
-
- if ( *currPrefs.suffix != 0x00 )
- {
- sprintf((char*)sTemp,"-S%#s",(char*)currPrefs.suffix);
- argv[argc]=(char*)sTemp;
- argc++;
- }
-
- /*********** next arg ***************/
-
- PtoCstr(fName);
- argv[argc]=(char*)fName;
- argv[++argc]=NULL;
-
- /*********** do it ***************/
-
- SetVol( nil, vRefNum);
-
- result = gzip_main ( argc, argv );
-
- /*********** creator & other ***************/
-
- CtoPstr(fName);
-
- return( result );
-
- }
-
-
- void FixMacFile( char* name, int ascii, int decompress)
- /*
- * when using fetch prefs, this should be called after
- * AsciiMode
- */
-
- {
- FInfo vFInfo;
-
- CtoPstr(name);
- GetFInfo(name,GvRefNum,&vFInfo);
-
-
- if ( decompress)
- {
- if ( SufMap.Found )
- {
- vFInfo.fdCreator = SufMap.Creator;
- vFInfo.fdType = SufMap.Type;
- }
- else
- {
- if(ascii)
- {
- /* This is a very dirty hack to avoid odd address error in 68000 */
-
- vFInfo.fdType='TEXT';
- PtoCstr(currPrefs.textcreator);
- vFInfo.fdCreator=*(OSType*)(currPrefs.textcreator);
- CtoPstr(currPrefs.textcreator);
- }
- else
- {
- PtoCstr(currPrefs.bincreator);
- vFInfo.fdCreator=*(OSType*)(currPrefs.bincreator);
- CtoPstr(currPrefs.bincreator);
- PtoCstr(currPrefs.bintype);
- vFInfo.fdType=*(OSType*)(currPrefs.bintype);
- CtoPstr(currPrefs.bintype);
- }
- }
- }
- else
- {
- vFInfo.fdType='Gzip';
- vFInfo.fdCreator='Gzip';
- }
-
- SetFInfo(name,GvRefNum,&vFInfo);
- PtoCstr(name);
- }
-
- int AsciiMode(char *name, int ascii, int compress)
- {
-
- FInfo vFInfo;
- int result, len;
-
- Ptr pPrefs;
- char *p, *n;
-
- extern char charKey;
- extern Handle FPrefs;
- extern Size FPrefsSize;
-
-
- if(compress) /* name is Pascal string */
- {
- if((currPrefs.StKeysComp)&&(charKey!=0x00))
- {
- result = (charKey == 'a');
- }
- else
- {
- switch(currPrefs.AsciiCompress)
- {
- case OnlyText:
- GetFInfo(name,GvRefNum,&vFInfo);
- result = (vFInfo.fdType == 'TEXT');
- break;
-
- case Never:
- result = 0;
- break;
-
- case UseMenu:
- result = currPrefs.ascii;
- break;
-
- default:
- break;
-
- }
- }
- }
- else /* OJO *//* name is C string */
- {
- SufMap.Found = false;
-
- if((currPrefs.StKeysComp)&&(charKey!=0x00))
- {
- result = (charKey == 'a');
- }
- else
- {
- switch(currPrefs.AsciiUnCompress)
- {
- case Fetch:
-
- HLock( FPrefs );
- pPrefs = *FPrefs;
-
-
-
- while( pPrefs < *FPrefs+FPrefsSize )
- {
- SufMap.Type = *(OSType *)pPrefs; pPrefs += 4;
- SufMap.Creator = *(OSType *)pPrefs; pPrefs += 4;
- SufMap.Binary = (*(short *)pPrefs != 0); pPrefs += 2;
- SufMap.BinHex = (*(short *)pPrefs != 0); pPrefs += 2;
-
- p = SufMap.Suffix;
- while((*p++ = *(char *)(pPrefs++))!=0)
- ;
-
- #ifdef GET_DESC
- p = SufMap.Description;
- while((*p++= *(char *)(pPrefs++))!=0)
- ;
- #else
- while(*(char *)(pPrefs++)!=0)
- ;
- #endif
- len = strlen(SufMap.Suffix);
-
- for( p = SufMap.Suffix, n = name + strlen(name) - len;
- (tolower(*p) == tolower(*n)) && (p<SufMap.Suffix+len);
- p++, n++)
- ;
-
- if ( n == name + strlen(name) )
- {
- SufMap.Found = true;
- break;
- }
- }
-
- HUnlock( FPrefs );
-
- if(SufMap.Found)
- {
- result = !SufMap.Binary;
- }
- else
- {
- result = 0;
- }
-
- break;
-
- case Never:
- result = 0;
- break;
-
- case UseMenu:
- result = currPrefs.ascii;
- break;
-
- default:
- break;
- }
- }
- }
-
- return (result);
- }
-