mirror of
https://github.com/kanaka/mal.git
synced 2024-08-17 17:50:24 +03:00
- Reorder README to have implementation list after "learning tool" bullet. - This also moves tests/ and libs/ into impls. It would be preferrable to have these directories at the top level. However, this causes difficulties with the wasm implementations which need pre-open directories and have trouble with paths starting with "../../". So in lieu of that, symlink those directories to the top-level. - Move the run_argv_test.sh script into the tests directory for general hygiene.
47 lines
1.3 KiB
JavaScript
47 lines
1.3 KiB
JavaScript
// IMPORTANT: choose one
|
|
var RL_LIB = "libreadline"; // NOTE: libreadline is GPL
|
|
//var RL_LIB = "libedit";
|
|
|
|
var HISTORY_FILE = require('path').join(process.env.HOME, '.mal-history');
|
|
|
|
var rlwrap = {}; // namespace for this module in web context
|
|
|
|
var ffi = require('ffi-napi'),
|
|
fs = require('fs');
|
|
|
|
var rllib = ffi.Library(RL_LIB, {
|
|
'readline': [ 'string', [ 'string' ] ],
|
|
'add_history': [ 'int', [ 'string' ] ]});
|
|
|
|
var rl_history_loaded = false;
|
|
|
|
exports.readline = rlwrap.readline = function(prompt) {
|
|
prompt = typeof prompt !== 'undefined' ? prompt : "user> ";
|
|
|
|
if (!rl_history_loaded) {
|
|
rl_history_loaded = true;
|
|
var lines = [];
|
|
if (fs.existsSync(HISTORY_FILE)) {
|
|
lines = fs.readFileSync(HISTORY_FILE).toString().split("\n");
|
|
}
|
|
// Max of 2000 lines
|
|
lines = lines.slice(Math.max(lines.length - 2000, 0));
|
|
for (var i=0; i<lines.length; i++) {
|
|
if (lines[i]) { rllib.add_history(lines[i]); }
|
|
}
|
|
}
|
|
|
|
var line = rllib.readline(prompt);
|
|
if (line) {
|
|
rllib.add_history(line);
|
|
try {
|
|
fs.appendFileSync(HISTORY_FILE, line + "\n");
|
|
} catch (exc) {
|
|
// ignored
|
|
}
|
|
}
|
|
|
|
return line;
|
|
};
|
|
var readline = exports;
|