main.cc
changeset 177 697562a5da7c
parent 139 668a54686827
child 178 1622dc05c6ca
--- a/main.cc	Tue May 19 16:31:35 2009 +0200
+++ b/main.cc	Mon May 25 12:17:10 2009 +0200
@@ -65,9 +65,6 @@
 #include <stdlib.h>  // EXIT_FAILURE
 #include "absyntax/absyntax.hh"  // symbol_c type
 
-
-
-
 /* A macro for printing out internal parser errors... */
 #include <iostream> // required for std::cerr
 #define ERROR error_exit(__FILE__,__LINE__)
@@ -79,67 +76,84 @@
 
 
 
-/* forward declarations... */
-int stage1_2(const char *filename, const char *includedir, symbol_c **tree_root, bool full);
+
+#include "stage1_2/stage1_2.hh"
+
 //int stage3(symbol_c *tree_root);
 int stage4(symbol_c *tree_root, const char *builddir);
 
 
 static void printusage(const char *cmd) {
-  printf("syntaxe: %s [-fh] <input_file> [-I <include_directory>] [<target_directory>]\n", cmd);
+  printf("syntax: %s [-h] [-f] [-s] [-I <include_directory>] [-T <target_directory>] <input_file>\n", cmd);
+  printf("  h : show this help message\n");
   printf("  f : full token location on error messages\n");
-  printf("  h : show this help message\n");
+      /******************************************************/
+      /* whether we are suporting safe extensions           */
+      /* as defined in PLCopen - Technical Committee 5      */
+      /* Safety Software Technical Specification,           */
+      /* Part 1: Concepts and Function Blocks,              */
+      /* Version 1.0 – Official Release                     */
+      /******************************************************/
+  printf("  s : allow use of safe extensions\n");
 }
 
 
 
 int main(int argc, char **argv) {
   symbol_c *tree_root;
-  char * includedir = NULL;
   char * builddir = NULL;
-  bool full = false;
-  int offset = 0; 
+  stage1_2_options_t stage1_2_options = {false, false, NULL};
+  int optres, errflg = 0;
+/*
+  extern char *optarg;
+  extern int optind, optopt;
+*/
 
-  if (argc < 2 || argc > 6) {
-    printusage(argv[0]);
-    return EXIT_FAILURE;
+  while ((optres = getopt(argc, argv, ":hfsI:T:")) != -1) {
+    switch(optres) {
+    case 'h':
+      printusage(argv[0]);
+      return 0;
+      break;
+    case 'f':
+      stage1_2_options.full_token_loc = true;
+      break;
+    case 's':
+      stage1_2_options.safe_extensions = true;
+      break;
+    case 'I':
+      stage1_2_options.includedir = optarg;
+      break;
+    case ':':       /* -I or -T without operand */
+      fprintf(stderr, "Option -%c requires an operand\n", optopt);
+      errflg++;
+      break;
+    case '?':
+    default:
+      fprintf(stderr, "Unrecognized option: -%c\n", optopt);
+      errflg++;
+      break;
+    }
   }
 
-  if (strcmp(argv[1], "-h") == 0) {
-    printusage(argv[0]);
-    return 0;
+  if (optind == argc) {
+    fprintf(stderr, "Missing input file\n");
+    errflg++;
   }
 
-  if (strcmp(argv[1], "-f") == 0) {
-    if (argc == 2) {
+  if (optind > argc) {
+    fprintf(stderr, "Too many input files\n");
+    errflg++;
+  }
+
+  if (errflg) {
       printusage(argv[0]);
       return EXIT_FAILURE;
-    }
-    full = true;
-    offset = 1;
-  }
-    
-  if (argc == (5 + offset)) {
-    builddir = argv[4 + offset];
-    argc = 4 + offset;
   }
 
-  if (argc == (4 + offset)) {
-    if (strcmp(argv[2 + offset], "-I") != 0) {
-      printusage(argv[0]);
-      return EXIT_FAILURE;
-    }
-    includedir = argv[3 + offset];
-    argc = 2 + offset;
-  }
-
-  if (argc == (3 + offset)) {
-    builddir = argv[2 + offset];
-    argc = 2 + offset;
-  }    
 
   /* 1st Pass */
-  if (stage1_2(argv[1 + offset], includedir, &tree_root, full) < 0)
+  if (stage1_2(argv[optind], &tree_root, stage1_2_options) < 0)
     return EXIT_FAILURE;
 
   /* 2nd Pass */