1/* -----------------------------------------------------------------------------
2 * See the LICENSE file for information on copyright, usage and redistribution
3 * of SWIG, and the README file for authors - http://www.swig.org/release.html.
4 *
5 * getopt.c
6 *
7 * Handles the parsing of command line options.  This is particularly nasty
8 * compared to other utilities given that command line options can potentially
9 * be read by many different modules within SWIG.  Thus, in order to make sure
10 * there are no unrecognized options, each module is required to "mark"
11 * the options that it uses.  Afterwards, we can make a quick scan to make
12 * sure there are no unmarked options.
13 *
14 * TODO:
15 *     - This module needs to be modified so that it doesn't call exit().
16 *       Should have cleaner error handling in general.
17 * ----------------------------------------------------------------------------- */
18
19char cvsroot_getopt_c[] = "$Id: getopt.c 10926 2008-11-11 22:17:40Z wsfulton $";
20
21#include "swig.h"
22
23static char **args;
24static int numargs;
25static int *marked;
26
27/* -----------------------------------------------------------------------------
28 * Swig_init_args()
29 *
30 * Initialize the argument list handler.
31 * ----------------------------------------------------------------------------- */
32
33void Swig_init_args(int argc, char **argv) {
34  int i;
35  assert(argc > 0);
36  assert(argv);
37
38  numargs = argc;
39  args = argv;
40  marked = (int *) malloc(numargs * sizeof(int));
41  for (i = 0; i < argc; i++) {
42    marked[i] = 0;
43  }
44  marked[0] = 1;
45}
46
47/* -----------------------------------------------------------------------------
48 * Swig_mark_arg()
49 *
50 * Marks an argument as being parsed.
51 * ----------------------------------------------------------------------------- */
52
53void Swig_mark_arg(int n) {
54  assert(marked);
55  assert((n >= 0) && (n < numargs));
56  marked[n] = 1;
57}
58
59/* -----------------------------------------------------------------------------
60 * Swig_check_marked()
61 *
62 * Checks to see if argument has been picked up.
63 * ----------------------------------------------------------------------------- */
64
65int Swig_check_marked(int n) {
66  assert((n >= 0) && (n < numargs));
67  return marked[n];
68}
69
70/* -----------------------------------------------------------------------------
71 * Swig_check_options()
72 *
73 * Checkers for unprocessed command line options and errors.
74 * ----------------------------------------------------------------------------- */
75
76void Swig_check_options(int check_input) {
77  int error = 0;
78  int i;
79  int max = check_input ? numargs - 1 : numargs;
80  assert(marked);
81  for (i = 1; i < max; i++) {
82    if (!marked[i]) {
83      Printf(stderr, "swig error : Unrecognized option %s\n", args[i]);
84      error = 1;
85    }
86  }
87  if (error) {
88    Printf(stderr, "Use 'swig -help' for available options.\n");
89    exit(1);
90  }
91  if (check_input && marked[numargs - 1]) {
92    Printf(stderr, "Must specify an input file. Use -help for available options.\n");
93    exit(1);
94  }
95}
96
97/* -----------------------------------------------------------------------------
98 * Swig_arg_error()
99 *
100 * Generates a generic error message and exits.
101 * ----------------------------------------------------------------------------- */
102
103void Swig_arg_error(void) {
104  Printf(stderr, "SWIG : Unable to parse command line options.\n");
105  Printf(stderr, "Use 'swig -help' for available options.\n");
106  exit(1);
107}
108