| // 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(unsigned char letter) { |
| return 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 |