argparsing working
authorMart Lubbers <mart@martlubbers.net>
Wed, 23 Mar 2016 11:02:14 +0000 (12:02 +0100)
committerMart Lubbers <mart@martlubbers.net>
Wed, 23 Mar 2016 11:02:14 +0000 (12:02 +0100)
modelchecker/Makefile
modelchecker/main.c
modelchecker/mc.h [new file with mode: 0644]

index 5c295e6..4f09f85 100644 (file)
@@ -1,8 +1,8 @@
-PROGRAM=main
-OBJS=sokoban.o
+PROGRAM:=main
+OBJS:=sokoban.o
 
-CFLAGS=-O3 -Wextra -Wall -Werror -fno-strict-aliasing -std=gnu11 \
-       -I./sylvan/src
+CFLAGS=-O3 -Wextra -Wall -Werror -fno-strict-aliasing -std=gnu11
+CFLAGS+=-I./sylvan/src
 
 all: $(OBJS) $(PROGRAM) 
 
index 00f8b32..76f5e95 100644 (file)
 #include <stdio.h>
+#include <stdbool.h>
+#include <ctype.h>
 
 #include <sylvan.h>
+#include "mc.h"
 
 //#include <sokoban.h>
 //#include <object.h>
 //#include <coord.h>
-//#include <mc.h>
-
-int main(void){
-       // Mart:
-       // Argument parsing
-       // ./main [opts] [FILEPATH [FILEPATH ...]]
-       // -o         Objectbased
-       // -c         Coordinatebased
-       // -y         hYbrid
-       // -h         Help
-       //
-       // FUTURE:
-       // -r         Also compute the set of all reachable solution states
-       // -l LURD    Check if LURD is a valid path
-       //
-       // FILEPATH   Optional input file(s)
-       
+
+bool DEBUG = false;
+
+void usage(char *prg){
+       fprintf(stderr, 
+               "Usage:\n"
+               "\t%s [opts] [FILE [FILE [...]]]\n"
+               "\n"
+               "Options:\n"
+               "\tAll strategies are mutually exclusive\n"
+               "\t-c       coordinate based strategy\n"
+               "\t-o       object based strategy\n"
+               "\t-y       hybrid strategy\n"
+//             "\t-l LURD  lURD verification strategy\n"
+//             "\t-r       show all positions that are a valid solution\n"
+               "\n"
+               "\t-d       enable verbose debug output\n"
+               "\t-h       show this help\n"
+               "\n"
+               "Positional arguments:\n"
+               "\tFILE     zero or more sokoban screens\n"
+               "\t         when no file is specified stdin will be used\n", prg);
+}
+
+void solve(FILE *inputstream){
+       int buffer;
+       while((buffer = fgetc(inputstream)) != EOF){
+               printf("%c", buffer);
+       }
        // Alex:
        // Screen reading
        // - Removing outside walls
        // - Bucket fill
        // - [tile]
        // - tile = structure {int, int, enumtile}
-       
+
        // Both: Encoding in both schemes
        
        // Future: SMC
+}
+
+int main(int argc, char **argv){
+       strategy strat = HYBRID;
+       int optchar;
+
+       while((optchar = getopt(argc, argv, "cdhoy")) != -1){
+               switch(optchar){
+               case 'c':
+                       strat = COORD;
+                       if(DEBUG) fprintf(stderr, "Strategy changed to Coordinate based\n");
+                       break;
+               case 'd':
+                       DEBUG = true;
+                       if(DEBUG) fprintf(stderr, "Debug enabled\n");
+                       break;
+               case 'h':
+                       usage(argv[0]);
+                       return 0;
+               case 'o':
+                       strat = OBJECT;
+                       if(DEBUG) fprintf(stderr, "Strategy changed to Object based\n");
+                       break;
+               case 'y':
+                       strat = HYBRID;
+                       if(DEBUG) fprintf(stderr, "Strategy changed to Hybrid\n");
+                       break;
+               case '?':
+                       if(isprint(optopt)){
+                               fprintf(stderr, "Unknown option `-%c'.\n", optopt);
+                       } else {
+                               fprintf(stderr, "Unknown option char `-\\x%x'.\n", optopt);
+                       }
+                       return 2;
+               default:
+                       break;
+               }
+       }
+
+       if(optind == argc){
+               fprintf(stderr, "You have not specified a file, reading from stdin\n");
+               solve(stdin);
+       }
+
+       for(int filepathindex = optind; filepathindex < argc; filepathindex++){
+               char *currentfilepath = argv[filepathindex];
+               fprintf(stderr, "Processing: %s\n", currentfilepath);
+               if(DEBUG) fprintf(stderr, "Strategy: %d\n", strat);
+               FILE *currentfile = fopen(currentfilepath, "r");
+               if(DEBUG) fprintf(stderr, "Opening file\n");
+               solve(currentfile);
+               if(DEBUG) fprintf(stderr, "Closing file\n");
+               fclose(currentfile);
+       }
        return 0;
 }
diff --git a/modelchecker/mc.h b/modelchecker/mc.h
new file mode 100644 (file)
index 0000000..fd90291
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef MC_H
+#define MC_H
+
+typedef enum {OBJECT, COORD, HYBRID} strategy;
+
+#endif