src/SDL_getenv.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. SDL_putenv
  2. SDL_getenv
  3. main

   1 
   2 /* Not all environments have a working getenv()/putenv() */
   3 
   4 #ifdef TEST_MAIN
   5 #define NEED_SDL_GETENV
   6 #endif
   7 
   8 #include "SDL_getenv.h"
   9 
  10 #ifdef NEED_SDL_GETENV
  11 
  12 #include <stdlib.h>
  13 #include <string.h>
  14 
  15 static char **SDL_env = (char **)0;
  16 
  17 /* Put a variable of the form "name=value" into the environment */
  18 int SDL_putenv(const char *variable)
     /* [<][>][^][v][top][bottom][index][help] */
  19 {
  20         const char *name, *value;
  21         int added;
  22         int len, i;
  23         char **new_env;
  24         char *new_variable;
  25 
  26         /* A little error checking */
  27         if ( ! variable ) {
  28                 return(-1);
  29         }
  30         name = variable;
  31         for ( value=variable; *value && (*value != '='); ++value ) {
  32                 /* Keep looking for '=' */ ;
  33         }
  34         if ( *value ) {
  35                 ++value;
  36         } else {
  37                 return(-1);
  38         }
  39 
  40         /* Allocate memory for the variable */
  41         new_variable = (char *)malloc(strlen(variable)+1);
  42         if ( ! new_variable ) {
  43                 return(-1);
  44         }
  45         strcpy(new_variable, variable);
  46 
  47         /* Actually put it into the environment */
  48         added = 0;
  49         i = 0;
  50         if ( SDL_env ) {
  51                 /* Check to see if it's already there... */
  52                 len = (value - name);
  53                 for ( ; SDL_env[i]; ++i ) {
  54                         if ( strncmp(SDL_env[i], name, len) == 0 ) {
  55                                 break;
  56                         }
  57                 }
  58                 /* If we found it, just replace the entry */
  59                 if ( SDL_env[i] ) {
  60                         free(SDL_env[i]);
  61                         SDL_env[i] = new_variable;
  62                         added = 1;
  63                 }
  64         }
  65 
  66         /* Didn't find it in the environment, expand and add */
  67         if ( ! added ) {
  68                 new_env = realloc(SDL_env, (i+2)*sizeof(char *));
  69                 if ( new_env ) {
  70                         SDL_env = new_env;
  71                         SDL_env[i++] = new_variable;
  72                         SDL_env[i++] = (char *)0;
  73                         added = 1;
  74                 } else {
  75                         free(new_variable);
  76                 }
  77         }
  78         return (added ? 0 : -1);
  79 }
  80 
  81 /* Retrieve a variable named "name" from the environment */
  82 char *SDL_getenv(const char *name)
     /* [<][>][^][v][top][bottom][index][help] */
  83 {
  84         int len, i;
  85         char *value;
  86 
  87         value = (char *)0;
  88         if ( SDL_env ) {
  89                 len = strlen(name);
  90                 for ( i=0; SDL_env[i] && !value; ++i ) {
  91                         if ( (strncmp(SDL_env[i], name, len) == 0) &&
  92                              (SDL_env[i][len] == '=') ) {
  93                                 value = &SDL_env[i][len+1];
  94                         }
  95                 }
  96         }
  97         return value;
  98 }
  99 
 100 #endif /* NEED_GETENV */
 101 
 102 #ifdef TEST_MAIN
 103 #include <stdio.h>
 104 
 105 int main(int argc, char *argv[])
     /* [<][>][^][v][top][bottom][index][help] */
 106 {
 107         char *value;
 108 
 109         printf("Checking for non-existent variable... ");
 110         fflush(stdout);
 111         if ( ! getenv("EXISTS") ) {
 112                 printf("okay\n");
 113         } else {
 114                 printf("failed\n");
 115         }
 116         printf("Setting FIRST=VALUE1 in the environment... ");
 117         fflush(stdout);
 118         if ( putenv("FIRST=VALUE1") == 0 ) {
 119                 printf("okay\n");
 120         } else {
 121                 printf("failed\n");
 122         }
 123         printf("Getting FIRST from the environment... ");
 124         fflush(stdout);
 125         value = getenv("FIRST");
 126         if ( value && (strcmp(value, "VALUE1") == 0) ) {
 127                 printf("okay\n");
 128         } else {
 129                 printf("failed\n");
 130         }
 131         printf("Setting SECOND=VALUE2 in the environment... ");
 132         fflush(stdout);
 133         if ( putenv("SECOND=VALUE2") == 0 ) {
 134                 printf("okay\n");
 135         } else {
 136                 printf("failed\n");
 137         }
 138         printf("Getting SECOND from the environment... ");
 139         fflush(stdout);
 140         value = getenv("SECOND");
 141         if ( value && (strcmp(value, "VALUE2") == 0) ) {
 142                 printf("okay\n");
 143         } else {
 144                 printf("failed\n");
 145         }
 146         printf("Setting FIRST=NOVALUE in the environment... ");
 147         fflush(stdout);
 148         if ( putenv("FIRST=NOVALUE") == 0 ) {
 149                 printf("okay\n");
 150         } else {
 151                 printf("failed\n");
 152         }
 153         printf("Getting FIRST from the environment... ");
 154         fflush(stdout);
 155         value = getenv("FIRST");
 156         if ( value && (strcmp(value, "NOVALUE") == 0) ) {
 157                 printf("okay\n");
 158         } else {
 159                 printf("failed\n");
 160         }
 161         printf("Checking for non-existent variable... ");
 162         fflush(stdout);
 163         if ( ! getenv("EXISTS") ) {
 164                 printf("okay\n");
 165         } else {
 166                 printf("failed\n");
 167         }
 168         return(0);
 169 }
 170 #endif /* TEST_MAIN */
 171 

/* [<][>][^][v][top][bottom][index][help] */