home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / crt0 / c1loadef.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-25  |  3.3 KB  |  167 lines

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  3. #include <libc/stubs.h>
  4. #include <crt0.h>
  5. #include <limits.h>
  6. #include <stdlib.h>
  7. #include <io.h>
  8. #include <fcntl.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <unistd.h>
  12.  
  13. void
  14. __crt0_load_environment_file(char *app_name)
  15. {
  16.   int djgpp_env;
  17.   char *djgpp_var = getenv("DJGPP");
  18.  
  19.   if (djgpp_var)
  20.   {
  21.     djgpp_env = _open(djgpp_var, O_RDONLY);
  22.     if (djgpp_env >= 0)
  23.     {
  24.       char *file;
  25.       char base[PATH_MAX], *bp, *a0p, *tb;
  26.       int this_prog = 1;
  27.       int fsize = lseek(djgpp_env, 0L, SEEK_END);
  28.  
  29.       file = (char *)malloc(fsize+2);
  30.       if (file == 0)
  31.     return;
  32.       lseek(djgpp_env, 0L, 0);
  33.       _read(djgpp_env, file, fsize);
  34.       _close(djgpp_env);
  35.       if (file[fsize-1] == '\n')
  36.       {
  37.     file[fsize] = 0;
  38.       }
  39.       else
  40.       {
  41.     file[fsize] = '\n';
  42.     file[fsize+1] = 0;
  43.       }
  44.       tb = file;
  45.  
  46.       base[0] = '[';
  47.       bp = app_name;
  48.       for (a0p = bp; *a0p; a0p++)
  49.     if (strchr("\\/:", *a0p))
  50.       bp = a0p+1;
  51.       for (a0p=base+1; *bp && *bp != '.';)
  52.     *a0p++ = tolower(*bp++);
  53.       *a0p++ = ']';
  54.       *a0p++ = 0;
  55.  
  56.       bp = tb;
  57.       while (1)
  58.       {
  59.     tb = bp;
  60.     while (*tb && (*tb == '\n' || *tb == '\r'))
  61.       tb++;
  62.     bp = tb;
  63.     while (*bp && *bp != '\n' && *bp != '\r')
  64.       bp++;
  65.     if (*bp == 0)
  66.       break;
  67.     *bp++ = 0;
  68.     if (tb[0] == 0 || tb[0] == '#')
  69.       continue;
  70.     if (tb[0] == '[')
  71.     {
  72.       if (strcmp(tb, base) == 0)
  73.         this_prog = 1;
  74.       else
  75.         this_prog = 0;
  76.     }
  77.     else
  78.     {
  79.       if (this_prog)
  80.       {
  81.         char *buf = alloca(fsize);
  82.         char *tb2 = buf;
  83.         char *sp=tb, *dp=tb2;
  84.         while (*sp != '=' && *sp != '\n' && *sp)
  85.           *dp++ = *sp++;
  86.         if (*sp == '\n' || *sp == '\0')
  87.         {
  88.           tb = sp;
  89.           continue;
  90.         }
  91.         if (*tb2 == '+')    /* non-overriding */
  92.         {
  93.           *dp = 0;
  94.           tb2++;
  95.           if (getenv(tb2))
  96.         continue;    /* while scanning bytes */
  97.         }
  98.         *dp++ = *sp++;    /* copy the '=' */
  99.         while (*sp)
  100.         {
  101.           if (*sp == '%')
  102.           {
  103.         char *pp;
  104.         if (sp[1] == '%')
  105.         {
  106.           *dp++ = '%';
  107.           sp += 2;
  108.         }
  109.         else
  110.         {
  111.           char ps, *e, *dirend;
  112.           int dirpart=0, apsemi=0;
  113.           int mapup=0, maplow=0, mapfs=0, mapbs=0;
  114.           while (strchr(":;/\\<>", sp[1]))
  115.           {
  116.             switch (sp[1])
  117.             {
  118.             case ':':  dirpart=1; break;
  119.             case ';':  apsemi=1;  break;
  120.             case '/':  mapfs=1;   break;
  121.             case '\\': mapbs=1;   break;
  122.             case '<':  mapup=1;   break;
  123.             case '>':  maplow=1;  break;
  124.             }
  125.             sp++;
  126.           }
  127.           for (pp=sp+1; *pp && *pp != '%'; pp++);
  128.           ps = *pp;
  129.           *pp = 0;
  130.           e = getenv(sp+1);
  131.           dirend = dp;
  132.           if (e)
  133.           {
  134.             while (*e)
  135.             {
  136.               char ec = *e++;
  137.               if (strchr("\\/:", ec))
  138.             dirend=dp;
  139.               if (mapup) ec = toupper(ec);
  140.               if (maplow) ec = tolower(ec);
  141.               if (mapfs && ec == '\\') ec = '/';
  142.               if (mapbs && ec == '/') ec = '\\';
  143.               *dp++ = ec;
  144.             }
  145.           }
  146.           if (dirpart)
  147.             dp = dirend;
  148.           if (apsemi && e)
  149.             *dp++ = ';';
  150.           if (ps == 0)
  151.             break;
  152.           sp = pp+1;
  153.         }
  154.           }
  155.           else
  156.         *dp++ = *sp++;
  157.         }
  158.         *dp++ = 0;
  159.         putenv(tb2);
  160.       }
  161.     }
  162.       }
  163.       free(file);
  164.     }
  165.   }
  166. }
  167.