getenv.c
资源名称:unzip540.zip [点击查看]
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:9k
源码类别:
压缩解压
开发平台:
MultiPlatform
- /*
- 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[1024];
- 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 = ' ';
- }
- 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("nnList of all environment variablesn");
- getenv(" ");
- printf("nnEndnn");
- /* restore used variables */
- ListAllKeyValues = 0;
- LineNumber = 0;
- IgnoreEnvironment = tmpIgnoreEnvironment;
- }