2 * (c) Copyright 1992 by Panagiotis Tsirigotis
3 * All rights reserved. The file named COPYRIGHT specifies the terms
4 * and conditions for redistribution.
17 typedef struct __env env_s ;
19 #define INITIAL_VARS 20
25 static char **lookup( const env_h env, const char *var,
26 register unsigned int len );
28 static env_s *alloc_env( unsigned max_vars )
34 ep = (env_s *) malloc( sizeof( env_s ) ) ;
37 env_errno = ENV_ENOMEM ;
41 memset( ep, 0, sizeof( env_s ) );
42 size = ( max_vars + 1 ) * sizeof( char * ) ;
43 pointers = (char **) malloc( size ) ;
44 if ( pointers == NULL )
47 env_errno = ENV_ENOMEM ;
50 (void) memset( (char *)pointers, 0, size ) ;
53 ep->max_vars = max_vars ;
59 env_h env_create( const env_h init_env )
65 if ( init_env == ENV_NULL )
66 max_vars = INITIAL_VARS ;
68 max_vars = init_env->n_vars + 5 ;
70 ep = alloc_env( max_vars ) ;
73 env_errno = ENV_ENOMEM ;
77 if ( init_env == ENV_NULL )
80 for ( u = 0, ep->n_vars = 0 ; u < init_env->n_vars ; u++, ep->n_vars++ )
82 ep->vars[ ep->n_vars ] = new_string( init_env->vars[ u ] ) ;
83 if ( ep->vars[ ep->n_vars ] == NULL )
86 env_errno = ENV_ENOMEM ;
94 void env_destroy( env_h env )
98 for ( u = 0 ; u < env->n_vars ; u++ )
99 free( env->vars[ u ] ) ;
100 free( (char *)env->vars ) ;
101 free( (char *)env ) ;
105 env_h env_make( char **env_strings )
110 for ( pp = env_strings ; *pp ; pp++ ) ;
112 ep = alloc_env( (unsigned) (pp-env_strings) ) ;
115 env_errno = ENV_ENOMEM ;
119 for ( pp = env_strings ; *pp ; pp++ )
121 char *p = new_string( *pp ) ;
126 env_errno = ENV_ENOMEM ;
129 ep->vars[ ep->n_vars++ ] = p ;
135 char *env_lookup( env_h env, const char *var )
137 char **pp = lookup( env, var, strlen( var ) ) ;
139 return( ( pp == NULL ) ? NULL : *pp ) ;
143 static char **lookup( const env_h env, const char * var,
144 register unsigned int len )
148 for ( pp = env->vars ; *pp ; pp++ )
149 if ( strncmp( *pp, var, len ) == 0 && (*pp)[ len ] == '=' )
155 static int grow( env_s *ep )
158 unsigned new_max_vars ;
160 new_max_vars = ep->max_vars + INCREASE ;
161 new_size = ( new_max_vars+1 ) * sizeof( char * ) ;
162 new_vars = (char **) realloc( (char *)ep->vars, new_size ) ;
163 if ( new_vars == NULL )
166 ep->vars = new_vars ;
167 ep->max_vars = new_max_vars ;
169 memset(&ep->vars[ep->n_vars], 0, new_size - (ep->n_vars * sizeof(char *)));
175 * Add the variable string to the given environment.
177 static int addstring( env_s *ep, const char *var_string, unsigned int len )
182 p = new_string( var_string ) ;
186 pp = lookup( ep, var_string, len ) ;
189 if ( ep->n_vars >= ep->max_vars && grow( ep ) == ENV_ERR )
192 env_errno = ENV_ENOMEM ;
195 ep->vars[ ep->n_vars++ ] = p ;
196 ep->vars[ ep->n_vars ] = NULL;
207 int env_addvar( env_h env, env_h from_env, char *var_name )
209 char *var_string = env_lookup( from_env, var_name ) ;
211 if ( var_string == NULL )
213 env_errno = ENV_EBADVAR ;
217 return( addstring( env, var_string, strlen( var_name ) ) ) ;
221 int env_addstr( env_h env, char *var_string )
223 char *p = strchr( var_string, '=' ) ;
227 env_errno = ENV_EBADSTRING ;
231 return( addstring( env, var_string, (unsigned int)(p-var_string) ) ) ;
236 static int comparator( char **p1, char **p2 )
238 return( strcmp( *p1, *p2 ) ) ;
242 void env_sort( env_h env )
244 qsort( (char *)env->vars, env->n_vars, sizeof( char * ), comparator ) ;