Path: blob/master/thirdparty/embree/common/lexers/stringstream.cpp
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "stringstream.h"45namespace embree6{7static const std::string stringChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 _.,+-=:/*\\";89/* creates map for fast categorization of characters */10static void createCharMap(bool map[256], const std::string& chrs) {11for (size_t i=0; i<256; i++) map[i] = false;12for (size_t i=0; i<chrs.size(); i++) map[uint8_t(chrs[i])] = true;13}1415/* simple tokenizer */16StringStream::StringStream(const Ref<Stream<int> >& cin, const std::string& seps, const std::string& endl, bool multiLine)17: cin(cin), endl(endl), multiLine(multiLine)18{19createCharMap(isSepMap,seps);20createCharMap(isValidCharMap,stringChars);21}2223std::string StringStream::next()24{25/* skip separators */26while (cin->peek() != EOF) {27if (endl != "" && cin->peek() == '\n') { cin->drop(); return endl; }28if (multiLine && cin->peek() == '\\') {29cin->drop();30if (cin->peek() == '\n') { cin->drop(); continue; }31cin->unget();32}33if (!isSeparator(cin->peek())) break;34cin->drop();35}3637/* parse everything until the next separator */38std::vector<char> str; str.reserve(64);39while (cin->peek() != EOF && !isSeparator(cin->peek())) {40int c = cin->get();41if (!isValidChar(c)) abort(); //throw std::runtime_error("invalid character "+std::string(1,c)+" in input");42str.push_back((char)c);43}44str.push_back(0);45return std::string(str.data());46}47}484950