home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff319.lzh / CNewsSrc / cnews.src.lzh / libfake / putenv.c < prev    next >
C/C++ Source or Header  |  1980-01-01  |  1KB  |  54 lines

  1. /*
  2.  * putenv - add a variable to the environment, as in SysV
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include "libc.h"
  8.  
  9. #define YES 1
  10. #define NO 0
  11.  
  12. /* peculiar return values */
  13. #define WORKED 0
  14. #define FAILED 1
  15.  
  16. int
  17. putenv(var)            /* put var in the environment */
  18. char *var;
  19. {
  20.     register char **envp, **newenv;
  21.     register int oldenvcnt;
  22.     extern char **environ;
  23.  
  24.     /* count variables, look for var */
  25.     for (envp = environ; *envp != 0; envp++) {
  26.         register char *varp = var, *ep = *envp;
  27.         register int namesame;
  28.  
  29.         namesame = NO;
  30.         for (; *varp == *ep && *varp != '\0'; ++ep, ++varp)
  31.             if (*varp == '=')
  32.                 namesame = YES;
  33.         if (*varp == *ep && *ep == '\0')
  34.             return WORKED;    /* old & new var's are the same */
  35.         if (namesame) {
  36.             *envp = var;    /* replace var with new value */
  37.             return WORKED;
  38.         }
  39.     }
  40.     oldenvcnt = envp - environ;
  41.  
  42.     /* allocate new environment with room for one more variable */
  43.     newenv = (char **)malloc((unsigned)((oldenvcnt+1+1)*sizeof(*envp)));
  44.     if (newenv == NULL)
  45.         return FAILED;
  46.  
  47.     /* copy old environment pointers, add var, switch environments */
  48.     (void) memcpy((char *)newenv, (char *)environ, oldenvcnt*sizeof(*envp));
  49.     newenv[oldenvcnt] = var;
  50.     newenv[oldenvcnt+1] = NULL;
  51.     environ = newenv;
  52.     return WORKED;
  53. }
  54.