src/SDL_getenv.c
author Ryan C. Gordon <icculus@icculus.org>
Tue, 27 Sep 2005 12:14:17 +0000
changeset 1147 b580f7201543
parent 769 b8d311d90021
child 1268 f098b247299d
permissions -rw-r--r--
From: "Alex Volkov" <avcp-sdlmail@usa.net>
To: "'A list for developers using the SDL library. \(includesSDL-announce\)'" <sdl@libsdl.org>
Date: Mon, 19 Sep 2005 18:59:43 -0400
Subject: [SDL] [patch] Volume multiplier bug in

The volume multiplier in SDL_MixAudio_MMX_S8() is formed from the wrong
register.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2004 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Library General Public
     7     License as published by the Free Software Foundation; either
     8     version 2 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Library General Public License for more details.
    14 
    15     You should have received a copy of the GNU Library General Public
    16     License along with this library; if not, write to the Free
    17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 
    23 #ifdef SAVE_RCSID
    24 static char rcsid =
    25  "@(#) $Id$";
    26 #endif
    27 
    28 /* Not all environments have a working getenv()/putenv() */
    29 
    30 #ifdef TEST_MAIN
    31 #define NEED_SDL_GETENV
    32 #endif
    33 
    34 #include "SDL_getenv.h"
    35 
    36 #ifdef NEED_SDL_GETENV
    37 
    38 #include <stdlib.h>
    39 #include <string.h>
    40 
    41 static char **SDL_env = (char **)0;
    42 
    43 /* Put a variable of the form "name=value" into the environment */
    44 int SDL_putenv(const char *variable)
    45 {
    46 	const char *name, *value;
    47 	int added;
    48 	int len, i;
    49 	char **new_env;
    50 	char *new_variable;
    51 
    52 	/* A little error checking */
    53 	if ( ! variable ) {
    54 		return(-1);
    55 	}
    56 	name = variable;
    57 	for ( value=variable; *value && (*value != '='); ++value ) {
    58 		/* Keep looking for '=' */ ;
    59 	}
    60 	if ( *value ) {
    61 		++value;
    62 	} else {
    63 		return(-1);
    64 	}
    65 
    66 	/* Allocate memory for the variable */
    67 	new_variable = (char *)malloc(strlen(variable)+1);
    68 	if ( ! new_variable ) {
    69 		return(-1);
    70 	}
    71 	strcpy(new_variable, variable);
    72 
    73 	/* Actually put it into the environment */
    74 	added = 0;
    75 	i = 0;
    76 	if ( SDL_env ) {
    77 		/* Check to see if it's already there... */
    78 		len = (value - name);
    79 		for ( ; SDL_env[i]; ++i ) {
    80 			if ( strncmp(SDL_env[i], name, len) == 0 ) {
    81 				break;
    82 			}
    83 		}
    84 		/* If we found it, just replace the entry */
    85 		if ( SDL_env[i] ) {
    86 			free(SDL_env[i]);
    87 			SDL_env[i] = new_variable;
    88 			added = 1;
    89 		}
    90 	}
    91 
    92 	/* Didn't find it in the environment, expand and add */
    93 	if ( ! added ) {
    94 		new_env = realloc(SDL_env, (i+2)*sizeof(char *));
    95 		if ( new_env ) {
    96 			SDL_env = new_env;
    97 			SDL_env[i++] = new_variable;
    98 			SDL_env[i++] = (char *)0;
    99 			added = 1;
   100 		} else {
   101 			free(new_variable);
   102 		}
   103 	}
   104 	return (added ? 0 : -1);
   105 }
   106 
   107 /* Retrieve a variable named "name" from the environment */
   108 char *SDL_getenv(const char *name)
   109 {
   110 	int len, i;
   111 	char *value;
   112 
   113 	value = (char *)0;
   114 	if ( SDL_env ) {
   115 		len = strlen(name);
   116 		for ( i=0; SDL_env[i] && !value; ++i ) {
   117 			if ( (strncmp(SDL_env[i], name, len) == 0) &&
   118 			     (SDL_env[i][len] == '=') ) {
   119 				value = &SDL_env[i][len+1];
   120 			}
   121 		}
   122 	}
   123 	return value;
   124 }
   125 
   126 #endif /* NEED_GETENV */
   127 
   128 #ifdef TEST_MAIN
   129 #include <stdio.h>
   130 
   131 int main(int argc, char *argv[])
   132 {
   133 	char *value;
   134 
   135 	printf("Checking for non-existent variable... ");
   136 	fflush(stdout);
   137 	if ( ! getenv("EXISTS") ) {
   138 		printf("okay\n");
   139 	} else {
   140 		printf("failed\n");
   141 	}
   142 	printf("Setting FIRST=VALUE1 in the environment... ");
   143 	fflush(stdout);
   144 	if ( putenv("FIRST=VALUE1") == 0 ) {
   145 		printf("okay\n");
   146 	} else {
   147 		printf("failed\n");
   148 	}
   149 	printf("Getting FIRST from the environment... ");
   150 	fflush(stdout);
   151 	value = getenv("FIRST");
   152 	if ( value && (strcmp(value, "VALUE1") == 0) ) {
   153 		printf("okay\n");
   154 	} else {
   155 		printf("failed\n");
   156 	}
   157 	printf("Setting SECOND=VALUE2 in the environment... ");
   158 	fflush(stdout);
   159 	if ( putenv("SECOND=VALUE2") == 0 ) {
   160 		printf("okay\n");
   161 	} else {
   162 		printf("failed\n");
   163 	}
   164 	printf("Getting SECOND from the environment... ");
   165 	fflush(stdout);
   166 	value = getenv("SECOND");
   167 	if ( value && (strcmp(value, "VALUE2") == 0) ) {
   168 		printf("okay\n");
   169 	} else {
   170 		printf("failed\n");
   171 	}
   172 	printf("Setting FIRST=NOVALUE in the environment... ");
   173 	fflush(stdout);
   174 	if ( putenv("FIRST=NOVALUE") == 0 ) {
   175 		printf("okay\n");
   176 	} else {
   177 		printf("failed\n");
   178 	}
   179 	printf("Getting FIRST from the environment... ");
   180 	fflush(stdout);
   181 	value = getenv("FIRST");
   182 	if ( value && (strcmp(value, "NOVALUE") == 0) ) {
   183 		printf("okay\n");
   184 	} else {
   185 		printf("failed\n");
   186 	}
   187 	printf("Checking for non-existent variable... ");
   188 	fflush(stdout);
   189 	if ( ! getenv("EXISTS") ) {
   190 		printf("okay\n");
   191 	} else {
   192 		printf("failed\n");
   193 	}
   194 	return(0);
   195 }
   196 #endif /* TEST_MAIN */
   197