Index: rlz/lib/string_utils.cc |
=================================================================== |
--- rlz/lib/string_utils.cc (revision 0) |
+++ rlz/lib/string_utils.cc (revision 0) |
@@ -0,0 +1,92 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// String manipulation functions used in the RLZ library. |
+ |
+#include "rlz/lib/string_utils.h" |
+ |
+#include "rlz/lib/assert.h" |
+ |
+namespace rlz_lib { |
+ |
+bool IsAscii(char letter) { |
+ return (letter >= 0x0 && letter < 0x80); |
+} |
+ |
+bool GetHexValue(char letter, int* value) { |
+ if (!value) { |
+ ASSERT_STRING("GetHexValue: Invalid output paramter"); |
+ return false; |
+ } |
+ *value = 0; |
+ |
+ if (letter >= '0' && letter <= '9') |
+ *value = letter - '0'; |
+ else if (letter >= 'a' && letter <= 'f') |
+ *value = (letter - 'a') + 0xA; |
+ else if (letter >= 'A' && letter <= 'F') |
+ *value = (letter - 'A') + 0xA; |
+ else |
+ return false; |
+ |
+ return true; |
+} |
+ |
+int HexStringToInteger(const char* text) { |
+ if (!text) { |
+ ASSERT_STRING("HexStringToInteger: text is NULL."); |
+ return 0; |
+ } |
+ |
+ int idx = 0; |
+ // Ignore leading whitespace. |
+ while (text[idx] == '\t' || text[idx] == ' ') |
+ idx++; |
+ |
+ if ((text[idx] == '0') && |
+ (text[idx + 1] == 'X' || text[idx + 1] == 'x')) |
+ idx +=2; // String is of the form 0x... |
+ |
+ int number = 0; |
+ int digit = 0; |
+ for (; text[idx] != '\0'; idx++) { |
+ if (!GetHexValue(text[idx], &digit)) { |
+ // Ignore trailing whitespaces, but assert on other trailing characters. |
+ bool only_whitespaces = true; |
+ while (only_whitespaces && text[idx]) |
+ only_whitespaces = (text[idx++] == ' '); |
+ if (!only_whitespaces) |
+ ASSERT_STRING("HexStringToInteger: text contains non-hex characters."); |
+ return number; |
+ } |
+ number = (number << 4) | digit; |
+ } |
+ |
+ return number; |
+} |
+ |
+bool BytesToString(const unsigned char* data, |
+ int data_len, |
+ std::string* string) { |
+ if (!string) |
+ return false; |
+ |
+ string->clear(); |
+ if (data_len < 1 || !data) |
+ return false; |
+ |
+ static const char kHex[] = "0123456789ABCDEF"; |
+ |
+ // Fix the buffer size to begin with to avoid repeated re-allocation. |
+ string->resize(data_len * 2); |
+ int index = data_len; |
+ while (index--) { |
+ string->at(2 * index) = kHex[data[index] >> 4]; // high digit |
+ string->at(2 * index + 1) = kHex[data[index] & 0x0F]; // low digit |
+ } |
+ |
+ return true; |
+} |
+ |
+} // namespace rlz_lib |