#endif
#include <cstdio>
+#include <fstream>
#include <sstream>
#include <setjmp.h>
#include <readline/history.h>
#endif
-#include <sys/mman.h>
-
#include <errno.h>
#include <unistd.h>
if (driver.program_ == NULL)
goto restart;
- if (client_ != -1)
- code = command_;
- else {
- std::ostringstream str;
- CYOutput out(str, options);
- Setup(out, driver, options);
- out << *driver.program_;
- code = str.str();
- }
+ std::ostringstream str;
+ CYOutput out(str, options);
+ Setup(out, driver, options);
+ out << *driver.program_;
+ code = str.str();
}
history += command_;
}
}
-static void *Map(const char *path, size_t *psize) {
- int fd;
- _syscall(fd = open(path, O_RDONLY));
-
- struct stat stat;
- _syscall(fstat(fd, &stat));
- size_t size(stat.st_size);
-
- *psize = size;
-
- void *base;
- _syscall(base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0));
-
- _syscall(close(fd));
- return base;
-}
-
void InjectLibrary(pid_t pid);
int Main(int argc, char const * const argv[], char const * const envp[]) {
else {
CYLocalPool pool;
- char *start, *end;
- std::istream *indirect;
-
+ std::istream *stream;
if (script == NULL) {
- start = NULL;
- end = NULL;
- indirect = &std::cin;
+ stream = &std::cin;
+ script = "<stdin>";
} else {
- size_t size;
- start = reinterpret_cast<char *>(Map(script, &size));
- end = start + size;
-
- if (size >= 2 && start[0] == '#' && start[1] == '!') {
- start += 2;
-
- if (void *line = memchr(start, '\n', end - start))
- start = reinterpret_cast<char *>(line);
- else
- start = end;
- }
-
- indirect = NULL;
+ stream = new std::fstream(script, std::ios::in | std::ios::binary);
+ _assert(!stream->fail());
}
- CYStream direct(start, end);
- std::istream &stream(indirect == NULL ? direct : *indirect);
- CYDriver driver(stream, script ?: "<stdin>");
-
+ CYDriver driver(*stream, script);
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;
- } else if (driver.program_ != NULL)
- if (client_ != -1) {
- // XXX: this code means that you can't pipe to another process
- std::string code(start, end-start);
+ } else if (driver.program_ != NULL) {
+ std::ostringstream str;
+ CYOutput out(str, options);
+ Setup(out, driver, options);
+ out << *driver.program_;
+ std::string code(str.str());
+ if (compile)
+ std::cout << code;
+ else
Run(client_, false, code, &std::cout);
- } else {
- std::ostringstream str;
- CYOutput out(str, options);
- Setup(out, driver, options);
- out << *driver.program_;
- std::string code(str.str());
- if (compile)
- std::cout << code;
- else
- Run(client_, false, code, &std::cout);
- }
+ }
}
apr_pool_destroy(pool);
return;
data[size] = '\0';
- CYStream stream(data, data + size);
- CYDriver driver(stream);
-
- cy::parser parser(driver);
-
- const char *json;
- if (parser.parse() != 0 || !driver.errors_.empty()) {
- json = NULL;
- size = _not(uint32_t);
- } else {
- NSAutoreleasePool *ar = [[NSAutoreleasePool alloc] init];
-
- CYOptions options;
- CYContext context(options);
- driver.program_->Replace(context);
- std::ostringstream str;
- CYOutput out(str, options);
- out << *driver.program_;
- std::string code(str.str());
- CYExecute_ execute = {pool, code.c_str()};
- NSValue *value([NSValue valueWithPointer:&execute]);
- if (dispatch)
- [client performSelectorOnMainThread:@selector(execute:) withObject:value waitUntilDone:YES];
- else
- [client execute:value];
- json = execute.data_;
- size = json == NULL ? _not(uint32_t) : strlen(json);
-
- [ar release];
- }
+ NSAutoreleasePool *ar = [[NSAutoreleasePool alloc] init];
+
+ std::string code(data, size);
+ CYExecute_ execute = {pool, code.c_str()};
+ NSValue *value([NSValue valueWithPointer:&execute]);
+ if (dispatch)
+ [client performSelectorOnMainThread:@selector(execute:) withObject:value waitUntilDone:YES];
+ else
+ [client execute:value];
+
+ const char *json(execute.data_);
+ size = json == NULL ? _not(uint32_t) : strlen(json);
+
+ [ar release];
if (!CYSendAll(socket_, &size, sizeof(size)))
return;