From 10b706288aea943aa25ae8f6cb178fd5e8729548 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Mon, 3 Jan 2005 19:24:11 +0100
Subject: [PATCH] Added parsing of options.

Rev: src/mklibpike.pike:1.3
---
 src/mklibpike.pike | 83 ++++++++++++++++++++++++++++++++++++----------
 1 file changed, 65 insertions(+), 18 deletions(-)

diff --git a/src/mklibpike.pike b/src/mklibpike.pike
index 738a08a5a3..0faa29263c 100644
--- a/src/mklibpike.pike
+++ b/src/mklibpike.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: mklibpike.pike,v 1.2 2005/01/03 17:59:05 grubba Exp $
+ * $Id: mklibpike.pike,v 1.3 2005/01/03 18:24:11 grubba Exp $
  *
  * Create strapping code for a list of symbols in pike.so,
  * and the pike headerfiles.
@@ -77,26 +77,73 @@ mapping(string:array(array(Parser.C.Token))) parse(array(Parser.C.Token) tokens)
 int main(int argc, array(string) argv)
 {
   array(string) headers = default_headers;
-  array(string) srcdirs = ({ ".", "/home/grubba/src/Pike/7.7/src", });
-  array(string) symbols = ({
-    "init_pike",
-    "init_pike_runtime",
-    "pike_set_default_master",
-    "set_pike_debug_options",
-  });
+  array(string) srcdirs = ({ "." });
+  array(string) symbols = ({ });
 
   Stdio.File out = Stdio.stdout;
 
-  // FIXME: Argument parsing here.
+  foreach(Getopt.find_all_options(argv, ({
+		 ({ "help", Getopt.NO_ARG, ({ "-h", "--help" }) }),
+		 ({ "header", Getopt.HAS_ARG, ({ "-i", "--include" }) }),
+		 ({ "dir", Getopt.HAS_ARG, ({ "-I", "--include-dir" }) }),
+		 ({ "out", Getopt.HAS_ARG, ({ "-o", "--out" }) }),
+		 ({ "sym", Getopt.HAS_ARG, ({ "-s", "--sym" }) }),
+		 ({ "sym-file", Getopt.HAS_ARG, ({ "-S", "--sym-file" }) }),
+			       }), 1), [string key, string val]) {
+    switch(key) {
+    case "help":
+      //   -h	Help.
+      werror("Usage:\n"
+	     "  %s [ -I <include directory> ... ] \\\n"
+	     "     [ -i <header-file> ... ] \\\n"
+	     "     [ -s <symbol> ... ] \\\n"
+	     "     [ -S <symbol-file> ... ] \\\n"
+	     "     [ -o <output-file> ]\n",
+	     argv[0]);
+      exit(0);
+      break;
+    case "header":
+      //   -i	Add include file.
+      headers += ({ val });
+      break;
+    case "dir":
+      //   -I	Add include directory.
+      srcdirs += ({ val });
+      break;
+    case "out":
+      //   -o	Specify output filename.
+      if (out != Stdio.stdout) {
+	werror("Output file specified multiple times.\n");
+	exit(1);
+      }
+      out = Stdio.File();
+      if (!out->open(val, "wct")) {
+	werror("Failed to open %O for writing.\n", val);
+	exit(1);
+      }
+      break;
+    case "sym":
+      //   -s	Add single symbol.
+      symbols += ({ val });
+      break;
+    case "sym-file":
+      //   -S	Specify symbol file.
+      string raw_syms = Stdio.read_file(val);
+      if (!raw_syms) {
+	werror("Failed to open symbol file %O.\n", val);
+	exit(1);
+      }
+      symbols += String.trim_whites((replace(raw_syms, "\r", "")/"\n")[*]);
+      break;
+    }
+  }
+
+  argv = Getopt.get_args(argv, 1);
 
-  // Suggested arguments:
-  //
-  //   -h	Help.
-  //   -i	Add include file.
-  //   -I	Add include directory.
-  //   -o	Specify output filename.
-  //   -s	Add single symbol.
-  //   -S	Specify symbol file.
+  if (sizeof(argv) != 1) {
+    werror("Too many arguments to %s.\n", argv[0]);
+    exit(1);
+  }
 
   string raw = cpp(sprintf("%{#include \"%s\"\n%}", headers), "include_all.c",
 		   0,
@@ -112,7 +159,7 @@ int main(int argc, array(string) argv)
   mapping(string:array(array(Parser.C.Token))) symbol_info = parse(tokens);
 
   int fail;
-  foreach(symbols, string sym) {
+  foreach(Array.uniq(sort(symbols)), string sym) {
     array(array(Parser.C.Token)) info = symbol_info[sym];
     if (!info) {
       werror("Symbol %O not found!\n", sym);
-- 
GitLab