line source
+ − /*
+ − +-----------------------------------------------------------------------------
+ − | Project :
+ − | Modul : line
+ − +-----------------------------------------------------------------------------
+ − | Copyright 2002 Texas Instruments Berlin, AG
+ − | All rights reserved.
+ − |
+ − | This file is confidential and a trade secret of Texas
+ − | Instruments Berlin, AG
+ − | The receipt of or possession of this file does not convey
+ − | any rights to reproduce or disclose its contents or to
+ − | manufacture, use, or sell anything it may describe, in
+ − | whole, or in part, without the specific written consent of
+ − | Texas Instruments Berlin, AG.
+ − +-----------------------------------------------------------------------------
+ − | Purpose : This modul ...
+ − +-----------------------------------------------------------------------------
+ − */
+ −
+ − #include <stdio.h>
+ − #include <stdlib.h>
+ − #include <string.h>
+ − #include <ctype.h>
+ −
+ − #include "typedefs.h"
+ − #include "vsi.h"
+ − #include "pei.h"
+ − #include "aci_mem.h"
+ − #include "p_aci.val"
+ −
+ − #include "line_edit.h"
+ − #include "line_edit_intern.h"
+ − #include "line_split_intern.h"
+ −
+ − static T_LEDIT_CHAR_TYPE ledit_lookAhead (char c);
+ − static UBYTE ledit_check_valid_basic_cmd (char c);
+ − static UBYTE ledit_check_valid_and_cmd (char c);
+ − static USHORT ledit_get_para_len (T_LEDIT_INTERN *leditInt, USHORT searchLen);
+ − static USHORT ledit_get_name_len (T_LEDIT_INTERN *leditInt, T_LEDIT_NAME_TYPE nType);
+ − static T_LEDIT_RSLT ledit_get_memory (T_LEDIT_ATCMD_M **cmdm, int size, int name);
+ − static T_LEDIT_RSLT ledit_get_cmd_mem (T_LEDIT_INTERN *leditInt);
+ − static T_LEDIT_RSLT ledit_assign_name (T_LEDIT_INTERN *leditInt, int len);
+ − static T_LEDIT_RSLT ledit_assign_param (T_LEDIT_INTERN *leditInt, T_LEDIT_PARAM_TYPE pType);
+ − static T_LEDIT_ATCMD_SUBTYPE ledit_extended_type (T_LEDIT_INTERN *leditInt);
+ − static T_LEDIT_RSLT ledit_extended_cmd (T_LEDIT_INTERN *leditInt);
+ − static T_LEDIT_RSLT ledit_s_cmd (T_LEDIT_INTERN *leditInt);
+ − static T_LEDIT_RSLT ledit_dial (T_LEDIT_INTERN *leditInt);
+ − static T_LEDIT_RSLT ledit_and_basic_cmd (T_LEDIT_INTERN *leditInt);
+ − static T_LEDIT_RSLT ledit_basic_cmd (T_LEDIT_INTERN *leditInt);
+ −
+ − static T_LEDIT_RSLT ledit_restore_dial_string (char *procDialString,
+ − int procDialStringLen,
+ − char *origCommandLine,
+ − int origCommandLineLen);
+ −
+ −
+ − static const UBYTE basic_ATcmd [26][2] =
+ − {
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* A */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* B */
+ − {BATCMD_NO_SUPP, ANDCMD_SUPPORT}, /* C */
+ − {BATCMD_DIAL , ANDCMD_SUPPORT}, /* D <---- SPECIAL */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* E */
+ − {BATCMD_SUPPORT, ANDCMD_SUPPORT}, /* F */
+ − {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* G */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* H */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* I */
+ − {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* J */
+ − {BATCMD_NO_SUPP, ANDCMD_SUPPORT}, /* K */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* L */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* M */
+ − {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* N */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* O */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* P */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* Q */
+ − {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* R */
+ − {BATCMD_S_PARAM, ANDCMD_NO_SUPP}, /* S <---- SPECIAL */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* T */
+ − {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* U */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* V */
+ − {BATCMD_SUPPORT, ANDCMD_SUPPORT}, /* W */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP}, /* X */
+ − {BATCMD_NO_SUPP, ANDCMD_NO_SUPP}, /* Y */
+ − {BATCMD_SUPPORT, ANDCMD_NO_SUPP} /* Z */
+ − };
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_check_valid_basic_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : -
+ − */
+ − static UBYTE ledit_check_valid_basic_cmd (char c)
+ − {
+ − return basic_ATcmd [(int)(c-'A')][0];
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_check_valid_and_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : -
+ − */
+ − static UBYTE ledit_check_valid_and_cmd (char c)
+ − {
+ − return basic_ATcmd [(int)(c-'A')][1];
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_lookAhead |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - qualify the character at the look ahead position
+ − */
+ −
+ − static T_LEDIT_CHAR_TYPE ledit_lookAhead (char c)
+ − {
+ − if (c EQ '\0')
+ − return LEDIT_CHAR_TERMINATED;
+ −
+ − switch (c)
+ − {
+ − case '%':
+ − return LEDIT_CHAR_PERCENT;
+ − case '&':
+ − return LEDIT_CHAR_AND;
+ − case '+':
+ − return LEDIT_CHAR_PLUS;
+ − case ',':
+ − return LEDIT_CHAR_COMMA;
+ − case '=':
+ − return LEDIT_CHAR_SET;
+ − case ';':
+ − return LEDIT_CHAR_SEPARATOR;
+ − case '?':
+ − return LEDIT_CHAR_READ;
+ − default:
+ − {
+ − if ((c-'0') < 10 AND (c - '0') >=0)
+ − return LEDIT_CHAR_NUMBER;
+ − if ((c>='A') && (c<='Z'))
+ − return LEDIT_CHAR_CHAR;
+ − if (((c >= '!') AND (c <= '_')) OR ((c >= 123) AND ((unsigned char)c <= 127)))
+ − /*the rest of characters*/
+ − return LEDIT_CHAR_EXT;
+ − return LEDIT_CHAR_INVALID;
+ − }
+ − }
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_get_para_len |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - calculate length of an AT command parameter
+ − */
+ − static USHORT ledit_get_para_len (T_LEDIT_INTERN *leditInt, USHORT searchLen)
+ − {
+ − USHORT i = 0;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION("ledit_get_para_len()");
+ − #endif
+ − if (searchLen EQ SEARCH_BAT_LEN)
+ − {
+ − /* basic AT command can have numbers only e.g.: ATF123 */
+ − i = leditInt->execBufIter; /* start with first number */
+ − while (isdigit(leditInt->execBuffer[i]))
+ − {
+ − ++i;
+ − }
+ − return (i - leditInt->execBufIter);
+ − }
+ − else
+ − {
+ − /*
+ − * dial string finish with ';'
+ − * extended AT command is terminated by ';' or by '\0' if last one in cmd line
+ − */
+ − i = leditInt->execBufIter;
+ −
+ − while (';' != leditInt->execBuffer[i])
+ − {
+ − ++i;
+ − if (leditInt->execBuffer[i] EQ '\0')
+ − {
+ − break;
+ − }
+ − }
+ − if ((searchLen EQ SEARCH_DIAL_LEN) AND (';' EQ leditInt->execBuffer[i]))
+ − {
+ − ++i; /* for dial the ';' is important */
+ − }
+ − return (i - leditInt->execBufIter);
+ − }
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_get_name_len |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - get the length of an extended AT command or ATSnn where nn := 0..99
+ − extended name starts with '+', '%', '$' ... or every other char which is not [a-zA-Z][0-9]
+ − after prefix must start with [A-Z] and then up to further 15 characters
+ − of [A-Z][0-9]!%-./:_ according to V.25 ter chapter 5.4.1
+ − */
+ − static USHORT ledit_get_name_len (T_LEDIT_INTERN *leditInt, T_LEDIT_NAME_TYPE nType)
+ − {
+ − USHORT i = leditInt->execBufIter;
+ −
+ − if (nType EQ LEDIT_EXT_NAME)
+ − {
+ − ++i; /* skip prefix of extended name */
+ − }
+ − /*
+ − * first char (after extended prefix) must be [A-Z] (to capital letter done by ledit_collect())
+ − */
+ − if (isupper (leditInt->execBuffer[i]))
+ − {
+ − while (leditInt->execBuffer[i])
+ − {
+ − if ((nType EQ LEDIT_S_NAME) AND (i > leditInt->execBufIter))
+ − {
+ − if (isdigit(leditInt->execBuffer[i]) EQ 0)
+ − {
+ − return 0; /* invalid name for ATSnn, where nn must be [0-9]+ */
+ − }
+ − if ((i - leditInt->execBufIter) > LEDIT_MAX_S_NAME_LEN)
+ − {
+ − return 0; /* invalid name for ATSnn, where nn is too large */
+ − }
+ − }
+ − ++i;
+ − switch (leditInt->execBuffer[i])
+ − {
+ − case '\0':
+ − {
+ − return (i - leditInt->execBufIter);
+ − }
+ − case '=':
+ − {
+ − if (leditInt->execBuffer[i+1] NEQ '?')
+ − {
+ − return (i - leditInt->execBufIter);
+ − }
+ − else /* AT+XXX=? */
+ − {
+ − if ((leditInt->execBuffer[i+2] NEQ '\0') AND (leditInt->execBuffer[i+2] NEQ ';'))
+ − {
+ − return 0; /* after =? must be ';' or terminated */
+ − }
+ − return (i - leditInt->execBufIter);
+ − }
+ − }
+ − case '?':
+ − {
+ − if ((leditInt->execBuffer[i+1] NEQ '\0') AND (leditInt->execBuffer[i+1] NEQ ';'))
+ − {
+ − return 0; /* after ? must be ';' or terminated */
+ − }
+ − return (i - leditInt->execBufIter);
+ − }
+ − case ';':
+ − {
+ − /*
+ − * there are several extended AT cmds without "=parameter" or "=?" or "?" after the name, e.g.: +CGMM;+CGMI;+CGMR;+CGSN;...
+ − * the ";" after the name will be parsed in ledit_get_para_len()
+ − */
+ − return (i - leditInt->execBufIter);
+ − }
+ − }
+ − } /* end of while (leditInt->execBuffer[i]) */
+ − }
+ − return 0; /* invalid name */
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_free_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : -
+ − */
+ − void ledit_free_cmd (T_LEDIT_INTERN *leditInt)
+ − {
+ −
+ − T_LEDIT_ATCMD_M *tmp = NULL;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION("ledit_free_cmd()");
+ − #endif
+ − while (leditInt->cmdm)
+ − {
+ − tmp = leditInt->cmdm->next;
+ − if (leditInt->cmdm->cmd)
+ − {
+ − if (leditInt->cmdm->cmd->name)
+ − {
+ − ACI_MFREE(leditInt->cmdm->cmd->name);
+ − }
+ − if (leditInt->cmdm->cmd->params)
+ − {
+ − ACI_MFREE (leditInt->cmdm->cmd->params);
+ − }
+ − ACI_MFREE (leditInt->cmdm->cmd);
+ − }
+ − /* if (leditInt->cmdm) ... always true */
+ − {
+ − ACI_MFREE (leditInt->cmdm);
+ − }
+ − leditInt->cmdm = tmp;
+ − }
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_get_cmd_mem |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - allocate some memory for T_LEDIT_ATCMD
+ − */
+ −
+ − static T_LEDIT_RSLT ledit_get_cmd_mem (T_LEDIT_INTERN *leditInt)
+ − {
+ − ACI_MALLOC(leditInt->cmdm,sizeof(T_LEDIT_ATCMD_M));
+ − if (leditInt->cmdm EQ NULL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − memset(leditInt->cmdm, '\0', sizeof(T_LEDIT_ATCMD_M));
+ − leditInt->cmdm->next = NULL;
+ −
+ − ACI_MALLOC(leditInt->cmdm->cmd,sizeof(T_LEDIT_ATCMD));
+ − if (leditInt->cmdm->cmd EQ NULL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − memset(leditInt->cmdm->cmd, '\0', sizeof(T_LEDIT_ATCMD));
+ −
+ − leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_NIL;
+ − leditInt->cmdm->cmd->type.sType = (T_LEDIT_ATCMD_SUBTYPE) LEDIT_ATCMD_NIL;
+ − /* Initializing flag here BUG 11920 */
+ − leditInt->cmdm->cmd->type.append_Flag = FALSE;
+ − leditInt->cmdm->cmd->name = NULL;
+ − leditInt->cmdm->cmd->params = NULL;
+ − return LEDIT_CMPL;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_get_memory |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - allocate some memory (for char *)
+ − */
+ −
+ − static T_LEDIT_RSLT ledit_get_memory (T_LEDIT_ATCMD_M **cmdm, int size, int name)
+ − {
+ −
+ − T_LEDIT_ATCMD_M **tmp = cmdm;
+ − if (name)
+ − {
+ − ACI_MALLOC((*tmp)->cmd->name,size * sizeof(char));
+ − if ((*tmp)->cmd->name EQ NULL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − (*tmp)->cmd->name[0]='\0';
+ − }
+ − else
+ − {
+ − ACI_MALLOC((*tmp)->cmd->params,size * sizeof(char));
+ − if ((*tmp)->cmd->params EQ NULL)
+ − {
+ − TRACE_FUNCTION("ledit_get_memory(): returning fail");
+ − return LEDIT_FAIL;
+ − }
+ − (*tmp)->cmd->params[0]='\0';
+ − }
+ − return LEDIT_CMPL;
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_assign_name |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - extract the name of an AT command from command line
+ − and put it into T_LEDIT_ATCMD member name
+ − */
+ −
+ − static T_LEDIT_RSLT ledit_assign_name (T_LEDIT_INTERN *leditInt, int len)
+ − {
+ − if(ledit_get_memory (&(leditInt->cmdm), len+1, 1) EQ LEDIT_FAIL)
+ − {
+ − leditInt->err.code = LEDIT_ERR_NoMemory;
+ − leditInt->err.msg = ledit_err[LEDIT_ERR_NoMemory].msg;
+ − return LEDIT_FAIL;
+ − }
+ − memcpy (leditInt->cmdm->cmd->name, leditInt->execBuffer+leditInt->execBufIter, len);
+ − *(leditInt->cmdm->cmd->name+len) = '\0'; /* terminate name */
+ − leditInt->execBufIter += len; /* update iterator in execBuffer */
+ − return LEDIT_CMPL;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_assign_param |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - extract the param(s) of an AT command from command line
+ − and put it into T_LEDIT_ATCMD member param
+ − - can be empty
+ − */
+ −
+ − static T_LEDIT_RSLT ledit_assign_param (T_LEDIT_INTERN *leditInt, T_LEDIT_PARAM_TYPE pType)
+ − {
+ − int len = 0;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION("ledit_assign_param()");
+ − #endif
+ − if (pType EQ LEDIT_BASIC_PARAM)
+ − {
+ − len = ledit_get_para_len (leditInt, SEARCH_BAT_LEN);
+ − }
+ − else
+ − if (pType EQ LEDIT_DIAL_PARAM) /* dial parameter, we need the possible ';' */
+ − {
+ − len = ledit_get_para_len (leditInt, SEARCH_DIAL_LEN);
+ − /*
+ − * If there were any 'g' or 'i' characters in a dial string that have
+ − * been turned into 'G' or 'I' characters on conversion to upper case
+ − * by the ledit_collect function...
+ − * Turn them back into the lower case characters so that they affect
+ − * CUG and CLIR in the way they were intended to.
+ − */
+ − ledit_restore_dial_string ( &leditInt->execBuffer[leditInt->execBufIter],
+ − len,
+ − leditInt->origBuffer,
+ − strlen(leditInt->origBuffer));
+ − }
+ − else /* extended AT cmd params */
+ − {
+ − len = ledit_get_para_len (leditInt, SEARCH_EXT_LEN);
+ − }
+ − if(ledit_get_memory (&(leditInt->cmdm), len+1, 0) EQ LEDIT_FAIL)
+ − {
+ − leditInt->err.code = LEDIT_ERR_NoMemory;
+ − leditInt->err.msg = ledit_err[LEDIT_ERR_NoMemory].msg;
+ − return LEDIT_FAIL;
+ − }
+ − memcpy (leditInt->cmdm->cmd->params, leditInt->execBuffer+leditInt->execBufIter, len);
+ − *(leditInt->cmdm->cmd->params+len) = '\0';
+ −
+ − /*
+ − * update iterator in execBuffer
+ − * for extended cmds skip the ';'
+ − */
+ − if (pType EQ LEDIT_EXT_PARAM)
+ − {
+ − if (leditInt->execBuffer[leditInt->execBufIter+len] EQ '\0')
+ − {
+ − leditInt->execBufIter += len;
+ − }
+ − else
+ − {
+ − leditInt->execBufIter += len+1; /* skip the ';' */
+ − }
+ − }
+ − else
+ − {
+ − leditInt->execBufIter += len;
+ − }
+ −
+ − return LEDIT_CMPL;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_extended_type |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : -
+ − */
+ − static T_LEDIT_ATCMD_SUBTYPE ledit_extended_type (T_LEDIT_INTERN *leditInt)
+ − {
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION("ledit_extended_type()");
+ − #endif
+ − switch (ledit_lookAhead(leditInt->execBuffer[leditInt->execBufIter]))
+ − {
+ − case LEDIT_CHAR_SET:
+ − {
+ − ++(leditInt->execBufIter);
+ − if (ledit_lookAhead(leditInt->execBuffer[leditInt->execBufIter]) EQ LEDIT_CHAR_READ)
+ − {
+ − ++(leditInt->execBufIter);
+ − /*Setting flag as 1*/
+ − leditInt->cmdm->cmd->type.append_Flag = TRUE;
+ − /* bug 11920*/
+ − return LEDIT_ATCMD_TEST;
+ − }
+ − /*Setting flag as 1*/
+ − leditInt->cmdm->cmd->type.append_Flag = TRUE;
+ − /* bug 11920*/
+ − return LEDIT_ATCMD_SET;
+ − }
+ − case LEDIT_CHAR_READ:
+ − {
+ − ++(leditInt->execBufIter);
+ − /*Setting flag as 1*/
+ − leditInt->cmdm->cmd->type.append_Flag = TRUE;
+ − /* bug 11920*/
+ − return LEDIT_ATCMD_QUERY;
+ − }
+ − default:
+ − {
+ − /* return LEDIT_ATCMD_NIL; */
+ − /*Setting flag as 0.
+ − These types need not be appended with the characters later on while reconstructing
+ − command in leedit_fwrd_extension*/
+ − leditInt->cmdm->cmd->type.append_Flag = FALSE;
+ − /* bug 11920*/
+ −
+ − return LEDIT_ATCMD_SET; /* if after name no parameters e.g.: AT+CMGL; */
+ − }
+ − }
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_extended_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - split cmd line into single canonical commands
+ − */
+ − static T_LEDIT_RSLT ledit_extended_cmd (T_LEDIT_INTERN *leditInt)
+ − {
+ − int len = 0;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION ("ledit_extended_cmd()");
+ − #endif
+ − /*
+ − * get name lenght
+ − */
+ − len = ledit_get_name_len (leditInt, LEDIT_EXT_NAME);
+ − if(len)
+ − {
+ − if (ledit_assign_name(leditInt, len) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_EXTENDED;
+ − leditInt->cmdm->cmd->type.sType = ledit_extended_type(leditInt);
+ − if (ledit_assign_param (leditInt, LEDIT_EXT_PARAM) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else
+ − {
+ − leditInt->err.code = LEDIT_ERR_NoValidCommand;
+ − leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg;
+ − return LEDIT_FAIL;
+ − }
+ − return LEDIT_CMPL;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_s_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - special basic AT command ATS
+ − with own syntax similiar to extended AT commands
+ − e.g.: ATS0? <-- query register S0
+ − ATS0=123 <-- set new value for register S0
+ − but the parameter is basic cmd like
+ − */
+ − static T_LEDIT_RSLT ledit_s_cmd (T_LEDIT_INTERN *leditInt)
+ − {
+ − int len = 0;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION ("ledit_s_cmd()");
+ − #endif
+ − /*
+ − * get name length, support for up to ATS99, but not ATS100 !
+ − */
+ − len = ledit_get_name_len (leditInt, LEDIT_S_NAME);
+ − if(len)
+ − {
+ − if (ledit_assign_name(leditInt, len) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_S;
+ − leditInt->cmdm->cmd->type.sType = ledit_extended_type(leditInt); /* after Sx must be [?|=] */
+ − if (ledit_assign_param (leditInt, LEDIT_BASIC_PARAM) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else
+ − {
+ − leditInt->err.code = LEDIT_ERR_NoValidCommand;
+ − leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg;
+ − return LEDIT_FAIL;
+ − }
+ − return LEDIT_CMPL;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_dial |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - ATD12345; , but also ATD(030)12345; or ATD!; ATD@; ...
+ − - semantic of ATD paramter has to be checked by ATI
+ − */
+ − static T_LEDIT_RSLT ledit_dial (T_LEDIT_INTERN *leditInt)
+ − {
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION ("ledit_dial()");
+ − #endif
+ − leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_DIAL;
+ − leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_SET;
+ − /*Setting flag as 0*/
+ − leditInt->cmdm->cmd->type.append_Flag = FALSE;
+ − /*Issue 11920*/
+ − if (ledit_assign_name(leditInt, 1) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − /*
+ − * dial paramter ends with ';' -> LEDIT_EXT_PARAM
+ − */
+ − if (ledit_assign_param (leditInt, LEDIT_DIAL_PARAM) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − if (leditInt->execBuffer[leditInt->execBufIter])
+ − {
+ − return LEDIT_FAIL; /* dial command is not the last on cmd line */
+ − }
+ − return LEDIT_CMPL;
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_and_basic_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : -
+ − */
+ − static T_LEDIT_RSLT ledit_and_basic_cmd (T_LEDIT_INTERN *leditInt)
+ − {
+ − USHORT rv = ANDCMD_NO_SUPP;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION ("ledit_and_basic_cmd()");
+ − #endif
+ − ++(leditInt->execBufIter); /* skip the & */
+ −
+ − rv = ledit_check_valid_and_cmd (leditInt->execBuffer[leditInt->execBufIter]);
+ − if(rv EQ ANDCMD_SUPPORT)
+ − {
+ − leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_AND;
+ − leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_QUERY;
+ −
+ − /*Setting flag as 0*/
+ − leditInt->cmdm->cmd->type.append_Flag = FALSE;
+ − /* bug 11920*/
+ −
+ − if (ledit_assign_name(leditInt, 1) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − if (ledit_assign_param (leditInt, LEDIT_BASIC_PARAM) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else
+ − {
+ − leditInt->err.code = LEDIT_ERR_NoValidCommand;
+ − leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg;
+ − return LEDIT_FAIL;
+ − }
+ − return LEDIT_CMPL;
+ − }
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_basic_cmd |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - check for basic command
+ − - check for dial command
+ − */
+ − static T_LEDIT_RSLT ledit_basic_cmd (T_LEDIT_INTERN *leditInt)
+ − {
+ − USHORT rv = BATCMD_NO_SUPP;
+ − #ifdef _SIMULATION_
+ − TRACE_FUNCTION ("ledit_basic_cmd()");
+ − #endif
+ − rv = ledit_check_valid_basic_cmd (leditInt->execBuffer[leditInt->execBufIter]);
+ − if (rv EQ BATCMD_SUPPORT)
+ − {
+ − leditInt->cmdm->cmd->type.mType = LEDIT_ATCMD_BASIC;
+ − leditInt->cmdm->cmd->type.sType = LEDIT_ATCMD_SET;
+ −
+ − /* Setting flag as 0*/
+ − leditInt->cmdm->cmd->type.append_Flag = FALSE;
+ − /* Issue 11920*/
+ −
+ − if (ledit_assign_name(leditInt, 1) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − if (ledit_assign_param (leditInt, LEDIT_BASIC_PARAM) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else if (rv EQ BATCMD_DIAL)
+ − {
+ − if (ledit_dial(leditInt) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else if (rv EQ BATCMD_S_PARAM)
+ − {
+ − if (ledit_s_cmd(leditInt) NEQ LEDIT_CMPL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else
+ − {
+ − leditInt->err.code = LEDIT_ERR_NoValidCommand;
+ − leditInt->err.msg = ledit_err[LEDIT_ERR_NoValidCommand].msg;
+ − return LEDIT_FAIL;
+ − }
+ − return LEDIT_CMPL;
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_split |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : - split cmd line into single canonical commands
+ − */
+ − T_LEDIT_RSLT ledit_split (T_LEDIT_INTERN *leditInt)
+ − {
+ −
+ − char c = leditInt->execBuffer[leditInt->execBufIter];
+ − TRACE_FUNCTION("ledit_split");
+ −
+ − /*
+ − * check first character of a command: has to be valid basic command letter, "&" or
+ − * any extension sign "+", "%" , "$" or what ever else
+ − */
+ − if(c)
+ − {
+ − if (ledit_get_cmd_mem (leditInt) EQ LEDIT_FAIL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − if (isalpha(c))
+ − {
+ − if (ledit_basic_cmd (leditInt) EQ LEDIT_FAIL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else if (c EQ '&')
+ − {
+ − if (ledit_and_basic_cmd (leditInt) EQ LEDIT_FAIL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − else
+ − {
+ − if (ledit_extended_cmd (leditInt) EQ LEDIT_FAIL)
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ −
+ − /* here we should peek into the next character to see if command is valid */
+ − switch (ledit_lookAhead(leditInt->execBuffer[leditInt->execBufIter]))
+ − {
+ − /* legal characters */
+ − case LEDIT_CHAR_PERCENT: /* '%' */
+ − case LEDIT_CHAR_AND: /* '&' */
+ − case LEDIT_CHAR_PLUS: /* '+' */
+ − case LEDIT_CHAR_CHAR: /* 'A' symbolic for A..Z*/
+ − case LEDIT_CHAR_EXT: /*The rest of the characters*/
+ − leditInt->cmdIndex++; /* More commands will follow */
+ − /*lint -fallthrough */
+ − case LEDIT_CHAR_TERMINATED: /* '\0' */
+ − return LEDIT_CMPL;
+ −
+ − /* illegal characters */
+ − #if 0
+ − case LEDIT_CHAR_COMMA: /* ',' */
+ − case LEDIT_CHAR_NUMBER: /* '0' symbolic for 0..9 */
+ − case LEDIT_CHAR_SEPARATOR: /* ';' */
+ − case LEDIT_CHAR_SET: /* '=' */
+ − case LEDIT_CHAR_READ: /* '?' */
+ − case LEDIT_CHAR_INVALID:
+ − #endif
+ − default:
+ − {
+ − return LEDIT_FAIL;
+ − }
+ − }
+ − }
+ − else
+ − {
+ − TRACE_ERROR ("ledit_split: unexp. EOF execBuffer");
+ − }
+ − return LEDIT_FAIL;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : LINE_EDIT_LIB |
+ − | STATE : code ROUTINE : ledit_restore_dial_string |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : -
+ − If there were any 'g' or 'i' characters in a dial string that have
+ − been turned into 'G' or 'I' characters on conversion to upper case
+ − by the ledit_collect function...
+ − Turn them back into the lower case characters so that they affect
+ − CUG and CLIR in the way they were intended to.
+ − */
+ − static T_LEDIT_RSLT ledit_restore_dial_string (char *procDialString,
+ − int procDialStringLen,
+ − char *origCommandLine,
+ − int origCommandLineLen)
+ − {
+ − int procDialStringIndex = 0; /* Loop index to procDialString array */
+ − int origCommandLineIndex = 0; /* Loop index to origCommandLine array */
+ − char *origDialString; /* Pointer to original dial string array in origCommandLine */
+ − int origDialStringIndex; /* Loop index to origDialString array */
+ −
+ − TRACE_FUNCTION("ledit_restore_dial_string");
+ −
+ − if ((procDialString == NULL) OR
+ − (procDialStringLen == 0) OR
+ − (origCommandLine == NULL) OR
+ − (origCommandLineLen == 0))
+ − {
+ − TRACE_ERROR("FAILURE: Invalid parameter");
+ − if (procDialString == NULL)
+ − TRACE_EVENT_P1("procDialString = %p", procDialString);
+ − if (procDialStringLen == 0)
+ − TRACE_EVENT_P1("procDialStringLen = %d", procDialStringLen);
+ − if (origCommandLine == NULL)
+ − TRACE_EVENT_P1("origCommandLine = %p", origCommandLine);
+ − if (origCommandLineLen == 0)
+ − TRACE_EVENT_P1("origCommandLineLen = %d", origCommandLineLen);
+ − return LEDIT_FAIL;
+ − }
+ −
+ − /* Look for a 'G' or 'I' character in the processed dial string */
+ − for (procDialStringIndex = 0;
+ − procDialStringIndex < procDialStringLen;
+ − procDialStringIndex++)
+ − {
+ − if ((procDialString[procDialStringIndex] EQ 'G') OR
+ − (procDialString[procDialStringIndex] EQ 'I'))
+ − {
+ − /* 'G' or 'I' found, so we have something to do */
+ − break;
+ − }
+ − }
+ −
+ − if (procDialStringIndex EQ procDialStringLen)
+ − {
+ − /* No 'G' or 'I' found, so we have nothing to do */
+ − TRACE_EVENT("SUCCESS: Nothing to do");
+ − return LEDIT_CMPL;
+ − }
+ −
+ − /*
+ − * Look for the start of the original dial string in the original command
+ − * line by looking for 'd' or 'D' characters
+ − */
+ − for (origCommandLineIndex = 0;
+ − origCommandLineIndex < origCommandLineLen;
+ − origCommandLineIndex++)
+ − {
+ − if ((origCommandLine[origCommandLineIndex] EQ 'd') OR
+ − (origCommandLine[origCommandLineIndex] EQ 'D'))
+ − {
+ − /* Found the possible start of the original dial string */
+ − origDialString = &origCommandLine[origCommandLineIndex+1];
+ − origDialStringIndex = 0;
+ −
+ − for (procDialStringIndex = 0;
+ − procDialStringIndex < procDialStringLen;
+ − procDialStringIndex++)
+ − {
+ − /* Ignore any spaces in the original dial string */
+ − while (isspace(origDialString[origDialStringIndex]))
+ − {
+ − origDialStringIndex++;
+ − }
+ −
+ − /* Do we have a matching character? */
+ − if (origDialString[origDialStringIndex] NEQ procDialString[procDialStringIndex])
+ − {
+ − /* No: Is the mismatch just on the alphabetic case? */
+ − if (isalpha(origDialString[origDialStringIndex]) AND
+ − isalpha(procDialString[procDialStringIndex]) AND
+ − (toupper(origDialString[origDialStringIndex]) EQ
+ − toupper(procDialString[procDialStringIndex])))
+ − {
+ − /* Yes, so ignore mismatch */;
+ − }
+ − else
+ − { /* No, so not the original dial string */
+ − break;
+ − }
+ − }
+ − origDialStringIndex++;
+ − }
+ −
+ − /* Have we found the original dial string? */
+ − if (procDialStringIndex EQ procDialStringLen)
+ − {
+ − /* Yes, so copy 'G'/'g' and 'I'/'i' characters from the original dial string */
+ − origDialStringIndex = 0;
+ − for (procDialStringIndex = 0;
+ − procDialStringIndex < procDialStringLen;
+ − procDialStringIndex++)
+ − {
+ − /* Ignore any spaces in the original dial string */
+ − while (isspace(origDialString[origDialStringIndex]))
+ − {
+ − origDialStringIndex++;
+ − }
+ −
+ − if ((procDialString[procDialStringIndex] EQ 'G') OR
+ − (procDialString[procDialStringIndex] EQ 'I'))
+ − { /* Copy the 'G'/'g' or 'I'/'i' character from the original dial string */
+ − procDialString[procDialStringIndex] = origDialString[origDialStringIndex];
+ − }
+ − origDialStringIndex++;
+ − }
+ −
+ − TRACE_EVENT("SUCCESS");
+ − return LEDIT_CMPL;
+ − }
+ − }
+ − }
+ − /* If we get this far then we haven't found the original dial string */
+ − TRACE_ERROR("FAILURE: Could not find original dial string");
+ − return LEDIT_FAIL;
+ − }
+ −
+ −