home *** CD-ROM | disk | FTP | other *** search
/ AMIGA PD 1 / AMIGA-PD-1.iso / Programme_zum_Heft / Programmieren / Kurztests / DiceC / cc / subs.c < prev    next >
C/C++ Source or Header  |  1994-02-01  |  2KB  |  160 lines

  1.  
  2. /*
  3.  *  SUBS.C
  4.  *
  5.  *  (c)Copyright 1990, All Rights Reserved
  6.  */
  7.  
  8. #include "defs.h"
  9. #include <exec/execbase.h>
  10.  
  11. Prototype int ExtArgsEnv(short, char ***, char *);
  12. Prototype char *skipspace(char *);
  13. Prototype char *skipnspace(char *);
  14. Prototype void CreateObjPath(char *);
  15.  
  16. extern struct ExecBase *SysBase;
  17.  
  18. /*
  19.  *  ExtArgsEnv()        DCCOPTS
  20.  */
  21.  
  22. int
  23. ExtArgsEnv(ac, pav, envname)
  24. short ac;
  25. char ***pav;
  26. char *envname;
  27. {
  28.     long len = -1;
  29.     char *str;
  30.     char *ptr;
  31.     int nac = 0;
  32.     char **nav;
  33.  
  34. #ifndef LATTICE
  35.     if (SysBase->LibNode.lib_Version < 36) {
  36. #else
  37.     {
  38. #endif
  39.     char buf[64];
  40.     int fd;
  41.  
  42.     sprintf(buf, "ENV:%s", envname);
  43.  
  44.     fd = open(buf, O_RDONLY);
  45.  
  46.     if (fd >= 0) {
  47.         if ((len = lseek(fd, 0L, 2)) > 0) {
  48.         str = malloc(len + 1);
  49.  
  50.         lseek(fd, 0L, 0);
  51.         read(fd, str, len);
  52.         str[len] = 0;
  53.         }
  54.         close(fd);
  55.     }
  56.     }
  57. #ifndef LATTICE
  58.       else {
  59.     str = malloc(1024);
  60.     len = GetVar(envname, str, 1024, 0);
  61.     if (len > 0)
  62.         str = realloc(str, len + 1);
  63.     else
  64.         free(str);
  65.     }
  66. #endif
  67.  
  68.     if (len < 0)
  69.     return(ac);
  70.  
  71.     /*
  72.      *    parse
  73.      */
  74.  
  75.     ptr = skipspace(str);
  76.     while (*ptr) {
  77.     ++nac;
  78.     ptr = skipnspace(ptr);
  79.     ptr = skipspace(ptr);
  80.     }
  81.     nav = malloc((ac + nac + 1) * sizeof(char *));
  82.     movmem(*pav, nav, ac * sizeof(char *));
  83.     nac = ac;
  84.     ptr = skipspace(str);
  85.     while (*ptr) {
  86.     nav[nac] = ptr;
  87.     ptr = skipnspace(ptr);
  88.     if (*ptr)
  89.         *ptr++ = 0;
  90.     ptr = skipspace(ptr);
  91.     ++nac;
  92.     }
  93.     nav[nac] = NULL;
  94.     ac = nac;
  95.     *pav = nav;
  96.     return(ac);
  97. }
  98.  
  99. char *
  100. skipspace(ptr)
  101. char *ptr;
  102. {
  103.     while (*ptr == ' ' || *ptr == 9)
  104.     ++ptr;
  105.     return(ptr);
  106. }
  107.  
  108. char *
  109. skipnspace(ptr)
  110. char *ptr;
  111. {
  112.     while (*ptr != ' ' && *ptr != 9 && *ptr)
  113.     ++ptr;
  114.     return(ptr);
  115. }
  116.  
  117. /*
  118.  *  check for path existance
  119.  */
  120.  
  121. void
  122. CreateObjPath(file)
  123. char *file;
  124. {
  125.     short i;
  126.     short j;
  127.     BPTR lock;
  128.     char tmp[128];
  129.  
  130.     for (i = strlen(file); i >= 0 && file[i] != '/' && file[i] != ':'; --i);
  131.  
  132.     if (i <= 0)
  133.     return;
  134.     strncpy(tmp, file, i);
  135.     tmp[i] = 0;
  136.  
  137.     /*
  138.      *    valid directory
  139.      */
  140.  
  141.     if (lock = Lock(tmp, SHARED_LOCK)) {
  142.     UnLock(lock);
  143.     return;
  144.     }
  145.  
  146.     /*
  147.      *    invalid, attempt to create directory path.
  148.      */
  149.  
  150.     for (j = 0; j <= i; ++j) {
  151.     if (file[j] == '/') {
  152.         strncpy(tmp, file, j);
  153.         tmp[j] = 0;
  154.         if (mkdir(tmp) < 0 && errno != EEXIST)
  155.         break;
  156.     }
  157.     }
  158. }
  159.  
  160.