blob: 7747c017007fd9d45a26e329e7db62626e77ad2d [file] [log] [blame]
#include "strutil.h"
#include <ctype.h>
#include <string.h>
#include <unordered_map>
#include <utility>
WordScanner::Iterator& WordScanner::Iterator::operator++() {
int len = static_cast<int>(in->size());
for (s = i; s < len; s++) {
if (!isspace((*in)[s]))
break;
}
if (s == len) {
in = NULL;
s = 0;
i = 0;
return *this;
}
for (i = s; i < len; i++) {
if (isspace((*in)[s]))
break;
}
return *this;
}
StringPiece WordScanner::Iterator::operator*() const {
return in->substr(s, i);
}
WordScanner::WordScanner(StringPiece in)
: in_(in) {
}
WordScanner::Iterator WordScanner::begin() const {
Iterator iter;
iter.in = &in_;
iter.s = 0;
iter.i = 0;
++iter;
return iter;
}
WordScanner::Iterator WordScanner::end() const {
Iterator iter;
iter.in = NULL;
iter.s = 0;
iter.i = 0;
return iter;
}
static unordered_map<StringPiece, char*>* g_symtab;
void InitSymtab() {
g_symtab = new unordered_map<StringPiece, char*>;
}
void QuitSymtab() {
for (auto p : *g_symtab) {
free(p.second);
}
delete g_symtab;
}
StringPiece Intern(StringPiece s) {
auto found = g_symtab->find(s);
if (found != g_symtab->end())
return found->first;
char* b = static_cast<char*>(malloc(s.size()+1));
memcpy(b, s.data(), s.size());
s = StringPiece(b, s.size());
(*g_symtab)[s] = b;
return s;
}