Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Revision:
1:d5452e398b76
Parent:
0:e0b964252a05
--- a/strings.cpp	Wed May 19 12:39:18 2010 +0000
+++ b/strings.cpp	Tue Sep 14 21:02:04 2010 +0000
@@ -1,6 +1,7 @@
 /*******************************************************************************
 
-Strings.cpp - By Sophie Dexter, April 2010
+strings.cpp 
+(c) 2010 by Sophie Dexter
 
 This C++ module provides functions for working with 'strings' of ascii 'char's
 
@@ -15,6 +16,7 @@
 accept liability for any damage arising from its use.
 
 *******************************************************************************/
+
 #include "strings.h"
 
 // copies a string, s2, (array of chars) to another string, s1.
@@ -81,4 +83,81 @@
         s++;
     }
     return s;
-}
\ No newline at end of file
+}
+
+// StrAddc    adds a single char to the end of a string
+
+char *StrAddc (char *s, const char c) {
+  char *s1 = s;
+
+// Find the end of the string 's'
+  while (*s)
+    *s++;
+// add the new character
+  *s++ = c;
+// put the end of string character at its new position
+  *s = '\0';
+  return s1;
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Converts an ASCII character to low nibble of a byte.
+
+    @param        rx_byte            character to convert
+    
+    @return                        resulting value            
+*/
+uint8_t ascii2nibble(char str)
+{
+    return str >= 'a' ? (str - 'a' + 10) & 0x0f :
+        (str >= 'A' ? (str - 'A' + 10) & 0x0f :
+        (str - '0') & 0x0f);
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Converts an ASCII string to integer (checks string contents beforehand).
+
+    @param        val                destination integer
+    @param        str                pointer to source string
+    @param        length            length of source string
+
+    @return                        succ / fail
+*/
+bool ascii2int(uint32_t* val, const char* str, uint8_t length)
+{
+    // nothing to convert
+    if (!str || length < 1)
+    {
+        *val = 0;
+        return false;
+    }
+
+    // check string contents
+    uint8_t shift;
+    for (shift = 0; shift < length; ++shift)
+    {
+        if (!isxdigit(*(str + shift)))
+        {
+            // not a hex value
+            *val = 0;
+            return false;    
+        } 
+    }
+
+    // convert string
+    *val = ascii2nibble(*(str++));
+    for (shift = 1; shift < length; ++shift)
+    {
+        *val <<= 4;
+        *val += ascii2nibble(*(str++));
+    }
+    return true;
+}
+
+int isxdigit ( int ch )
+{
+    return (unsigned int)( ch         - '0') < 10u  ||
+           (unsigned int)((ch | 0x20) - 'a') <  6u;
+}