getenv.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:9k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*
  2. This file implements the getenv() function.
  3. #  Background:
  4. #  Under Unix: Each Process (= running Program) has a set of
  5. #  associated variables. The variables are called enviroment
  6. #  variables and, together, constitute the process environment.
  7. #  These variables include the search path, the terminal type,
  8. #  and the user's login name.
  9. #  Unfortunatelly the MacOS has no equivalent. So we need
  10. #  a file to define the environment variables.
  11. #  Name of this file is "MacZip.Env". It can be placed
  12. #  in the current folder of MacZip or in the
  13. #  preference folder of the system disk.
  14. #  If MacZip founds the "MacZip.Env" file in the current
  15. #  the folder of MacZip the "MacZip.Env" file in the
  16. #  preference folder will be ignored.
  17. #  An environment variable has a name and a value:
  18. #  Name=Value
  19. #  Note: Spaces are significant:
  20. #  ZIPOPT=-r  and
  21. #  ZIPOPT = -r are different !!!
  22.  */
  23. /*****************************************************************************/
  24. /*  Includes                                                                 */
  25. /*****************************************************************************/
  26. #include <stdio.h>
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include <time.h>
  30. #include <unix.h>
  31. #include <Files.h>
  32. #include <Folders.h>
  33. #include "pathname.h"
  34. #include "helpers.h"
  35. /*****************************************************************************/
  36. /*  Module level Vars                                                        */
  37. /*****************************************************************************/
  38. static char ListAllKeyValues = 0;
  39. static unsigned LineNumber   = 0;
  40. static char CompletePath[1024];
  41. Boolean IgnoreEnvironment    = false;  /* used by dialog.c and initfunc.c
  42.                                           of the Mainapp */
  43. /*****************************************************************************/
  44. /*  Macros, typedefs                                                         */
  45. /*****************************************************************************/
  46. typedef struct _EnviromentPair {
  47.     char *key;
  48.     char *value;
  49. } EnviromentPair;
  50. #define MAX_COMMAND 1024
  51. /*****************************************************************************/
  52. /*  Prototypes                                                               */
  53. /*****************************************************************************/
  54. int get_char(FILE *file);
  55. void unget_char(int ch,FILE *file);
  56. int get_string(char *string,int size, FILE *file, char *terms);
  57. void skip_comments(FILE *file);
  58. char *load_entry(FILE *file);
  59. char *getenv(const char *name);
  60. EnviromentPair *ParseLine(char *line);
  61. OSErr FSpFindFolder_Name(short vRefNum, OSType folderType,
  62.                          Boolean createFolder,FSSpec *spec, unsigned char *name);
  63. FILE * FSp_fopen(ConstFSSpecPtr spec, const char * open_mode);
  64. void ShowAllKeyValues(void);
  65. void Set_LineNum(unsigned ln);
  66. /*****************************************************************************/
  67. /*  Functions                                                                */
  68. /*****************************************************************************/
  69. /* get_string(str, max, file, termstr) : like fgets() but
  70.  *      (1) has terminator string which should include n
  71.  *      (2) will always leave room for the null
  72.  *      (3) uses get_char() so LineNumber will be accurate
  73.  *      (4) returns EOF or terminating character, whichever
  74.  */
  75. int get_string(char *string, int size, FILE *file, char *terms)
  76. {
  77.     int ch;
  78.     while (EOF != (ch = get_char(file)) && !strchr(terms, ch)) {
  79.         if (size > 1) {
  80.             *string++ = (char) ch;
  81.             size--;
  82.         }
  83.     }
  84.     if (size > 0)
  85.         {
  86.         *string = '';
  87.         }
  88.     return ch;
  89. }
  90. void Set_LineNum(unsigned ln)
  91. {
  92.  LineNumber = ln;
  93. }
  94. /* get_char(file) : like getc() but increment LineNumber on newlines
  95.  */
  96. int get_char(FILE *file)
  97. {
  98.     int ch;
  99.     ch = getc(file);
  100.     if (ch == 'n')
  101.         {
  102.         Set_LineNum(LineNumber + 1);
  103.         }
  104.     return ch;
  105. }
  106. /* skip_comments(file) : read past comment (if any)
  107.  */
  108. void skip_comments(FILE *file)
  109. {
  110.     int ch;
  111.     while (EOF != (ch = get_char(file)))
  112.         {
  113.         /* ch is now the first character of a line.
  114.          */
  115.         while (ch == ' ' || ch == 't')
  116.             {
  117.             ch = get_char(file);
  118.             }
  119.         if (ch == EOF)
  120.             {
  121.             break;
  122.             }
  123.         /* ch is now the first non-blank character of a line.
  124.          */
  125.         if (ch != 'n' && ch != '#')
  126.             {
  127.             break;
  128.             }
  129.         /* ch must be a newline or comment as first non-blank
  130.          * character on a line.
  131.          */
  132.         while (ch != 'n' && ch != EOF)
  133.             {
  134.             ch = get_char(file);
  135.             }
  136.         /* ch is now the newline of a line which we're going to
  137.          * ignore.
  138.          */
  139.     }
  140.     if (ch != EOF)
  141.         {
  142.         unget_char(ch, file);
  143.         }
  144. }
  145. /* unget_char(ch, file) : like ungetc but do LineNumber processing
  146.  */
  147. void unget_char(int ch, FILE *file)
  148. {
  149.     ungetc(ch, file);
  150.     if (ch == 'n')
  151.         {
  152.         Set_LineNum(LineNumber - 1);
  153.         }
  154. }
  155. /* this function reads one file entry -- the next -- from a file.
  156. *  it skips any leading blank lines, ignores comments, and returns
  157. *  NULL if for any reason the entry can't be read and parsed.
  158. */
  159. char *load_entry(FILE *file)
  160. {
  161.     int ch;
  162.     static char cmd[MAX_COMMAND];
  163.     skip_comments(file);
  164.     ch = get_string(cmd, MAX_COMMAND, file, "n");
  165.     if (ch == EOF)
  166.         {
  167.         return NULL;
  168.         }
  169.     return cmd;
  170. }
  171. EnviromentPair *ParseLine(char *line)
  172. {
  173. char *tmpPtr;
  174. static EnviromentPair *Env;
  175. unsigned short length = strlen(line);
  176. Env->key   = "";
  177. Env->value = "";
  178. for (tmpPtr = line; *tmpPtr; tmpPtr++)
  179.     {
  180.     if (*tmpPtr == '=')
  181.         {
  182.         *tmpPtr = 0;
  183.         Env->key = line;
  184.         if (strlen(Env->key) < length)
  185.             {
  186.             Env->value = ++tmpPtr;
  187.             }
  188.         return Env;
  189.         }
  190.     }
  191. return Env;
  192. }
  193. char *getenv(const char *name)
  194. {
  195. FILE *fp;
  196. char *LineStr = NULL;
  197. EnviromentPair *Env1;
  198. FSSpec spec;
  199. OSErr err;
  200. if (IgnoreEnvironment)
  201.     return NULL;  /* user wants to ignore the environment vars */
  202. if (name == NULL)
  203.     return NULL;
  204. GetCompletePath(CompletePath,"MacZip.Env",&spec,&err);
  205. /* try open the file in the current folder */
  206. fp = FSp_fopen(&spec,"r");
  207. if (fp == NULL)
  208.     { /* Okey, lets try open the file in the preference folder */
  209.     FSpFindFolder_Name(
  210.                    kOnSystemDisk,
  211.                    kPreferencesFolderType,
  212.                    kDontCreateFolder,
  213.                    &spec,
  214.                    "pMacZip.Env");
  215.     fp = FSp_fopen(&spec,"r");
  216.     if (fp == NULL)
  217.         {
  218.         return NULL; /* there is no enviroment-file */
  219.         }
  220.     }
  221. LineStr = load_entry(fp);
  222. while (LineStr != NULL)
  223.     {   /* parse the file line by line */
  224.     Env1 = ParseLine(LineStr);
  225.     if (strlen(Env1->value) > 0)
  226.         {       /* we found a key/value pair */
  227.         if (ListAllKeyValues)
  228.             printf("n   Line:%3d   [%s] = [%s]",LineNumber,Env1->key,Env1->value);
  229.         if (stricmp(name,Env1->key) == 0)
  230.             {   /* we found the value of a given key */
  231.             return Env1->value;
  232.             }
  233.         }
  234.     LineStr = load_entry(fp);  /* read next line */
  235.     }
  236. fclose(fp);
  237. return NULL;
  238. }
  239. OSErr FSpFindFolder_Name(
  240.     short vRefNum,          /* Volume reference number. */
  241.     OSType folderType,      /* Folder type taken by FindFolder. */
  242.     Boolean createFolder,   /* Should we create it if non-existant. */
  243.     FSSpec *spec,           /* Pointer to resulting directory. */
  244.     unsigned char *name)    /* Name of the file in the folder */
  245. {
  246.     short foundVRefNum;
  247.     long foundDirID;
  248.     OSErr err;
  249.     err = FindFolder(vRefNum, folderType, createFolder,
  250.                      &foundVRefNum, &foundDirID);
  251.     if (err != noErr)
  252.         {
  253.         return err;
  254.         }
  255.     err = FSMakeFSSpec(foundVRefNum, foundDirID, name, spec);
  256.     return err;
  257. }
  258. void ShowAllKeyValues(void)
  259. {
  260. OSErr err;
  261. FSSpec spec;
  262. Boolean tmpIgnoreEnvironment = IgnoreEnvironment;
  263. ListAllKeyValues = 1;
  264. IgnoreEnvironment = false;
  265. GetCompletePath(CompletePath,"MacZip.Env",&spec,&err);
  266. if (err != 0)
  267.     { /* Okey, lets try open the file in the preference folder */
  268.     FSpFindFolder_Name(
  269.                    kOnSystemDisk,
  270.                    kPreferencesFolderType,
  271.                    kDontCreateFolder,
  272.                    &spec,
  273.                    "pMacZip.Env");
  274.     GetFullPathFromSpec(CompletePath,&spec, &err);
  275.     if (err != 0)
  276.         {
  277.         return; /* there is no enviroment-file */
  278.         }
  279.     }
  280. printf("nLocation of the current "MacZip.Env" file:n [%s]",CompletePath);
  281. printf("nnList of all environment variablesn");
  282. getenv(" ");
  283. printf("nnEndnn");
  284. /* restore used variables */
  285. ListAllKeyValues = 0;
  286. LineNumber = 0;
  287. IgnoreEnvironment = tmpIgnoreEnvironment;
  288. }