/[svn]/ircd-hybrid-8/src/getopt.c
ViewVC logotype

Diff of /ircd-hybrid-8/src/getopt.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1356  
changed lines
  Added in v.1357

svnadmin@ircd-hybrid.org
ViewVC Help
Powered by ViewVC 1.1.28