*** empty log message ***
[h316.git] / pc-tools / ldc2 / src / argread.cpp
1 #include "argread.hh"
2 #include <stdio.h>
3
4 argreader::argreader(string n_name){
5 progname=n_name;
6 }
7
8 void argreader::add_param (string shortname, string longname,
9 string description, int * status,
10 string * target, string placeholder){
11 if (target!=NULL) if(status!=NULL)
12 arguments.insert(arguments.end(),parameter(shortname,longname,description,status,target,placeholder));
13 }
14
15 void argreader::add_free_param(string placeholder, string description, int * status, string * target){
16 if (target!=NULL) if(status!=NULL)
17 free_arguments.insert(free_arguments.end(),free_parameter(placeholder,description,status,target));
18 }
19
20 vector<string> argreader::read_args(int argc, char ** args){
21 vector<string> result;
22 vector<string> argv;
23 for (char ** akt=args; *akt ;akt++) argv.insert(argv.end(),string(*akt));
24
25 unsigned int free_parms_count=0;
26 for (vector<string>::iterator akt_p=argv.begin()+1;akt_p<argv.end();akt_p++){ //Argument loop
27
28 // Look for long argument
29 if ((akt_p->substr(0,2)=="--")&&(free_parms_count==0)){
30 int found=0;
31 for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
32 if (akt_p->substr(2,parm_p->longname.length())==parm_p->longname){
33 found=1;
34 *(parm_p->status)=1;
35 if (parm_p->target){
36 if (akt_p->length()>2+parm_p->longname.length()){
37 *(parm_p->target)=akt_p->substr(2+parm_p->longname.length());
38
39 } else // Word not long enough
40 if (akt_p+1<argv.end()) { // If next word existend
41 *(parm_p->status)=1;
42 *(parm_p->target)=*(++akt_p);
43 } else { // No next word :-(
44 result.insert(result.end(),
45 "Parameter --"+parm_p->longname+parm_p->placeholder+" needs an Argument!");
46 }
47 } // arg needed
48 }
49 } // search for loop
50 if (!found) result.insert(result.end(),"Unknown parameter: "+*akt_p);
51 } else { // No -- param, now look for switches
52 if (((*akt_p)[0]=='-')&&(free_parms_count==0)){
53 int stop_char_loop=0;
54 for (unsigned int pos=1; pos<akt_p->length()&& !stop_char_loop ;pos++){
55 int found=0;
56 for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
57 if (parm_p->shortname[0]==(*akt_p)[pos]){
58 found=1;
59 (*parm_p->status)=1;
60 if (parm_p->target){ // Need argument
61 if (akt_p->length()>pos+1){
62 *(parm_p->target)=akt_p->substr(pos+1);
63 stop_char_loop=1;
64 } else { // Word not long enough
65 printf("s word next\n");
66 if (akt_p+1<argv.end()) { // If next word existend
67 *(parm_p->target)=*(++akt_p);
68 stop_char_loop=1;
69 } else { // No next word :-(
70 result.insert(result.end(),
71 "Parameter --"+parm_p->longname+parm_p->placeholder+" needs an Argument!");
72 }
73 }
74 } // arg needed
75 } //if match
76 } //args loop
77 if (!found) result.insert(result.end(),"Unknown switch: "+akt_p->substr(pos,1));
78 } // char loop
79 }// switch found
80 else{ // no switch found
81 if (free_parms_count<free_arguments.size()){
82 *(free_arguments[free_parms_count].target)=*akt_p;
83 }
84 free_parms_count++;
85 }
86 } //looking for not -- args
87 } // argv loop
88 if (free_parms_count>free_arguments.size()) result.insert(result.begin(),"Too many arguments!");
89 if (!result.empty()) get_help(result);
90 return result;
91 }
92
93
94 void argreader::get_help(vector<string> & result){
95 result.insert(result.end(),"Usage:");
96 string line=" "+progname+" ";
97 for (vector<parameter>::iterator parm_p=arguments.begin();parm_p<arguments.end();parm_p++){
98 line+="[-"+parm_p->shortname;
99 if (parm_p->target!=0) line+=parm_p->placeholder;
100 line+="] ";
101 }
102 result.insert(result.end(),line);
103 }
104
105 vector<string> argreader::get_help(){
106 vector<string> result;
107 get_help(result);
108 return result;
109 }
110
111
112 /**************************************************/
113
114 argreader::parameter::parameter(string n_shortname, string n_longname,string n_description, int * n_status,
115 string * n_target, string n_placeholder){
116 shortname=n_shortname;
117 longname=n_longname;
118 description=n_description;
119 status=n_status;
120 target=n_target;
121 placeholder=n_placeholder;
122 if (status) *status=0;
123 }
124
125 argreader::free_parameter::free_parameter( string n_placeholder, string n_description,
126 int * n_status, string * n_target){
127 description=n_description;
128 status=n_status;
129 target=n_target;
130 placeholder=n_placeholder;
131 if (status) *status=0;
132 }
133
134
135
136