Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
strings.cpp@5:1775b4b13232, 2015-04-25 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Sat Apr 25 17:07:08 2015 +0000
- Revision:
- 5:1775b4b13232
- Parent:
- 1:d5452e398b76
Version 1.5 Is a significant milestone.; ; Supports BDM and CAN read and write of T5.x, T7 and T8 ECU's plus T8 recovery.; A Target Resident Driver for BDM gives a big speed boost.; Supports many alternative replacement FLASH chips for T5.x ECU's;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Just4pLeisure | 0:e0b964252a05 | 1 | /******************************************************************************* |
Just4pLeisure | 0:e0b964252a05 | 2 | |
Just4pLeisure | 1:d5452e398b76 | 3 | strings.cpp |
Just4pLeisure | 1:d5452e398b76 | 4 | (c) 2010 by Sophie Dexter |
Just4pLeisure | 0:e0b964252a05 | 5 | |
Just4pLeisure | 0:e0b964252a05 | 6 | This C++ module provides functions for working with 'strings' of ascii 'char's |
Just4pLeisure | 0:e0b964252a05 | 7 | |
Just4pLeisure | 0:e0b964252a05 | 8 | C++ should have functions like these, but it doesn't seem to so these are my |
Just4pLeisure | 0:e0b964252a05 | 9 | own ones. They are very simple and do not check for any errors e.g. StrCpy |
Just4pLeisure | 0:e0b964252a05 | 10 | does not check that s1 is big enough to store all of s2. |
Just4pLeisure | 0:e0b964252a05 | 11 | |
Just4pLeisure | 0:e0b964252a05 | 12 | ******************************************************************************** |
Just4pLeisure | 0:e0b964252a05 | 13 | |
Just4pLeisure | 0:e0b964252a05 | 14 | WARNING: Use at your own risk, sadly this software comes with no guarantees. |
Just4pLeisure | 0:e0b964252a05 | 15 | This software is provided 'free' and in good faith, but the author does not |
Just4pLeisure | 0:e0b964252a05 | 16 | accept liability for any damage arising from its use. |
Just4pLeisure | 0:e0b964252a05 | 17 | |
Just4pLeisure | 0:e0b964252a05 | 18 | *******************************************************************************/ |
Just4pLeisure | 1:d5452e398b76 | 19 | |
Just4pLeisure | 0:e0b964252a05 | 20 | #include "strings.h" |
Just4pLeisure | 0:e0b964252a05 | 21 | |
Just4pLeisure | 0:e0b964252a05 | 22 | // copies a string, s2, (array of chars) to another string, s1. |
Just4pLeisure | 0:e0b964252a05 | 23 | char *StrCpy(char *s1, char *s2) { |
Just4pLeisure | 0:e0b964252a05 | 24 | // while (*s1++ = *s2++); |
Just4pLeisure | 0:e0b964252a05 | 25 | while (*s2) |
Just4pLeisure | 0:e0b964252a05 | 26 | *s1++ = *s2++; |
Just4pLeisure | 0:e0b964252a05 | 27 | return s1; |
Just4pLeisure | 0:e0b964252a05 | 28 | } |
Just4pLeisure | 0:e0b964252a05 | 29 | |
Just4pLeisure | 0:e0b964252a05 | 30 | // returns the number of chars in a string |
Just4pLeisure | 0:e0b964252a05 | 31 | int StrLen(char *s) { |
Just4pLeisure | 0:e0b964252a05 | 32 | int x = 0; |
Just4pLeisure | 0:e0b964252a05 | 33 | while (*s++) |
Just4pLeisure | 0:e0b964252a05 | 34 | x++; |
Just4pLeisure | 0:e0b964252a05 | 35 | return (x); |
Just4pLeisure | 0:e0b964252a05 | 36 | } |
Just4pLeisure | 0:e0b964252a05 | 37 | |
Just4pLeisure | 0:e0b964252a05 | 38 | // checks s1 to see if it the same as s2 |
Just4pLeisure | 0:e0b964252a05 | 39 | // returns TRUE if there is a match |
Just4pLeisure | 0:e0b964252a05 | 40 | // WARNING actually only checks that s1 starts with s2! |
Just4pLeisure | 0:e0b964252a05 | 41 | bool StrCmp(char *s1, char *s2) { |
Just4pLeisure | 0:e0b964252a05 | 42 | // while (*s2 != '\0') { |
Just4pLeisure | 0:e0b964252a05 | 43 | while (*s2) { |
Just4pLeisure | 0:e0b964252a05 | 44 | if (*s1++ != *s2++) { |
Just4pLeisure | 0:e0b964252a05 | 45 | return FALSE; |
Just4pLeisure | 0:e0b964252a05 | 46 | } |
Just4pLeisure | 0:e0b964252a05 | 47 | } |
Just4pLeisure | 0:e0b964252a05 | 48 | return TRUE; |
Just4pLeisure | 0:e0b964252a05 | 49 | } |
Just4pLeisure | 0:e0b964252a05 | 50 | |
Just4pLeisure | 0:e0b964252a05 | 51 | // Converts lower case ascii letters a-z to upper case |
Just4pLeisure | 0:e0b964252a05 | 52 | // leaves other characters unchanged |
Just4pLeisure | 0:e0b964252a05 | 53 | char ToUpper(char c) { |
Just4pLeisure | 0:e0b964252a05 | 54 | if (c >= 'a' && c <= 'z') |
Just4pLeisure | 0:e0b964252a05 | 55 | c -= 32; |
Just4pLeisure | 0:e0b964252a05 | 56 | return c; |
Just4pLeisure | 0:e0b964252a05 | 57 | } |
Just4pLeisure | 0:e0b964252a05 | 58 | |
Just4pLeisure | 0:e0b964252a05 | 59 | // Converts upper case ascii letters A-Z to lower case |
Just4pLeisure | 0:e0b964252a05 | 60 | // leaves other characters unchanged |
Just4pLeisure | 0:e0b964252a05 | 61 | char ToLower(char c) { |
Just4pLeisure | 0:e0b964252a05 | 62 | if (c >= 'A' && c <= 'Z') |
Just4pLeisure | 0:e0b964252a05 | 63 | c += 32; |
Just4pLeisure | 0:e0b964252a05 | 64 | return c; |
Just4pLeisure | 0:e0b964252a05 | 65 | } |
Just4pLeisure | 0:e0b964252a05 | 66 | |
Just4pLeisure | 0:e0b964252a05 | 67 | // Converts ASCII numbers 0-9 and letters a-f (and A-F) to hex values 0x00-0x0F |
Just4pLeisure | 0:e0b964252a05 | 68 | // leaves other characters unchanged |
Just4pLeisure | 0:e0b964252a05 | 69 | // ASCII '0' is worth 0x30 so subtract 0x30 if ascii character is a number |
Just4pLeisure | 0:e0b964252a05 | 70 | // Lower case ASCII letter 'a' is worth 0x61, but we want this to be worth 0x0A |
Just4pLeisure | 0:e0b964252a05 | 71 | // Subtract 0x57 (0x61 + 0x0A = 0x57) from lower case letters |
Just4pLeisure | 0:e0b964252a05 | 72 | // Upper case ASCII letter 'A' is worth 0x41, but we want this to be worth 0x0A |
Just4pLeisure | 0:e0b964252a05 | 73 | // Subtract 0x37 (0x41 + 0x0A = 0x37) from upper case letters |
Just4pLeisure | 0:e0b964252a05 | 74 | |
Just4pLeisure | 0:e0b964252a05 | 75 | char *aToh(char *s) { |
Just4pLeisure | 0:e0b964252a05 | 76 | while (*s) { |
Just4pLeisure | 0:e0b964252a05 | 77 | if ((*s >= '0') && (*s <='9')) |
Just4pLeisure | 0:e0b964252a05 | 78 | *s -= '0'; |
Just4pLeisure | 0:e0b964252a05 | 79 | else if ((*s >= 'a') && (*s <='f')) |
Just4pLeisure | 0:e0b964252a05 | 80 | *s -= ('a' - 0x0A); |
Just4pLeisure | 0:e0b964252a05 | 81 | else if ((*s >= 'A') && (*s <='F')) |
Just4pLeisure | 0:e0b964252a05 | 82 | *s -= ('A' - 0x0A); |
Just4pLeisure | 0:e0b964252a05 | 83 | s++; |
Just4pLeisure | 0:e0b964252a05 | 84 | } |
Just4pLeisure | 0:e0b964252a05 | 85 | return s; |
Just4pLeisure | 1:d5452e398b76 | 86 | } |
Just4pLeisure | 1:d5452e398b76 | 87 | |
Just4pLeisure | 1:d5452e398b76 | 88 | // StrAddc adds a single char to the end of a string |
Just4pLeisure | 1:d5452e398b76 | 89 | |
Just4pLeisure | 1:d5452e398b76 | 90 | char *StrAddc (char *s, const char c) { |
Just4pLeisure | 1:d5452e398b76 | 91 | char *s1 = s; |
Just4pLeisure | 1:d5452e398b76 | 92 | |
Just4pLeisure | 1:d5452e398b76 | 93 | // Find the end of the string 's' |
Just4pLeisure | 1:d5452e398b76 | 94 | while (*s) |
Just4pLeisure | 1:d5452e398b76 | 95 | *s++; |
Just4pLeisure | 1:d5452e398b76 | 96 | // add the new character |
Just4pLeisure | 1:d5452e398b76 | 97 | *s++ = c; |
Just4pLeisure | 1:d5452e398b76 | 98 | // put the end of string character at its new position |
Just4pLeisure | 1:d5452e398b76 | 99 | *s = '\0'; |
Just4pLeisure | 1:d5452e398b76 | 100 | return s1; |
Just4pLeisure | 1:d5452e398b76 | 101 | } |
Just4pLeisure | 1:d5452e398b76 | 102 | |
Just4pLeisure | 1:d5452e398b76 | 103 | //----------------------------------------------------------------------------- |
Just4pLeisure | 1:d5452e398b76 | 104 | /** |
Just4pLeisure | 1:d5452e398b76 | 105 | Converts an ASCII character to low nibble of a byte. |
Just4pLeisure | 1:d5452e398b76 | 106 | |
Just4pLeisure | 1:d5452e398b76 | 107 | @param rx_byte character to convert |
Just4pLeisure | 1:d5452e398b76 | 108 | |
Just4pLeisure | 1:d5452e398b76 | 109 | @return resulting value |
Just4pLeisure | 1:d5452e398b76 | 110 | */ |
Just4pLeisure | 1:d5452e398b76 | 111 | uint8_t ascii2nibble(char str) |
Just4pLeisure | 1:d5452e398b76 | 112 | { |
Just4pLeisure | 1:d5452e398b76 | 113 | return str >= 'a' ? (str - 'a' + 10) & 0x0f : |
Just4pLeisure | 1:d5452e398b76 | 114 | (str >= 'A' ? (str - 'A' + 10) & 0x0f : |
Just4pLeisure | 1:d5452e398b76 | 115 | (str - '0') & 0x0f); |
Just4pLeisure | 1:d5452e398b76 | 116 | } |
Just4pLeisure | 1:d5452e398b76 | 117 | |
Just4pLeisure | 1:d5452e398b76 | 118 | //----------------------------------------------------------------------------- |
Just4pLeisure | 1:d5452e398b76 | 119 | /** |
Just4pLeisure | 1:d5452e398b76 | 120 | Converts an ASCII string to integer (checks string contents beforehand). |
Just4pLeisure | 1:d5452e398b76 | 121 | |
Just4pLeisure | 1:d5452e398b76 | 122 | @param val destination integer |
Just4pLeisure | 1:d5452e398b76 | 123 | @param str pointer to source string |
Just4pLeisure | 1:d5452e398b76 | 124 | @param length length of source string |
Just4pLeisure | 1:d5452e398b76 | 125 | |
Just4pLeisure | 1:d5452e398b76 | 126 | @return succ / fail |
Just4pLeisure | 1:d5452e398b76 | 127 | */ |
Just4pLeisure | 1:d5452e398b76 | 128 | bool ascii2int(uint32_t* val, const char* str, uint8_t length) |
Just4pLeisure | 1:d5452e398b76 | 129 | { |
Just4pLeisure | 1:d5452e398b76 | 130 | // nothing to convert |
Just4pLeisure | 1:d5452e398b76 | 131 | if (!str || length < 1) |
Just4pLeisure | 1:d5452e398b76 | 132 | { |
Just4pLeisure | 1:d5452e398b76 | 133 | *val = 0; |
Just4pLeisure | 1:d5452e398b76 | 134 | return false; |
Just4pLeisure | 1:d5452e398b76 | 135 | } |
Just4pLeisure | 1:d5452e398b76 | 136 | |
Just4pLeisure | 1:d5452e398b76 | 137 | // check string contents |
Just4pLeisure | 1:d5452e398b76 | 138 | uint8_t shift; |
Just4pLeisure | 1:d5452e398b76 | 139 | for (shift = 0; shift < length; ++shift) |
Just4pLeisure | 1:d5452e398b76 | 140 | { |
Just4pLeisure | 1:d5452e398b76 | 141 | if (!isxdigit(*(str + shift))) |
Just4pLeisure | 1:d5452e398b76 | 142 | { |
Just4pLeisure | 1:d5452e398b76 | 143 | // not a hex value |
Just4pLeisure | 1:d5452e398b76 | 144 | *val = 0; |
Just4pLeisure | 1:d5452e398b76 | 145 | return false; |
Just4pLeisure | 1:d5452e398b76 | 146 | } |
Just4pLeisure | 1:d5452e398b76 | 147 | } |
Just4pLeisure | 1:d5452e398b76 | 148 | |
Just4pLeisure | 1:d5452e398b76 | 149 | // convert string |
Just4pLeisure | 1:d5452e398b76 | 150 | *val = ascii2nibble(*(str++)); |
Just4pLeisure | 1:d5452e398b76 | 151 | for (shift = 1; shift < length; ++shift) |
Just4pLeisure | 1:d5452e398b76 | 152 | { |
Just4pLeisure | 1:d5452e398b76 | 153 | *val <<= 4; |
Just4pLeisure | 1:d5452e398b76 | 154 | *val += ascii2nibble(*(str++)); |
Just4pLeisure | 1:d5452e398b76 | 155 | } |
Just4pLeisure | 1:d5452e398b76 | 156 | return true; |
Just4pLeisure | 1:d5452e398b76 | 157 | } |
Just4pLeisure | 1:d5452e398b76 | 158 | |
Just4pLeisure | 1:d5452e398b76 | 159 | int isxdigit ( int ch ) |
Just4pLeisure | 1:d5452e398b76 | 160 | { |
Just4pLeisure | 1:d5452e398b76 | 161 | return (unsigned int)( ch - '0') < 10u || |
Just4pLeisure | 1:d5452e398b76 | 162 | (unsigned int)((ch | 0x20) - 'a') < 6u; |
Just4pLeisure | 1:d5452e398b76 | 163 | } |