command line, multisampling, optimisations
[csRadar.git] / csrOpt.h
diff --git a/csrOpt.h b/csrOpt.h
new file mode 100644 (file)
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;
+}