Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Tue Jun 07 12:23:28 2011 +0000
Revision:
3:92dae9083c83
Parent:
1:d5452e398b76
Basic T7 CAN DUMP and FLASH for P-BUS connection only
Requires MyBooty V2.x for T5 CAN FLASHing at 1 Mbps

Who changed what in which revision?

UserRevisionLine numberNew 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 }