.
This commit is contained in:
parent
56f7748377
commit
4668736ce6
119 changed files with 1106 additions and 187 deletions
28
cmdln/new.c
28
cmdln/new.c
|
|
@ -21,10 +21,14 @@ struct cmdln_flags* new_cmdln_flags(
|
|||
|
||||
bool read_init_file = true;
|
||||
|
||||
const char* custom_init_path = "~/.13rc";
|
||||
const char* init_path = "~/.13rc";
|
||||
|
||||
const char* input_string = NULL;
|
||||
|
||||
#ifndef RELEASE_BUILD
|
||||
const char* test_interactive_using_input_file = NULL;
|
||||
#endif
|
||||
|
||||
enum input_kind input_kind = ik_interactive;
|
||||
|
||||
static const struct option long_options[] = {
|
||||
|
|
@ -36,13 +40,18 @@ struct cmdln_flags* new_cmdln_flags(
|
|||
|
||||
{"custom-init-path", required_argument, 0, 4},
|
||||
|
||||
#ifndef RELEASE_BUILD
|
||||
{"test-interactive-using-input-file", required_argument, 0, 5},
|
||||
#endif
|
||||
|
||||
{"command", required_argument, 0, 'c'},
|
||||
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
for (int c; (c = getopt_long(argc, argv, ""
|
||||
"\1\2\3\4c:\5\6"
|
||||
"\1\2\3\4\5:\6"
|
||||
"c:"
|
||||
"", long_options, NULL)) >= 0; )
|
||||
{
|
||||
switch (c)
|
||||
|
|
@ -72,7 +81,14 @@ struct cmdln_flags* new_cmdln_flags(
|
|||
|
||||
case 4: // --custom-init-path
|
||||
{
|
||||
custom_init_path = optarg;
|
||||
init_path = optarg;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 5: // --test-interactive-using-input-file
|
||||
{
|
||||
test_interactive_using_input_file = optarg;
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -143,12 +159,16 @@ struct cmdln_flags* new_cmdln_flags(
|
|||
|
||||
flags->read_init_file = read_init_file;
|
||||
|
||||
flags->custom_init_path = custom_init_path;
|
||||
flags->init_path = init_path;
|
||||
|
||||
flags->input_kind = input_kind;
|
||||
|
||||
flags->input_string = input_string;
|
||||
|
||||
#ifndef RELEASE_BUILD
|
||||
flags->test_interactive_using_input_file = test_interactive_using_input_file;
|
||||
#endif
|
||||
|
||||
EXIT;
|
||||
return flags;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,12 +18,16 @@ struct cmdln_flags
|
|||
|
||||
bool read_init_file;
|
||||
|
||||
const char* custom_init_path;
|
||||
const char* init_path;
|
||||
|
||||
const char* input_string;
|
||||
|
||||
const char* input_file;
|
||||
|
||||
#ifndef RELEASE_BUILD
|
||||
const char* test_interactive_using_input_file;
|
||||
#endif
|
||||
|
||||
char* const* argv;
|
||||
};
|
||||
|
||||
|
|
|
|||
8
debug.h
8
debug.h
|
|
@ -77,11 +77,7 @@ extern int debug_depth;
|
|||
|
||||
#define TODO \
|
||||
{ \
|
||||
char filebuffer[PATH_MAX]; \
|
||||
strcpy(filebuffer, __FILE__ + 4); \
|
||||
filebuffer[strlen(filebuffer) - 2] = 0; \
|
||||
\
|
||||
printf("TODO hit at %s:%i!\n", filebuffer, __LINE__); \
|
||||
printf("TODO hit at %s:%i!\n", __FILE__, __LINE__); \
|
||||
\
|
||||
pid_t __child = fork(); \
|
||||
\
|
||||
|
|
@ -102,7 +98,7 @@ extern int debug_depth;
|
|||
{\
|
||||
char __buffer[100]; \
|
||||
snprintf(__buffer, 100, "+%u", __LINE__); \
|
||||
execlp("gedit", "gedit", filebuffer, __buffer, NULL); \
|
||||
execlp("gedit", "gedit", __FILE__, __buffer, NULL); \
|
||||
}\
|
||||
\
|
||||
exit(1); \
|
||||
|
|
|
|||
7
examples/sandbox-interactive.txt
Normal file
7
examples/sandbox-interactive.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
1
|
||||
(1
|
||||
(
|
||||
)
|
||||
+ 1 2
|
||||
1 2
|
||||
λx:x
|
||||
|
|
@ -47,7 +47,7 @@ fib 8
|
|||
|
||||
(𝑌 λ f x: (≤ x 1) x (+ (f (- x 1)) (f (- x 2)))) 10
|
||||
|
||||
((((( ((((( 1 ))))) )))))
|
||||
((((( ((((( ((((( ((((( 1 ))))) ))))) ))))) )))))
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,13 @@ struct value* application_expression_evaluate(
|
|||
{
|
||||
dpvu(lleft->kind);
|
||||
|
||||
// make some kind of 'error-value'?
|
||||
// that's contagious, like NaN?
|
||||
|
||||
// maybe error values can link to other error values?
|
||||
// if more than on seperate error was encountered?
|
||||
TODO;
|
||||
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
26
expression/error/evaluate.c
Normal file
26
expression/error/evaluate.c
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../evaluate.h"
|
||||
|
||||
#include "struct.h"
|
||||
#include "evaluate.h"
|
||||
|
||||
struct value* error_expression_evaluate(
|
||||
struct expression* super,
|
||||
struct environment* environment,
|
||||
struct booleans* booleans)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
TODO;
|
||||
#if 0
|
||||
struct error_expression* this = (void*) super;
|
||||
|
||||
struct value* result = expression_evaluate(
|
||||
this->subexpression, environment, booleans);
|
||||
|
||||
EXIT;
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
7
expression/error/evaluate.h
Normal file
7
expression/error/evaluate.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
struct value* error_expression_evaluate(
|
||||
struct expression* this,
|
||||
struct environment* environment,
|
||||
struct booleans* booleans);
|
||||
|
||||
|
||||
19
expression/error/free.c
Normal file
19
expression/error/free.c
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../free.h"
|
||||
|
||||
#include "struct.h"
|
||||
#include "free.h"
|
||||
|
||||
void free_error_expression(
|
||||
struct expression* super)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
struct error_expression* this = (void*) super;
|
||||
|
||||
free_expression(this->subexpression);
|
||||
|
||||
EXIT;
|
||||
}
|
||||
6
expression/error/free.h
Normal file
6
expression/error/free.h
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
struct expression;
|
||||
|
||||
void free_error_expression(
|
||||
struct expression* super);
|
||||
|
||||
20
expression/error/inheritance.c
Normal file
20
expression/error/inheritance.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../inheritance.h"
|
||||
|
||||
#include "prettyprint_errors.h"
|
||||
#include "prettyprint.h"
|
||||
#include "evaluate.h"
|
||||
#include "free.h"
|
||||
#include "inheritance.h"
|
||||
|
||||
struct expression_inheritance error_expression_inheritance = {
|
||||
.prettyprint_errors = error_expression_prettyprint_errors,
|
||||
|
||||
.prettyprint = error_expression_prettyprint,
|
||||
|
||||
.evaluate = error_expression_evaluate,
|
||||
|
||||
.free = free_error_expression
|
||||
};
|
||||
2
expression/error/inheritance.h
Normal file
2
expression/error/inheritance.h
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
extern struct expression_inheritance error_expression_inheritance;
|
||||
28
expression/error/new.c
Normal file
28
expression/error/new.c
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../new.h"
|
||||
#include "../inc.h"
|
||||
|
||||
#include "inheritance.h"
|
||||
#include "struct.h"
|
||||
#include "new.h"
|
||||
|
||||
struct expression* new_error_expression(
|
||||
const wchar_t* message,
|
||||
struct expression* subexpression)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
struct error_expression* this = (void*) new_expression(
|
||||
/* inheritance: */ &error_expression_inheritance,
|
||||
/* alloc size: */ sizeof(*this));
|
||||
|
||||
this->message = message;
|
||||
|
||||
this->subexpression = inc_expression(subexpression);
|
||||
|
||||
EXIT;
|
||||
return (void*) this;
|
||||
}
|
||||
|
||||
9
expression/error/new.h
Normal file
9
expression/error/new.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
struct value;
|
||||
struct string;
|
||||
|
||||
struct expression* new_error_expression(
|
||||
const wchar_t* message,
|
||||
struct expression* subexpression);
|
||||
|
||||
|
||||
72
expression/error/prettyprint.c
Normal file
72
expression/error/prettyprint.c
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <defines/N.h>
|
||||
|
||||
#include <stringtree/new.h>
|
||||
#include <stringtree/prepend.h>
|
||||
#include <stringtree/append.h>
|
||||
|
||||
#include <globals/terminalcolors.h>
|
||||
|
||||
#include "../prettyprint.h"
|
||||
|
||||
#include "struct.h"
|
||||
#include "prettyprint.h"
|
||||
|
||||
struct stringtree* error_expression_prettyprint(
|
||||
int *out_chosen_color,
|
||||
struct expression* super,
|
||||
bool with_color)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
TODO;
|
||||
#if 0
|
||||
struct error_expression* const this = (void*) super;
|
||||
|
||||
int inner_color;
|
||||
|
||||
struct stringtree* tree = expression_prettyprint(
|
||||
&inner_color,
|
||||
this->subexpression,
|
||||
with_color);
|
||||
|
||||
if (with_color)
|
||||
{
|
||||
int my_color = (inner_color + 1) % (int) N(terminalcolors.precedences);
|
||||
|
||||
stringtree_prepend_cstr(tree, terminalcolors.reset);
|
||||
stringtree_prepend_cstr(tree, L"(");
|
||||
stringtree_prepend_cstr(tree, terminalcolors.precedences[my_color]);
|
||||
|
||||
stringtree_append_cstr(tree, terminalcolors.precedences[my_color]);
|
||||
stringtree_append_cstr(tree, L")");
|
||||
stringtree_append_cstr(tree, terminalcolors.reset);
|
||||
|
||||
if (out_chosen_color)
|
||||
*out_chosen_color = my_color;
|
||||
}
|
||||
else
|
||||
{
|
||||
stringtree_prepend_cstr(tree, L"(");
|
||||
stringtree_append_cstr(tree, L")");
|
||||
}
|
||||
|
||||
EXIT;
|
||||
return tree;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
14
expression/error/prettyprint.h
Normal file
14
expression/error/prettyprint.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct expression;
|
||||
|
||||
struct color_factory;
|
||||
|
||||
struct stringtree* error_expression_prettyprint(
|
||||
int *out_chosen_color,
|
||||
struct expression* this,
|
||||
bool with_color);
|
||||
|
||||
|
||||
|
||||
38
expression/error/prettyprint_errors.c
Normal file
38
expression/error/prettyprint_errors.c
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <stringtree/new.h>
|
||||
#include <stringtree/append.h>
|
||||
|
||||
#include "../prettyprint_errors.h"
|
||||
|
||||
#include "struct.h"
|
||||
#include "prettyprint_errors.h"
|
||||
|
||||
struct stringtree* error_expression_prettyprint_errors(
|
||||
struct expression* super)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
struct error_expression* const this = (void*) super;
|
||||
|
||||
struct stringtree* tree = NULL;
|
||||
|
||||
if (this->subexpression)
|
||||
{
|
||||
tree = expression_prettyprint_errors(
|
||||
this->subexpression);
|
||||
}
|
||||
|
||||
if (!tree)
|
||||
{
|
||||
tree = new_stringtree();
|
||||
}
|
||||
|
||||
stringtree_append_cstr(tree, this->message);
|
||||
stringtree_append_cstr(tree, L"\n");
|
||||
|
||||
EXIT;
|
||||
return tree;
|
||||
}
|
||||
|
||||
4
expression/error/prettyprint_errors.h
Normal file
4
expression/error/prettyprint_errors.h
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
struct stringtree* error_expression_prettyprint_errors(
|
||||
struct expression* super);
|
||||
|
||||
12
expression/error/struct.h
Normal file
12
expression/error/struct.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
#include "../struct.h"
|
||||
|
||||
struct error_expression
|
||||
{
|
||||
struct expression super;
|
||||
|
||||
const wchar_t* message;
|
||||
|
||||
struct expression* subexpression;
|
||||
};
|
||||
|
||||
51
globals/terminalcolors.c
Normal file
51
globals/terminalcolors.c
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
|
||||
#include "terminalcolors.h"
|
||||
|
||||
#include "bin/globals/terminalcolors.cpp-4.c"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
struct colors terminalcolors = {
|
||||
.precedences = {
|
||||
#include "bin/globals/terminalcolors.cpp-18.c"
|
||||
|
||||
|
||||
|
||||
},
|
||||
|
||||
#include "bin/globals/terminalcolors.cpp-24.c"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.reset = L"\e[0m",
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
51
globals/terminalcolors.cpp
Normal file
51
globals/terminalcolors.cpp
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
|
||||
#include "terminalcolors.h"
|
||||
|
||||
/*/ python
|
||||
|
||||
import colorsys;
|
||||
|
||||
def make_color(hue, sat, val):
|
||||
t = colorsys.hsv_to_rgb(hue, sat, val);
|
||||
|
||||
r, g, b = map(lambda x: int(x * 255), t);
|
||||
|
||||
return f"\\e[38;2;{r};{g};{b}m";
|
||||
/*/
|
||||
|
||||
struct colors terminalcolors = {
|
||||
.precedences = {
|
||||
/*/
|
||||
for i in range(20):
|
||||
print(f'L"{make_color(i / 20, 0.9, 1.0)}",');
|
||||
/*/
|
||||
},
|
||||
|
||||
/*/
|
||||
print(f'.numeric = L"{make_color(31 / 360, 0.8, 1.0)}",');
|
||||
|
||||
print(f'.string = L"{make_color(300 / 360, 0.8, 1.0)}",');
|
||||
|
||||
print(f'.variable = L"{make_color(263 / 360, 0.8, 1.0)}",');
|
||||
|
||||
print(f'.builtin = L"{make_color(0 / 360, 0.0, 0.52)}",');
|
||||
/*/
|
||||
|
||||
.reset = L"\e[0m",
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
19
globals/terminalcolors.h
Normal file
19
globals/terminalcolors.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
|
||||
#include <wchar.h>
|
||||
|
||||
extern struct colors {
|
||||
const wchar_t* precedences[20];
|
||||
|
||||
const wchar_t* numeric;
|
||||
|
||||
const wchar_t* variable;
|
||||
|
||||
const wchar_t* string;
|
||||
|
||||
const wchar_t* builtin;
|
||||
|
||||
const wchar_t* reset;
|
||||
} terminalcolors;
|
||||
|
||||
|
||||
|
||||
|
|
@ -23,14 +23,14 @@
|
|||
#include <parse/position/new.h>
|
||||
#include <parse/position/free.h>
|
||||
|
||||
#include <parse/istream/string/new.h>
|
||||
#include <parse/istream/file/new.h>
|
||||
#include <parse/istream/read.h>
|
||||
#include <parse/istream/free.h>
|
||||
#include <istream/string/new.h>
|
||||
#include <istream/file/new.h>
|
||||
#include <istream/read.h>
|
||||
#include <istream/free.h>
|
||||
|
||||
#include <parse/wcistream/istream/new.h>
|
||||
#include <parse/wcistream/read.h>
|
||||
#include <parse/wcistream/free.h>
|
||||
#include <wcistream/istream/new.h>
|
||||
#include <wcistream/read.h>
|
||||
#include <wcistream/free.h>
|
||||
|
||||
#include <parse/token/struct.h>
|
||||
|
||||
|
|
@ -60,7 +60,8 @@ void handle_file(
|
|||
struct booleans* booleans,
|
||||
const char* input_file,
|
||||
bool echo,
|
||||
bool print_with_colors)
|
||||
bool print_with_colors,
|
||||
struct wcostream* wc_stdout)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
|
|
@ -68,12 +69,6 @@ void handle_file(
|
|||
|
||||
assert(input_file);
|
||||
|
||||
struct ostream* b_stdout = new_file_ostream(
|
||||
/* file descriptor: */ 1);
|
||||
|
||||
struct wcostream* wc_stdout = new_ostream_wcostream(
|
||||
/* binary stream: */ b_stdout);
|
||||
|
||||
struct istream* stream = new_file_istream(
|
||||
/* path: */ input_file);
|
||||
|
||||
|
|
@ -163,14 +158,10 @@ void handle_file(
|
|||
|
||||
free_string(filename);
|
||||
|
||||
free_wcostream(wc_stdout);
|
||||
|
||||
free_wcistream(wcstream);
|
||||
|
||||
free_istream(stream);
|
||||
|
||||
free_ostream(b_stdout);
|
||||
|
||||
EXIT;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ void handle_file(
|
|||
struct booleans* booleans,
|
||||
const char* input_file,
|
||||
bool echo,
|
||||
bool isatty);
|
||||
bool isatty,
|
||||
struct wcostream* wc_stdout);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,13 +16,13 @@
|
|||
#include <parse/position/new.h>
|
||||
#include <parse/position/free.h>
|
||||
|
||||
#include <parse/istream/file/new.h>
|
||||
#include <parse/istream/read.h>
|
||||
#include <parse/istream/free.h>
|
||||
#include <istream/file/new.h>
|
||||
#include <istream/read.h>
|
||||
#include <istream/free.h>
|
||||
|
||||
#include <parse/wcistream/istream/new.h>
|
||||
#include <parse/wcistream/read.h>
|
||||
#include <parse/wcistream/free.h>
|
||||
#include <wcistream/istream/new.h>
|
||||
#include <wcistream/read.h>
|
||||
#include <wcistream/free.h>
|
||||
|
||||
#include <parse/parse.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,35 @@
|
|||
#include <memory/smalloc.h>
|
||||
#include <memory/srealloc.h>
|
||||
|
||||
#include <string/new.h>
|
||||
#include <string/free.h>
|
||||
|
||||
#include <stringtree/new.h>
|
||||
#include <stringtree/append.h>
|
||||
#include <stringtree/print.h>
|
||||
#include <stringtree/free.h>
|
||||
|
||||
#include <parse/position/new.h>
|
||||
#include <parse/position/free.h>
|
||||
|
||||
#include <parse/tokenizer/new.h>
|
||||
#include <parse/tokenizer/next.h>
|
||||
#include <parse/tokenizer/free.h>
|
||||
|
||||
#include <parse/parse.h>
|
||||
|
||||
#include <statement/prettyprint.h>
|
||||
#include <statement/prettyprint_errors.h>
|
||||
#include <statement/execute.h>
|
||||
#include <statement/free.h>
|
||||
|
||||
#include <stringtree/println.h>
|
||||
#include <stringtree/free.h>
|
||||
|
||||
#include <wcistream/string/new.h>
|
||||
#include <wcistream/read.h>
|
||||
#include <wcistream/free.h>
|
||||
|
||||
#include "handle_interactive.h"
|
||||
|
||||
static const enum state {
|
||||
|
|
@ -24,6 +53,10 @@ static const enum state {
|
|||
|
||||
s_backspace,
|
||||
|
||||
s_enter,
|
||||
|
||||
s_insert_lambda,
|
||||
|
||||
s_insert_letter,
|
||||
|
||||
s_up,
|
||||
|
|
@ -36,6 +69,8 @@ static const enum state {
|
|||
|
||||
s_start,
|
||||
|
||||
s_sync_idle,
|
||||
|
||||
s_esc,
|
||||
s_csi,
|
||||
|
||||
|
|
@ -45,10 +80,25 @@ static const enum state {
|
|||
|
||||
[s_start][0x7F] = s_backspace,
|
||||
|
||||
[s_start][0x16] = s_sync_idle,
|
||||
[s_sync_idle]['\\'] = s_insert_lambda,
|
||||
|
||||
[s_start]['\n'] = s_enter,
|
||||
|
||||
[s_start][' '] = s_insert_letter,
|
||||
[s_start]['0' ... '9'] = s_insert_letter,
|
||||
[s_start]['a' ... 'z'] = s_insert_letter,
|
||||
[s_start]['A' ... 'Z'] = s_insert_letter,
|
||||
|
||||
[s_start][':'] = s_insert_letter,
|
||||
[s_start]['+'] = s_insert_letter,
|
||||
[s_start]['-'] = s_insert_letter,
|
||||
[s_start]['/'] = s_insert_letter,
|
||||
[s_start]['.'] = s_insert_letter,
|
||||
[s_start]['('] = s_insert_letter,
|
||||
[s_start][')'] = s_insert_letter,
|
||||
[s_start]['\\'] = s_insert_letter,
|
||||
|
||||
[s_start][0x1B] = s_esc,
|
||||
[s_esc]['['] = s_csi,
|
||||
[s_start][0x9B] = s_csi,
|
||||
|
|
@ -65,27 +115,47 @@ static const enum state {
|
|||
|
||||
void handle_interactive(
|
||||
struct environment** environment,
|
||||
struct booleans* booleans)
|
||||
struct booleans* booleans,
|
||||
struct wcostream* wc_stdout
|
||||
#ifndef RELEASE_BUILD
|
||||
, const char* test_interactive_using_input_file
|
||||
#endif
|
||||
)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
int fd;
|
||||
|
||||
struct termios termios;
|
||||
|
||||
if (tcgetattr(/* fd: */ 1, /* struct termios: */ &termios) < 0)
|
||||
if (test_interactive_using_input_file)
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
if ((fd = open(test_interactive_using_input_file, O_RDONLY)) < 0)
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
struct termios original = termios;
|
||||
|
||||
termios.c_lflag &= ~(unsigned) ICANON; // disable ICANON.
|
||||
termios.c_lflag &= ~(unsigned) ECHO; // disable ECHO.
|
||||
|
||||
if (tcsetattr(/* fd: */ 1, /* when?: */ TCSADRAIN, /* struct termios: */ &termios) < 0)
|
||||
else
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
fd = 0;
|
||||
|
||||
if (tcgetattr(/* fd: */ 1, /* struct termios: */ &termios) < 0)
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
struct termios modified_termios = termios;
|
||||
|
||||
modified_termios.c_lflag &= ~(unsigned) ICANON; // disable ICANON.
|
||||
modified_termios.c_lflag &= ~(unsigned) ECHO; // disable ECHO.
|
||||
|
||||
if (tcsetattr(/* fd: */ 1, /* when?: */ TCSADRAIN, /* struct termios: */ &modified_termios) < 0)
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
size_t width = 50;
|
||||
|
|
@ -109,6 +179,8 @@ void handle_interactive(
|
|||
{
|
||||
live.data = smalloc(sizeof(*live.data) * width);
|
||||
|
||||
live.pos = 0;
|
||||
|
||||
live.cap = width;
|
||||
|
||||
memset(live.data, 0, sizeof(*live.data) * width);
|
||||
|
|
@ -148,7 +220,7 @@ void handle_interactive(
|
|||
{
|
||||
assert(line.pos <= line.n);
|
||||
|
||||
ensure_capacity(line.cap + 1);
|
||||
ensure_capacity(line.n + 1);
|
||||
|
||||
memmove(
|
||||
/* dest: */ line.data + line.pos + 1,
|
||||
|
|
@ -172,6 +244,8 @@ void handle_interactive(
|
|||
|
||||
assert(line.n <= width);
|
||||
|
||||
struct stringtree* tree = new_stringtree();
|
||||
|
||||
size_t i = 0;
|
||||
|
||||
for (; i < width; i++)
|
||||
|
|
@ -184,26 +258,33 @@ void handle_interactive(
|
|||
{
|
||||
if (pos != i)
|
||||
{
|
||||
printf("\e[%zuG", i + 1); // Move cursor to indicated column in current row.
|
||||
stringtree_append_formatstr(tree, "\e[%zuG", i + 1); // Move cursor to indicated column in current row.
|
||||
|
||||
pos = i;
|
||||
}
|
||||
|
||||
printf("%c", (uint8_t) intended_letter->code);
|
||||
struct string* s = new_string(&intended_letter->code, 1);
|
||||
|
||||
stringtree_append_string(tree, s);
|
||||
|
||||
live_letter->code = intended_letter->code;
|
||||
|
||||
pos++;
|
||||
|
||||
free_string(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (pos != line.pos)
|
||||
{
|
||||
printf("\e[%zuG", line.pos + 1); // Move cursor to indicated column in current row.
|
||||
stringtree_append_formatstr(tree, "\e[%zuG", line.pos + 1); // Move cursor to indicated column in current row.
|
||||
|
||||
live.pos = pos;
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
stringtree_print(tree, wc_stdout);
|
||||
|
||||
free_stringtree(tree);
|
||||
}
|
||||
|
||||
struct {
|
||||
|
|
@ -249,11 +330,18 @@ void handle_interactive(
|
|||
fflush(stdout);
|
||||
}
|
||||
|
||||
uint8_t buffer[4096];
|
||||
struct string* filename = new_string(L"<cmdln>", (unsigned) -1);
|
||||
|
||||
struct position* position = new_position(
|
||||
/* filename: */ filename,
|
||||
/* line: */ 1,
|
||||
/* column: */ 1);
|
||||
|
||||
for (bool keep_going = true, error = false; !error && keep_going; )
|
||||
{
|
||||
ssize_t retval = read(0, buffer, sizeof(buffer));
|
||||
uint8_t buffer[4096];
|
||||
|
||||
ssize_t retval = read(fd, buffer, sizeof(buffer));
|
||||
|
||||
if (retval < 0)
|
||||
{
|
||||
|
|
@ -261,7 +349,7 @@ void handle_interactive(
|
|||
}
|
||||
else if (!retval)
|
||||
{
|
||||
TODO;
|
||||
keep_going = false;
|
||||
}
|
||||
else for (ssize_t i = 0; i < retval; i++)
|
||||
{
|
||||
|
|
@ -303,6 +391,83 @@ void handle_interactive(
|
|||
break;
|
||||
}
|
||||
|
||||
case s_enter:
|
||||
{
|
||||
puts("");
|
||||
|
||||
if (line.n)
|
||||
{
|
||||
wchar_t* string = smalloc(sizeof(*string) * (line.n + 1));
|
||||
|
||||
for (size_t j = 0, m = line.n; j < m; j++)
|
||||
{
|
||||
string[j] = line.data[j].code;
|
||||
}
|
||||
|
||||
string[line.n] = 0;
|
||||
|
||||
struct wcistream* stream = new_string_wcistream(
|
||||
/* input_string: */ string);
|
||||
|
||||
wcistream_read(stream);
|
||||
|
||||
struct tokenizer* tokenizer = new_tokenizer(
|
||||
/* istream: */ stream,
|
||||
/* position: */ position);
|
||||
|
||||
tokenizer_next(tokenizer);
|
||||
|
||||
struct statement* statement = parse(
|
||||
/* tokenizer: */ tokenizer);
|
||||
|
||||
struct stringtree* etree = statement_prettyprint_errors(
|
||||
/* instance: */ statement);
|
||||
|
||||
if (etree)
|
||||
{
|
||||
stringtree_println(etree,
|
||||
/* wide-character stdout: */ wc_stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct stringtree* stree = statement_prettyprint(
|
||||
/* chosen color reference: */ NULL,
|
||||
/* instance: */ statement,
|
||||
/* print with color? */ true);
|
||||
|
||||
stringtree_println(stree,
|
||||
/* wide-character stdout: */ wc_stdout);
|
||||
|
||||
statement_execute(
|
||||
/* instance: */ statement,
|
||||
/* environment: */ environment,
|
||||
/* booleans: */ booleans,
|
||||
/* wide-character stdout: */ wc_stdout,
|
||||
/* print value: */ true,
|
||||
/* print with color?: */ true);
|
||||
|
||||
free_stringtree(stree);
|
||||
}
|
||||
|
||||
line.n = 0;
|
||||
line.pos = 0;
|
||||
|
||||
redraw();
|
||||
|
||||
free_stringtree(etree);
|
||||
|
||||
free_statement(statement);
|
||||
|
||||
free_tokenizer(tokenizer);
|
||||
|
||||
free_wcistream(stream);
|
||||
|
||||
free(string);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case s_delete:
|
||||
{
|
||||
if (line.pos < line.n)
|
||||
|
|
@ -315,6 +480,15 @@ void handle_interactive(
|
|||
break;
|
||||
}
|
||||
|
||||
case s_insert_lambda:
|
||||
{
|
||||
insert_into_line_at_pos(L'λ'), line.pos++;
|
||||
|
||||
redraw();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case s_insert_letter:
|
||||
{
|
||||
insert_into_line_at_pos(buffer[i]), line.pos++;
|
||||
|
|
@ -387,15 +561,26 @@ void handle_interactive(
|
|||
}
|
||||
}
|
||||
|
||||
// running them through a tokenizer-like state machine?
|
||||
|
||||
// different states have corasponding actions
|
||||
|
||||
if (tcsetattr(/* fd: */ 1, /* when?: */ TCSADRAIN, /* struct termios: */ &original) < 0)
|
||||
if (test_interactive_using_input_file)
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tcsetattr(/* fd: */ 1, /* when?: */ TCSADRAIN, /* struct termios: */ &termios) < 0)
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
free_position(position);
|
||||
|
||||
free_string(filename);
|
||||
|
||||
free(token.data);
|
||||
|
||||
free(live.data);
|
||||
|
||||
free(line.data);
|
||||
|
||||
|
|
|
|||
|
|
@ -5,5 +5,10 @@ struct color_factory;
|
|||
|
||||
void handle_interactive(
|
||||
struct environment** environment,
|
||||
struct booleans* booleans);
|
||||
struct booleans* booleans,
|
||||
struct wcostream* wc_stdout
|
||||
#ifndef RELEASE_BUILD
|
||||
, const char* test_interactive_input_file
|
||||
#endif
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -9,28 +9,18 @@
|
|||
#include <stringtree/println.h>
|
||||
#include <stringtree/free.h>
|
||||
|
||||
/*#include <booleans/new.h>*/
|
||||
/*#include <booleans/free.h>*/
|
||||
|
||||
/*#include <color_factory/new.h>*/
|
||||
/*#include <color_factory/free.h>*/
|
||||
|
||||
/*#include <environment/new.h>*/
|
||||
/*#include <environment/declare_builtins.h>*/
|
||||
/*#include <environment/free.h>*/
|
||||
|
||||
#include <parse/position/struct.h>
|
||||
#include <parse/position/new.h>
|
||||
#include <parse/position/free.h>
|
||||
|
||||
#include <parse/istream/string/new.h>
|
||||
#include <parse/istream/file/new.h>
|
||||
#include <parse/istream/read.h>
|
||||
#include <parse/istream/free.h>
|
||||
#include <istream/string/new.h>
|
||||
#include <istream/file/new.h>
|
||||
#include <istream/read.h>
|
||||
#include <istream/free.h>
|
||||
|
||||
#include <parse/wcistream/istream/new.h>
|
||||
#include <parse/wcistream/read.h>
|
||||
#include <parse/wcistream/free.h>
|
||||
#include <wcistream/istream/new.h>
|
||||
#include <wcistream/read.h>
|
||||
#include <wcistream/free.h>
|
||||
|
||||
#include <parse/token/struct.h>
|
||||
|
||||
|
|
@ -60,18 +50,13 @@ void handle_string(
|
|||
struct booleans* booleans,
|
||||
const char* input_string,
|
||||
bool echo,
|
||||
bool print_with_colors)
|
||||
bool print_with_colors,
|
||||
struct wcostream* wc_stdout)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
assert(input_string);
|
||||
|
||||
struct ostream* b_stdout = new_file_ostream(
|
||||
/* file descriptor: */ 1);
|
||||
|
||||
struct wcostream* wc_stdout = new_ostream_wcostream(
|
||||
/* binary stream: */ b_stdout);
|
||||
|
||||
struct istream* stream = new_string_istream(
|
||||
/* read-only text: */ (const uint8_t*) input_string);
|
||||
|
||||
|
|
@ -156,14 +141,10 @@ void handle_string(
|
|||
|
||||
free_string(filename);
|
||||
|
||||
free_wcostream(wc_stdout);
|
||||
|
||||
free_wcistream(wcstream);
|
||||
|
||||
free_istream(stream);
|
||||
|
||||
free_ostream(b_stdout);
|
||||
|
||||
EXIT;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
struct wcostream;
|
||||
struct color_factory;
|
||||
struct environment;
|
||||
struct booleans;
|
||||
|
|
@ -8,5 +9,6 @@ void handle_string(
|
|||
struct booleans* booleans,
|
||||
const char* input_file,
|
||||
bool echo,
|
||||
bool print_with_colors);
|
||||
bool print_with_colors,
|
||||
struct wcostream* wc_stdout);
|
||||
|
||||
|
|
|
|||
39
main.c
39
main.c
|
|
@ -14,8 +14,11 @@
|
|||
#include <booleans/new.h>
|
||||
#include <booleans/free.h>
|
||||
|
||||
/*#include <color_factory/new.h>*/
|
||||
/*#include <color_factory/free.h>*/
|
||||
#include <ostream/file/new.h>
|
||||
#include <ostream/free.h>
|
||||
|
||||
#include <wcostream/ostream/new.h>
|
||||
#include <wcostream/free.h>
|
||||
|
||||
#include <environment/new.h>
|
||||
#include <environment/declare_builtins.h>
|
||||
|
|
@ -44,9 +47,15 @@ int main(int argc, char* const* argv)
|
|||
|
||||
if (flags->read_init_file)
|
||||
{
|
||||
handle_init_file(&environment, booleans, flags->custom_init_path);
|
||||
handle_init_file(&environment, booleans, flags->init_path);
|
||||
}
|
||||
|
||||
struct ostream* b_stdout = new_file_ostream(
|
||||
/* file descriptor: */ 1);
|
||||
|
||||
struct wcostream* wc_stdout = new_ostream_wcostream(
|
||||
/* binary stream: */ b_stdout);
|
||||
|
||||
switch (flags->input_kind)
|
||||
{
|
||||
case ik_string:
|
||||
|
|
@ -55,8 +64,9 @@ int main(int argc, char* const* argv)
|
|||
/* environment, may by modified/replaced: */ &environment,
|
||||
/* booleans: */ booleans,
|
||||
/* input string: */ flags->input_string,
|
||||
/* echo? */ flags->echo,
|
||||
/* colors?: */ flags->print_with_colors);
|
||||
/* echo statements? */ flags->echo,
|
||||
/* colors?: */ flags->print_with_colors,
|
||||
/* wide-character output stream: */ wc_stdout);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -67,23 +77,32 @@ int main(int argc, char* const* argv)
|
|||
/* environment, may by modified/replaced: */ &environment,
|
||||
/* booleans: */ booleans,
|
||||
/* input file: */ flags->input_file,
|
||||
/* echo? */ flags->echo,
|
||||
/* colors?: */ flags->print_with_colors);
|
||||
/* echo statements? */ flags->echo,
|
||||
/* colors?: */ flags->print_with_colors,
|
||||
/* wide-character output stream: */ wc_stdout);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ik_interactive:
|
||||
{
|
||||
#ifdef RELEASE_BUILD
|
||||
if (!isatty(1))
|
||||
{
|
||||
TODO;
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
handle_interactive(
|
||||
/* environment, may by modified/replaced: */ &environment,
|
||||
/* booleans: */ booleans);
|
||||
/* booleans: */ booleans,
|
||||
/* wide-character output stream: */ wc_stdout
|
||||
#ifndef RELEASE_BUILD
|
||||
, /* test interactive using input file: */
|
||||
flags->test_interactive_using_input_file
|
||||
#endif
|
||||
);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -95,6 +114,10 @@ int main(int argc, char* const* argv)
|
|||
}
|
||||
}
|
||||
|
||||
free_wcostream(wc_stdout);
|
||||
|
||||
free_ostream(b_stdout);
|
||||
|
||||
free_environment(environment);
|
||||
|
||||
free_booleans(booleans);
|
||||
|
|
|
|||
10
makefile
10
makefile
|
|
@ -25,7 +25,7 @@ endif
|
|||
|
||||
srclist.mk:
|
||||
@echo "searching for source files ..."
|
||||
@find -name '*.c*' -! -path '*/junk/*' \
|
||||
@find -name '*.c*' -! -path '*/bin/*' -! -path '*/junk/*' \
|
||||
| sed 's/.cpp$$/.c/g;s/^/srcs += /g' \
|
||||
| sort -Vu > ${@}
|
||||
|
||||
|
|
@ -33,9 +33,9 @@ include srclist.mk
|
|||
|
||||
.PRECIOUS: %.c
|
||||
|
||||
%.c: %.cpp zog.py
|
||||
%.c: %.cpp zog.py | bin/
|
||||
@echo "preprocessing ${<} ..."
|
||||
@python3.10 ./zog.py -i $< -o $@
|
||||
@./zog.py -i $< --snippet-directory=bin -o $@
|
||||
|
||||
${prefix}/%.o ${prefix}/%.d: %.c ${optionset} | ${prefix}/%/
|
||||
@echo "compiling (${buildtype}) ${*}.c ..."
|
||||
|
|
@ -56,7 +56,9 @@ args += --custom-init-path ./examples/init.txt
|
|||
|
||||
#args += -c '1'
|
||||
|
||||
args += ./examples/sandbox.txt
|
||||
#args += ./examples/sandbox.txt
|
||||
|
||||
args += --test-interactive-using-input-file ./examples/sandbox-interactive.txt
|
||||
|
||||
run: ${prefix}/13
|
||||
$< ${args}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
|
@ -12,6 +13,8 @@ void* srealloc(
|
|||
|
||||
if (!newptr)
|
||||
{
|
||||
printf("oldptr = %p\n", oldptr);
|
||||
printf("size = %zu\n", size);
|
||||
assert(!"TODO");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,12 +24,14 @@
|
|||
#include <expression/lambda/new.h>
|
||||
#include <expression/application/new.h>
|
||||
#include <expression/parenthesis/new.h>
|
||||
#include <expression/error/new.h>
|
||||
#include <expression/inc.h>
|
||||
#include <expression/free.h>
|
||||
|
||||
#include <statement/expression/new.h>
|
||||
#include <statement/substatements/new.h>
|
||||
#include <statement/assignment/new.h>
|
||||
#include <statement/error/new.h>
|
||||
#include <statement/inc.h>
|
||||
#include <statement/free.h>
|
||||
|
||||
|
|
@ -244,7 +246,34 @@ struct expression* parse_primary_expression(
|
|||
parse_application_expression(tokenizer,
|
||||
/* in parenthesis: */ true);
|
||||
|
||||
retval = new_parenthesis_expression(subexpression);
|
||||
switch (tokenizer->token->kind)
|
||||
{
|
||||
case tk_cparen:
|
||||
retval = new_parenthesis_expression(subexpression);
|
||||
break;
|
||||
|
||||
case tk_EOF:
|
||||
{
|
||||
retval = new_error_expression(
|
||||
L"Unexpected EOF when reading parenthesis. "
|
||||
L"Expecting close parenthesis.",
|
||||
subexpression);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case tk_semicolon:
|
||||
TODO;
|
||||
break;
|
||||
|
||||
case tk_error:
|
||||
TODO;
|
||||
break;
|
||||
|
||||
default:
|
||||
TODO;
|
||||
break;
|
||||
}
|
||||
|
||||
tokenizer_next(tokenizer);
|
||||
|
||||
|
|
@ -330,7 +359,14 @@ struct expression* parse_application_expression(
|
|||
case tk_error:
|
||||
TODO;
|
||||
break;
|
||||
|
||||
case tk_EOF:
|
||||
{
|
||||
retval = new_error_expression(L"Unexpected EOF.", NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
TODO;
|
||||
break;
|
||||
|
|
@ -371,14 +407,6 @@ struct expression* parse_application_expression(
|
|||
|
||||
case tk_semicolon:
|
||||
case tk_EOF:
|
||||
{
|
||||
if (in_parentheses)
|
||||
{
|
||||
TODO;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case tk_cparen:
|
||||
{
|
||||
break;
|
||||
|
|
@ -504,6 +532,14 @@ struct statement* parse_statement(
|
|||
TODO;
|
||||
break;
|
||||
|
||||
case tk_cparen:
|
||||
{
|
||||
retval = new_error_statement(
|
||||
L"Unexpected close parenthesis when reading statement", NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case tk_error:
|
||||
TODO;
|
||||
// create error statement ("unknown token")
|
||||
|
|
@ -550,12 +586,18 @@ struct statement* parse_statements(
|
|||
left = inc_statement(right);
|
||||
}
|
||||
|
||||
if (tokenizer->token->kind == tk_cparen)
|
||||
while (tokenizer->token->kind == tk_cparen)
|
||||
{
|
||||
TODO;
|
||||
struct statement* oldleft = left;
|
||||
|
||||
left = new_error_statement(L"Extra close parenthesis.", left);
|
||||
|
||||
free_statement(oldleft);
|
||||
|
||||
tokenizer_next(tokenizer);
|
||||
}
|
||||
|
||||
if (tokenizer->token->kind == tk_semicolon)
|
||||
while (tokenizer->token->kind == tk_semicolon)
|
||||
{
|
||||
tokenizer_next(tokenizer);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../wcistream/free.h"
|
||||
#include <wcistream/free.h>
|
||||
|
||||
#include "../position/free.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <parse/wcistream/inc.h>
|
||||
#include <wcistream/inc.h>
|
||||
|
||||
#include <parse/position/inc.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@
|
|||
#include <string/new.h>
|
||||
#include <string/free.h>
|
||||
|
||||
#include "../wcistream/struct.h"
|
||||
#include "../wcistream/read.h"
|
||||
#include <wcistream/struct.h>
|
||||
#include <wcistream/read.h>
|
||||
|
||||
#include "../position/struct.h"
|
||||
#include "../position/clone.h"
|
||||
|
|
|
|||
68
srclist.mk
68
srclist.mk
|
|
@ -28,6 +28,12 @@ srcs += ./expression/application/inheritance.c
|
|||
srcs += ./expression/application/new.c
|
||||
srcs += ./expression/application/prettyprint.c
|
||||
srcs += ./expression/application/prettyprint_errors.c
|
||||
srcs += ./expression/error/evaluate.c
|
||||
srcs += ./expression/error/free.c
|
||||
srcs += ./expression/error/inheritance.c
|
||||
srcs += ./expression/error/new.c
|
||||
srcs += ./expression/error/prettyprint.c
|
||||
srcs += ./expression/error/prettyprint_errors.c
|
||||
srcs += ./expression/evaluate.c
|
||||
srcs += ./expression/free.c
|
||||
srcs += ./expression/inc.c
|
||||
|
|
@ -67,6 +73,18 @@ srcs += ./handle_file.c
|
|||
srcs += ./handle_init_file.c
|
||||
srcs += ./handle_interactive.c
|
||||
srcs += ./handle_string.c
|
||||
srcs += ./istream/file/free.c
|
||||
srcs += ./istream/file/inheritance.c
|
||||
srcs += ./istream/file/new.c
|
||||
srcs += ./istream/file/read.c
|
||||
srcs += ./istream/free.c
|
||||
srcs += ./istream/inc.c
|
||||
srcs += ./istream/new.c
|
||||
srcs += ./istream/read.c
|
||||
srcs += ./istream/string/free.c
|
||||
srcs += ./istream/string/inheritance.c
|
||||
srcs += ./istream/string/new.c
|
||||
srcs += ./istream/string/read.c
|
||||
srcs += ./main.c
|
||||
srcs += ./memory/smalloc.c
|
||||
srcs += ./memory/srealloc.c
|
||||
|
|
@ -89,18 +107,6 @@ srcs += ./ostream/free.c
|
|||
srcs += ./ostream/inc.c
|
||||
srcs += ./ostream/new.c
|
||||
srcs += ./ostream/write.c
|
||||
srcs += ./parse/istream/file/free.c
|
||||
srcs += ./parse/istream/file/inheritance.c
|
||||
srcs += ./parse/istream/file/new.c
|
||||
srcs += ./parse/istream/file/read.c
|
||||
srcs += ./parse/istream/free.c
|
||||
srcs += ./parse/istream/inc.c
|
||||
srcs += ./parse/istream/new.c
|
||||
srcs += ./parse/istream/read.c
|
||||
srcs += ./parse/istream/string/free.c
|
||||
srcs += ./parse/istream/string/inheritance.c
|
||||
srcs += ./parse/istream/string/new.c
|
||||
srcs += ./parse/istream/string/read.c
|
||||
srcs += ./parse/parse.c
|
||||
srcs += ./parse/position/assign.c
|
||||
srcs += ./parse/position/clone.c
|
||||
|
|
@ -116,28 +122,18 @@ srcs += ./parse/tokenizer/put_back.c
|
|||
srcs += ./parse/token/free.c
|
||||
srcs += ./parse/token/inc.c
|
||||
srcs += ./parse/token/new.c
|
||||
srcs += ./parse/wcistream/file/free.c
|
||||
srcs += ./parse/wcistream/file/inheritance.c
|
||||
srcs += ./parse/wcistream/file/new.c
|
||||
srcs += ./parse/wcistream/file/read.c
|
||||
srcs += ./parse/wcistream/free.c
|
||||
srcs += ./parse/wcistream/inc.c
|
||||
srcs += ./parse/wcistream/istream/free.c
|
||||
srcs += ./parse/wcistream/istream/inheritance.c
|
||||
srcs += ./parse/wcistream/istream/new.c
|
||||
srcs += ./parse/wcistream/istream/read.c
|
||||
srcs += ./parse/wcistream/new.c
|
||||
srcs += ./parse/wcistream/read.c
|
||||
srcs += ./parse/wcistream/string/free.c
|
||||
srcs += ./parse/wcistream/string/inheritance.c
|
||||
srcs += ./parse/wcistream/string/new.c
|
||||
srcs += ./parse/wcistream/string/read.c
|
||||
srcs += ./statement/assignment/execute.c
|
||||
srcs += ./statement/assignment/free.c
|
||||
srcs += ./statement/assignment/inheritance.c
|
||||
srcs += ./statement/assignment/new.c
|
||||
srcs += ./statement/assignment/prettyprint.c
|
||||
srcs += ./statement/assignment/prettyprint_errors.c
|
||||
srcs += ./statement/error/execute.c
|
||||
srcs += ./statement/error/free.c
|
||||
srcs += ./statement/error/inheritance.c
|
||||
srcs += ./statement/error/new.c
|
||||
srcs += ./statement/error/prettyprint.c
|
||||
srcs += ./statement/error/prettyprint_errors.c
|
||||
srcs += ./statement/execute.c
|
||||
srcs += ./statement/expression/execute.c
|
||||
srcs += ./statement/expression/free.c
|
||||
|
|
@ -190,6 +186,22 @@ srcs += ./value/number/inheritance.c
|
|||
srcs += ./value/number/new.c
|
||||
srcs += ./value/number/prettyprint.c
|
||||
srcs += ./value/prettyprint.c
|
||||
srcs += ./wcistream/file/free.c
|
||||
srcs += ./wcistream/file/inheritance.c
|
||||
srcs += ./wcistream/file/new.c
|
||||
srcs += ./wcistream/file/read.c
|
||||
srcs += ./wcistream/free.c
|
||||
srcs += ./wcistream/inc.c
|
||||
srcs += ./wcistream/istream/free.c
|
||||
srcs += ./wcistream/istream/inheritance.c
|
||||
srcs += ./wcistream/istream/new.c
|
||||
srcs += ./wcistream/istream/read.c
|
||||
srcs += ./wcistream/new.c
|
||||
srcs += ./wcistream/read.c
|
||||
srcs += ./wcistream/string/free.c
|
||||
srcs += ./wcistream/string/inheritance.c
|
||||
srcs += ./wcistream/string/new.c
|
||||
srcs += ./wcistream/string/read.c
|
||||
srcs += ./wcostream/file/free.c
|
||||
srcs += ./wcostream/file/new.c
|
||||
srcs += ./wcostream/file/write.c
|
||||
|
|
|
|||
69
statement/error/execute.c
Normal file
69
statement/error/execute.c
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <debug.h>
|
||||
|
||||
#include <stringtree/new.h>
|
||||
#include <stringtree/println.h>
|
||||
#include <stringtree/free.h>
|
||||
|
||||
#include <value/prettyprint.h>
|
||||
#include <value/lazy/unlazy.h>
|
||||
#include <value/free.h>
|
||||
|
||||
#include <statement/execute.h>
|
||||
|
||||
#include "struct.h"
|
||||
#include "execute.h"
|
||||
|
||||
void error_statement_execute(
|
||||
struct statement* super,
|
||||
struct environment** environment,
|
||||
struct booleans* booleans,
|
||||
struct wcostream* ostream,
|
||||
bool print_value,
|
||||
bool print_with_color)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
TODO;
|
||||
#if 0
|
||||
struct error_statement* this = (void*) super;
|
||||
|
||||
struct value* value = error_evaluate(
|
||||
/* error: */ this->error,
|
||||
/* environment: */ *environment,
|
||||
/* booleans: */ booleans);
|
||||
|
||||
struct value* vvalue = lazy_value_unlazy(value, booleans);
|
||||
|
||||
if (print_value)
|
||||
{
|
||||
struct stringtree* tree = value_prettyprint(
|
||||
/* outgoing chosen color: */ NULL,
|
||||
/* value: */ vvalue,
|
||||
/* print with color? */ print_with_color);
|
||||
|
||||
stringtree_println(tree, ostream);
|
||||
|
||||
free_stringtree(tree);
|
||||
}
|
||||
|
||||
free_value(vvalue);
|
||||
|
||||
free_value(value);
|
||||
#endif
|
||||
|
||||
EXIT;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
12
statement/error/execute.h
Normal file
12
statement/error/execute.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
struct statement;
|
||||
struct environment;
|
||||
struct color_factory;
|
||||
|
||||
void error_statement_execute(
|
||||
struct statement* this,
|
||||
struct environment** environment,
|
||||
struct booleans* booleans,
|
||||
struct wcostream* ostream,
|
||||
bool print_value,
|
||||
bool print_with_color);
|
||||
20
statement/error/free.c
Normal file
20
statement/error/free.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <statement/free.h>
|
||||
|
||||
#include "struct.h"
|
||||
#include "free.h"
|
||||
|
||||
void free_error_statement(
|
||||
struct statement* super)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
struct error_statement* this = (void*) super;
|
||||
|
||||
free_statement(this->substatement);
|
||||
|
||||
EXIT;
|
||||
}
|
||||
|
||||
5
statement/error/free.h
Normal file
5
statement/error/free.h
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
struct statement;
|
||||
|
||||
void free_error_statement(
|
||||
struct statement* this);
|
||||
21
statement/error/inheritance.c
Normal file
21
statement/error/inheritance.c
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../inheritance.h"
|
||||
|
||||
#include "inheritance.h"
|
||||
|
||||
#include "prettyprint.h"
|
||||
#include "prettyprint_errors.h"
|
||||
#include "execute.h"
|
||||
#include "free.h"
|
||||
|
||||
struct statement_inheritance error_statement_inheritance = {
|
||||
.prettyprint_errors = error_statement_prettyprint_errors,
|
||||
|
||||
.prettyprint = error_statement_prettyprint,
|
||||
|
||||
.execute = error_statement_execute,
|
||||
|
||||
.free = free_error_statement,
|
||||
};
|
||||
3
statement/error/inheritance.h
Normal file
3
statement/error/inheritance.h
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
extern struct statement_inheritance error_statement_inheritance;
|
||||
|
||||
28
statement/error/new.c
Normal file
28
statement/error/new.c
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include "../new.h"
|
||||
#include "../inc.h"
|
||||
|
||||
#include "inheritance.h"
|
||||
#include "struct.h"
|
||||
#include "new.h"
|
||||
|
||||
struct statement* new_error_statement(
|
||||
const wchar_t* message,
|
||||
struct statement* substatement)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
struct error_statement* this = (void*) new_statement(
|
||||
/* inheritance: */ &error_statement_inheritance,
|
||||
/* alloc size: */ sizeof(*this));
|
||||
|
||||
this->message = message;
|
||||
|
||||
this->substatement = inc_statement(substatement);
|
||||
|
||||
EXIT;
|
||||
return (void*) this;
|
||||
}
|
||||
|
||||
7
statement/error/new.h
Normal file
7
statement/error/new.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
struct error;
|
||||
|
||||
struct statement* new_error_statement(
|
||||
const wchar_t* message,
|
||||
struct statement* statement);
|
||||
|
||||
28
statement/error/prettyprint.c
Normal file
28
statement/error/prettyprint.c
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <statement/prettyprint.h>
|
||||
|
||||
#include "struct.h"
|
||||
#include "prettyprint.h"
|
||||
|
||||
struct stringtree* error_statement_prettyprint(
|
||||
int *out_chosen_color,
|
||||
struct statement* super,
|
||||
bool with_color)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
TODO;
|
||||
#if 0
|
||||
struct error_statement* const this = (void*) super;
|
||||
|
||||
struct stringtree* tree = error_prettyprint(
|
||||
out_chosen_color,
|
||||
this->error, with_color);
|
||||
|
||||
EXIT;
|
||||
return tree;
|
||||
#endif
|
||||
}
|
||||
|
||||
10
statement/error/prettyprint.h
Normal file
10
statement/error/prettyprint.h
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct color_factory;
|
||||
|
||||
struct stringtree* error_statement_prettyprint(
|
||||
int *out_chosen_color,
|
||||
struct statement* this,
|
||||
bool with_color);
|
||||
|
||||
36
statement/error/prettyprint_errors.c
Normal file
36
statement/error/prettyprint_errors.c
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <stringtree/new.h>
|
||||
#include <stringtree/append.h>
|
||||
|
||||
#include <statement/prettyprint_errors.h>
|
||||
|
||||
#include "struct.h"
|
||||
#include "prettyprint_errors.h"
|
||||
|
||||
struct stringtree* error_statement_prettyprint_errors(
|
||||
struct statement* super)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
struct error_statement* this = (void*) super;
|
||||
|
||||
struct stringtree* tree = NULL;
|
||||
|
||||
if (this->substatement)
|
||||
{
|
||||
tree = statement_prettyprint_errors(this->substatement);
|
||||
}
|
||||
|
||||
if (!tree)
|
||||
{
|
||||
tree = new_stringtree();
|
||||
}
|
||||
|
||||
stringtree_append_cstr(tree, this->message);
|
||||
stringtree_append_cstr(tree, L"\n");
|
||||
|
||||
EXIT;
|
||||
return tree;
|
||||
}
|
||||
4
statement/error/prettyprint_errors.h
Normal file
4
statement/error/prettyprint_errors.h
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
struct stringtree* error_statement_prettyprint_errors(
|
||||
struct statement* super);
|
||||
|
||||
12
statement/error/struct.h
Normal file
12
statement/error/struct.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
#include "../struct.h"
|
||||
|
||||
struct error_statement
|
||||
{
|
||||
struct statement super;
|
||||
|
||||
const wchar_t* message;
|
||||
|
||||
struct statement* substatement;
|
||||
};
|
||||
|
||||
24
string/new.c
24
string/new.c
|
|
@ -106,6 +106,30 @@ struct string* new_string_from_ascii_format(
|
|||
return this;
|
||||
}
|
||||
|
||||
struct string* new_string_from_ascii_format_vargs(
|
||||
const char* fmt, va_list arg)
|
||||
{
|
||||
ENTER;
|
||||
|
||||
char *out = NULL;
|
||||
|
||||
int len = vasprintf(&out, fmt, arg);
|
||||
|
||||
if (len < 0)
|
||||
{
|
||||
TODO;
|
||||
}
|
||||
|
||||
dpvs(out);
|
||||
|
||||
struct string* this = new_string_from_ascii(out, (size_t) len);
|
||||
|
||||
free(out);
|
||||
|
||||
EXIT;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -14,3 +14,6 @@ struct string* new_string_from_ascii(
|
|||
struct string* new_string_from_ascii_format(
|
||||
const char* fmt, ...);
|
||||
|
||||
struct string* new_string_from_ascii_format_vargs(
|
||||
const char* fmt, va_list arg);
|
||||
|
||||
|
|
|
|||
|
|
@ -48,20 +48,17 @@ void stringtree_append_formatstr(
|
|||
{
|
||||
ENTER;
|
||||
|
||||
TODO;
|
||||
#if 0
|
||||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
|
||||
struct string* string = new_string_from_vargs(fmt, va);
|
||||
struct string* string = new_string_from_ascii_format_vargs(fmt, va);
|
||||
|
||||
stringtree_append_string(this, string);
|
||||
|
||||
free_string(string);
|
||||
|
||||
va_end(va);
|
||||
#endif
|
||||
|
||||
EXIT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include <debug.h>
|
||||
|
||||
#include <parse/istream/free.h>
|
||||
#include <istream/free.h>
|
||||
|
||||
#include "struct.h"
|
||||
#include "free.h"
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue