Line data Source code
1 : #ifndef FD_ENV_STYLE 2 : #if FD_HAS_HOSTED /* Use POSIX */ 3 : #define FD_ENV_STYLE 0 4 : #else 5 : #error "Define FD_ENV_STYLE for this build target" 6 : #endif 7 : #endif 8 : 9 : #if FD_ENV_STYLE==0 10 : 11 : #include "fd_env.h" 12 : 13 : #include <stdlib.h> 14 : 15 : #define FD_ENV_STRIP_CMDLINE_IMPL( T, what ) \ 16 : T \ 17 : fd_env_strip_cmdline_##what( int * pargc, \ 18 : char *** pargv, \ 19 : char const * key, \ 20 : char const * env_key, \ 21 61265 : T val ) { \ 22 61265 : int new_argc = 0; \ 23 61265 : int arg; \ 24 61265 : \ 25 61265 : if( env_key ) { \ 26 59772 : char const * cstr = getenv( env_key ); \ 27 59772 : if( cstr ) val = fd_cstr_to_##what( cstr ); \ 28 59772 : } \ 29 61265 : \ 30 61265 : if( key && pargc && pargv ) { \ 31 548938 : for( arg=0; arg<(*pargc); arg++ ) \ 32 492485 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; \ 33 492485 : else if( (++arg)<(*pargc) ) val = fd_cstr_to_##what( (*pargv)[arg] ); \ 34 56453 : (*pargc) = new_argc; \ 35 56453 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ \ 36 56453 : } \ 37 61265 : \ 38 61265 : return val; \ 39 61265 : } 40 : 41 : FD_ENV_STRIP_CMDLINE_IMPL( char const *, cstr ) 42 : FD_ENV_STRIP_CMDLINE_IMPL( char, char ) 43 : FD_ENV_STRIP_CMDLINE_IMPL( schar, schar ) 44 : FD_ENV_STRIP_CMDLINE_IMPL( short, short ) 45 : FD_ENV_STRIP_CMDLINE_IMPL( int, int ) 46 : FD_ENV_STRIP_CMDLINE_IMPL( long, long ) 47 : FD_ENV_STRIP_CMDLINE_IMPL( uchar, uchar ) 48 : FD_ENV_STRIP_CMDLINE_IMPL( ushort, ushort ) 49 : FD_ENV_STRIP_CMDLINE_IMPL( uint, uint ) 50 : FD_ENV_STRIP_CMDLINE_IMPL( ulong, ulong ) 51 : FD_ENV_STRIP_CMDLINE_IMPL( float, float ) 52 : #if FD_HAS_DOUBLE 53 : FD_ENV_STRIP_CMDLINE_IMPL( double, double ) 54 : #endif 55 : 56 : #undef FD_ENV_STRIP_CMDLINE_IMPL 57 : 58 : int 59 18 : fd_env_strip_cmdline_contains( int * pargc, char *** pargv, char const * key ) { 60 18 : int new_argc = 0; 61 18 : int found = 0; 62 18 : if( key && pargc && pargv ) { 63 78 : for( int arg=0; arg<(*pargc); arg++ ) 64 60 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; 65 9 : else found = 1; 66 18 : (*pargc) = new_argc; 67 18 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ 68 18 : } 69 18 : return found; 70 18 : } 71 : 72 : #else 73 : #error "Unknown FD_ENV_STYLE" 74 : #endif 75 :