diff src/fftw-3.3.3/libbench2/my-getopt.c @ 10:37bf6b4a2645

Add FFTW3
author Chris Cannam
date Wed, 20 Mar 2013 15:35:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fftw-3.3.3/libbench2/my-getopt.c	Wed Mar 20 15:35:50 2013 +0000
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2003, 2007-11 Matteo Frigo
+ * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "config.h"
+#include "my-getopt.h"
+
+int my_optind = 1;
+const char *my_optarg = 0;
+static const char *scan_pointer = 0;
+
+void my_usage(const char *progname, const struct my_option *opt)
+{
+    int i;
+    size_t col = 0;
+
+    fprintf(stdout, "Usage: %s", progname);
+    col += (strlen(progname) + 7);
+    for (i = 0; opt[i].long_name; i++) {
+	size_t option_len;
+
+	option_len = strlen(opt[i].long_name);
+	if (col >= 80 - (option_len + 16)) {
+	    fputs("\n\t", stdout);
+	    col = 8;
+	}
+	fprintf(stdout, " [--%s", opt[i].long_name);
+	col += (option_len + 4);
+	if (opt[i].short_name < 128) {
+	    fprintf(stdout, " | -%c", opt[i].short_name);
+	    col += 5;
+	}
+	switch (opt[i].argtype) {
+	    case REQARG:
+		 fputs(" arg]", stdout);
+		 col += 5;
+		 break;
+	    case OPTARG:
+		 fputs(" [arg]]", stdout);
+		 col += 10;
+		 break;
+	    default:
+		 fputs("]", stdout);
+		 col++;
+	}
+    }
+
+    fputs ("\n", stdout);
+}
+
+int my_getopt(int argc, char *argv[], const struct my_option *optarray)
+{
+     const char *p;
+     const struct my_option *l;
+
+     if (scan_pointer && *scan_pointer) {
+	  /* continue a previously scanned argv[] element */
+	  p = scan_pointer;
+	  goto short_option;
+     } else {
+	  /* new argv[] element */
+	  if (my_optind >= argc)
+	       return -1; /* no more options */
+
+	  p = argv[my_optind];
+     
+	  if (*p++ != '-')  
+	       return (-1); /* not an option */
+
+	  if (!*p) 
+	       return (-1); /* string is exactly '-' */
+	       
+	  ++my_optind;
+     }
+
+     if (*p == '-') {
+	  /* long option */
+	  scan_pointer = 0;
+	  my_optarg = 0;
+
+	  ++p;
+	  
+	  for (l = optarray; l->short_name; ++l) {
+	       size_t len = strlen(l->long_name);
+	       if (!strncmp(l->long_name, p, len) && 
+		   (!p[len] || p[len] == '=')) {
+		    switch (l->argtype) {
+			case NOARG: 
+			     goto ok;
+			case OPTARG: 
+			     if (p[len] == '=')
+				  my_optarg = p + len + 1;
+			     goto ok;
+			case REQARG: 
+			     if (p[len] == '=') {
+				  my_optarg = p + len + 1;
+				  goto ok;
+			     }
+			     if (my_optind >= argc) {
+				  fprintf(stderr, 
+					  "option --%s requires an argument\n",
+					  l->long_name);
+				  return '?';
+			     }
+			     my_optarg = argv[my_optind];
+			     ++my_optind;
+			     goto ok;
+		    }
+	       }
+	  }
+     } else {
+     short_option:
+	  scan_pointer = 0;
+	  my_optarg = 0;
+
+	  for (l = optarray; l->short_name; ++l) {
+	       if (l->short_name == (char)l->short_name &&
+		   *p == l->short_name) {
+		    ++p;
+		    switch (l->argtype) {
+			case NOARG: 
+			     scan_pointer = p;
+			     goto ok;
+			case OPTARG: 
+			     if (*p)
+				  my_optarg = p;
+			     goto ok;
+			case REQARG: 
+			     if (*p) {
+				  my_optarg = p;
+			     } else {
+				  if (my_optind >= argc) {
+				       fprintf(stderr, 
+					  "option -%c requires an argument\n",
+					  l->short_name);
+				       return '?';
+				  }
+				  my_optarg = argv[my_optind];
+				  ++my_optind;
+			     }
+			     goto ok;
+		    }
+	       }
+	  }
+     }
+
+     fprintf(stderr, "unrecognized option %s\n", argv[my_optind - 1]);
+     return '?';
+
+ ok:
+     return l->short_name;
+}
+