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 70256 : T val ) { \ 22 70256 : int new_argc = 0; \ 23 70256 : int arg; \ 24 70256 : \ 25 70256 : if( env_key ) { \ 26 68781 : char const * cstr = getenv( env_key ); \ 27 68781 : if( cstr ) val = fd_cstr_to_##what( cstr ); \ 28 68781 : } \ 29 70256 : \ 30 70256 : if( key && pargc && pargv ) { \ 31 9965842 : for( arg=0; arg<(*pargc); arg++ ) \ 32 9901124 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; \ 33 9901124 : else if( (++arg)<(*pargc) ) val = fd_cstr_to_##what( (*pargv)[arg] ); \ 34 64718 : (*pargc) = new_argc; \ 35 64718 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ \ 36 64718 : } \ 37 70256 : \ 38 70256 : return val; \ 39 70256 : } 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 :