• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //
5 // String manipulation functions used in the RLZ library.
6 
7 #include "rlz/lib/string_utils.h"
8 
9 #include "rlz/lib/assert.h"
10 
11 namespace rlz_lib {
12 
IsAscii(unsigned char letter)13 bool IsAscii(unsigned char letter) {
14   return letter < 0x80;
15 }
16 
GetHexValue(char letter,int * value)17 bool GetHexValue(char letter, int* value) {
18   if (!value) {
19     ASSERT_STRING("GetHexValue: Invalid output paramter");
20     return false;
21   }
22   *value = 0;
23 
24   if (letter >= '0' && letter <= '9')
25     *value = letter - '0';
26   else if (letter >= 'a' && letter <= 'f')
27     *value = (letter - 'a') + 0xA;
28   else if (letter >= 'A' && letter <= 'F')
29     *value = (letter - 'A') + 0xA;
30   else
31     return false;
32 
33   return true;
34 }
35 
HexStringToInteger(const char * text)36 int HexStringToInteger(const char* text) {
37   if (!text) {
38     ASSERT_STRING("HexStringToInteger: text is NULL.");
39     return 0;
40   }
41 
42   int idx = 0;
43   // Ignore leading whitespace.
44   while (text[idx] == '\t' || text[idx] == ' ')
45     idx++;
46 
47   if ((text[idx] == '0') &&
48       (text[idx + 1] == 'X' || text[idx + 1] == 'x'))
49     idx +=2;  // String is of the form 0x...
50 
51   int number = 0;
52   int digit = 0;
53   for (; text[idx] != '\0'; idx++) {
54     if (!GetHexValue(text[idx], &digit)) {
55       // Ignore trailing whitespaces, but assert on other trailing characters.
56       bool only_whitespaces = true;
57       while (only_whitespaces && text[idx])
58         only_whitespaces = (text[idx++] == ' ');
59       if (!only_whitespaces)
60         ASSERT_STRING("HexStringToInteger: text contains non-hex characters.");
61       return number;
62     }
63     number = (number << 4) | digit;
64   }
65 
66   return number;
67 }
68 
BytesToString(const unsigned char * data,int data_len,std::string * string)69 bool BytesToString(const unsigned char* data,
70                    int data_len,
71                    std::string* string) {
72   if (!string)
73     return false;
74 
75   string->clear();
76   if (data_len < 1 || !data)
77     return false;
78 
79   static const char kHex[] = "0123456789ABCDEF";
80 
81   // Fix the buffer size to begin with to avoid repeated re-allocation.
82   string->resize(data_len * 2);
83   int index = data_len;
84   while (index--) {
85     string->at(2 * index) = kHex[data[index] >> 4];  // high digit
86     string->at(2 * index + 1) = kHex[data[index] & 0x0F];  // low digit
87   }
88 
89   return true;
90 }
91 
92 }  // namespace rlz_lib
93