| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <assert.h> |
| #include "CmdLineParser.h" |
|
|
|
|
| #ifdef _WIN32 |
| int strcasecmp(char* c1,char* c2){return _stricmp(c1,c2);} |
| #endif |
|
|
| cmdLineReadable::cmdLineReadable(const char* name) |
| { |
| set=false; |
| this->name=new char[strlen(name)+1]; |
| strcpy(this->name,name); |
| } |
| cmdLineReadable::~cmdLineReadable(void) |
| { |
| if(name) delete[] name; |
| name=NULL; |
| } |
| int cmdLineReadable::read(char**,int){ |
| set=true; |
| return 0; |
| } |
| void cmdLineReadable::writeValue(char* str) |
| { |
| str[0] = 0; |
| } |
|
|
| |
| |
| |
| cmdLineInt::cmdLineInt(const char* name) : cmdLineReadable(name) {value=0;} |
| cmdLineInt::cmdLineInt(const char* name,const int& v) : cmdLineReadable(name) {value=v;} |
| int cmdLineInt::read(char** argv,int argc){ |
| if(argc>0){ |
| value=atoi(argv[0]); |
| set=true; |
| return 1; |
| } |
| else{return 0;} |
| } |
| void cmdLineInt::writeValue(char* str) |
| { |
| sprintf(str,"%d",value); |
| } |
|
|
| |
| |
| |
| cmdLineFloat::cmdLineFloat(const char* name) : cmdLineReadable(name) {value=0;} |
| cmdLineFloat::cmdLineFloat(const char* name, const float& v) : cmdLineReadable(name) {value=v;} |
| int cmdLineFloat::read(char** argv,int argc){ |
| if(argc>0){ |
| value=(float)atof(argv[0]); |
| set=true; |
| return 1; |
| } |
| else{return 0;} |
| } |
| void cmdLineFloat::writeValue(char* str) |
| { |
| sprintf(str,"%f",value); |
| } |
|
|
| |
| |
| |
| cmdLineString::cmdLineString(const char* name) : cmdLineReadable(name) {value=NULL;} |
| cmdLineString::~cmdLineString(void) |
| { |
| if(value) delete[] value; |
| value=NULL; |
| } |
| int cmdLineString::read(char** argv,int argc){ |
| if(argc>0) |
| { |
| value=new char[strlen(argv[0])+1]; |
| strcpy(value,argv[0]); |
| set=true; |
| return 1; |
| } |
| else{return 0;} |
| } |
| void cmdLineString::writeValue(char* str) |
| { |
| sprintf(str,"%s",value); |
| } |
|
|
| |
| |
| |
| cmdLineStrings::cmdLineStrings(const char* name,int Dim) : cmdLineReadable(name) |
| { |
| this->Dim=Dim; |
| values=new char*[Dim]; |
| for(int i=0;i<Dim;i++) values[i]=NULL; |
| } |
| cmdLineStrings::~cmdLineStrings(void) |
| { |
| for(int i=0;i<Dim;i++) |
| { |
| if(values[i]) delete[] values[i]; |
| values[i]=NULL; |
| } |
| delete[] values; |
| values=NULL; |
| } |
| int cmdLineStrings::read(char** argv,int argc) |
| { |
| if(argc>=Dim) |
| { |
| for(int i=0;i<Dim;i++) |
| { |
| values[i]=new char[strlen(argv[i])+1]; |
| strcpy(values[i],argv[i]); |
| } |
| set=true; |
| return Dim; |
| } |
| else return 0; |
| } |
| void cmdLineStrings::writeValue(char* str) |
| { |
| char* temp=str; |
| for(int i=0;i<Dim;i++) |
| { |
| sprintf(temp,"%s ",values[i]); |
| temp=str+strlen(str); |
| } |
| } |
|
|
|
|
| char* GetFileExtension(char* fileName){ |
| char* fileNameCopy; |
| char* ext=NULL; |
| char* temp; |
|
|
| fileNameCopy=new char[strlen(fileName)+1]; |
| assert(fileNameCopy); |
| strcpy(fileNameCopy,fileName); |
| temp=strtok(fileNameCopy,"."); |
| while(temp!=NULL) |
| { |
| if(ext!=NULL){delete[] ext;} |
| ext=new char[strlen(temp)+1]; |
| assert(ext); |
| strcpy(ext,temp); |
| temp=strtok(NULL,"."); |
| } |
| delete[] fileNameCopy; |
| return ext; |
| } |
| char* GetLocalFileName(char* fileName){ |
| char* fileNameCopy; |
| char* name=NULL; |
| char* temp; |
|
|
| fileNameCopy=new char[strlen(fileName)+1]; |
| assert(fileNameCopy); |
| strcpy(fileNameCopy,fileName); |
| temp=strtok(fileNameCopy,"\\"); |
| while(temp!=NULL){ |
| if(name!=NULL){delete[] name;} |
| name=new char[strlen(temp)+1]; |
| assert(name); |
| strcpy(name,temp); |
| temp=strtok(NULL,"\\"); |
| } |
| delete[] fileNameCopy; |
| return name; |
| } |
|
|
| void cmdLineParse(int argc, char **argv,int num,cmdLineReadable** readable,int dumpError) |
| { |
| int i,j; |
| while (argc > 0) |
| { |
| if (argv[0][0] == '-' && argv[0][1]=='-') |
| { |
| for(i=0;i<num;i++) |
| { |
| if (!strcmp(&argv[0][2],readable[i]->name)) |
| { |
| argv++, argc--; |
| j=readable[i]->read(argv,argc); |
| argv+=j,argc-=j; |
| break; |
| } |
| } |
| if(i==num){ |
| if(dumpError) |
| { |
| fprintf(stderr, "invalid option: %s\n",*argv); |
| fprintf(stderr, "possible options are:\n"); |
| for(i=0;i<num;i++) fprintf(stderr, " %s\n",readable[i]->name); |
| } |
| argv++, argc--; |
| } |
| } |
| else |
| { |
| if(dumpError) |
| { |
| fprintf(stderr, "invalid option: %s\n", *argv); |
| fprintf(stderr, " options must start with a \'--\'\n"); |
| } |
| argv++, argc--; |
| } |
| } |
| } |
| char** ReadWords(const char* fileName,int& cnt) |
| { |
| char** names; |
| char temp[500]; |
| FILE* fp; |
|
|
| fp=fopen(fileName,"r"); |
| if(!fp){return NULL;} |
| cnt=0; |
| while(fscanf(fp," %s ",temp)==1){cnt++;} |
| fclose(fp); |
|
|
| names=new char*[cnt]; |
| if(!names){return NULL;} |
|
|
| fp=fopen(fileName,"r"); |
| if(!fp){ |
| delete[] names; |
| cnt=0; |
| return NULL; |
| } |
| cnt=0; |
| while(fscanf(fp," %s ",temp)==1){ |
| names[cnt]=new char[strlen(temp)+1]; |
| if(!names){ |
| for(int j=0;j<cnt;j++){delete[] names[j];} |
| delete[] names; |
| cnt=0; |
| fclose(fp); |
| return NULL; |
| } |
| strcpy(names[cnt],temp); |
| cnt++; |
| } |
| fclose(fp); |
| return names; |
| } |
|
|