LString LString::fromUtf8(const std::string &s) { if (s.size() == 0) return LString(); const uint8_t *begin = reinterpret_cast<const uint8_t*>(s.c_str()); const uint8_t *end = begin + s.size(); LString ret; ret.reserve(s.size()); LChar *destBegin = ret.begin(); LChar *destEnd = ret.end(); bool conversionSucceeded = utf8ToUtf32(&begin, end, &destBegin, destEnd); assert(conversionSucceeded && "Failed conversion utf8 -> utf32"); ret.resize(destBegin - ret.begin()); return ret; }
bool read_constdb(ZString filename) { io::ReadFile in(filename); if (!in.is_open()) { PRINTF("can't read %s\n"_fmt, filename); return false; } bool rv = true; AString line_; while (in.getline(line_)) { // is_comment only works for whole-line comments // that could change once the Z dependency is dropped ... LString comment = "//"_s; XString line = line_.xislice_h(std::search(line_.begin(), line_.end(), comment.begin(), comment.end())).rstrip(); if (!line) continue; // "%m[A-Za-z0-9_] %i %i" // TODO promote either qsplit() or asplit() auto _it = std::find(line.begin(), line.end(), ' '); auto name = line.xislice_h(_it); auto _rest = line.xislice_t(_it); while (_rest.startswith(' ')) _rest = _rest.xslice_t(1); auto _it2 = std::find(_rest.begin(), _rest.end(), ' '); auto val_ = _rest.xislice_h(_it2); auto type_ = _rest.xislice_t(_it2); while (type_.startswith(' ')) type_ = type_.xslice_t(1); // yes, the above actually DTRT even for underlength input int val; int type = 0; // Note for future archeaologists: this code is indented correctly if (std::find_if_not(name.begin(), name.end(), [](char c) { return ('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || (c == '_'); }) != name.end() || !extract(val_, &val) || (!extract(type_, &type) && type_)) { PRINTF("Bad const line: %s\n"_fmt, line_); rv = false; continue; } P<str_data_t> n = add_strp(name); n->type = type ? StringCode::PARAM : StringCode::INT; n->val = val; } return rv; }
LString LString::fromAscii(const std::string &s) { LString ret; ret.resize(s.size()); LString::Iterator out = ret.begin(); for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) { *out = *i; } return ret; }
LString LString::toLower() const { LString ret; ret.resize(size()); LString::Iterator out = ret.begin(); for (LString::ConstIterator i = begin(); i != end(); i++) { char32_t ch = *i; ch = toLower(ch); *out = ch; ++out; } return ret; }