Subversion Repositories Kolibri OS

Rev

Rev 6347 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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)
  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)
  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[])
  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.  
  172.