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 30308 : T val ) { \ 22 30308 : int new_argc = 0; \ 23 30308 : int arg; \ 24 30308 : \ 25 30308 : if( env_key ) { \ 26 28881 : char const * cstr = getenv( env_key ); \ 27 28881 : if( cstr ) val = fd_cstr_to_##what( cstr ); \ 28 28881 : } \ 29 30308 : \ 30 30308 : if( key && pargc && pargv ) { \ 31 2888389 : for( arg=0; arg<(*pargc); arg++ ) \ 32 2860427 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; \ 33 2860427 : else if( (++arg)<(*pargc) ) val = fd_cstr_to_##what( (*pargv)[arg] ); \ 34 27962 : (*pargc) = new_argc; \ 35 27962 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ \ 36 27962 : } \ 37 30308 : \ 38 30308 : return val; \ 39 30308 : } 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 21 : fd_env_strip_cmdline_contains( int * pargc, char *** pargv, char const * key ) { 60 21 : int new_argc = 0; 61 21 : int found = 0; 62 21 : if( key && pargc && pargv ) { 63 84 : for( int arg=0; arg<(*pargc); arg++ ) 64 63 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; 65 9 : else found = 1; 66 21 : (*pargc) = new_argc; 67 21 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ 68 21 : } 69 21 : return found; 70 21 : } 71 : 72 : #else 73 : #error "Unknown FD_ENV_STYLE" 74 : #endif 75 :