X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmArgMgr.cxx;h=4950d679f4280944ba7cdc47fbe05c6720cde36f;hb=e7768bbebdc9a5972e396d71a3e848f5674ee378;hp=03de0461cf5b55fd83d15a5587d3740a91edaacc;hpb=e049d5e57ea67dd9ae9491a771e78cbfd03538c2;p=gdcm.git diff --git a/src/gdcmArgMgr.cxx b/src/gdcmArgMgr.cxx index 03de0461..4950d679 100644 --- a/src/gdcmArgMgr.cxx +++ b/src/gdcmArgMgr.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmArgMgr.cxx,v $ Language: C++ - Date: $Date: 2005/06/08 12:51:27 $ - Version: $Revision: 1.6 $ + Date: $Date: 2007/10/04 17:50:42 $ + Version: $Revision: 1.26 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -21,12 +21,18 @@ #include #include // For strlen +// No strcasecmp in WIN32 world, but stricmp +// http://www.opengroup.org/onlinepubs/007908799/xsh/strcasecmp.html +#ifdef _WIN32 +#define strcasecmp stricmp +#endif + #include // For strtok and strlen #include // For strtol and strtod #include "gdcmArgMgr.h" -namespace gdcm +namespace GDCM_NAME_SPACE { //------------------------------------------------------------------------- // Constructor / Destructor @@ -37,12 +43,13 @@ namespace gdcm * @param argv pointers array on the arguments passed to main() */ ArgMgr::ArgMgr(int argc, char **argv) + : ArgParamOut (NULL), ArgUsed(NULL), ArgLab(NULL), ArgStr(NULL), ArgCount(0), Appel(NULL) { int i; - int nblettre; - ArgUsed = NULL; - Appel = NULL; - + int nblettre; + ArgLab = new char *[ARGMAXCOUNT]; + ArgStr = new char *[ARGMAXCOUNT]; + /* Read the parameters of the command line *************************/ for ( ArgCount=0, nblettre=1 , i=0; i0; i-- ) + temp = Majuscule ( param ) ; + for ( i = ArgCount-1; i>0; i-- ) { - trouve = ! strcmp( ArgLab[i], temp ) ; + trouve = ( strcmp( ArgLab[i], temp )==0 ) ; if ( trouve ) { + free (temp); ArgUsed[i] = true ; for ( int j=1; j0; i-- ) @@ -182,7 +200,7 @@ char *ArgMgr::ArgMgrUnused ( ) */ int ArgMgr::ArgMgrPrintUnusedLabels () { - char *label; + const char *label; int i=0; while ( (label=ArgMgrUnused())!=0 ) { @@ -214,16 +232,16 @@ int ArgMgr::ArgMgrUsage(const char **usage ) * Saves a char. array in a parameter file * whose name is given on command line by : PARAMOUT=??? * or, as a default, by ARG_DEFAULT_PARAMOUT - * @param param char. array that defines the parameter: + * @param param char. array that defines the parameter * @return Entier correspondant au rang dans la liste de labels */ -int ArgMgr::ArgMgrSave ( char *param ) +int ArgMgr::ArgMgrSave ( const char *param ) { static int deja = 0; FILE *fd; if ( *ArgParamOut == '\0' ) return 0; - if(deja) + if ( deja ) { fd = fopen ( ArgParamOut, "a+" ); } @@ -242,12 +260,12 @@ int ArgMgr::ArgMgrSave ( char *param ) /** * \brief Gets an int value passed as an argument to a program * (use default value if not found) - * EXEMPLE: int dimx = ArgMgrGetInt ( "DIMX", 256 ); + * EXAMPLE: int dimx = ArgMgrGetInt ( "DIMX", 256 ); * @param label label name * @param defaultVal default value * @return parameter value */ -int ArgMgr::ArgMgrGetInt(char *label, int defaultVal) +int ArgMgr::ArgMgrGetInt(const char *label, int defaultVal) { return ( (ArgMgrDefined(label)) ? (atoi(ArgMgrValue(label))) @@ -257,59 +275,61 @@ int ArgMgr::ArgMgrGetInt(char *label, int defaultVal) /** * \brief Gets a float value passed as an argument to a program * (use default value if not found) - * EXEMPLE: float scale = ArgMgrGetFloat ( "SCALE", 0.33 ); - * @param label label name + * EXAMPLE: float scale = ArgMgrGetFloat ( "SCALE", 0.33 ); + * @param param label name * @param defaultVal default value * @return parameter value */ -float ArgMgr::ArgMgrGetFloat(char *label, float defaultVal) +float ArgMgr::ArgMgrGetFloat(const char *param, float defaultVal) { - return ( (ArgMgrDefined(label)) - ? ((float)atof(ArgMgrValue(label))) + return ( (ArgMgrDefined(param)) + ? ((float)atof(ArgMgrValue(param))) : (defaultVal) ); } /** * \brief Gets a 'string' value passed as an argument to a program * (use default value if not found) - * @param label label name + * EXAMPLE : char *imageName = ArgMgrGetString( "NAME", "test.dcm" ); + * @param param label name * @param defaultVal default value * @return parameter value */ -char *ArgMgr::ArgMgrGetString(char *label, char *defaultVal) +const char *ArgMgr::ArgMgrGetString(const char *param, const char *defaultVal) { - return ( (ArgMgrDefined(label)) - ? (ArgMgrValue(label)) + return ( (ArgMgrDefined(param)) + ? (ArgMgrValue(param)) : (defaultVal) ); } /** * \brief Gets a value amongst a set of values * (use default value if not found) - * EXEMPLE: int nlab = ArgMgrGetLabel("CONFIRM","NO\\YES", 0); - * @param label label name + * EXAMPLE: int nlab = ArgMgrGetLabel("CONFIRM","NO\\YES", 0); + * @param param label name * @param liste character Chain describing the various values. * Value are separated by '\\'. * Not case sensitive. * @param val number of default value * @return int : range of value amongst the values list */ -int ArgMgr::ArgMgrGetLabel (char *label, char *liste, int val ) +int ArgMgr::ArgMgrGetLabel (const char *param, const char *liste, int val ) { char *lab; - char *vallab; + const char *vallab; int i = 1; char *tmp; tmp = (char *) malloc(strlen(liste)+1); strcpy(tmp,liste); - if ( (vallab = ArgMgrGetString(label,(char *)NULL)) != 0 ) + if ( (vallab = ArgMgrGetString(param,(const char *)NULL)) != 0 ) { for ( lab = strtok (tmp,"\\"); lab != 0; lab = strtok(0L,"\\"), i++ ) { - if ( strcmp(maj(lab),maj(vallab))==0) + // strcmp ignoring case + if( strcasecmp(lab, vallab) == 0) return i; } val=0; @@ -320,23 +340,24 @@ int ArgMgr::ArgMgrGetLabel (char *label, char *liste, int val ) /** * \brief Demands a value amongst a set of values (abort if not found) - * EXEMPLE: int nlab = ArgMgrWantLabel("CONFIRM","NO\\YES", usage); - * @param label label name + * EXaMPLE: int nlab = ArgMgrWantLabel("CONFIRM","NO\\YES", usage); + * @param param label name * @param liste character Chain describing the various values. * Labels are separated by '\\'. * No case sensitive. + * WARNING this will be changed (not const) * @param usage Usage program (displayed if label not found) * @return int : range of value amongst the values list */ -int ArgMgr::ArgMgrWantLabel (char *label, char *liste, const char **usage ) +int ArgMgr::ArgMgrWantLabel (const char *param, char *liste, const char **usage ) { char *lab; - char *vallab; + const char *vallab; int i = 1; - if ( (vallab = ArgMgrGetString(label,0)) != 0 ) + if ( (vallab = ArgMgrGetString(param,0)) != 0 ) { for ( lab = strtok (liste,"\\"); lab != 0; lab = strtok(0L,"\\"), i++ ) - if ( strcmp(maj(lab),maj(vallab))==0) + if ( strcasecmp(lab,vallab)==0) return i; return 0; } @@ -347,12 +368,12 @@ int ArgMgr::ArgMgrWantLabel (char *label, char *liste, const char **usage ) /** * \brief Demands an int value passed as an argument to a program * If not found usage is displayed and the prog aborted - * EXEMPLE: int dimx = ArgMgrWantInt ( "DIMX", usage ); + * EXAMPLE: int dimx = ArgMgrWantInt ( "DIMX", usage ); * @param label label name * @param usage Usage program (displayed if label not found) * @return parameter value */ -int ArgMgr::ArgMgrWantInt (char *label, const char **usage) +int ArgMgr::ArgMgrWantInt (const char *label, const char **usage) { return ( (ArgMgrDefined(label) ) ? (atoi(ArgMgrValue(label) ) ) @@ -362,27 +383,27 @@ int ArgMgr::ArgMgrWantInt (char *label, const char **usage) /** * \brief Demands a float value passed as an argument to a program * If not found usage is displayed and the prog aborted - * EXEMPLE: float scale = ArgMgrWantFloat ( "SCALE", usage ); + * EXAMPLE: float scale = ArgMgrWantFloat ( "SCALE", usage ); * @param label label name * @param usage Usage program (displayed if label not found) * @return parameter value */ -float ArgMgr::ArgMgrWantFloat (char *label, const char **usage) +float ArgMgr::ArgMgrWantFloat (const char *label, const char **usage) { return ( (ArgMgrDefined(label) ) ? ((float)atof(ArgMgrValue(label) ) ) - : (ArgMgrUsage(usage),1.0) ); + : (ArgMgrUsage(usage),(float)1.0) ); } /** * \brief Demands a 'string' value passed as an argument to a program * If not found usage is displayed and the prog aborted - * EXEMPLE: char *code = ArgMgrWantString ( "CODE", usage ); + * EXAMPLE: char *code = ArgMgrWantString ( "CODE", usage ); * @param label Parameter label * @param usage Usage program (displayed if label not found) * @return parameter value */ -char *ArgMgr::ArgMgrWantString(char *label, const char **usage) +char *ArgMgr::ArgMgrWantString(const char *label, const char **usage) { return ( (ArgMgrDefined(label) ) ? (ArgMgrValue(label) ) @@ -390,13 +411,13 @@ char *ArgMgr::ArgMgrWantString(char *label, const char **usage) } /** - * \brief decodage des elements d'un argument 'ensemble de STRING' de lgr qcq + * \brief decodes and returns an array of 'STRING' + * EXAMPLE: char **codes = ArgMgrGetListOfString ( "CODES", &nbOfCodes ); * @param label label name - * @param number nb of found elements - * @return Pointer to the array - * Pointer NULL if error + * @param number nb of found 'STRINGs' + * @return Pointer to the 'STRING' array; NULL if error */ -char **ArgMgr::ArgMgrGetListOfString ( char *label, int *number ) +char **ArgMgr::ArgMgrGetListOfString ( const char *label, int *number ) { int taille; char *value = ArgMgrValue(label); @@ -404,7 +425,10 @@ char **ArgMgr::ArgMgrGetListOfString ( char *label, int *number ) char **elem; char *chainecur; if (!value) + { + *number = 0; return 0; + } *number = IdStrCountChar(value,',')+1; /* nb Elements = nb Commas +1 */ taille = *number; liste = (char **) malloc (sizeof(char*) * taille + strlen(value)+1); @@ -421,27 +445,30 @@ char **ArgMgr::ArgMgrGetListOfString ( char *label, int *number ) } /** - * \brief decodage des elements d'un argument 'liste d'INTEGER' de lgr qcq + * \brief decodes and returns an array of 'INT' + * EXAMPLE: int *points = ArgMgrGetListOfInt ( "POINTS", &nbOfPoints ); * @param label label name - * @param number nb of found elements - * @return Pointer to the array - * Pointer NULL if error + * @param number nb of found INT + * @return Pointer to the INT array; NULL if error */ -int *ArgMgr::ArgMgrGetListOfInt ( char *label, int *number ) +int *ArgMgr::ArgMgrGetListOfInt ( const char *label, int *number ) { char *value = ArgMgrValue(label); int *liste; int *elem; int taille; if (!value) + { + *number = 0; return 0; - *number = IdStrCountChar(value,',')+1; /* nb Elements = nb Commas +1 */ + } + *number = IdStrCountChar(value,',')+1; /* nb Elements = nb Commas +1 */ taille= *number; liste = (int *) calloc (1,sizeof(int)*taille ); if ( !liste ) return 0; elem = liste; - *number = 1; + //*number = 1; while ( taille>0 ) { @@ -459,13 +486,12 @@ return liste; } /** - * \brief decodage des elements d'un argument 'liste de FLOAT' de lgr qcq + * \brief decodes and returns an array of 'FLOAT' * @param label label name - * @param number taille de la liste trouvee - * @return Pointer vers le tableau de lgr 'taille' - * NULL if error + * @param number number of found FLOATs + * @return Pointer to the FLOAT array; NULL if error */ -float *ArgMgr::ArgMgrGetListOfFloat ( char *label, int *number ) +float *ArgMgr::ArgMgrGetListOfFloat ( const char *label, int *number ) { char *value = ArgMgrValue(label); float *liste; @@ -477,9 +503,12 @@ float *ArgMgr::ArgMgrGetListOfFloat ( char *label, int *number ) taille= *number; liste = (float *) calloc (1,sizeof(float)*taille ); if ( !liste ) + { + *number = 0; return 0; + } elem = liste; - *number = 1; + //*number = 1; while ( taille>0 ) { @@ -496,6 +525,66 @@ float *ArgMgr::ArgMgrGetListOfFloat ( char *label, int *number ) return liste; } +/** + * \brief decodes and returns an array of 'INT pairs', passed in decimal + * @param param label name + * @param number nb of found pairs + * @return pointer to the array of 'INT pairs'; NULL if fail + */ +int *ArgMgr::ArgMgrGetIntEnum ( const char *param, int *number ) +{ + char *value = ArgMgrValue(param); + int *liste; + if (!value) + { + *number = 0; + return 0; + } + liste = IdStrIntEnum(value, number); + return liste; +} + +/** + * \brief decodes and returns an array of 'INT16 pairs', passed in hexadecimal + * @param param label name + * @param number nb of found pairs + * @return pointer to the array of 'INT16 pairs'; NULL if fail + */ +uint16_t *ArgMgr::ArgMgrGetXInt16Enum ( const char *param, int *number ) +{ + char *value = ArgMgrValue(param); + uint16_t *liste; + if (!value) + { + *number = 0; + return 0; + } + liste = IdStrXInt16Enum(value, number); + return liste; +} +/** + * \brief decodes and returns an array of 'FLOAT pairs' + * @param param label name + * @param number nb of found pairs + * @return pointer to the array of 'FLOAT pairs'; NULL if fail + + */ +float *ArgMgr::ArgMgrGetFloatEnum ( const char *param, int *number ) +{ + char *value = ArgMgrValue(param); + float *liste; + if (!value) + { + *number = 0; + return 0; + } + liste = IdStrFloatEnum(value, number); + return liste; +} + +// ------------------------ Those are 'service functions' --------------------- +// ------------------------ internal use only --------------------- + /** * \brief Counts the nb of occurrences of a given charact within a 'string' * @param chaine Pointer to the 'string' @@ -513,10 +602,10 @@ int ArgMgr::IdStrCountChar (char *chaine, int caract) } /** - * \brief returns an array of set of 'INT pairs' - * @param value char array decribing a set of 'INT pairs' (deb1,fin1, deb2,fin2, ...) - * @param number nb of found pairs - * @return array of set of 'INT pairs' + * \brief returns an array of 'INT pairs' + * @param value char array decribing a set of 'INT pairs' (f1-l1, f2-l2, ...) + * @param number nb of found INT pairs + * @return pointer to the array of 'INT pairs' */ int *ArgMgr::IdStrIntEnum ( char* value, int *number) { @@ -560,12 +649,61 @@ int *ArgMgr::IdStrIntEnum ( char* value, int *number) } return liste; } - + /** - * \brief returns an array a set of 'FLOAT pairs' - * @param value char array decribing a set of 'FLOAT pairs' (deb1,fin1, deb2,fin2, ...) - * @param number nb of found pairs - * @return array of set of 'FLOAT pairs' + * \brief returns an array of set of 'INT16 pairs', passed in Hexadecimal + * @param value char array decribing a set of 'INT16 pairs' (f1-l1, f2-l2, ...) + * coded in hexadecimal e.g. 0x0008,0x00ac + * @param number nb of found pairs + * @return array of set of 'INT16 pairs' + */ +uint16_t *ArgMgr::IdStrXInt16Enum ( char *value, int *number) +{ + uint16_t *liste; + int taille; + int i; + + *number = IdStrCountChar(value,',')+1; /* nb Elements = nb Commas +1 */ + taille= *number; + liste = (uint16_t *) calloc (1,sizeof(uint16_t)*2*taille ); + if ( !liste ) + { + return 0; + } + i=0; + while ( taille>0 ) + { + liste[i] = (uint16_t) strtol ( value, &value, 16 ); + if ( *value == '\0' ) + { + liste[i+1]=liste[i]; + return liste; + } + if ( *(value++) != '-' ) + { + liste[i+1]=liste[i]; + value--; + } + else + { + liste[i+1] = (uint16_t) strtol ( value, &value, 16 ); + } + if ( *value == '\0' ) + return liste; + if ( *(value++) != ',' ) + { + free (liste); + return 0; + } + taille --; i+=2; + } + return liste; +} +/** + * \brief returns an array of 'FLOAT pairs' + * @param value char array decribing a set of 'FLOAT pairs' (f1-l1, f2-l2, ...) + * @param number nb of found pairs + * @return pointer to the array of 'FLOAT pairs'; NULL if fail */ float *ArgMgr::IdStrFloatEnum (char *value, int *number) { @@ -607,40 +745,6 @@ float *ArgMgr::IdStrFloatEnum (char *value, int *number) return liste; } -/** - * \brief decodage des elements d'un argument 'paires d'int' de lgr quelconque - * @param label label name - * @param number taille de l'ensemble de paires trouvee - * @return Pointer vers le tableau de taille '2*nbElem' - * Pointer NULL si erreur - */ -int *ArgMgr::ArgMgrGetIntEnum ( char *label, int *number ) -{ - char *value = ArgMgrValue(label); - int *liste; - if (!value) - return 0; - liste = IdStrIntEnum(value, number); - return liste; -} - -/** - * \brief decodage des elements d'un argument 'paires de float' de lgr quelconque - * @param label label name - * @param number taille de l'ensemble de paires trouvee - * @return Pointer vers le tableau de taille '2*nbElem' - * Pointer NULL si erreur - */ -float *ArgMgr::ArgMgrGetFloatEnum ( char *label, int *number ) -{ - char *value = ArgMgrValue(label); - float *liste; - if (!value) - return 0; - liste = IdStrFloatEnum(value, number); - return liste; -} - //----------------------------------------------------------------------------- // Protected @@ -655,12 +759,12 @@ float *ArgMgr::ArgMgrGetFloatEnum ( char *label, int *number ) * Valeur retournee . : Pointer to the new Upper case char array. * * * **************************************************************************/ -char *ArgMgr::Majuscule (char *chaine ) +char *ArgMgr::Majuscule (const char *chaine ) { char *ptr, *ptr2, *ptr3; ptr2 = (char *)malloc(strlen(chaine)*sizeof(char)+1); ptr3=ptr2; - for ( ptr = chaine ; *ptr!='\0' ; ptr ++ ) + for ( ptr = (char *)chaine ; *ptr!='\0' ; ptr ++ ) { *ptr3 = toupper ( * ptr ); ptr3++; } @@ -677,7 +781,7 @@ char *ArgMgr::Majuscule (char *chaine ) * Valeur retournee . : false if OK. * * true if KO. * **************************************************************************/ -int ArgMgr::FiltreLong ( char *arg ) +int ArgMgr::FiltreLong ( const char *arg ) { int n = 0 ; while ( (n++