static std::string command_;
static CYExpression *ParseExpression(CYUTF8String code) {
- std::ostringstream str;
- str << '(' << code << ')';
- std::string string(str.str());
-
- CYDriver driver;
- driver.data_ = string.c_str();
- driver.size_ = string.size();
+ std::stringstream stream;
+ stream << '(' << code << ')';
+ CYDriver driver(stream);
cy::parser parser(driver);
Setup(driver, parser);
rl_attempted_completion_over = TRUE;
CYLocalPool pool;
- CYDriver driver;
- cy::parser parser(driver);
- Setup(driver, parser);
std::string line(rl_line_buffer, start);
- std::string command(command_ + line);
-
- driver.data_ = command.c_str();
- driver.size_ = command.size();
+ std::istringstream stream(command_ + line);
+ CYDriver driver(stream);
driver.auto_ = true;
+ cy::parser parser(driver);
+ Setup(driver, parser);
+
if (parser.parse() != 0 || !driver.errors_.empty())
return NULL;
code = command_;
else {
CYLocalPool pool;
- CYDriver driver;
+
+ std::istringstream stream(command_);
+ CYDriver driver(stream);
+
cy::parser parser(driver);
Setup(driver, parser);
- driver.data_ = command_.c_str();
- driver.size_ = command_.size();
-
if (parser.parse() != 0 || !driver.errors_.empty()) {
for (CYDriver::Errors::const_iterator error(driver.errors_.begin()); error != driver.errors_.end(); ++error) {
cy::position begin(error->location_.begin);
Console(options);
else {
CYLocalPool pool;
- CYDriver driver(script ?: "<stdin>");
- cy::parser parser(driver);
- Setup(driver, parser);
char *start, *end;
+ std::istream *indirect;
if (script == NULL) {
start = NULL;
end = NULL;
-
- driver.file_ = stdin;
+ indirect = &std::cin;
} else {
size_t size;
start = reinterpret_cast<char *>(Map(script, &size));
start = end;
}
- driver.data_ = start;
- driver.size_ = end - start;
+ indirect = NULL;
}
+ CYStream direct(start, end);
+ std::istream &stream(indirect == NULL ? direct : *indirect);
+ CYDriver driver(stream, script ?: "<stdin>");
+
+ cy::parser parser(driver);
+ Setup(driver, parser);
+
if (parser.parse() != 0 || !driver.errors_.empty()) {
for (CYDriver::Errors::const_iterator i(driver.errors_.begin()); i != driver.errors_.end(); ++i)
std::cerr << i->location_.begin << ": " << i->message_ << std::endl;
}
#define YY_INPUT(data, value, size) { \
- if (yyextra->file_ != NULL) { \
- size_t copy(fread(data, 1, size, yyextra->file_)); \
- value = copy == 0 ? YY_NULL : copy; \
- } else if (yyextra->size_ == 0) \
+ if (yyextra->data_.eof()) \
value = YY_NULL; \
else { \
- size_t copy(size); \
- copy = (std::min(copy, yyextra->size_)); \
- memcpy(data, yyextra->data_, copy); \
- yyextra->data_ += copy; \
- yyextra->size_ -= copy; \
- value = copy; \
+ yyextra->data_.read(data, size); \
+ size_t copy(yyextra->data_.gcount()); \
+ value = copy == 0 ? YY_NULL : copy; \
} \
}
return;
data[size] = '\0';
- CYDriver driver;
- cy::parser parser(driver);
+ CYStream stream(data, data + size);
+ CYDriver driver(stream);
- driver.data_ = data;
- driver.size_ = size;
+ cy::parser parser(driver);
const char *json;
if (parser.parse() != 0 || !driver.errors_.empty()) {
extern "C" void CydgetPoolParse(apr_pool_t *remote, const uint16_t **data, size_t *size) {
CYLocalPool local;
- CYDriver driver;
- cy::parser parser(driver);
-
CYUTF8String utf8(CYPoolUTF8String(local, CYUTF16String(*data, *size)));
+ CYStream stream(utf8.data, utf8.data + utf8.size);
+ CYDriver driver(stream);
- driver.data_ = utf8.data;
- driver.size_ = utf8.size;
-
+ cy::parser parser(driver);
if (parser.parse() != 0 || !driver.errors_.empty())
return;
CYRange WordStartRange_(0x000001000000000LLU, 0x7fffffe87fffffeLLU); // A-Za-z_$
CYRange WordEndRange_ (0x3ff001000000000LLU, 0x7fffffe87fffffeLLU); // A-Za-z_$0-9
-CYDriver::CYDriver(const std::string &filename) :
+CYDriver::CYDriver(std::istream &data, const std::string &filename) :
state_(CYClear),
- data_(NULL),
- size_(0),
- file_(NULL),
+ data_(data),
strict_(false),
filename_(filename),
program_(NULL),
CYNewLine
};
+class CYStream :
+ public std::istream
+{
+ private:
+ class CYBuffer :
+ public std::streambuf
+ {
+ public:
+ CYBuffer(const char *start, const char *end) {
+ setg(const_cast<char *>(start), const_cast<char *>(start), const_cast<char *>(end));
+ }
+ } buffer_;
+
+ public:
+ CYStream(const char *start, const char *end) :
+ std::istream(&buffer_),
+ buffer_(start, end)
+ {
+ }
+};
+
class CYDriver {
public:
void *scanner_;
bool OpenBrace;
} no_;
- const char *data_;
- size_t size_;
- FILE *file_;
+ std::istream &data_;
bool strict_;
void ScannerDestroy();
public:
- CYDriver(const std::string &filename = "");
+ CYDriver(std::istream &data, const std::string &filename = "");
~CYDriver();
Condition GetCondition();
apparently you can have random escape sequences in strings, like \!
cycript -p with processes that have spaces doesn't work
+CYDriver uses std::istream, but it should use std::streambuf