Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Just4Trionic by
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 | } |
