--- /dev/null
+// 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;
+}