Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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