Make your own free website on Tripod.com
Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

options.cpp File Reference

#include <cstdlib>
#include <cctype>
#include <cstring>
#include "utils/bitcompat.h"
#include "options.h"

Go to the source code of this file.

Functions

int get_options (int argc, char **argv, option *opttable)


Function Documentation

int get_options int    argc,
char **    argv,
option   opttable
 

Definition at line 43 of file options.cpp.

References _option::names, optionBool, optionLong, optionString, _option::type, and _option::val.

Referenced by ReadOptions().

00044 {
00045   option *opt;
00046   char *p, *next_char;
00047   // prima non opzione e inizio indice opzioni
00048   int optind, optno, optfirstind;
00049   optno = optind = 1;
00050   for ( ; optind<argc; )
00051   {
00052     // se non e' un'opzione ritorna
00053     while( argv[optind][0] != '-' )
00054       if ( ++optind == argc )
00055         return optno;
00056 
00057     optfirstind = optind;
00058 
00059     if ( argv[optind][1] == '-' )
00060     {
00061       // caso '--' ritorna indica successivo elemento
00062       if (argv[optind][2] == '\0' )
00063         return optind+1;
00064       for(opt = opttable; ; ++opt)
00065       {
00066         if ( opt->names == NULL )
00067             return -optind;
00068         p = opt->names;
00069 
00070         // caso parametri lunghi
00071         for( ;*(p=p+strlen(p)+1); )
00072         {
00073           int l = strlen(p);
00074           if ( strncmp(p,argv[optind]+2,l) == 0 )
00075           {
00076             next_char = &argv[optind][2+l];
00077             if ( opt->type != optionBool && *next_char == '=' )
00078             {
00079               // --arg=value
00080               p = next_char+1;
00081               goto param_value;
00082             }
00083             // prova con un'altra opzione
00084             if (*next_char != '\0')
00085               break;
00086             if ( opt->type == optionBool)
00087               goto param_value;
00088             // --arg value
00089             goto param_found;
00090           }
00091         }
00092       }
00093       // non raggiunge mai questo punto
00094     }
00095     else
00096     {
00097       for(p = argv[optind]+1; *p != '\0' ;++p)
00098       {
00099         for( opt = opttable; ; ++opt)
00100         {
00101           if ( opt->names == NULL )
00102             return -optind;
00103 
00104           // caso parametri a caratteri singoli
00105           if ( strchr(opt->names,*p) != NULL )
00106           {
00107             if ( opt->type != optionBool )
00108             {
00109               // -a value
00110               next_char = p+1;
00111               goto param_found;
00112             }
00113             *(bool*)(opt->val) = true;
00114             break;
00115           }
00116         }
00117       }
00118       goto option_found;
00119     }
00120 
00121 param_found:
00122     // il valore dell'opzione e' il successivo parametro
00123     if (*next_char != '\0' || ++optind == argc)
00124       return -optind;
00125     p = argv[optind];
00126 param_value:
00127     // scrivi dati in output
00128     switch(opt->type)
00129     {
00130       case optionBool:
00131         *(bool*)(opt->val) = true;
00132         break;
00133       case optionString:
00134         *(const char**)(opt->val) = p;
00135         break;
00136       case optionLong:
00137         {
00138         char *pend;
00139         if ( !isdigit(*p) )
00140           return -optind;
00141         *(long*)(opt->val) = strtol(p,&pend,0);
00142         if ( *pend != '\0' )
00143           return -optind;
00144         }
00145       break;
00146     }
00147 
00148 option_found:
00149     ++optind;
00150     // sposta in fondo gli argomenti non flag
00151     if (optfirstind != optno)
00152     {
00153       // shifta num volte opzioni all'inizio
00154       for (;optind != optfirstind;)
00155       {
00156         int n = optfirstind;
00157         char *temp = argv[n];
00158         for(;--n >= optno;)
00159           argv[n+1] = argv[n];
00160         argv[optno] = temp;
00161         ++optno;
00162         ++optfirstind;
00163       }
00164     }
00165     else
00166       optno = optind;
00167 
00168   }
00169   return optno;
00170 }


Generated on Mon Jan 13 22:20:35 2003 for perdr by doxygen1.2.15