123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- /*
- Copyright (c) 1990-2001 Info-ZIP. All rights reserved.
- See the accompanying file LICENSE, version 2000-Apr-09 or later
- (the contents of which are also included in zip.h) for terms of use.
- If, for some reason, all these files are missing, the Info-ZIP license
- also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
- */
- /*---------------------------------------------------------------------------
- helpers.c
- Some useful functions Used by unzip and zip.
- ---------------------------------------------------------------------------*/
- /*****************************************************************************/
- /* Includes */
- /*****************************************************************************/
- #include "zip.h"
- #include <ctype.h>
- #include <time.h>
- #include <sound.h>
- #include "macstuff.h"
- #include "helpers.h"
- #include "pathname.h"
- /*****************************************************************************/
- /* Global Vars */
- /*****************************************************************************/
- extern int noisy;
- extern char MacPathEnd;
- extern char *zipfile; /* filename of the Zipfile */
- extern char *tempzip; /* Temporary zip file name */
- extern ZCONST unsigned char MacRoman_to_WinCP1252[128];
- static char argStr[1024];
- static char *argv[MAX_ARGS + 1];
- /*****************************************************************************/
- /* Functions */
- /*****************************************************************************/
- /*
- ** Copy a C string to a Pascal string
- **
- */
- unsigned char *CToPCpy(unsigned char *pstr, char *cstr)
- {
- register char *dptr;
- register unsigned len;
- len=0;
- dptr=(char *)pstr+1;
- while (len<255 && (*dptr++ = *cstr++)!='\0') ++len;
- *pstr= (unsigned char)len;
- return pstr;
- }
- /*
- ** Copy a Pascal string to a C string
- **
- */
- char *PToCCpy(unsigned char *pstr, char *cstr)
- {
- strncpy(cstr, (char *) &pstr[1], *pstr);
- cstr[pstr[0]] = '\0'; /* set endmarker for c-string */
- return cstr;
- }
- /*
- ** strcpy() and strcat() work-alikes which allow overlapping buffers.
- */
- char *sstrcpy(char *to,const char *from)
- {
- memmove(to, from, 1+strlen(from));
- return to;
- }
- char *sstrcat(char *to,const char *from)
- {
- sstrcpy(to + strlen(to), from);
- return to;
- }
- /*
- ** Alloc memory and init it
- **
- */
- char *StrCalloc(unsigned short size)
- {
- char *strPtr = NULL;
- if ((strPtr = calloc(size, sizeof(char))) == NULL)
- printerr("StrCalloc failed:", -1, size, __LINE__, __FILE__, "");
- Assert_it(strPtr,"strPtr == NULL","")
- return strPtr;
- }
- /*
- ** Release only non NULL pointers
- **
- */
- char *StrFree(char *strPtr)
- {
- if (strPtr != NULL)
- {
- free(strPtr);
- }
- return NULL;
- }
- /*
- ** Return a value in a binary string
- **
- */
- char *sBit2Str(unsigned short value)
- {
- static char str[sizeof(value)*8];
- int biz = 16;
- int strwid = 16;
- int i, j;
- char *tempPtr = str;
- j = strwid - (biz + (biz >> 2)- (biz % 4 ? 0 : 1));
- for (i = 0; i < j; i++) {
- *tempPtr++ = ' ';
- }
- while (--biz >= 0)
- {
- *tempPtr++ = ((value >> biz) & 1) + '0';
- if (!(biz % 4) && biz) {
- *tempPtr++ = ' ';
- }
- }
- *tempPtr = '\0';
- return str;
- }
- /*
- ** Parse commandline style arguments
- **
- */
- int ParseArguments(char *s, char ***arg)
- {
- int n = 1, Quote = 0;
- char *p = s, *p1, c;
- argv[0] = GetAppName();
- *arg = argv;
- p1 = (char *) argStr;
- while ((c = *p++) != 0) {
- if (c==' ') continue;
- argv[n++] = p1;
- if (n > MAX_ARGS)
- return (n-1);
- do {
- if (c=='\\' && *p++)
- c = *p++;
- else
- if ((c=='"') || (c == '\'')) {
- if (!Quote) {
- Quote = c;
- continue;
- }
- if (c == Quote) {
- Quote = 0;
- continue;
- }
- }
- *p1++ = c;
- } while (*p && ((c = *p++) != ' ' || Quote));
- *p1++ = '\0';
- }
- return n;
- }
- /*
- ** Print commandline style arguments
- **
- */
- void PrintArguments(int argc, char **argv)
- {
- printf("\n Arguments:");
- printf("\n --------------------------");
- while(--argc >= 0)
- printf("\n argc: %d argv: [%s]", argc, &*argv[argc]);
- printf("\n --------------------------\n\n");
- return;
- }
- /*
- ** return some error-msg on file-system
- **
- */
- int PrintUserHFSerr(int cond, int err, char *msg2)
- {
- char *msg;
- if (cond != 0)
- {
- switch (err)
- {
- case -35:
- msg = "No such Volume";
- break;
- case -56:
- msg = "No such Drive";
- break;
- case -37:
- msg = "Bad Volume Name";
- break;
- case -49:
- msg = "File is already open for writing";
- break;
- case -43:
- msg = "Directory/File not found";
- break;
- case -120:
- msg = "Directory/File not found or incomplete pathname";
- break;
- default: return err;
- }
- fprintf(stderr, "\n\n Error: %s ->%s", msg, msg2);
- exit(err);
- }
- return 0;
- }
- /*
- ** Check mounted volumes and return number of volumes
- ** with the same name.
- */
- short CheckMountedVolumes(char *FullPath)
- {
- FSSpec volumes[50]; /* 50 Volumes should be enough */
- char VolumeName[257], volume[257];
- short actVolCount, volIndex = 1, VolCount = 0;
- OSErr err;
- int i;
- GetVolumeFromPath(FullPath, VolumeName);
- err = OnLine(volumes, 50, &actVolCount, &volIndex);
- printerr("OnLine:", (err != -35) && (err != 0), err, __LINE__, __FILE__, "");
- for (i=0; i < actVolCount; i++)
- {
- PToCCpy(volumes[i].name,volume);
- if (stricmp(volume, VolumeName) == 0) VolCount++;
- }
- printerr("OnLine: ", (VolCount == 0), VolCount, __LINE__, __FILE__, FullPath);
- return VolCount;
- }
- /*
- ** compares strings, ignoring differences in case
- **
- */
- int stricmp(const char *p1, const char *p2)
- {
- int diff;
- while (*p1 && *p2)
- {
- if (*p1 != *p2)
- {
- if (isalpha(*p1) && isalpha(*p2))
- {
- diff = toupper(*p1) - toupper(*p2);
- if (diff) return diff;
- }
- else break;
- }
- p1++;
- p2++;
- }
- return *p1 - *p2;
- }
- /*
- ** Convert the MacOS-Strings (Filenames/Findercomments) to a most compatible.
- ** These strings will be stored in the public area of the zip-archive.
- ** Every foreign platform (outside macos) will access these strings
- ** for extraction.
- */
- void MakeCompatibleString(char *MacOS_Str,
- const char SpcChar1, const char SpcChar2,
- const char SpcChar3, const char SpcChar4,
- short CurrTextEncodingBase)
- {
- char *tmpPtr;
- register uch curch;
- Assert_it(MacOS_Str,"MakeCompatibleString MacOS_Str == NULL","")
- for (tmpPtr = MacOS_Str; (curch = *tmpPtr) != '\0'; tmpPtr++)
- {
- if (curch == SpcChar1)
- *tmpPtr = SpcChar2;
- else
- if (curch == SpcChar3)
- *tmpPtr = SpcChar4;
- else /* default */
- /* now convert from MacRoman to ISO-8859-1 */
- /* but convert only if MacRoman is activ */
- if ((CurrTextEncodingBase == kTextEncodingMacRoman) &&
- (curch > 127))
- {
- *tmpPtr = (char)MacRoman_to_WinCP1252[curch - 128];
- }
- } /* end for */
- }
- Boolean CheckForSwitch(char *Switch, int argc, char **argv)
- {
- char *p; /* steps through option arguments */
- int i; /* arg counter, root directory flag */
- for (i = 1; i < argc; i++)
- {
- if (argv[i][0] == '-')
- {
- if (argv[i][1])
- {
- for (p = argv[i]+1; *p; p++)
- {
- if (*p == Switch[0])
- {
- return true;
- }
- if ((Switch[1] != NULL) &&
- ((*p == Switch[0]) && (*p == Switch[1])))
- {
- return true;
- }
- }
- }
- }
- }
- return false;
- }
- #if (defined(USE_SIOUX) || defined(MACUNZIP_STANDALONE))
- /*
- ** checks the condition and returns an error-msg
- ** this function is for internal use only
- */
- OSErr printerr(const char *msg, int cond, int err, int line, char *file,
- const char *msg2)
- {
- if (cond != 0)
- {
- fprintf(stderr, "\nint err: %d: %s %d [%d/%s] {%s}\n", clock(), msg, err,
- line, file, msg2);
- }
- return cond;
- }
- /*
- fake-functions:
- Not Implemented for metrowerks SIOUX
- */
- void leftStatusString(char *status)
- {
- status = status;
- }
- void rightStatusString(char *status)
- {
- status = status;
- }
- void DoWarnUserDupVol( char *FullPath )
- {
- char VolName[257];
- GetVolumeFromPath(FullPath, VolName);
- printf("\n There are more than one volume that has the same name !!\n");
- printf("\n Volume: %s\n",VolName);
- printf("\n This port has one weak point:");
- printf("\n It is based on pathnames. As you may be already know:");
- printf("\n Pathnames are not unique on a Mac !");
- printf("\n MacZip has problems to find the correct location of");
- printf("\n the archive or the files.\n");
- printf("\n My (Big) recommendation: Name all your volumes with an");
- printf("\n unique name and MacZip will run without any problem.");
- }
- #endif
|