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