ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/getopt.c
(Generate patch)

Comparing:
ircd-hybrid/src/getopt.c (file contents), Revision 32 by knight, Sun Oct 2 20:41:23 2005 UTC vs.
ircd-hybrid-8/src/getopt.c (file contents), Revision 1357 by michael, Sat Apr 21 20:47:01 2012 UTC

# Line 27 | Line 27
27  
28   #define OPTCHAR '-'
29  
30 < static void usage(const char *name);
30 >
31 > static void
32 > usage(const char *name, const struct lgetopt *opts)
33 > {
34 >  unsigned int i;
35 >
36 >  fprintf(stderr, "Usage: %s [options]\n", name);
37 >  fprintf(stderr, "Where valid options are:\n");
38 >
39 >  for (i = 0; opts[i].opt; ++i)
40 >    fprintf(stderr, "\t%c%-10s %-20s%s\n", OPTCHAR, opts[i].opt,
41 >            (opts[i].argtype == YESNO || opts[i].argtype == USAGE) ? "" :
42 >            opts[i].argtype == INTEGER ? "<number>" : "<string>",
43 >            opts[i].desc);
44 >
45 >  exit(EXIT_FAILURE);
46 > }
47  
48   void
49   parseargs(int *argc, char ***argv, struct lgetopt *opts)
50   {
51 <  int i;
52 <  char *progname = (*argv)[0];
51 >  unsigned int i;
52 >  const char *progname = (*argv)[0];
53  
54    /* loop through each argument */
55 <  for (;;)
56 <    {
57 <      int found = 0;
55 >  while (1)
56 >  {
57 >    int found = 0;
58  
59 <      (*argc)--;
60 <      (*argv)++;
61 <      
62 <      if (*argc < 1)
63 <        {
64 <          return;
65 <        }
66 <      
67 <      /* check if it *is* an arg.. */
68 <      if ((*argv)[0][0] != OPTCHAR)
69 <        {
70 <          return;
71 <        }
72 <      
73 <      (*argv)[0]++;
74 <
75 <      /* search through our argument list, and see if it matches */
76 <      for (i = 0; opts[i].opt; i++)
77 <        {
78 <          if (!strcmp(opts[i].opt, (*argv)[0]))
79 <            {
80 <              /* found our argument */
81 <              found = 1;
82 <
83 <              switch (opts[i].argtype)
84 <                {
85 <                case YESNO:
86 <                  *((int *)opts[i].argloc) = 1;
87 <                  break;
72 <                case INTEGER:
73 <                  if (*argc < 2)
74 <                    {
75 <                      fprintf(stderr, "Error: option '%c%s' requires an argument\n",
76 <                              OPTCHAR, opts[i].opt);
77 <                      usage((*argv)[0]);
78 <                    }
79 <                  
80 <                  *((int *)opts[i].argloc) = atoi((*argv)[1]);
81 <                  break;
82 <                case STRING:
83 <                  if (*argc < 2)
84 <                    {
85 <                      fprintf(stderr, "error: option '%c%s' requires an argument\n",
86 <                              OPTCHAR, opts[i].opt);
87 <                      usage(progname);
88 <                    }
59 >    (*argc)--;
60 >    (*argv)++;
61 >
62 >    if (*argc < 1 || (*argv)[0][0] != OPTCHAR)
63 >      return;
64 >
65 >    (*argv)[0]++;
66 >
67 >    /* search through our argument list, and see if it matches */
68 >    for (i = 0; opts[i].opt; i++)
69 >    {
70 >      if (!strcmp(opts[i].opt, (*argv)[0]))
71 >      {
72 >        /* found our argument */
73 >        found = 1;
74 >
75 >        switch (opts[i].argtype)
76 >        {
77 >          case YESNO:
78 >            *((int *)opts[i].argloc) = 1;
79 >            break;
80 >
81 >          case INTEGER:
82 >            if (*argc < 2)
83 >            {
84 >              fprintf(stderr, "Error: option '%c%s' requires an argument\n",
85 >                      OPTCHAR, opts[i].opt);
86 >              usage((*argv)[0], opts);
87 >            }
88                    
89 <                  *((char**)opts[i].argloc) = malloc(strlen((*argv)[1]) + 1);
90 <                  strcpy(*((char**)opts[i].argloc), (*argv)[1]);
91 <                  break;
92 <
93 <                case USAGE:
94 <                  usage(progname);
95 <                  /*NOTREACHED*/
96 <
97 <                default:
98 <                  fprintf(stderr, "Error: internal error in parseargs() at %s:%d\n",
99 <                          __FILE__, __LINE__);
100 <                  exit(EXIT_FAILURE);
101 <                }
102 <            }
103 <        }
104 <        if (!found)
105 <          {
106 <            fprintf(stderr, "error: unknown argument '%c%s'\n", OPTCHAR, (*argv)[0]);
107 <            usage(progname);
108 <          }
89 >            *((int *)opts[i].argloc) = atoi((*argv)[1]);
90 >            (*argc)--;
91 >            (*argv)++;
92 >            break;
93 >
94 >          case STRING:
95 >            if (*argc < 2)
96 >            {
97 >              fprintf(stderr, "error: option '%c%s' requires an argument\n",
98 >                      OPTCHAR, opts[i].opt);
99 >              usage(progname, opts);
100 >            }
101 >
102 >            *((char**)opts[i].argloc) = malloc(strlen((*argv)[1]) + 1);
103 >            strcpy(*((char**)opts[i].argloc), (*argv)[1]);
104 >            (*argc)--;
105 >            (*argv)++;
106 >            break;
107 >
108 >          case USAGE:
109 >            usage(progname, opts);
110 >            /* NOTREACHED */
111 >
112 >          default:
113 >            fprintf(stderr, "Error: internal error in parseargs() at %s:%d\n",
114 >                    __FILE__, __LINE__);
115 >            exit(EXIT_FAILURE);
116 >        }
117 >      }
118      }
111 }
119  
120 < static void
121 < usage(const char *name)
122 < {
123 <  int i;
124 <  
125 <  fprintf(stderr, "Usage: %s [options]\n", name);
119 <  fprintf(stderr, "Where valid options are:\n");
120 <  
121 <  for (i = 0; myopts[i].opt; i++)
122 <  {
123 <    fprintf(stderr, "\t%c%-10s %-20s%s\n", OPTCHAR, myopts[i].opt,
124 <            (myopts[i].argtype == YESNO || myopts[i].argtype == USAGE) ? "" :
125 <            myopts[i].argtype == INTEGER ? "<number>" : "<string>",
126 <            myopts[i].desc);
120 >    if (!found)
121 >    {
122 >      fprintf(stderr, "error: unknown argument '%c%s'\n",
123 >              OPTCHAR, (*argv)[0]);
124 >      usage(progname, opts);
125 >    }
126    }
128
129  exit(EXIT_FAILURE);
127   }
131

Comparing:
ircd-hybrid/src/getopt.c (property svn:keywords), Revision 32 by knight, Sun Oct 2 20:41:23 2005 UTC vs.
ircd-hybrid-8/src/getopt.c (property svn:keywords), Revision 1357 by michael, Sat Apr 21 20:47:01 2012 UTC

# Line 1 | Line 1
1 < Revision
1 > Id Revision

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)