mpw-shell/mpw-shell.cpp

105 lines
1.6 KiB
C++
Raw Normal View History

2016-01-27 15:43:34 +00:00
#include <vector>
#include <string>
#include <unordered_map>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
2016-01-30 17:45:50 +00:00
#include <cerrno>
2016-01-27 15:43:34 +00:00
2016-01-30 17:45:50 +00:00
#define NOCOMMAND
2016-01-27 15:43:34 +00:00
#include "mpw-shell.h"
2016-01-30 17:45:50 +00:00
#include "phase1.h"
#include "phase2.h"
#include "command.h"
2016-01-27 15:43:34 +00:00
std::unordered_map<std::string, EnvironmentEntry> Environment;
// should set {MPW}, {MPWVersion}, then execute {MPW}StartUp
void init(void) {
Environment.emplace("status", std::string("0"));
Environment.emplace("exit", std::string("1")); // terminate script on error.
}
2016-01-30 17:45:50 +00:00
int read_stdin(phase1 &p) {
unsigned char buffer[2048];
ssize_t size;
for (;;) {
size = read(STDIN_FILENO, buffer, sizeof(buffer));
if (size == 0) break;
if (size < 0) {
if (errno == EINTR) continue;
perror("read: ");
return -1;
}
try {
p.process(buffer, buffer + size);
} catch(std::exception &ex) {
fprintf(stderr, "%s\n", ex.what());
p.reset();
}
}
try {
p.finish();
} catch(std::exception &ex) {
fprintf(stderr, "%s\n", ex.what());
p.reset();
}
return 0;
}
2016-01-27 15:43:34 +00:00
int main(int argc, char **argv) {
init();
command_ptr head;
2016-01-30 17:45:50 +00:00
phase1 p1;
phase2 p2;
2016-01-31 05:41:30 +00:00
p1 >>= p2;
p2 >>= [](command_ptr &&ptr) {
printf("command: %d\n", ptr->type);
ptr->execute();
};
/*
2016-01-30 17:45:50 +00:00
p1 >>= [&p2](std::string &&s) {
fprintf(stdout, " -> %s\n", s.c_str());
p2.process(s);
};
2016-01-31 05:41:30 +00:00
*/
2016-01-30 17:45:50 +00:00
read_stdin(p1);
2016-01-31 05:41:30 +00:00
p2.finish();
2016-01-30 17:45:50 +00:00
/*
2016-01-27 15:43:34 +00:00
try {
head = read_fd(0);
} catch (std::exception &ex) {
fprintf(stderr, "%s\n", ex.what());
exit(1);
}
try {
int status = execute(head);
exit(status);
} catch(std::exception &ex) {
fprintf(stderr, "%s\n", ex.what());
exit(1);
}
2016-01-30 17:45:50 +00:00
*/
2016-01-27 15:43:34 +00:00
}