strutil.cc revision 776ca3085c44e6570813270df75278849c37d400
1#include "strutil.h"
2
3#include <ctype.h>
4#include <string.h>
5
6#include <unordered_map>
7#include <utility>
8
9WordScanner::Iterator& WordScanner::Iterator::operator++() {
10  int len = static_cast<int>(in->size());
11  for (s = i; s < len; s++) {
12    if (!isspace((*in)[s]))
13      break;
14  }
15  if (s == len) {
16    in = NULL;
17    s = 0;
18    i = 0;
19    return *this;
20  }
21  for (i = s; i < len; i++) {
22    if (isspace((*in)[s]))
23      break;
24  }
25  return *this;
26}
27
28StringPiece WordScanner::Iterator::operator*() const {
29  return in->substr(s, i);
30}
31
32WordScanner::WordScanner(StringPiece in)
33    : in_(in) {
34}
35
36WordScanner::Iterator WordScanner::begin() const {
37  Iterator iter;
38  iter.in = &in_;
39  iter.s = 0;
40  iter.i = 0;
41  ++iter;
42  return iter;
43}
44
45WordScanner::Iterator WordScanner::end() const {
46  Iterator iter;
47  iter.in = NULL;
48  iter.s = 0;
49  iter.i = 0;
50  return iter;
51}
52
53static unordered_map<StringPiece, char*>* g_symtab;
54
55void InitSymtab() {
56  g_symtab = new unordered_map<StringPiece, char*>;
57}
58
59void QuitSymtab() {
60  for (auto p : *g_symtab) {
61    free(p.second);
62  }
63  delete g_symtab;
64}
65
66StringPiece Intern(StringPiece s) {
67  auto found = g_symtab->find(s);
68  if (found != g_symtab->end())
69    return found->first;
70
71  char* b = static_cast<char*>(malloc(s.size()+1));
72  memcpy(b, s.data(), s.size());
73  s = StringPiece(b, s.size());
74  (*g_symtab)[s] = b;
75  return s;
76}
77