commands.cxx

changeset 68
588cc27e84bb
parent 67
0a202714eea4
child 69
29a3e669d648
equal deleted inserted replaced
67:0a202714eea4 68:588cc27e84bb
73 73
74 r->MustNext (":"); 74 r->MustNext (":");
75 75
76 // Return value 76 // Return value
77 r->MustNext (); 77 r->MustNext ();
78 comm->returnvalue = GetCommandType (r->token); 78 comm->returnvalue = GetTypeByName (r->token);
79 if (comm->returnvalue == -1) 79 if (comm->returnvalue == -1)
80 r->ParserError ("bad return value type `%s` for command %s", r->token.chars(), comm->name.chars()); 80 r->ParserError ("bad return value type `%s` for command %s", r->token.chars(), comm->name.chars());
81 81
82 r->MustNext (":"); 82 r->MustNext (":");
83 83
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;

mercurial