FreeCalypso > hg > tcs211-l1-reconst
comparison g23m/condat/ms/src/aci/line_split.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : | |
4 | Modul : line | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : This modul ... | |
18 +----------------------------------------------------------------------------- | |
19 */ | |
20 | |
21 #include <stdio.h> | |
22 #include <stdlib.h> | |
23 #include <string.h> | |
24 #include <ctype.h> | |
25 | |
26 #include "typedefs.h" | |
27 #include "vsi.h" | |
28 #include "pei.h" | |
29 #include "aci_mem.h" | |
30 #include "P_ACI.val" | |
31 | |
32 #include "line_edit.h" | |
33 #include "line_edit_intern.h" | |
34 #include "line_split_intern.h" | |
35 | |
36 static T_LEDIT_CHAR_TYPE ledit_lookAhead (char c); | |
37 static UBYTE ledit_check_valid_basic_cmd (char c); | |
38 static UBYTE ledit_check_valid_and_cmd (char c); | |
39 static USHORT ledit_get_para_len (T_LEDIT_INTERN *leditInt, USHORT searchLen); | |
40 static USHORT ledit_get_name_len (T_LEDIT_INTERN *leditInt, T_LEDIT_NAME_TYPE nType); | |
41 static T_LEDIT_RSLT ledit_get_memory (T_LEDIT_ATCMD_M **cmdm, int size, int name); | |
42 static T_LEDIT_RSLT ledit_get_cmd_mem (T_LEDIT_INTERN *leditInt); | |
43 static T_LEDIT_RSLT ledit_assign_name (T_LEDIT_INTERN *leditInt, int len); | |
44 static T_LEDIT_RSLT ledit_assign_param (T_LEDIT_INTERN *leditInt, T_LEDIT_PARAM_TYPE pType); | |
45 static T_LEDIT_ATCMD_SUBTYPE ledit_extended_type (T_LEDIT_INTERN *leditInt); | |
46 static T_LEDIT_RSLT ledit_extended_cmd (T_LEDIT_INTERN *leditInt); | |
47 static T_LEDIT_RSLT ledit_s_cmd (T_LEDIT_INTERN *leditInt); | |
48 static T_LEDIT_RSLT ledit_dial (T_LEDIT_INTERN *leditInt); | |
49 static T_LEDIT_RSLT ledit_and_basic_cmd (T_LEDIT_INTERN *leditInt); | |
50 static T_LEDIT_RSLT ledit_basic_cmd (T_LEDIT_INTERN *leditInt); | |
51 | |
52 static T_LEDIT_RSLT ledit_restore_dial_string (char *procDialString, | |
53 int procDialStringLen, | |
54 char *origCommandLine, | |
55 int origCommandLineLen); | |
56 | |
57 | |
58 static const UBYTE basic_ATcmd [26][2] = | |
59 { | |
60 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* A */ | |
61 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* B */ | |
62 {BATCMD_NO_SUPP, ANDCMD_SUPPORT}, /* C */ | |
63 {BATCMD_DIAL , ANDCMD_SUPPORT}, /* D <---- SPECIAL */ | |
64 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* E */ | |
65 {BATCMD_SUPPORT, ANDCMD_SUPPORT}, /* F */ | |
66 {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* G */ | |
67 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* H */ | |
68 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* I */ | |
69 {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* J */ | |
70 {BATCMD_NO_SUPP, ANDCMD_SUPPORT}, /* K */ | |
71 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* L */ | |
72 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* M */ | |
73 {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* N */ | |
74 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* O */ | |
75 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* P */ | |
76 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* Q */ | |
77 {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* R */ | |
78 {BATCMD_S_PARAM, ANDCMD_NO_SUPP}, /* S <---- SPECIAL */ | |
79 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* T */ | |
80 {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* U */ | |
81 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* V */ | |
82 {BATCMD_SUPPORT, ANDCMD_SUPPORT}, /* W */ | |
83 {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* X */ | |
84 {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* Y */ | |
85 {BATCMD_SUPPORT, ANDCMD_NO_SUPP} /* Z */ | |
86 }; | |
87 | |
88 | |
89 /* | |
90 +--------------------------------------------------------------------+ | |
91 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
92 | STATE : code ROUTINE : ledit_check_valid_basic_cmd | | |
93 +--------------------------------------------------------------------+ | |
94 | |
95 PURPOSE : - | |
96 */ | |
97 static UBYTE ledit_check_valid_basic_cmd (char c) | |
98 { | |
99 return basic_ATcmd [(int)(c-'A')][0]; | |
100 } | |
101 | |
102 /* | |
103 +--------------------------------------------------------------------+ | |
104 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
105 | STATE : code ROUTINE : ledit_check_valid_and_cmd | | |
106 +--------------------------------------------------------------------+ | |
107 | |
108 PURPOSE : - | |
109 */ | |
110 static UBYTE ledit_check_valid_and_cmd (char c) | |
111 { | |
112 return basic_ATcmd [(int)(c-'A')][1]; | |
113 } | |
114 | |
115 | |
116 /* | |
117 +--------------------------------------------------------------------+ | |
118 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
119 | STATE : code ROUTINE : ledit_lookAhead | | |
120 +--------------------------------------------------------------------+ | |
121 | |
122 PURPOSE : - qualify the character at the look ahead position | |
123 */ | |
124 | |
125 static T_LEDIT_CHAR_TYPE ledit_lookAhead (char c) | |
126 { | |
127 if (c EQ '\0') | |
128 return LEDIT_CHAR_TERMINATED; | |
129 | |
130 switch (c) | |
131 { | |
132 case '%': | |
133 return LEDIT_CHAR_PERCENT; | |
134 case '&': | |
135 return LEDIT_CHAR_AND; | |
136 case '+': | |
137 return LEDIT_CHAR_PLUS; | |
138 case ',': | |
139 return LEDIT_CHAR_COMMA; | |
140 case '=': | |
141 return LEDIT_CHAR_SET; | |
142 case ';': | |
143 return LEDIT_CHAR_SEPARATOR; | |
144 case '?': | |
145 return LEDIT_CHAR_READ; | |
146 default: | |
147 { | |
148 if ((c-'0') < 10 AND (c - '0') >=0) | |
149 return LEDIT_CHAR_NUMBER; | |
150 if ((c>='A') && (c<='Z')) | |
151 return LEDIT_CHAR_CHAR; | |
152 if (((c >= '!') AND (c <= '_')) OR ((c >= 123) AND (c <= 127))) | |
153 /*the rest of characters*/ | |
154 return LEDIT_CHAR_EXT; | |
155 return LEDIT_CHAR_INVALID; | |
156 } | |
157 } | |
158 } | |
159 | |
160 | |
161 /* | |
162 +--------------------------------------------------------------------+ | |
163 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
164 | STATE : code ROUTINE : ledit_get_para_len | | |
165 +--------------------------------------------------------------------+ | |
166 | |
167 PURPOSE : - calculate length of an AT command parameter | |
168 */ | |
169 static USHORT ledit_get_para_len (T_LEDIT_INTERN *leditInt, USHORT searchLen) | |
170 { | |
171 USHORT i = 0; | |
172 #ifdef _SIMULATION_ | |
173 TRACE_FUNCTION("ledit_get_para_len()"); | |
174 #endif | |
175 if (searchLen EQ SEARCH_BAT_LEN) | |
176 { | |
177 /* basic AT command can have numbers only e.g.: ATF123 */ | |
178 i = leditInt->execBufIter; /* start with first number */ | |
179 while (isdigit(leditInt->execBuffer[i])) | |
180 { | |
181 ++i; | |
182 } | |
183 return (i - leditInt->execBufIter); | |
184 } | |
185 else | |
186 { | |
187 /* | |
188 * dial string finish with ';' | |
189 * extended AT command is terminated by ';' or by '\0' if last one in cmd line | |
190 */ | |
191 i = leditInt->execBufIter; | |
192 | |
193 while (';' != leditInt->execBuffer[i]) | |
194 { | |
195 ++i; | |
196 if (leditInt->execBuffer[i] EQ '\0') | |
197 { | |
198 break; | |
199 } | |
200 } | |
201 if ((searchLen EQ SEARCH_DIAL_LEN) AND (';' EQ leditInt->execBuffer[i])) | |
202 { | |
203 ++i; /* for dial the ';' is important */ | |
204 } | |
205 return (i - leditInt->execBufIter); | |
206 } | |
207 } | |
208 | |
209 /* | |
210 +--------------------------------------------------------------------+ | |
211 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
212 | STATE : code ROUTINE : ledit_get_name_len | | |
213 +--------------------------------------------------------------------+ | |
214 | |
215 PURPOSE : - get the length of an extended AT command or ATSnn where nn := 0..99 | |
216 extended name starts with '+', '%', '$' ... or every other char which is not [a-zA-Z][0-9] | |
217 after prefix must start with [A-Z] and then up to further 15 characters | |
218 of [A-Z][0-9]!%-./:_ according to V.25 ter chapter 5.4.1 | |
219 */ | |
220 static USHORT ledit_get_name_len (T_LEDIT_INTERN *leditInt, T_LEDIT_NAME_TYPE nType) | |
221 { | |
222 USHORT i = leditInt->execBufIter; | |
223 | |
224 if (nType EQ LEDIT_EXT_NAME) | |
225 { | |
226 ++i; /* skip prefix of extended name */ | |
227 } | |
228 /* | |
229 * first char (after extended prefix) must be [A-Z] (to capital letter done by ledit_collect()) | |
230 */ | |
231 if (isupper (leditInt->execBuffer[i])) | |
232 { | |
233 while (leditInt->execBuffer[i]) | |
234 { | |
235 if ((nType EQ LEDIT_S_NAME) AND (i > leditInt->execBufIter)) | |
236 { | |
237 if (isdigit(leditInt->execBuffer[i]) EQ 0) | |
238 { | |
239 return 0; /* invalid name for ATSnn, where nn must be [0-9]+ */ | |
240 } | |
241 if ((i - leditInt->execBufIter) > LEDIT_MAX_S_NAME_LEN) | |
242 { | |
243 return 0; /* invalid name for ATSnn, where nn is too large */ | |
244 } | |
245 } | |
246 ++i; | |
247 switch (leditInt->execBuffer[i]) | |
248 { | |
249 case '\0': | |
250 { | |
251 return (i - leditInt->execBufIter); | |
252 } | |
253 case '=': | |
254 { | |
255 if (leditInt->execBuffer[i+1] NEQ '?') | |
256 { | |
257 return (i - leditInt->execBufIter); | |
258 } | |
259 else /* AT+XXX=? */ | |
260 { | |
261 if ((leditInt->execBuffer[i+2] NEQ '\0') AND (leditInt->execBuffer[i+2] NEQ ';')) | |
262 { | |
263 return 0; /* after =? must be ';' or terminated */ | |
264 } | |
265 return (i - leditInt->execBufIter); | |
266 } | |
267 } | |
268 case '?': | |
269 { | |
270 if ((leditInt->execBuffer[i+1] NEQ '\0') AND (leditInt->execBuffer[i+1] NEQ ';')) | |
271 { | |
272 return 0; /* after ? must be ';' or terminated */ | |
273 } | |
274 return (i - leditInt->execBufIter); | |
275 } | |
276 case ';': | |
277 { | |
278 /* | |
279 * there are several extended AT cmds without "=parameter" or "=?" or "?" after the name, e.g.: +CGMM;+CGMI;+CGMR;+CGSN;... | |
280 * the ";" after the name will be parsed in ledit_get_para_len() | |
281 */ | |
282 return (i - leditInt->execBufIter); | |
283 } | |
284 } | |
285 } /* end of while (leditInt->execBuffer[i]) */ | |
286 } | |
287 return 0; /* invalid name */ | |
288 } | |
289 | |
290 | |
291 /* | |
292 +--------------------------------------------------------------------+ | |
293 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
294 | STATE : code ROUTINE : ledit_free_cmd | | |
295 +--------------------------------------------------------------------+ | |
296 | |
297 PURPOSE : - | |
298 */ | |
299 void ledit_free_cmd (T_LEDIT_INTERN *leditInt) | |
300 { | |
301 | |
302 T_LEDIT_ATCMD_M *tmp = NULL; | |
303 #ifdef _SIMULATION_ | |
304 TRACE_FUNCTION("ledit_free_cmd()"); | |
305 #endif | |
306 while (leditInt->cmdm) | |
307 { | |
308 tmp = leditInt->cmdm->next; | |
309 if (leditInt->cmdm->cmd) | |
310 { | |
311 if (leditInt->cmdm->cmd->name) | |
312 { | |
313 ACI_MFREE(leditInt->cmdm->cmd->name); | |
314 } | |
315 if (leditInt->cmdm->cmd->params) | |
316 { | |
317 ACI_MFREE (leditInt->cmdm->cmd->params); | |
318 } | |
319 ACI_MFREE (leditInt->cmdm->cmd); | |
320 } | |
321 /* if (leditInt->cmdm) ... always true */ | |
322 { | |
323 ACI_MFREE (leditInt->cmdm); | |
324 } | |
325 leditInt->cmdm = tmp; | |
326 } | |
327 } | |
328 | |
329 | |
330 /* | |
331 +--------------------------------------------------------------------+ | |
332 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
333 | STATE : code ROUTINE : ledit_get_cmd_mem | | |
334 +--------------------------------------------------------------------+ | |
335 | |
336 PURPOSE : - allocate some memory for T_LEDIT_ATCMD | |
337 */ | |
338 | |
339 static T_LEDIT_RSLT ledit_get_cmd_mem (T_LEDIT_INTERN *leditInt) | |
340 { | |
341 ACI_MALLOC(leditInt->cmdm,sizeof(T_LEDIT_ATCMD_M)); | |
342 if (leditInt->cmdm EQ NULL) | |
343 { | |
344 return LEDIT_FAIL; | |
345 } | |
346 memset(leditInt->cmdm, '\0', sizeof(T_LEDIT_ATCMD_M)); | |
347 leditInt->cmdm->next = NULL; | |
348 | |
349 ACI_MALLOC(leditInt->cmdm->cmd,sizeof(T_LEDIT_ATCMD)); | |
350 if (leditInt->cmdm->cmd EQ NULL) | |
351 { | |
352 return LEDIT_FAIL; | |
353 } | |
354 memset(leditInt->cmdm->cmd, '\0', sizeof(T_LEDIT_ATCMD)); | |
355 | |
356 leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_NIL; | |
357 leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_NIL; | |
358 /* Initializing flag here BUG 11920 */ | |
359 leditInt->cmdm->cmd->type.append_Flag = FALSE; | |
360 leditInt->cmdm->cmd->name = NULL; | |
361 leditInt->cmdm->cmd->params = NULL; | |
362 return LEDIT_CMPL; | |
363 } | |
364 | |
365 /* | |
366 +--------------------------------------------------------------------+ | |
367 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
368 | STATE : code ROUTINE : ledit_get_memory | | |
369 +--------------------------------------------------------------------+ | |
370 | |
371 PURPOSE : - allocate some memory (for char *) | |
372 */ | |
373 | |
374 static T_LEDIT_RSLT ledit_get_memory (T_LEDIT_ATCMD_M **cmdm, int size, int name) | |
375 { | |
376 | |
377 T_LEDIT_ATCMD_M **tmp = cmdm; | |
378 if (name) | |
379 { | |
380 ACI_MALLOC((*tmp)->cmd->name,size * sizeof(char)); | |
381 if ((*tmp)->cmd->name EQ NULL) | |
382 { | |
383 return LEDIT_FAIL; | |
384 } | |
385 (*tmp)->cmd->name[0]='\0'; | |
386 } | |
387 else | |
388 { | |
389 ACI_MALLOC((*tmp)->cmd->params,size * sizeof(char)); | |
390 if ((*tmp)->cmd->params EQ NULL) | |
391 { | |
392 TRACE_FUNCTION("ledit_get_memory(): returning fail"); | |
393 return LEDIT_FAIL; | |
394 } | |
395 (*tmp)->cmd->params[0]='\0'; | |
396 } | |
397 return LEDIT_CMPL; | |
398 } | |
399 | |
400 | |
401 /* | |
402 +--------------------------------------------------------------------+ | |
403 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
404 | STATE : code ROUTINE : ledit_assign_name | | |
405 +--------------------------------------------------------------------+ | |
406 | |
407 PURPOSE : - extract the name of an AT command from command line | |
408 and put it into T_LEDIT_ATCMD member name | |
409 */ | |
410 | |
411 static T_LEDIT_RSLT ledit_assign_name (T_LEDIT_INTERN *leditInt, int len) | |
412 { | |
413 if(ledit_get_memory (&(leditInt->cmdm), len+1, 1) EQ LEDIT_FAIL) | |
414 { | |
415 leditInt->err.code = LEDIT_ERR_NoMemory; | |
416 leditInt->err.msg = ledit_err[LEDIT_ERR_NoMemory].msg; | |
417 return LEDIT_FAIL; | |
418 } | |
419 memcpy (leditInt->cmdm->cmd->name, leditInt->execBuffer+leditInt->execBufIter, len); | |
420 *(leditInt->cmdm->cmd->name+len) = '\0'; /* terminate name */ | |
421 leditInt->execBufIter += len; /* update iterator in execBuffer */ | |
422 return LEDIT_CMPL; | |
423 } | |
424 | |
425 /* | |
426 +--------------------------------------------------------------------+ | |
427 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
428 | STATE : code ROUTINE : ledit_assign_param | | |
429 +--------------------------------------------------------------------+ | |
430 | |
431 PURPOSE : - extract the param(s) of an AT command from command line | |
432 and put it into T_LEDIT_ATCMD member param | |
433 - can be empty | |
434 */ | |
435 | |
436 static T_LEDIT_RSLT ledit_assign_param (T_LEDIT_INTERN *leditInt, T_LEDIT_PARAM_TYPE pType) | |
437 { | |
438 int len = 0; | |
439 #ifdef _SIMULATION_ | |
440 TRACE_FUNCTION("ledit_assign_param()"); | |
441 #endif | |
442 if (pType EQ LEDIT_BASIC_PARAM) | |
443 { | |
444 len = ledit_get_para_len (leditInt, SEARCH_BAT_LEN); | |
445 } | |
446 else | |
447 if (pType EQ LEDIT_DIAL_PARAM) /* dial parameter, we need the possible ';' */ | |
448 { | |
449 len = ledit_get_para_len (leditInt, SEARCH_DIAL_LEN); | |
450 /* | |
451 * If there were any 'g' or 'i' characters in a dial string that have | |
452 * been turned into 'G' or 'I' characters on conversion to upper case | |
453 * by the ledit_collect function... | |
454 * Turn them back into the lower case characters so that they affect | |
455 * CUG and CLIR in the way they were intended to. | |
456 */ | |
457 ledit_restore_dial_string ( &leditInt->execBuffer[leditInt->execBufIter], | |
458 len, | |
459 leditInt->origBuffer, | |
460 strlen(leditInt->origBuffer)); | |
461 } | |
462 else /* extended AT cmd params */ | |
463 { | |
464 len = ledit_get_para_len (leditInt, SEARCH_EXT_LEN); | |
465 } | |
466 if(ledit_get_memory (&(leditInt->cmdm), len+1, 0) EQ LEDIT_FAIL) | |
467 { | |
468 leditInt->err.code = LEDIT_ERR_NoMemory; | |
469 leditInt->err.msg = ledit_err[LEDIT_ERR_NoMemory].msg; | |
470 return LEDIT_FAIL; | |
471 } | |
472 memcpy (leditInt->cmdm->cmd->params, leditInt->execBuffer+leditInt->execBufIter, len); | |
473 *(leditInt->cmdm->cmd->params+len) = '\0'; | |
474 | |
475 /* | |
476 * update iterator in execBuffer | |
477 * for extended cmds skip the ';' | |
478 */ | |
479 if (pType EQ LEDIT_EXT_PARAM) | |
480 { | |
481 if (leditInt->execBuffer[leditInt->execBufIter+len] EQ '\0') | |
482 { | |
483 leditInt->execBufIter += len; | |
484 } | |
485 else | |
486 { | |
487 leditInt->execBufIter += len+1; /* skip the ';' */ | |
488 } | |
489 } | |
490 else | |
491 { | |
492 leditInt->execBufIter += len; | |
493 } | |
494 | |
495 return LEDIT_CMPL; | |
496 } | |
497 | |
498 /* | |
499 +--------------------------------------------------------------------+ | |
500 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
501 | STATE : code ROUTINE : ledit_extended_type | | |
502 +--------------------------------------------------------------------+ | |
503 | |
504 PURPOSE : - | |
505 */ | |
506 static T_LEDIT_ATCMD_SUBTYPE ledit_extended_type (T_LEDIT_INTERN *leditInt) | |
507 { | |
508 #ifdef _SIMULATION_ | |
509 TRACE_FUNCTION("ledit_extended_type()"); | |
510 #endif | |
511 switch (ledit_lookAhead(leditInt->execBuffer[leditInt->execBufIter])) | |
512 { | |
513 case LEDIT_CHAR_SET: | |
514 { | |
515 ++(leditInt->execBufIter); | |
516 if (ledit_lookAhead(leditInt->execBuffer[leditInt->execBufIter]) EQ LEDIT_CHAR_READ) | |
517 { | |
518 ++(leditInt->execBufIter); | |
519 /*Setting flag as 1*/ | |
520 leditInt->cmdm->cmd->type.append_Flag = TRUE; | |
521 /* bug 11920*/ | |
522 return LEDIT_ATCMD_TEST; | |
523 } | |
524 /*Setting flag as 1*/ | |
525 leditInt->cmdm->cmd->type.append_Flag = TRUE; | |
526 /* bug 11920*/ | |
527 return LEDIT_ATCMD_SET; | |
528 } | |
529 case LEDIT_CHAR_READ: | |
530 { | |
531 ++(leditInt->execBufIter); | |
532 /*Setting flag as 1*/ | |
533 leditInt->cmdm->cmd->type.append_Flag = TRUE; | |
534 /* bug 11920*/ | |
535 return LEDIT_ATCMD_QUERY; | |
536 } | |
537 default: | |
538 { | |
539 /* return LEDIT_ATCMD_NIL; */ | |
540 /*Setting flag as 0. | |
541 These types need not be appended with the characters later on while reconstructing | |
542 command in leedit_fwrd_extension*/ | |
543 leditInt->cmdm->cmd->type.append_Flag = FALSE; | |
544 /* bug 11920*/ | |
545 | |
546 return LEDIT_ATCMD_SET; /* if after name no parameters e.g.: AT+CMGL; */ | |
547 } | |
548 } | |
549 } | |
550 | |
551 /* | |
552 +--------------------------------------------------------------------+ | |
553 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
554 | STATE : code ROUTINE : ledit_extended_cmd | | |
555 +--------------------------------------------------------------------+ | |
556 | |
557 PURPOSE : - split cmd line into single canonical commands | |
558 */ | |
559 static T_LEDIT_RSLT ledit_extended_cmd (T_LEDIT_INTERN *leditInt) | |
560 { | |
561 int len = 0; | |
562 #ifdef _SIMULATION_ | |
563 TRACE_FUNCTION ("ledit_extended_cmd()"); | |
564 #endif | |
565 /* | |
566 * get name lenght | |
567 */ | |
568 len = ledit_get_name_len (leditInt, LEDIT_EXT_NAME); | |
569 if(len) | |
570 { | |
571 if (ledit_assign_name(leditInt, len) NEQ LEDIT_CMPL) | |
572 { | |
573 return LEDIT_FAIL; | |
574 } | |
575 leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_EXTENDED; | |
576 leditInt->cmdm->cmd->type.sType = ledit_extended_type(leditInt); | |
577 if (ledit_assign_param (leditInt, LEDIT_EXT_PARAM) NEQ LEDIT_CMPL) | |
578 { | |
579 return LEDIT_FAIL; | |
580 } | |
581 } | |
582 else | |
583 { | |
584 leditInt->err.code = LEDIT_ERR_NoValidCommand; | |
585 leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg; | |
586 return LEDIT_FAIL; | |
587 } | |
588 return LEDIT_CMPL; | |
589 } | |
590 | |
591 /* | |
592 +--------------------------------------------------------------------+ | |
593 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
594 | STATE : code ROUTINE : ledit_s_cmd | | |
595 +--------------------------------------------------------------------+ | |
596 | |
597 PURPOSE : - special basic AT command ATS | |
598 with own syntax similiar to extended AT commands | |
599 e.g.: ATS0? <-- query register S0 | |
600 ATS0=123 <-- set new value for register S0 | |
601 but the parameter is basic cmd like | |
602 */ | |
603 static T_LEDIT_RSLT ledit_s_cmd (T_LEDIT_INTERN *leditInt) | |
604 { | |
605 int len = 0; | |
606 #ifdef _SIMULATION_ | |
607 TRACE_FUNCTION ("ledit_s_cmd()"); | |
608 #endif | |
609 /* | |
610 * get name length, support for up to ATS99, but not ATS100 ! | |
611 */ | |
612 len = ledit_get_name_len (leditInt, LEDIT_S_NAME); | |
613 if(len) | |
614 { | |
615 if (ledit_assign_name(leditInt, len) NEQ LEDIT_CMPL) | |
616 { | |
617 return LEDIT_FAIL; | |
618 } | |
619 leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_S; | |
620 leditInt->cmdm->cmd->type.sType = ledit_extended_type(leditInt); /* after Sx must be [?|=] */ | |
621 if (ledit_assign_param (leditInt, LEDIT_BASIC_PARAM) NEQ LEDIT_CMPL) | |
622 { | |
623 return LEDIT_FAIL; | |
624 } | |
625 } | |
626 else | |
627 { | |
628 leditInt->err.code = LEDIT_ERR_NoValidCommand; | |
629 leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg; | |
630 return LEDIT_FAIL; | |
631 } | |
632 return LEDIT_CMPL; | |
633 } | |
634 | |
635 /* | |
636 +--------------------------------------------------------------------+ | |
637 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
638 | STATE : code ROUTINE : ledit_dial | | |
639 +--------------------------------------------------------------------+ | |
640 | |
641 PURPOSE : - ATD12345; , but also ATD(030)12345; or ATD!; ATD@; ... | |
642 - semantic of ATD paramter has to be checked by ATI | |
643 */ | |
644 static T_LEDIT_RSLT ledit_dial (T_LEDIT_INTERN *leditInt) | |
645 { | |
646 #ifdef _SIMULATION_ | |
647 TRACE_FUNCTION ("ledit_dial()"); | |
648 #endif | |
649 leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_DIAL; | |
650 leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_SET; | |
651 /*Setting flag as 0*/ | |
652 leditInt->cmdm->cmd->type.append_Flag = FALSE; | |
653 /*Issue 11920*/ | |
654 if (ledit_assign_name(leditInt, 1) NEQ LEDIT_CMPL) | |
655 { | |
656 return LEDIT_FAIL; | |
657 } | |
658 /* | |
659 * dial paramter ends with ';' -> LEDIT_EXT_PARAM | |
660 */ | |
661 if (ledit_assign_param (leditInt, LEDIT_DIAL_PARAM) NEQ LEDIT_CMPL) | |
662 { | |
663 return LEDIT_FAIL; | |
664 } | |
665 if (leditInt->execBuffer[leditInt->execBufIter]) | |
666 { | |
667 return LEDIT_FAIL; /* dial command is not the last on cmd line */ | |
668 } | |
669 return LEDIT_CMPL; | |
670 } | |
671 | |
672 | |
673 /* | |
674 +--------------------------------------------------------------------+ | |
675 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
676 | STATE : code ROUTINE : ledit_and_basic_cmd | | |
677 +--------------------------------------------------------------------+ | |
678 | |
679 PURPOSE : - | |
680 */ | |
681 static T_LEDIT_RSLT ledit_and_basic_cmd (T_LEDIT_INTERN *leditInt) | |
682 { | |
683 USHORT rv = ANDCMD_NO_SUPP; | |
684 #ifdef _SIMULATION_ | |
685 TRACE_FUNCTION ("ledit_and_basic_cmd()"); | |
686 #endif | |
687 ++(leditInt->execBufIter); /* skip the & */ | |
688 | |
689 rv = ledit_check_valid_and_cmd (leditInt->execBuffer[leditInt->execBufIter]); | |
690 if(rv EQ ANDCMD_SUPPORT) | |
691 { | |
692 leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_AND; | |
693 leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_QUERY; | |
694 | |
695 /*Setting flag as 0*/ | |
696 leditInt->cmdm->cmd->type.append_Flag = FALSE; | |
697 /* bug 11920*/ | |
698 | |
699 if (ledit_assign_name(leditInt, 1) NEQ LEDIT_CMPL) | |
700 { | |
701 return LEDIT_FAIL; | |
702 } | |
703 if (ledit_assign_param (leditInt, LEDIT_BASIC_PARAM) NEQ LEDIT_CMPL) | |
704 { | |
705 return LEDIT_FAIL; | |
706 } | |
707 } | |
708 else | |
709 { | |
710 leditInt->err.code = LEDIT_ERR_NoValidCommand; | |
711 leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg; | |
712 return LEDIT_FAIL; | |
713 } | |
714 return LEDIT_CMPL; | |
715 } | |
716 /* | |
717 +--------------------------------------------------------------------+ | |
718 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
719 | STATE : code ROUTINE : ledit_basic_cmd | | |
720 +--------------------------------------------------------------------+ | |
721 | |
722 PURPOSE : - check for basic command | |
723 - check for dial command | |
724 */ | |
725 static T_LEDIT_RSLT ledit_basic_cmd (T_LEDIT_INTERN *leditInt) | |
726 { | |
727 USHORT rv = BATCMD_NO_SUPP; | |
728 #ifdef _SIMULATION_ | |
729 TRACE_FUNCTION ("ledit_basic_cmd()"); | |
730 #endif | |
731 rv = ledit_check_valid_basic_cmd (leditInt->execBuffer[leditInt->execBufIter]); | |
732 if (rv EQ BATCMD_SUPPORT) | |
733 { | |
734 leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_BASIC; | |
735 leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_SET; | |
736 | |
737 /* Setting flag as 0*/ | |
738 leditInt->cmdm->cmd->type.append_Flag = FALSE; | |
739 /* Issue 11920*/ | |
740 | |
741 if (ledit_assign_name(leditInt, 1) NEQ LEDIT_CMPL) | |
742 { | |
743 return LEDIT_FAIL; | |
744 } | |
745 if (ledit_assign_param (leditInt, LEDIT_BASIC_PARAM) NEQ LEDIT_CMPL) | |
746 { | |
747 return LEDIT_FAIL; | |
748 } | |
749 } | |
750 else if (rv EQ BATCMD_DIAL) | |
751 { | |
752 if (ledit_dial(leditInt) NEQ LEDIT_CMPL) | |
753 { | |
754 return LEDIT_FAIL; | |
755 } | |
756 } | |
757 else if (rv EQ BATCMD_S_PARAM) | |
758 { | |
759 if (ledit_s_cmd(leditInt) NEQ LEDIT_CMPL) | |
760 { | |
761 return LEDIT_FAIL; | |
762 } | |
763 } | |
764 else | |
765 { | |
766 leditInt->err.code = LEDIT_ERR_NoValidCommand; | |
767 leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg; | |
768 return LEDIT_FAIL; | |
769 } | |
770 return LEDIT_CMPL; | |
771 } | |
772 | |
773 | |
774 /* | |
775 +--------------------------------------------------------------------+ | |
776 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
777 | STATE : code ROUTINE : ledit_split | | |
778 +--------------------------------------------------------------------+ | |
779 | |
780 PURPOSE : - split cmd line into single canonical commands | |
781 */ | |
782 T_LEDIT_RSLT ledit_split (T_LEDIT_INTERN *leditInt) | |
783 { | |
784 | |
785 char c = leditInt->execBuffer[leditInt->execBufIter]; | |
786 TRACE_FUNCTION("ledit_split"); | |
787 | |
788 /* | |
789 * check first character of a command: has to be valid basic command letter, "&" or | |
790 * any extension sign "+", "%" , "$" or what ever else | |
791 */ | |
792 if(c) | |
793 { | |
794 if (ledit_get_cmd_mem (leditInt) EQ LEDIT_FAIL) | |
795 { | |
796 return LEDIT_FAIL; | |
797 } | |
798 if (isalpha(c)) | |
799 { | |
800 if (ledit_basic_cmd (leditInt) EQ LEDIT_FAIL) | |
801 { | |
802 return LEDIT_FAIL; | |
803 } | |
804 } | |
805 else if (c EQ '&') | |
806 { | |
807 if (ledit_and_basic_cmd (leditInt) EQ LEDIT_FAIL) | |
808 { | |
809 return LEDIT_FAIL; | |
810 } | |
811 } | |
812 else | |
813 { | |
814 if (ledit_extended_cmd (leditInt) EQ LEDIT_FAIL) | |
815 { | |
816 return LEDIT_FAIL; | |
817 } | |
818 } | |
819 | |
820 /* here we should peek into the next character to see if command is valid */ | |
821 switch (ledit_lookAhead(leditInt->execBuffer[leditInt->execBufIter])) | |
822 { | |
823 /* legal characters */ | |
824 case LEDIT_CHAR_PERCENT: /* '%' */ | |
825 case LEDIT_CHAR_AND: /* '&' */ | |
826 case LEDIT_CHAR_PLUS: /* '+' */ | |
827 case LEDIT_CHAR_CHAR: /* 'A' symbolic for A..Z*/ | |
828 case LEDIT_CHAR_EXT: /*The rest of the characters*/ | |
829 leditInt->cmdIndex++; /* More commands will follow */ | |
830 /* fallthrough */ | |
831 case LEDIT_CHAR_TERMINATED: /* '\0' */ | |
832 return LEDIT_CMPL; | |
833 | |
834 /* illegal characters */ | |
835 #if 0 | |
836 case LEDIT_CHAR_COMMA: /* ',' */ | |
837 case LEDIT_CHAR_NUMBER: /* '0' symbolic for 0..9 */ | |
838 case LEDIT_CHAR_SEPARATOR: /* ';' */ | |
839 case LEDIT_CHAR_SET: /* '=' */ | |
840 case LEDIT_CHAR_READ: /* '?' */ | |
841 case LEDIT_CHAR_INVALID: | |
842 #endif | |
843 default: | |
844 { | |
845 return LEDIT_FAIL; | |
846 } | |
847 } | |
848 } | |
849 else | |
850 { | |
851 TRACE_ERROR ("ledit_split: unexp. EOF execBuffer"); | |
852 } | |
853 return LEDIT_FAIL; | |
854 } | |
855 | |
856 /* | |
857 +--------------------------------------------------------------------+ | |
858 | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB | | |
859 | STATE : code ROUTINE : ledit_restore_dial_string | | |
860 +--------------------------------------------------------------------+ | |
861 | |
862 PURPOSE : - | |
863 If there were any 'g' or 'i' characters in a dial string that have | |
864 been turned into 'G' or 'I' characters on conversion to upper case | |
865 by the ledit_collect function... | |
866 Turn them back into the lower case characters so that they affect | |
867 CUG and CLIR in the way they were intended to. | |
868 */ | |
869 static T_LEDIT_RSLT ledit_restore_dial_string (char *procDialString, | |
870 int procDialStringLen, | |
871 char *origCommandLine, | |
872 int origCommandLineLen) | |
873 { | |
874 int procDialStringIndex = 0; /* Loop index to procDialString array */ | |
875 int origCommandLineIndex = 0; /* Loop index to origCommandLine array */ | |
876 char *origDialString; /* Pointer to original dial string array in origCommandLine */ | |
877 int origDialStringIndex; /* Loop index to origDialString array */ | |
878 | |
879 TRACE_FUNCTION("ledit_restore_dial_string"); | |
880 | |
881 if ((procDialString == NULL) OR | |
882 (procDialStringLen == 0) OR | |
883 (origCommandLine == NULL) OR | |
884 (origCommandLineLen == 0)) | |
885 { | |
886 TRACE_ERROR("FAILURE: Invalid parameter"); | |
887 if (procDialString == NULL) | |
888 TRACE_EVENT_P1("procDialString = %p", procDialString); | |
889 if (procDialStringLen == 0) | |
890 TRACE_EVENT_P1("procDialStringLen = %d", procDialStringLen); | |
891 if (origCommandLine == NULL) | |
892 TRACE_EVENT_P1("origCommandLine = %p", origCommandLine); | |
893 if (origCommandLineLen == 0) | |
894 TRACE_EVENT_P1("origCommandLineLen = %d", origCommandLineLen); | |
895 return LEDIT_FAIL; | |
896 } | |
897 | |
898 /* Look for a 'G' or 'I' character in the processed dial string */ | |
899 for (procDialStringIndex = 0; | |
900 procDialStringIndex < procDialStringLen; | |
901 procDialStringIndex++) | |
902 { | |
903 if ((procDialString[procDialStringIndex] EQ 'G') OR | |
904 (procDialString[procDialStringIndex] EQ 'I')) | |
905 { | |
906 /* 'G' or 'I' found, so we have something to do */ | |
907 break; | |
908 } | |
909 } | |
910 | |
911 if (procDialStringIndex EQ procDialStringLen) | |
912 { | |
913 /* No 'G' or 'I' found, so we have nothing to do */ | |
914 TRACE_EVENT("SUCCESS: Nothing to do"); | |
915 return LEDIT_CMPL; | |
916 } | |
917 | |
918 /* | |
919 * Look for the start of the original dial string in the original command | |
920 * line by looking for 'd' or 'D' characters | |
921 */ | |
922 for (origCommandLineIndex = 0; | |
923 origCommandLineIndex < origCommandLineLen; | |
924 origCommandLineIndex++) | |
925 { | |
926 if ((origCommandLine[origCommandLineIndex] EQ 'd') OR | |
927 (origCommandLine[origCommandLineIndex] EQ 'D')) | |
928 { | |
929 /* Found the possible start of the original dial string */ | |
930 origDialString = &origCommandLine[origCommandLineIndex+1]; | |
931 origDialStringIndex = 0; | |
932 | |
933 for (procDialStringIndex = 0; | |
934 procDialStringIndex < procDialStringLen; | |
935 procDialStringIndex++) | |
936 { | |
937 /* Ignore any spaces in the original dial string */ | |
938 while (isspace(origDialString[origDialStringIndex])) | |
939 { | |
940 origDialStringIndex++; | |
941 } | |
942 | |
943 /* Do we have a matching character? */ | |
944 if (origDialString[origDialStringIndex] NEQ procDialString[procDialStringIndex]) | |
945 { | |
946 /* No: Is the mismatch just on the alphabetic case? */ | |
947 if (isalpha(origDialString[origDialStringIndex]) AND | |
948 isalpha(procDialString[procDialStringIndex]) AND | |
949 (toupper(origDialString[origDialStringIndex]) EQ | |
950 toupper(procDialString[procDialStringIndex]))) | |
951 { | |
952 /* Yes, so ignore mismatch */; | |
953 } | |
954 else | |
955 { /* No, so not the original dial string */ | |
956 break; | |
957 } | |
958 } | |
959 origDialStringIndex++; | |
960 } | |
961 | |
962 /* Have we found the original dial string? */ | |
963 if (procDialStringIndex EQ procDialStringLen) | |
964 { | |
965 /* Yes, so copy 'G'/'g' and 'I'/'i' characters from the original dial string */ | |
966 origDialStringIndex = 0; | |
967 for (procDialStringIndex = 0; | |
968 procDialStringIndex < procDialStringLen; | |
969 procDialStringIndex++) | |
970 { | |
971 /* Ignore any spaces in the original dial string */ | |
972 while (isspace(origDialString[origDialStringIndex])) | |
973 { | |
974 origDialStringIndex++; | |
975 } | |
976 | |
977 if ((procDialString[procDialStringIndex] EQ 'G') OR | |
978 (procDialString[procDialStringIndex] EQ 'I')) | |
979 { /* Copy the 'G'/'g' or 'I'/'i' character from the original dial string */ | |
980 procDialString[procDialStringIndex] = origDialString[origDialStringIndex]; | |
981 } | |
982 origDialStringIndex++; | |
983 } | |
984 | |
985 TRACE_EVENT("SUCCESS"); | |
986 return LEDIT_CMPL; | |
987 } | |
988 } | |
989 } | |
990 /* If we get this far then we haven't found the original dial string */ | |
991 TRACE_ERROR("FAILURE: Could not find original dial string"); | |
992 return LEDIT_FAIL; | |
993 } | |
994 | |
995 |