Utility library for MTS Socket Modem Arduino Shield devices from Multi-Tech Systems

Dependents:   mtsas mtsas thermostat_fan_demo--fan mtsas ... more

NOTE: MTS-Utils has moved to GitHub. This version will not be updated. For updates, go to the GitHub version.

Committer:
Mike Fiore
Date:
Wed Sep 09 11:59:59 2015 -0500
Revision:
14:1d88cf5266c8
Parent:
13:4709c2dfcd11
Child:
15:ae12624eb600
update from git

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 2:7779ede60c3d 1 #include "MTSText.h"
Mike Fiore 12:7818d55b35c6 2 #include "ctype.h"
Mike Fiore 13:4709c2dfcd11 3 #include <math.h>
Mike Fiore 2:7779ede60c3d 4
Mike Fiore 2:7779ede60c3d 5 using namespace mts;
Mike Fiore 2:7779ede60c3d 6
Mike Fiore 14:1d88cf5266c8 7 std::string BASE64CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
Mike Fiore 14:1d88cf5266c8 8
Mike Fiore 2:7779ede60c3d 9 std::string Text::getLine(const std::string& source, const size_t& start, size_t& cursor) {
Mike Fiore 2:7779ede60c3d 10 char delimiters[2];
Mike Fiore 2:7779ede60c3d 11 delimiters[0] = '\n';
Mike Fiore 2:7779ede60c3d 12 delimiters[1] = '\r';
Mike Fiore 2:7779ede60c3d 13 size_t end = source.find_first_of(delimiters, start, 2);
Mike Fiore 2:7779ede60c3d 14 std::string line(source.substr(start, end - start));
Mike Fiore 2:7779ede60c3d 15 if (end < source.size()) {
Mike Fiore 2:7779ede60c3d 16 if (end < source.size() - 1)
Mike Fiore 2:7779ede60c3d 17 if ((source[end] == '\n' && source[end + 1] == '\r') || (source[end] == '\r' && source[end + 1] == '\n')) {
Mike Fiore 2:7779ede60c3d 18 //Advance an additional character in scenarios where lines end in \r\n or \n\r
Mike Fiore 2:7779ede60c3d 19 end++;
Mike Fiore 2:7779ede60c3d 20 }
Mike Fiore 2:7779ede60c3d 21 end++;
Mike Fiore 2:7779ede60c3d 22 }
Mike Fiore 2:7779ede60c3d 23 cursor = end;
Mike Fiore 2:7779ede60c3d 24 return line;
Mike Fiore 2:7779ede60c3d 25 }
Mike Fiore 2:7779ede60c3d 26
Mike Fiore 2:7779ede60c3d 27 std::vector<std::string> Text::split(const std::string& str, char delimiter, int limit) {
Mike Fiore 2:7779ede60c3d 28 return split(str, std::string(1, delimiter), limit);
Mike Fiore 2:7779ede60c3d 29 }
Mike Fiore 2:7779ede60c3d 30
Mike Fiore 2:7779ede60c3d 31 std::vector<std::string> Text::split(const std::string& str, const std::string& delimiter, int limit) {
Mike Fiore 2:7779ede60c3d 32 std::vector<std::string> result;
Mike Fiore 2:7779ede60c3d 33 if(str.size() == 0) {
Mike Fiore 2:7779ede60c3d 34 return result;
Mike Fiore 2:7779ede60c3d 35 }
Mike Fiore 2:7779ede60c3d 36 size_t start = 0;
Mike Fiore 2:7779ede60c3d 37 size_t end = str.find(delimiter, start);
Mike Fiore 2:7779ede60c3d 38 for (int i = 1; i < limit || (limit <= 0 && (end != std::string::npos)); ++i) {
Mike Fiore 2:7779ede60c3d 39 result.push_back(str.substr(start, end - start));
Mike Fiore 2:7779ede60c3d 40 start = end + delimiter.length();
Mike Fiore 2:7779ede60c3d 41 end = str.find(delimiter, start);
Mike Fiore 2:7779ede60c3d 42 }
Mike Fiore 2:7779ede60c3d 43 result.push_back(str.substr(start));
Mike Fiore 2:7779ede60c3d 44 return result;
Mike Fiore 2:7779ede60c3d 45 }
Mike Fiore 2:7779ede60c3d 46
Mike Fiore 2:7779ede60c3d 47 std::string Text::readString(char* index, int length)
Mike Fiore 2:7779ede60c3d 48 {
Mike Fiore 2:7779ede60c3d 49 std::string result = std::string(index, length);
Mike Fiore 2:7779ede60c3d 50 index += length;
Mike Fiore 2:7779ede60c3d 51 return result;
Mike Fiore 13:4709c2dfcd11 52 }
Mike Fiore 13:4709c2dfcd11 53
Mike Fiore 12:7818d55b35c6 54 std::string Text::toUpper(const std::string str)
Mike Fiore 12:7818d55b35c6 55 {
Mike Fiore 12:7818d55b35c6 56 std::string ret = str;
Mike Fiore 12:7818d55b35c6 57
Mike Fiore 12:7818d55b35c6 58 for (unsigned int i = 0; i < ret.size(); i++)
Mike Fiore 12:7818d55b35c6 59 {
Mike Fiore 12:7818d55b35c6 60 ret[i] = toupper(ret[i]);
Mike Fiore 12:7818d55b35c6 61 }
Mike Fiore 12:7818d55b35c6 62
Mike Fiore 12:7818d55b35c6 63 return ret;
Mike Fiore 12:7818d55b35c6 64 }
Mike Fiore 13:4709c2dfcd11 65
Mike Fiore 13:4709c2dfcd11 66 std::string Text::float2String(double val, int precision) {
Mike Fiore 13:4709c2dfcd11 67 char buff[100];
Mike Fiore 13:4709c2dfcd11 68 sprintf(buff, "%d.%d", (int)val, (int)((val - floor(val)) * (int)pow(10.0, precision)));
Mike Fiore 13:4709c2dfcd11 69 return std::string(buff);
Mike Fiore 13:4709c2dfcd11 70 }
Mike Fiore 13:4709c2dfcd11 71
Mike Fiore 13:4709c2dfcd11 72 std::string Text::bin2hexString(const std::vector<uint8_t>& data, const char* delim, bool leadingZeros) {
Mike Fiore 13:4709c2dfcd11 73 uint8_t data_arr[data.size()];
Mike Fiore 13:4709c2dfcd11 74
Mike Fiore 13:4709c2dfcd11 75 for (int i = 0; i < data.size(); i++)
Mike Fiore 13:4709c2dfcd11 76 data_arr[i] = data[i];
Mike Fiore 13:4709c2dfcd11 77
Mike Fiore 13:4709c2dfcd11 78 return bin2hexString(data_arr, data.size(), delim, leadingZeros);
Mike Fiore 13:4709c2dfcd11 79 }
Mike Fiore 13:4709c2dfcd11 80
Mike Fiore 13:4709c2dfcd11 81 std::string Text::bin2hexString(const uint8_t* data, const uint32_t len, const char* delim, bool leadingZeros) {
Mike Fiore 13:4709c2dfcd11 82 std::string str;
Mike Fiore 13:4709c2dfcd11 83 char buf[32];
Mike Fiore 13:4709c2dfcd11 84 char lead[] = "0x";
Mike Fiore 13:4709c2dfcd11 85
Mike Fiore 13:4709c2dfcd11 86 for (uint32_t i = 0; i < len; i++) {
Mike Fiore 13:4709c2dfcd11 87 if (leadingZeros)
Mike Fiore 13:4709c2dfcd11 88 str.append(lead);
Mike Fiore 13:4709c2dfcd11 89 snprintf(buf, sizeof(buf), "%02x", data[i]);
Mike Fiore 13:4709c2dfcd11 90 str.append(buf, strlen(buf));
Mike Fiore 13:4709c2dfcd11 91 if (i < len - 1)
Mike Fiore 13:4709c2dfcd11 92 str.append(delim);
Mike Fiore 13:4709c2dfcd11 93 }
Mike Fiore 13:4709c2dfcd11 94
Mike Fiore 13:4709c2dfcd11 95 return str;
Mike Fiore 13:4709c2dfcd11 96 }
Mike Fiore 14:1d88cf5266c8 97
Mike Fiore 14:1d88cf5266c8 98 std::string Text::bin2base64(const uint8_t* data, size_t size) {
Mike Fiore 14:1d88cf5266c8 99 std::string out;
Mike Fiore 14:1d88cf5266c8 100 uint8_t b;
Mike Fiore 14:1d88cf5266c8 101
Mike Fiore 14:1d88cf5266c8 102 for (size_t i = 0; i < size; i+=3) {
Mike Fiore 14:1d88cf5266c8 103 b = (data[i] & 0xfc) >> 2;
Mike Fiore 14:1d88cf5266c8 104 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 105 b = (data[i] & 0x03) << 4;
Mike Fiore 14:1d88cf5266c8 106 if (i+1 < size) {
Mike Fiore 14:1d88cf5266c8 107 b |= (data[i+1] & 0xf0) >> 4;
Mike Fiore 14:1d88cf5266c8 108 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 109 b = (data[i + 1] & 0x0f) << 2;
Mike Fiore 14:1d88cf5266c8 110 if (i+2 < size) {
Mike Fiore 14:1d88cf5266c8 111 b |= (data[i+2] & 0xc0) >> 6;
Mike Fiore 14:1d88cf5266c8 112 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 113 b = data[i+2] & 0x3f;
Mike Fiore 14:1d88cf5266c8 114 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 115 } else {
Mike Fiore 14:1d88cf5266c8 116 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 117 out.append("=");
Mike Fiore 14:1d88cf5266c8 118 }
Mike Fiore 14:1d88cf5266c8 119 } else {
Mike Fiore 14:1d88cf5266c8 120 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 121 out.append("==");
Mike Fiore 14:1d88cf5266c8 122 }
Mike Fiore 14:1d88cf5266c8 123 }
Mike Fiore 14:1d88cf5266c8 124
Mike Fiore 14:1d88cf5266c8 125 return out;
Mike Fiore 14:1d88cf5266c8 126 }
Mike Fiore 14:1d88cf5266c8 127
Mike Fiore 14:1d88cf5266c8 128 std::string Text::bin2base64(const std::vector<uint8_t>& data) {
Mike Fiore 14:1d88cf5266c8 129 std::string out;
Mike Fiore 14:1d88cf5266c8 130 uint8_t b;
Mike Fiore 14:1d88cf5266c8 131
Mike Fiore 14:1d88cf5266c8 132 for (size_t i = 0; i < data.size(); i+=3) {
Mike Fiore 14:1d88cf5266c8 133 b = (data[i] & 0xfc) >> 2;
Mike Fiore 14:1d88cf5266c8 134 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 135 b = (data[i] & 0x03) << 4;
Mike Fiore 14:1d88cf5266c8 136 if (i+1 < data.size()) {
Mike Fiore 14:1d88cf5266c8 137 b |= (data[i+1] & 0xf0) >> 4;
Mike Fiore 14:1d88cf5266c8 138 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 139 b = (data[i + 1] & 0x0f) << 2;
Mike Fiore 14:1d88cf5266c8 140 if (i+2 < data.size()) {
Mike Fiore 14:1d88cf5266c8 141 b |= (data[i+2] & 0xc0) >> 6;
Mike Fiore 14:1d88cf5266c8 142 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 143 b = data[i+2] & 0x3f;
Mike Fiore 14:1d88cf5266c8 144 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 145 } else {
Mike Fiore 14:1d88cf5266c8 146 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 147 out.append("=");
Mike Fiore 14:1d88cf5266c8 148 }
Mike Fiore 14:1d88cf5266c8 149 } else {
Mike Fiore 14:1d88cf5266c8 150 out.push_back(BASE64CODE[b]);
Mike Fiore 14:1d88cf5266c8 151 out.append("==");
Mike Fiore 14:1d88cf5266c8 152 }
Mike Fiore 14:1d88cf5266c8 153 }
Mike Fiore 14:1d88cf5266c8 154
Mike Fiore 14:1d88cf5266c8 155 return out;
Mike Fiore 14:1d88cf5266c8 156 }
Mike Fiore 14:1d88cf5266c8 157
Mike Fiore 14:1d88cf5266c8 158 bool Text::base642bin(const std::string in, std::vector<uint8_t>& out) {
Mike Fiore 14:1d88cf5266c8 159
Mike Fiore 14:1d88cf5266c8 160 if (in.find_first_not_of(BASE64CODE) != std::string::npos) {
Mike Fiore 14:1d88cf5266c8 161 return false;
Mike Fiore 14:1d88cf5266c8 162 }
Mike Fiore 14:1d88cf5266c8 163
Mike Fiore 14:1d88cf5266c8 164 if (in.size() % 4 != 0) {
Mike Fiore 14:1d88cf5266c8 165 return false;
Mike Fiore 14:1d88cf5266c8 166 }
Mike Fiore 14:1d88cf5266c8 167
Mike Fiore 14:1d88cf5266c8 168 uint8_t a,b,c,d;
Mike Fiore 14:1d88cf5266c8 169
Mike Fiore 14:1d88cf5266c8 170 for (uint32_t i = 0; i < in.size(); i+=4) {
Mike Fiore 14:1d88cf5266c8 171 a = BASE64CODE.find(in[i]);
Mike Fiore 14:1d88cf5266c8 172 b = BASE64CODE.find(in[i+1]);
Mike Fiore 14:1d88cf5266c8 173 c = BASE64CODE.find(in[i+2]);
Mike Fiore 14:1d88cf5266c8 174 d = BASE64CODE.find(in[i+3]);
Mike Fiore 14:1d88cf5266c8 175 out.push_back(a << 2 | b >> 4);
Mike Fiore 14:1d88cf5266c8 176 out.push_back(b << 4 | c >> 2);
Mike Fiore 14:1d88cf5266c8 177 out.push_back(c << 6 | d);
Mike Fiore 14:1d88cf5266c8 178 }
Mike Fiore 14:1d88cf5266c8 179
Mike Fiore 14:1d88cf5266c8 180 return true;
Mike Fiore 14:1d88cf5266c8 181 }
Mike Fiore 14:1d88cf5266c8 182
Mike Fiore 13:4709c2dfcd11 183
Mike Fiore 13:4709c2dfcd11 184 void Text::ltrim(std::string& str, const char* args) {
Mike Fiore 13:4709c2dfcd11 185 size_t startpos = str.find_first_not_of(args);
Mike Fiore 13:4709c2dfcd11 186 if (startpos != std::string::npos)
Mike Fiore 13:4709c2dfcd11 187 str = str.substr(startpos);
Mike Fiore 13:4709c2dfcd11 188 }
Mike Fiore 13:4709c2dfcd11 189
Mike Fiore 13:4709c2dfcd11 190 void Text::rtrim(std::string& str, const char* args) {
Mike Fiore 13:4709c2dfcd11 191 size_t endpos = str.find_last_not_of(args);
Mike Fiore 13:4709c2dfcd11 192 if (endpos != std::string::npos)
Mike Fiore 13:4709c2dfcd11 193 str = str.substr(0, endpos + 1);
Mike Fiore 13:4709c2dfcd11 194 }
Mike Fiore 13:4709c2dfcd11 195
Mike Fiore 13:4709c2dfcd11 196 void Text::trim(std::string& str, const char* args) {
Mike Fiore 13:4709c2dfcd11 197 ltrim(str, args);
Mike Fiore 13:4709c2dfcd11 198 rtrim(str, args);
Mike Fiore 13:4709c2dfcd11 199 }