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 63060 : T val ) { \ 22 63060 : int new_argc = 0; \ 23 63060 : int arg; \ 24 63060 : \ 25 63060 : if( env_key ) { \ 26 61459 : char const * cstr = getenv( env_key ); \ 27 61459 : if( cstr ) val = fd_cstr_to_##what( cstr ); \ 28 61459 : } \ 29 63060 : \ 30 63060 : if( key && pargc && pargv ) { \ 31 567283 : for( arg=0; arg<(*pargc); arg++ ) \ 32 509181 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; \ 33 509181 : else if( (++arg)<(*pargc) ) val = fd_cstr_to_##what( (*pargv)[arg] ); \ 34 58102 : (*pargc) = new_argc; \ 35 58102 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ \ 36 58102 : } \ 37 63060 : \ 38 63060 : return val; \ 39 63060 : } 40 : 41 30162 : FD_ENV_STRIP_CMDLINE_IMPL( char const *, cstr ) 42 15 : FD_ENV_STRIP_CMDLINE_IMPL( char, char ) 43 15 : FD_ENV_STRIP_CMDLINE_IMPL( schar, schar ) 44 15 : FD_ENV_STRIP_CMDLINE_IMPL( short, short ) 45 14856 : FD_ENV_STRIP_CMDLINE_IMPL( int, int ) 46 33 : FD_ENV_STRIP_CMDLINE_IMPL( long, long ) 47 15 : FD_ENV_STRIP_CMDLINE_IMPL( uchar, uchar ) 48 18 : FD_ENV_STRIP_CMDLINE_IMPL( ushort, ushort ) 49 153 : FD_ENV_STRIP_CMDLINE_IMPL( uint, uint ) 50 17709 : FD_ENV_STRIP_CMDLINE_IMPL( ulong, ulong ) 51 45 : FD_ENV_STRIP_CMDLINE_IMPL( float, float ) 52 : #if FD_HAS_DOUBLE 53 24 : 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 114 : for( int arg=0; arg<(*pargc); arg++ ) 64 93 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; 65 9 : else found = 1; 66 21 : (*pargc) = new_argc; 67 : (*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 :