X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=blobdiff_plain;f=csrOpt.h;fp=csrOpt.h;h=9195790ab34253f948eb81853ea79c1d9c6485de;hp=0000000000000000000000000000000000000000;hb=1d2752b69b6285d5eb6436728c6cf84228a9ccde;hpb=b95752d31a7b1e224b227093f13a72d8c2b7f34b diff --git a/csrOpt.h b/csrOpt.h new file mode 100644 index 0000000..9195790 --- /dev/null +++ b/csrOpt.h @@ -0,0 +1,175 @@ +// Supported: +// -abc +// -a value +// -ab value +// +// --long-value=test +// regular_thing + +static int csr_argi = 1; +static int csr_argj = 1; +static int csr_argc = 0; +static int csr_consume_next = 0; +static char **csr_argv; + +// Will return 0 if exhausted +int csr_argp( int argc, char *argv[] ) +{ + csr_argv = argv; + csr_argc = argc; + + static int delta_i = 0; + static int delta_j = 0; + + if( csr_argj != 1 && !csr_argv[ csr_argi ][ csr_argj ] ) + { + csr_argj = 1; + csr_argi ++; + } + + if( csr_consume_next ) + { + csr_consume_next = 0; + csr_argi ++; + } + + if( csr_argi >= argc ) + return 0; + + if( (delta_i == csr_argi) && (delta_j == csr_argj) ) + { + char *cur = &csr_argv[ csr_argi ][ csr_argj ]; + + if( *cur != '-' ) + { + fprintf( stderr, "Unknown opt '-%c'\n", *cur ); + } + else + { + fprintf( stderr, "Unknown opt '--%s'\n", cur + 1 ); + } + + exit(0); + } + + delta_i = csr_argi; + delta_j = csr_argj; + + return 1; +} + +// Example: see if -c is set +int csr_opt( char c ) +{ + char *carg = csr_argv[ csr_argi ]; + + if( carg[0] == '-' ) + { + if( carg[1] == '-' ) + return 0; + + if( carg[ csr_argj ] == c ) + { + csr_argj ++; + + return 1; + } + } + + return 0; +} + +// Example: get -c *value* +char *csr_opt_arg( char c ) +{ + if( csr_opt( c ) ) + { + if( csr_argi < csr_argc-1 ) + { + if( csr_argv[ csr_argi + 1 ][0] != '-' ) + { + csr_consume_next = 1; + return csr_argv[ csr_argi + 1 ]; + } + } + + fprintf( stderr, "Option '%c' requires argument!\n", c ); + exit(0); + } + + return NULL; +} + +// Example see if --big is set +int csr_long_opt( char *name ) +{ + char *carg = csr_argv[ csr_argi ]; + + if( carg[0] == '-' ) + { + if( carg[1] == '-' ) + { + if( !strcmp( name, carg+2 ) ) + { + csr_consume_next = 1; + return 1; + } + } + } + + return 0; +} + +// Example: get --big=value +char *csr_long_opt_arg( char *name ) +{ + char *carg = csr_argv[ csr_argi ]; + + if( carg[0] == '-' ) + { + if( carg[1] == '-' ) + { + int k = 2; int set = 0; + while( carg[ k ] ) + { + if( carg[ k ] == '=' ) + { + set = 1; + break; + } + + k ++; + } + + if( !strncmp( name, carg+2, k-2 ) ) + { + csr_consume_next = 1; + + // the rest + if( set ) + { + return carg + k + 1; + } + else + { + fprintf( stderr, "Long option '%s' requires argument\n", name ); + } + } + } + } + + return NULL; +} + +char *csr_arg(void) +{ + char *carg = csr_argv[ csr_argi ]; + + if( carg[0] != '-' ) + { + csr_argi ++; + return carg; + } + + return NULL; +}