diff gsm-fw/g23m-aci/ksd/ksd_utl.c @ 775:eedbf248bac0

gsm-fw/g23m-aci subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 12 Oct 2014 01:45:14 +0000
parents
children c421163143a0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/g23m-aci/ksd/ksd_utl.c	Sun Oct 12 01:45:14 2014 +0000
@@ -0,0 +1,326 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-F&D (8411)
+|  Modul   :  KSD_UTL
++----------------------------------------------------------------------------- 
+|  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 module defines utility functions for the KSD
+|             component of the protocol stack.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef KSD_UTL_C
+#define KSD_UTL_C
+#endif
+
+#include "aci_all.h"
+/*==== INCLUDES ===================================================*/
+
+/*==== CONSTANTS ==================================================*/
+
+#define SUBADDR_DELIMITER '-'  /* used to separate the subaddress  */
+                               /* from the main address            */
+#define NULL_TERM         '\0' /* string termination               */
+
+/*==== TYPES ======================================================*/
+
+/*==== EXPORT =====================================================*/
+
+/*==== VARIABLES ==================================================*/
+
+/*==== FUNCTIONS ==================================================*/
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_cutInternational     |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function cuts all characters which signals that the
+            dial number is international (leading '+' or leading
+            '00').
+
+            <dial>:       the origin dial number
+            <cuttedDial>: the dial number without leading '+' or '00'
+
+            returns:      TRUE if the dial number was of the type
+                          international, otherwise FALSE.
+*/
+LOCAL BOOL utl_cutInternational (CHAR* dial, CHAR** cuttedDial)
+{
+  BOOL international = FALSE; /* holds whether number is */
+                              /* international           */
+
+  if (dial[0] EQ '+')
+  {
+    international = TRUE;
+    *cuttedDial   = dial + 1;
+  }
+  /*
+   * 00 is not an indication for an international call
+  else if (dial[0] EQ '0' AND dial[1] EQ '0')
+  {
+    international = TRUE;
+    *cuttedDial   = dial + 2;
+  }
+  */
+  else
+    *cuttedDial   = dial;
+
+  return international;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_getValidDialchars    |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function returns the number of valid dial characters 
+            in the buffer. This function is only used to process 
+            the subaddress part.
+
+            <dial>:  the dial number (subaddress)
+
+            returns: the number of valid dial characters.
+*/
+LOCAL USHORT utl_getValidDialchars (CHAR* dial)
+{
+  USHORT numChars = 0; /* holds number of valid dial characters */
+  USHORT i        = 0; /* used for counting                     */
+
+  while (dial[i] NEQ NULL_TERM)
+  {
+    if ((dial[i] >= '0' AND dial[i] <= '9') OR
+        (dial[i] >= 'A' AND dial[i] <= 'C') OR
+        (dial[i] >= 'a' AND dial[i] <= 'c') OR
+         dial[i] EQ '*'                     OR
+         dial[i] EQ '#'                       )
+      numChars++;
+         
+    i++;
+  }
+
+  return numChars;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_splitDialnumber      |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function splits a dial string into address and
+            subaddress and delivers additional information about
+            the specific types of addresses.
+
+            <dial>:          the origin dial number
+            <main>:          the main address of the dial number;
+                             if it was international, leading '+'
+                             or '00' are cutted
+            <international>: TRUE if the dial number is international,
+                             otherwise FALSE
+            <sub>:           the sub address of the dial number or
+                             NULL if there is none
+            <numCharsSub>:   the number of valid dial characters of
+                             the sub address
+*/
+GLOBAL void utl_splitDialnumber (CHAR*   dial,
+                                 CHAR**  main,
+                                 BOOL*   international,
+                                 CHAR**  sub,
+                                 USHORT* numCharsSub)
+{
+  CHAR* token; /* points to dial number */
+  
+  if (dial NEQ NULL)
+  {
+    token = strchr (dial, SUBADDR_DELIMITER);
+  
+    if (token NEQ NULL)
+    {
+      *token       = NULL_TERM;
+      *sub         = ++token;
+      *numCharsSub = utl_getValidDialchars (token);
+    }
+    else
+    {
+      *sub         = NULL;
+      *numCharsSub = 0;
+    }
+
+    *international = utl_cutInternational (dial, main);
+  }
+  else
+  {
+    *main          = NULL;
+    *international = FALSE;
+    *sub           = NULL;
+    *numCharsSub   = 0;
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_string2UByte         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function converts characters from a buffer to an
+            unsigned byte value.
+
+            <inUByte>:  buffer containing the characters forming 
+                        the unsigned byte value
+            <inLen>:    number of characters to be taken into account
+            <outValue>: the converted value
+
+            returns:    TRUE if the conversion was successful,
+                        otherwise FALSE.
+*/
+GLOBAL BOOL utl_string2UByte (CHAR*  inUByte,
+                              USHORT inLen,
+                              UBYTE* outValue)
+{
+  UBYTE result = 0; /* holds the result value of conversion */
+
+  if (inLen EQ 0)
+    return TRUE;
+
+  while (inLen--)
+  {
+    result *= 10;
+    if (*inUByte >= '0' AND *inUByte <= '9')
+      result += *inUByte++ - '0';
+    else
+      return FALSE;
+  }
+
+  *outValue = result;
+  return TRUE;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_string2Byte          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function converts characters from a buffer to a
+            signed byte value.
+
+            <inByte>:   buffer containing the characters forming 
+                        the signed byte value
+            <inLen>:    number of characters to be taken into account
+            <outValue>: the converted value
+
+            returns:    TRUE if the conversion was successful,
+                        otherwise FALSE.
+*/
+GLOBAL BOOL utl_string2Byte (CHAR*  inByte,
+                             USHORT inLen,
+                             BYTE*  outValue)
+{
+  BYTE result = 0; /* holds the result value of conversion */
+
+  if (inLen EQ 0)
+    return TRUE;
+
+  while (inLen--)
+  {
+    result *= 10;
+    if (*inByte >= '0' AND *inByte <= '9')
+      result += *inByte++ - '0';
+    else
+      return FALSE;
+  }
+
+  *outValue = result;
+  return TRUE;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_string2Short         |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function converts characters from a buffer to an
+            short value.
+
+            <inShort>:  buffer containing the characters forming 
+                        the short value
+            <inLen>:    number of characters to be taken into account
+            <outValue>: the converted value
+
+            returns:    TRUE if the conversion was successful,
+                        otherwise FALSE.
+*/
+GLOBAL BOOL utl_string2Short (CHAR*  inShort,
+                              USHORT inLen,
+                              SHORT* outValue)
+{
+  SHORT result = 0; /* holds the result value of conversion */
+
+  if (inLen EQ 0)
+    return TRUE;
+
+  while (inLen--)
+  {
+    result *= 10;
+    if (*inShort >= '0' AND *inShort <= '9')
+      result += *inShort++ - '0';
+    else
+      return FALSE;
+  }
+
+  *outValue = result;
+  return TRUE;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : KSD_UTL                  |
+| STATE   : code                  ROUTINE : utl_string2Long          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function converts characters from a buffer to an
+            long value.
+
+            <inLong>:   buffer containing the characters forming 
+                        the short value
+            <inLen>:    number of characters to be taken into account
+            <outValue>: the converted value
+
+            returns:    TRUE if the conversion was successful,
+                        otherwise FALSE.
+*/
+GLOBAL BOOL utl_string2Long (CHAR*  inLong,
+                             USHORT inLen,
+                             LONG*  outValue)
+{
+  LONG result = 0; /* holds the result value of conversion */
+
+  if (inLen EQ 0)
+    return TRUE;
+
+  while (inLen--)
+  {
+    result *= 10;
+    if (*inLong >= '0' AND *inLong <= '9')
+      result += *inLong++ - '0';
+    else
+      return FALSE;
+  }
+
+  *outValue = result;
+  return TRUE;
+}