mirror of
https://github.com/avinal/xeus-basic.git
synced 2026-01-10 07:08:35 +05:30
add wrapper around basic interpreter
Signed-off-by: Avinal Kumar <avinal.xlvii@gmail.com>
This commit is contained in:
18
libs/basic/CMakeLists.txt
Normal file
18
libs/basic/CMakeLists.txt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#[=======================================================================[
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
SPDX-FileCopyrightText: 2021 Avinal Kumar <avinal.xlvii@gmail.com>
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
project(basic LANGUAGES C CXX)
|
||||||
|
|
||||||
|
file(GLOB BASIC_SRC src/*.c)
|
||||||
|
add_library(basic "")
|
||||||
|
target_sources(basic PRIVATE ${BASIC_SRC})
|
||||||
|
target_include_directories(basic PRIVATE include/basic)
|
||||||
|
|
||||||
|
add_executable(basic_exec main.cc)
|
||||||
|
target_include_directories(basic_exec PRIVATE include/basic include)
|
||||||
|
target_link_libraries(basic_exec PRIVATE basic)
|
||||||
|
|
||||||
|
|
||||||
60
libs/basic/include/basic.hpp
Normal file
60
libs/basic/include/basic.hpp
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/**
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
* SPDX-FileCopyrightText: 2021 Avinal Kumar <avinal.xlvii@gmail.com>
|
||||||
|
*
|
||||||
|
* @file basic.hpp
|
||||||
|
* @brief Wrapper around basic
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BASIC_BASIC_HPP_
|
||||||
|
#define BASIC_BASIC_HPP_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
extern "C" {
|
||||||
|
#include "basic/parser.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
class basic {
|
||||||
|
private:
|
||||||
|
std::string last_error = "";
|
||||||
|
static std::string output;
|
||||||
|
static int out(int ch) {
|
||||||
|
output.push_back(ch);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int in() { return getchar(); }
|
||||||
|
|
||||||
|
public:
|
||||||
|
basic();
|
||||||
|
~basic();
|
||||||
|
bool evaluate_line(const std::string& line);
|
||||||
|
std::string run();
|
||||||
|
std::string get_error();
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string basic::output = "";
|
||||||
|
|
||||||
|
basic::basic() {
|
||||||
|
basic_init(1024 * 8, 2048);
|
||||||
|
basic_register_io(out, in);
|
||||||
|
}
|
||||||
|
|
||||||
|
basic::~basic() { basic_destroy(); }
|
||||||
|
|
||||||
|
bool basic::evaluate_line(const std::string& line) {
|
||||||
|
char* input = const_cast<char*>(line.c_str());
|
||||||
|
basic_eval(input);
|
||||||
|
if (evaluate_last_error()) {
|
||||||
|
last_error.append(evaluate_last_error());
|
||||||
|
clear_last_error();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string basic::get_error() { return last_error; }
|
||||||
|
|
||||||
|
std::string basic::run() { return output; }
|
||||||
|
|
||||||
|
#endif // BASIC_BASIC_HPP_
|
||||||
112
libs/basic/main.cc
Normal file
112
libs/basic/main.cc
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/**
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
* SPDX-FileCopyrightText: 2021 Avinal Kumar <avinal.xlvii@gmail.com>
|
||||||
|
*
|
||||||
|
* @file main.cc
|
||||||
|
* @brief Driver Code
|
||||||
|
*/
|
||||||
|
|
||||||
|
// #include <math.h>
|
||||||
|
// #include <readline/history.h>
|
||||||
|
// #include <readline/readline.h>
|
||||||
|
// #include <signal.h>
|
||||||
|
// #include <stdbool.h>
|
||||||
|
// #include <stdio.h>
|
||||||
|
// #include <string.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "basic.hpp"
|
||||||
|
|
||||||
|
// extern bool __RUNNING;
|
||||||
|
// extern bool __STOPPED;
|
||||||
|
|
||||||
|
// static void sigint_handler(int signum) {
|
||||||
|
// signal(SIGINT, sigint_handler);
|
||||||
|
// if (__RUNNING) {
|
||||||
|
// __RUNNING = false;
|
||||||
|
// __STOPPED = true;
|
||||||
|
// printf("STOP\n");
|
||||||
|
// fflush(stdout);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static char *readline_gets() {
|
||||||
|
// char *line_read = readline("");
|
||||||
|
|
||||||
|
// if (line_read && *line_read) {
|
||||||
|
// add_history(line_read);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return line_read;
|
||||||
|
// }
|
||||||
|
std::string outputs;
|
||||||
|
// int out(int ch) {
|
||||||
|
// outputs += char(ch);
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// int in(void) { return getchar(); }
|
||||||
|
|
||||||
|
void replcc() {
|
||||||
|
std::cout << " _ _ \n"
|
||||||
|
<< "| |__ __ _ ___(_) ___ \n"
|
||||||
|
<< "| '_ \\ / _` / __| |/ __|\n"
|
||||||
|
<< "| |_) | (_| \\__ \\ | (__ \n"
|
||||||
|
<< "|_.__/ \\__,_|___/_|\\___|\n"
|
||||||
|
<< "(c) 2015-2016 Johan Van den Brande\n";
|
||||||
|
// using_history();
|
||||||
|
std::string input;
|
||||||
|
basic check;
|
||||||
|
while (getline(std::cin, input)) {
|
||||||
|
if (!input.compare("QUIT")) {
|
||||||
|
// check.~basic();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!check.evaluate_line(input)) {
|
||||||
|
std::cerr << check.get_error() << "\n";
|
||||||
|
}
|
||||||
|
// basic_eval((char *)input.c_str());
|
||||||
|
if (input == "RUN") {
|
||||||
|
std::cout << check.run();
|
||||||
|
}
|
||||||
|
// if (evaluate_last_error()) {
|
||||||
|
// std::cerr << "ERROR: " << evaluate_last_error() << "\n";
|
||||||
|
// clear_last_error();
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// clear_history();
|
||||||
|
}
|
||||||
|
|
||||||
|
void runcc(std::string filename) {
|
||||||
|
// std::fstream file(filename, std::ios::in);
|
||||||
|
|
||||||
|
// if (!file.is_open()) {
|
||||||
|
// std::cerr << "Can't open " << filename << std::endl;
|
||||||
|
// exit(EXIT_FAILURE);
|
||||||
|
// }
|
||||||
|
// std::string line;
|
||||||
|
// while (getline(file, line)) {
|
||||||
|
// basic_eval((char *)line.c_str());
|
||||||
|
// }
|
||||||
|
// file.close();
|
||||||
|
// basic_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
// signal(SIGINT, sigint_handler);
|
||||||
|
// basic_init(1024 * 8, 2048);
|
||||||
|
// basic_register_io(out, in);
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
runcc(argv[1]);
|
||||||
|
} else {
|
||||||
|
replcc();
|
||||||
|
}
|
||||||
|
|
||||||
|
// basic_destroy();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user