static char name_[] = "cycript";
static char break_[] = " \t\n\"\\'`@$><=;|&{(" ")}" ".:[]";
+class History {
+ private:
+ std::string histfile_;
+ size_t histlines_;
+
+ public:
+ History(std::string histfile) :
+ histfile_(histfile),
+ histlines_(0)
+ {
+ read_history(histfile_.c_str());
+ }
+
+ ~History() {
+ if (append_history$ != NULL) {
+ _syscall(close(_syscall(open(histfile_.c_str(), O_CREAT | O_WRONLY, 0600))));
+ _assert((*append_history$)(histlines_, histfile_.c_str()) == 0);
+ } else {
+ _assert(write_history(histfile_.c_str()) == 0);
+ }
+ }
+
+ void operator +=(const std::string &command) {
+ add_history(command_.c_str());
+ ++histlines_;
+ }
+};
+
static void Console(CYOptions &options) {
CYPool pool;
else
passwd = getpwuid(getuid());
- const char *basedir(pool.strcat(passwd->pw_dir, "/.cycript", NULL));
- const char *histfile(pool.strcat(basedir, "/history", NULL));
- size_t histlines(0);
+ std::string basedir(passwd->pw_dir);
+ basedir += "/.cycript";
+ mkdir(basedir.c_str(), 0700);
rl_initialize();
rl_readline_name = name_;
- mkdir(basedir, 0700);
- read_history(histfile);
+ History history(basedir + "/history");
bool bypass(false);
bool debug(false);
char *line(readline(prompt));
mode_ = Working;
- if (line == NULL)
+ if (line == NULL) {
+ *out_ << std::endl;
break;
- if (line[0] == '\0')
+ } else if (line[0] == '\0')
goto read;
if (!extra) {
syntax = !syntax;
*out_ << "syntax == " << (syntax ? "true" : "false") << std::endl;
}
- add_history(line);
- ++histlines;
+ history += line;
goto restart;
}
}
std::cerr << " | ";
std::cerr << error->message_ << std::endl;
- add_history(command_.c_str());
- ++histlines;
+ history += command_;
goto restart;
}
}
}
}
- add_history(command_.c_str());
- ++histlines;
+ history += command_;
if (debug) {
Write(syntax, code.c_str(), code.size(), std::cout);
Run(client_, syntax, code, out_, expand);
}
-
- if (append_history$ != NULL) {
- _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600))));
- (*append_history$)(histlines, histfile);
- } else {
- write_history(histfile);
- }
-
- *out_ << std::endl;
}
static void *Map(const char *path, size_t *psize) {