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 : #include "fd_env.h"
10 :
11 : #include <stdlib.h>
12 :
13 : int
14 21 : fd_env_strip_cmdline_contains( int * pargc, char *** pargv, char const * key ) {
15 21 : int new_argc = 0;
16 21 : int found = 0;
17 21 : if( key && pargc && pargv ) {
18 114 : for( int arg=0; arg<(*pargc); arg++ )
19 93 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg];
20 9 : else found = 1;
21 21 : (*pargc) = new_argc;
22 21 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */
23 21 : }
24 21 : return found;
25 21 : }
26 :
27 : #if FD_ENV_STYLE==0
28 :
29 : #define FD_ENV_STRIP_CMDLINE_IMPL( T, what ) \
30 : T \
31 : fd_env_strip_cmdline_##what( int * pargc, \
32 : char *** pargv, \
33 : char const * key, \
34 : char const * env_key, \
35 65191 : T val ) { \
36 65191 : int new_argc = 0; \
37 65191 : int arg; \
38 65191 : \
39 65191 : if( env_key ) { \
40 63422 : char const * cstr = getenv( env_key ); \
41 63422 : if( cstr ) val = fd_cstr_to_##what( cstr ); \
42 63422 : } \
43 65191 : \
44 65191 : if( key && pargc && pargv ) { \
45 588709 : for( arg=0; arg<(*pargc); arg++ ) \
46 528622 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; \
47 528622 : else if( (++arg)<(*pargc) ) val = fd_cstr_to_##what( (*pargv)[arg] ); \
48 60087 : (*pargc) = new_argc; \
49 60087 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ \
50 60087 : } \
51 65191 : \
52 65191 : return val; \
53 65191 : }
54 :
55 31152 : FD_ENV_STRIP_CMDLINE_IMPL( char const *, cstr )
56 15 : FD_ENV_STRIP_CMDLINE_IMPL( char, char )
57 15 : FD_ENV_STRIP_CMDLINE_IMPL( schar, schar )
58 15 : FD_ENV_STRIP_CMDLINE_IMPL( short, short )
59 15327 : FD_ENV_STRIP_CMDLINE_IMPL( int, int )
60 33 : FD_ENV_STRIP_CMDLINE_IMPL( long, long )
61 15 : FD_ENV_STRIP_CMDLINE_IMPL( uchar, uchar )
62 18 : FD_ENV_STRIP_CMDLINE_IMPL( ushort, ushort )
63 144 : FD_ENV_STRIP_CMDLINE_IMPL( uint, uint )
64 18388 : FD_ENV_STRIP_CMDLINE_IMPL( ulong, ulong )
65 45 : FD_ENV_STRIP_CMDLINE_IMPL( float, float )
66 : #if FD_HAS_DOUBLE
67 : FD_ENV_STRIP_CMDLINE_IMPL( double, double )
68 : #endif
69 :
70 : #undef FD_ENV_STRIP_CMDLINE_IMPL
71 :
72 : #elif FD_LOG_STYLE==1 /* generic embedded target */
73 :
74 : #define FD_ENV_STRIP_CMDLINE_IMPL( T, what ) \
75 : T \
76 : fd_env_strip_cmdline_##what( int * pargc, \
77 : char *** pargv, \
78 : char const * key, \
79 : char const * env_key, \
80 : T val ) { \
81 : (void)env_key; \
82 : int new_argc = 0; \
83 : int arg; \
84 : \
85 : if( key && pargc && pargv ) { \
86 : for( arg=0; arg<(*pargc); arg++ ) \
87 : if( strcmp( key, (*pargv)[arg] ) ) (*pargv)[new_argc++] = (*pargv)[arg]; \
88 : else if( (++arg)<(*pargc) ) val = fd_cstr_to_##what( (*pargv)[arg] ); \
89 : (*pargc) = new_argc; \
90 : (*pargv)[new_argc] = NULL; /* ANSI - argv is NULL terminated */ \
91 : } \
92 : \
93 : return val; \
94 : }
95 :
96 : FD_ENV_STRIP_CMDLINE_IMPL( char const *, cstr )
97 : FD_ENV_STRIP_CMDLINE_IMPL( char, char )
98 : FD_ENV_STRIP_CMDLINE_IMPL( schar, schar )
99 : FD_ENV_STRIP_CMDLINE_IMPL( short, short )
100 : FD_ENV_STRIP_CMDLINE_IMPL( int, int )
101 : FD_ENV_STRIP_CMDLINE_IMPL( long, long )
102 : FD_ENV_STRIP_CMDLINE_IMPL( uchar, uchar )
103 : FD_ENV_STRIP_CMDLINE_IMPL( ushort, ushort )
104 : FD_ENV_STRIP_CMDLINE_IMPL( uint, uint )
105 : FD_ENV_STRIP_CMDLINE_IMPL( ulong, ulong )
106 : FD_ENV_STRIP_CMDLINE_IMPL( float, float )
107 : #if FD_HAS_DOUBLE
108 : FD_ENV_STRIP_CMDLINE_IMPL( double, double )
109 : #endif
110 :
111 : #else
112 : #error "Unknown FD_ENV_STYLE"
113 : #endif
114 :
|