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