Cosa fa: E' una classe per facilitare la gestione dei parametri (switch) della linea di comando.
Il materiale accessibile da queste pagine fanno parte di una serie di progetti per i quali non è previsto ulteriore sviluppo, ma mantengono la propria validità per studio o base per implementarle in altri progetti. Il loro impiego in altri software e' libero. La loro riproduzione su siti e/o stampa deve avvenire nel rispetto della normativa del diritto d'autore. Per qualunque domanda, mandare una email utilizzando la sezione Contatti di questo sito.
Modulo:
Listato/Codice sorgente: /* ------------------------------------------------------------------------ What it does ? Gestisce la command line DOS-Style Author Paolo Guccini Internet E-mail: lettori@paologuccini.it // ------------------------------------------------------------------------ Release history 06/OTT/92 : Riadattamento da un vecchio progetto che avevo lasciato in soffitta... 02/MAG/93 : aggiunto case sensitive 22/GIU/93 : corretto getnextarg. prendeva come lunghezza massima la lunghezza dello switch : modificato costruttore con valori di default : corretto getnextswitch() che non metteva mai maiuscolo : e che se chiamato in presenza di uno switch, ne causava il salto. 06/NOV/93 : trasformato i valori "unsigned int" in "int" 03/mar/94 : aggiunta funzione per eseguire test sulla presenza di un determinato switch 20/giu/94 fix bug a testswitch che non rispristinava il puntatore degli switch 13/ago/94 fix bug in "getnextpar()" che al termine dei parametri mangiava lo switch successivo. 20/AGO/94 inserita funzione di acquisizione dal DOS del tipo di carattere che identifica lo switch in relazione al set del la nazione */ // ------------------------------------------------------------------------ #include <string.h> #include <dos.h> #include <cmdline.hpp> // ------------------------------------------------------------------------ CmdLine::CmdLine( int clargc , char ** clargv , int xswlen , int xswparlen , int casesensitive ) { argc = 0 ; maxargc = clargc ; argv = clargv ; swlen = xswlen ; swparlen = xswparlen ; //arglen = 64 ; casesensitiveflag = casesensitive ; // identifica il carattere identificante lo switch !!940820 // (la barra '/' o il trattino '-' ) /* _AX = 0x3700; geninterrupt(0x21); swChar = _DL; */ swChar = '/' ; // eliminato geniterrupt perche' WinNT non lo ammette } // ------------------------------------------------------------------------ // Returns // 0 = fine switches // 1 = trovato int CmdLine::getnextswitch( char * swstr ) { int retval = 0 ; char *sw = swstr ; // prossimo switch argc ++ ; // salta i parametri dello switch corrente while ( ( argc < maxargc ) && ( * ( argv [argc] ) != swChar ) ) { argc ++ ; } /* se non e' uscito per errore, allora estrae swith */ if ( argc < maxargc ) { char * a = argv [argc] ; int maxlen = swlen ; a ++ ; // salta il carattere '/' oppure '-' while ( maxlen -- > 0 && ( * a ) ) { * sw ++ = * a ++ ; } retval = 1 ; } * sw = 0x00 ; // se non case sensitive allora tutto in maiuscole if ( casesensitiveflag == 0 ) { strupr( swstr ) ; } return retval ; } /* ------------------------------------------------------------------------ * Member * prende dalla linea comandi un parametro dello switch * trovato da ::getnextswitch() * Returns * 0 = non trovato parametro per lo switches * 1 = trovato */ int CmdLine::getnextpar( char * swparstr ) { int retval = 0 ; if ( ( (argc+1) < maxargc ) && ( * ( argv [argc+1] ) != swChar ) ) { // prossimo parametro argc ++ ; char * a = argv [argc] ; int maxlen = swparlen ; while ( maxlen -- > 0 && ( * a ) ) { * swparstr ++ = * a ++ ; } retval = 1 ; } * swparstr = 0x00 ; return retval ; } // ------------------------------------------------------------------------ char * CmdLine::getswparadr( void ) { return argv [argc] ; } /* ------------------------------------------------------------------------ // Returns // 0 = fine argoments // 1 = trovato */ int CmdLine::getnextarg( char * argstr ) { int retval = 0 ; // prossimo parametro dello switch argc ++ ; // estrae swith if ( argc < maxargc && * (argv [argc] ) != swChar && * (argv [argc] ) != 0x00 ) { char * a = argv [argc] ; int maxlen = swparlen ; while ( maxlen -- > 0 && ( * a ) ) { * argstr ++ = * a ++ ; } retval = 1 ; } else { argc -- ; } * argstr = 0x00 ; return retval ; } // ------------------------------------------------------------------------ void CmdLine::nextreset( void ) { argc = 0 ; } /* ------------------------------------------------------------------------ FUNZIONE Ricerca se e' presente un determinato switch sulla commandline Return 0 : non trovato 1 : trovato -1 : errore */ int CmdLine::testswitch( char * swstrcercare ) { int retval = 0 ; int oldargc = argc ; // memorizza attuale posizione puntatore agli switches char * strsw = new char [ swlen + 1 ] ; if ( strsw != NULL ) { while ( getnextswitch( strsw ) ) { if ( 0 == strcmp( swstrcercare , strsw ) ) { retval = 1 ; break ; } } delete strsw ; } else { retval = -1 ; } // ripristina il puntatore agli switches argc = oldargc ; return retval ; } // ------------------------------------------------------------------------ void CmdLine::setswlen( int l ) { swlen = l ; } // ------------------------------------------------------------------------ void CmdLine::setparlen( int l ) { swparlen = l ; } // ------------------------------------------------------------------------ /* void CmdLine::setarglen( int l ) { arglen = l ; } */ // ------------------------------------------------------------------------ void CmdLine::setcasesensitive( int yn ) { casesensitiveflag = yn ; } // ------------------------------------------------------------------------ /* #include <iostream.h> void main( int argc , char ** argv ) { char argstr[64] ; char swstr[34] ; char parstr[64] ; CmdLine comml ( argc , argv , sizeof swstr +1 , sizeof parstr +1 ) ; cout << "Estrae e visualizza i dati della command line" << endl << "ciclicamente sino a che l'utente non interrompe l'elaborazione" << endl << endl ; while (1) { cout << "----------- Estrazione dati" << endl ; while ( comml.getnextarg( argstr ) ) { cout << "Argomento :" << argstr << "\n" ; } cout << endl ; while ( comml.getnextswitch( swstr ) ) { cout << "Switch :" << swstr << "\n" ; while ( comml.getnextpar( parstr ) ) { cout << "Parametro :" << parstr << "\n" ; } cout << endl ; } // rinizia dal primo elemento comml.nextreset() ; } } */ // ------------------------------------------------------------------------
File header/include: // ------------------------------------------------------------------------ typedef unsigned int u_int ; // ------------------------------------------------------------------------ class CmdLine { private: int argc ; // ultimo usato int maxargc ; // immessi in commandline char ** argv ; // vettore dati di command line int swlen ; // massima lumghezza switch int swparlen ; // massima lunghezza parametro dello switch int casesensitiveflag ; int swChar ; // carattere che identifica lo switch sulla command line public: private : int extractswitch( char * , int , char * ) ; public : CmdLine( int , char ** , int swlen = 16 , int swparlen = 64 , int casesensitive = 0 ) ; char *getswparadr( void ) ; int getnextarg( char * ) ; int getnextswitch( char * ) ; int getnextpar( char * swparstr ) ; int testswitch( char * swstr ) ; void nextreset( void ) ; void setswlen( int ) ; void setparlen( int ) ; void setarglen( int ) ; void setcasesensitive( int ) ; } ; // ------------------------------------------------------------------------