98 int curarg = 0; |
98 int curarg = 0; |
99 while (curarg < comm->maxargs) { |
99 while (curarg < comm->maxargs) { |
100 r->MustNext (":"); |
100 r->MustNext (":"); |
101 r->MustNext (); |
101 r->MustNext (); |
102 |
102 |
103 int type = GetCommandType (r->token); |
103 type_e type = GetTypeByName (r->token); |
104 if (type == -1) |
104 if (type == -1) |
105 r->ParserError ("bad argument %d type `%s`", curarg, r->token.chars()); |
105 r->ParserError ("bad argument %d type `%s`", curarg, r->token.chars()); |
106 if (type == RETURNVAL_VOID) |
106 if (type == TYPE_VOID) |
107 r->ParserError ("void is not a valid argument type!"); |
107 r->ParserError ("void is not a valid argument type!"); |
108 comm->argtypes[curarg] = type; |
108 comm->argtypes[curarg] = type; |
109 |
109 |
110 r->MustNext ("("); |
110 r->MustNext ("("); |
111 r->MustNext (); |
111 r->MustNext (); |
120 |
120 |
121 // If this is an optional parameter, we need the default value. |
121 // If this is an optional parameter, we need the default value. |
122 if (curarg >= comm->numargs) { |
122 if (curarg >= comm->numargs) { |
123 r->MustNext ("="); |
123 r->MustNext ("="); |
124 switch (type) { |
124 switch (type) { |
125 case RETURNVAL_INT: |
125 case TYPE_INT: |
126 case RETURNVAL_BOOLEAN: |
126 case TYPE_BOOL: |
127 r->MustNumber(); break; |
127 r->MustNumber(); |
128 case RETURNVAL_STRING: r->MustString(); break; |
128 break; |
|
129 case TYPE_STRING: |
|
130 r->MustString(); |
|
131 break; |
|
132 case TYPE_UNKNOWN: |
|
133 case TYPE_FLOAT: |
|
134 case TYPE_VOID: |
|
135 break; |
129 } |
136 } |
130 |
137 |
131 comm->defvals[curarg] = r->token; |
138 comm->defvals[curarg] = r->token; |
132 } |
139 } |
133 |
140 |
151 r->ParserError ("no commands defined!\n"); |
158 r->ParserError ("no commands defined!\n"); |
152 |
159 |
153 r->CloseFile (); |
160 r->CloseFile (); |
154 delete r; |
161 delete r; |
155 printf ("%d command definitions read.\n", numCommDefs); |
162 printf ("%d command definitions read.\n", numCommDefs); |
156 } |
|
157 |
|
158 // ============================================================================ |
|
159 // Get command type by name |
|
160 int GetCommandType (str t) { |
|
161 t = t.tolower(); |
|
162 return (t == "int") ? TYPE_INT : |
|
163 (t == "float") ? TYPE_FLOAT : |
|
164 (t == "str") ? TYPE_STRING : |
|
165 (t == "void") ? TYPE_VOID : |
|
166 (t == "bool") ? TYPE_BOOL : -1; |
|
167 } |
|
168 |
|
169 // ============================================================================ |
|
170 // Inverse operation - type name by value |
|
171 str GetTypeName (int r) { |
|
172 switch (r) { |
|
173 case TYPE_INT: return "int"; break; |
|
174 case TYPE_STRING: return "str"; break; |
|
175 case TYPE_VOID: return "void"; break; |
|
176 case TYPE_FLOAT: return "float"; break; |
|
177 case TYPE_BOOL: return "bool"; break; |
|
178 } |
|
179 |
|
180 return ""; |
|
181 } |
|
182 |
|
183 // ============================================================================ |
|
184 str GetReturnTypeName (int r) { |
|
185 switch (r) { |
|
186 case RETURNVAL_INT: return "int"; break; |
|
187 case RETURNVAL_STRING: return "str"; break; |
|
188 case RETURNVAL_VOID: return "void"; break; |
|
189 case RETURNVAL_BOOLEAN: return "bool"; break; |
|
190 } |
|
191 |
|
192 return ""; |
|
193 } |
163 } |
194 |
164 |
195 // ============================================================================ |
165 // ============================================================================ |
196 // Finds a command by name |
166 // Finds a command by name |
197 CommandDef* FindCommand (str fname) { |
167 CommandDef* FindCommand (str fname) { |
228 text += comm->argnames[i]; |
198 text += comm->argnames[i]; |
229 |
199 |
230 if (i >= comm->numargs) { |
200 if (i >= comm->numargs) { |
231 text += '='; |
201 text += '='; |
232 |
202 |
233 bool isString = comm->argtypes[i] == RETURNVAL_STRING; |
203 bool isString = comm->argtypes[i] == TYPE_STRING; |
234 if (isString) text += '"'; |
204 if (isString) text += '"'; |
235 |
205 |
236 char defvalstring[8]; |
206 char defvalstring[8]; |
237 sprintf (defvalstring, "%d", comm->defvals[i]); |
207 sprintf (defvalstring, "%d", comm->defvals[i]); |
238 text += defvalstring; |
208 text += defvalstring; |