123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- /*
- Copyright (c) 1990-2000 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
- */
- /*
- This file implements the getenv() function.
- # Background:
- # Under Unix: Each Process (= running Program) has a set of
- # associated variables. The variables are called enviroment
- # variables and, together, constitute the process environment.
- # These variables include the search path, the terminal type,
- # and the user's login name.
- # Unfortunatelly the MacOS has no equivalent. So we need
- # a file to define the environment variables.
- # Name of this file is "MacZip.Env". It can be placed
- # in the current folder of MacZip or in the
- # preference folder of the system disk.
- # If MacZip founds the "MacZip.Env" file in the current
- # the folder of MacZip the "MacZip.Env" file in the
- # preference folder will be ignored.
- # An environment variable has a name and a value:
- # Name=Value
- # Note: Spaces are significant:
- # ZIPOPT=-r and
- # ZIPOPT = -r are different !!!
- */
- /*****************************************************************************/
- /* Includes */
- /*****************************************************************************/
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <time.h>
- #include <unix.h>
- #include <Files.h>
- #include <Folders.h>
- #include "pathname.h"
- #include "helpers.h"
- /*****************************************************************************/
- /* Module level Vars */
- /*****************************************************************************/
- static char ListAllKeyValues = 0;
- static unsigned LineNumber = 0;
- static char CompletePath[NAME_MAX];
- Boolean IgnoreEnvironment = false; /* used by dialog.c and initfunc.c
- of the Mainapp */
- /*****************************************************************************/
- /* Macros, typedefs */
- /*****************************************************************************/
- typedef struct _EnviromentPair {
- char *key;
- char *value;
- } EnviromentPair;
- #define MAX_COMMAND 1024
- /*****************************************************************************/
- /* Prototypes */
- /*****************************************************************************/
- int get_char(FILE *file);
- void unget_char(int ch,FILE *file);
- int get_string(char *string,int size, FILE *file, char *terms);
- void skip_comments(FILE *file);
- char *load_entry(FILE *file);
- char *getenv(const char *name);
- EnviromentPair *ParseLine(char *line);
- OSErr FSpFindFolder_Name(short vRefNum, OSType folderType,
- Boolean createFolder,FSSpec *spec, unsigned char *name);
- FILE * FSp_fopen(ConstFSSpecPtr spec, const char * open_mode);
- void ShowAllKeyValues(void);
- void Set_LineNum(unsigned ln);
- /*****************************************************************************/
- /* Functions */
- /*****************************************************************************/
- /* get_string(str, max, file, termstr) : like fgets() but
- * (1) has terminator string which should include \n
- * (2) will always leave room for the null
- * (3) uses get_char() so LineNumber will be accurate
- * (4) returns EOF or terminating character, whichever
- */
- int get_string(char *string, int size, FILE *file, char *terms)
- {
- int ch;
- while (EOF != (ch = get_char(file)) && !strchr(terms, ch)) {
- if (size > 1) {
- *string++ = (char) ch;
- size--;
- }
- }
- if (size > 0)
- {
- *string = '\0';
- }
- return ch;
- }
- void Set_LineNum(unsigned ln)
- {
- LineNumber = ln;
- }
- /* get_char(file) : like getc() but increment LineNumber on newlines
- */
- int get_char(FILE *file)
- {
- int ch;
- ch = getc(file);
- if (ch == '\n')
- {
- Set_LineNum(LineNumber + 1);
- }
- return ch;
- }
- /* skip_comments(file) : read past comment (if any)
- */
- void skip_comments(FILE *file)
- {
- int ch;
- while (EOF != (ch = get_char(file)))
- {
- /* ch is now the first character of a line.
- */
- while (ch == ' ' || ch == '\t')
- {
- ch = get_char(file);
- }
- if (ch == EOF)
- {
- break;
- }
- /* ch is now the first non-blank character of a line.
- */
- if (ch != '\n' && ch != '#')
- {
- break;
- }
- /* ch must be a newline or comment as first non-blank
- * character on a line.
- */
- while (ch != '\n' && ch != EOF)
- {
- ch = get_char(file);
- }
- /* ch is now the newline of a line which we're going to
- * ignore.
- */
- }
- if (ch != EOF)
- {
- unget_char(ch, file);
- }
- }
- /* unget_char(ch, file) : like ungetc but do LineNumber processing
- */
- void unget_char(int ch, FILE *file)
- {
- ungetc(ch, file);
- if (ch == '\n')
- {
- Set_LineNum(LineNumber - 1);
- }
- }
- /* this function reads one file entry -- the next -- from a file.
- * it skips any leading blank lines, ignores comments, and returns
- * NULL if for any reason the entry can't be read and parsed.
- */
- char *load_entry(FILE *file)
- {
- int ch;
- static char cmd[MAX_COMMAND];
- skip_comments(file);
- ch = get_string(cmd, MAX_COMMAND, file, "\n");
- if (ch == EOF)
- {
- return NULL;
- }
- return cmd;
- }
- EnviromentPair *ParseLine(char *line)
- {
- char *tmpPtr;
- static EnviromentPair *Env;
- unsigned short length = strlen(line);
- Env->key = "";
- Env->value = "";
- for (tmpPtr = line; *tmpPtr; tmpPtr++)
- {
- if (*tmpPtr == '=')
- {
- *tmpPtr = 0;
- Env->key = line;
- if (strlen(Env->key) < length)
- {
- Env->value = ++tmpPtr;
- }
- return Env;
- }
- }
- return Env;
- }
- char *getenv(const char *name)
- {
- FILE *fp;
- char *LineStr = NULL;
- EnviromentPair *Env1;
- FSSpec spec;
- OSErr err;
- if (IgnoreEnvironment)
- return NULL; /* user wants to ignore the environment vars */
- if (name == NULL)
- return NULL;
- GetCompletePath(CompletePath,"MacZip.Env",&spec,&err);
- /* try open the file in the current folder */
- fp = FSp_fopen(&spec,"r");
- if (fp == NULL)
- { /* Okey, lets try open the file in the preference folder */
- FSpFindFolder_Name(
- kOnSystemDisk,
- kPreferencesFolderType,
- kDontCreateFolder,
- &spec,
- "\pMacZip.Env");
- fp = FSp_fopen(&spec,"r");
- if (fp == NULL)
- {
- return NULL; /* there is no enviroment-file */
- }
- }
- LineStr = load_entry(fp);
- while (LineStr != NULL)
- { /* parse the file line by line */
- Env1 = ParseLine(LineStr);
- if (strlen(Env1->value) > 0)
- { /* we found a key/value pair */
- if (ListAllKeyValues)
- printf("\n Line:%3d [%s] = [%s]",LineNumber,Env1->key,Env1->value);
- if (stricmp(name,Env1->key) == 0)
- { /* we found the value of a given key */
- return Env1->value;
- }
- }
- LineStr = load_entry(fp); /* read next line */
- }
- fclose(fp);
- return NULL;
- }
- OSErr FSpFindFolder_Name(
- short vRefNum, /* Volume reference number. */
- OSType folderType, /* Folder type taken by FindFolder. */
- Boolean createFolder, /* Should we create it if non-existant. */
- FSSpec *spec, /* Pointer to resulting directory. */
- unsigned char *name) /* Name of the file in the folder */
- {
- short foundVRefNum;
- long foundDirID;
- OSErr err;
- err = FindFolder(vRefNum, folderType, createFolder,
- &foundVRefNum, &foundDirID);
- if (err != noErr)
- {
- return err;
- }
- err = FSMakeFSSpec(foundVRefNum, foundDirID, name, spec);
- return err;
- }
- void ShowAllKeyValues(void)
- {
- OSErr err;
- FSSpec spec;
- Boolean tmpIgnoreEnvironment = IgnoreEnvironment;
- ListAllKeyValues = 1;
- IgnoreEnvironment = false;
- GetCompletePath(CompletePath,"MacZip.Env",&spec,&err);
- if (err != 0)
- { /* Okey, lets try open the file in the preference folder */
- FSpFindFolder_Name(
- kOnSystemDisk,
- kPreferencesFolderType,
- kDontCreateFolder,
- &spec,
- "\pMacZip.Env");
- GetFullPathFromSpec(CompletePath,&spec, &err);
- if (err != 0)
- {
- return; /* there is no enviroment-file */
- }
- }
- printf("\nLocation of the current \"MacZip.Env\" file:\n [%s]",CompletePath);
- printf("\n\nList of all environment variables\n");
- getenv(" ");
- printf("\n\nEnd\n\n");
- /* restore used variables */
- ListAllKeyValues = 0;
- LineNumber = 0;
- IgnoreEnvironment = tmpIgnoreEnvironment;
- }
|