a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
0
|
// Copyright (C) 2023, Jakob Wakeling |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
1
|
// All rights reserved. |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
2
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
3
|
#include "eval.h" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
4
|
#include "lineread/lineread.h" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
5
|
#include "util/log.h" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
6
|
#include "util/optget.h" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
7
|
#include "util/util.h" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
8
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
9
|
#include <errno.h> |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
10
|
#include <setjmp.h> |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
11
|
#include <signal.h> |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
12
|
#include <stdio.h> |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
13
|
#include <stdlib.h> |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
14
|
#include <string.h> |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
15
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
16
|
static void reset(int); |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
17
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
18
|
static const char *const help; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
19
|
const char *const version; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
20
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
21
|
static jmp_buf jmp; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
22
|
static sig_atomic_t jmpflag = false; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
23
|
bool _loop = true; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
24
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
25
|
int main(int, char *av[]) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
26
|
struct opt opt = OPTGET_INIT; opt.str = "Ep"; opt.lops = (struct lop[]){ |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
27
|
{ "help", ARG_NUL, 256 }, |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
28
|
{ "version", ARG_NUL, 257 }, |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
29
|
{ "debug", ARG_NUL, 258 }, |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
30
|
{ NULL, 0, 0 }, |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
31
|
}; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
32
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
33
|
struct {} args = {}; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
34
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
35
|
for (int c; (c = optget(&opt, av, 1)) != -1;) { |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
36
|
switch (c) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
37
|
case 'E': { Eflag = true; } break; |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
38
|
case 'p': { pflag = true; } break; |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
39
|
case 258: { __debug = true; } break; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
40
|
case 256: { fputs(help, stdout); } return 0; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
41
|
case 257: { fputs(version, stdout); } return 0; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
42
|
default: {} return -1; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
43
|
} |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
44
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
45
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
46
|
signal(SIGINT, &reset); signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, SIG_IGN); |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
47
|
atexit(&linefree); |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
48
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
49
|
do { |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
50
|
if (sigsetjmp(jmp, 1)) { fputc('\n', stdout); } jmpflag = true; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
51
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
52
|
char *l = lineread(); |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
53
|
if (!l) { if (errno) { log_warn("lineread: %s", strerror(errno)); } break; } |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
54
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
55
|
eval(l, strlen(l)); free(l); |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
56
|
} while (_loop); |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
57
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
58
|
return __warned; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
59
|
} |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
60
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
61
|
static void reset(int) { |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
62
|
if (jmpflag) { siglongjmp(jmp, 1); } |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
63
|
} |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
64
|
|
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
65
|
static const char *const help = |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
66
|
"ESH - Executive Shell\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
67
|
"Usage:\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
68
|
" esh [--debug]\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
69
|
"Options:\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
70
|
" -E Output lexer tokens\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
71
|
" -p Output parser AST \n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
72
|
" --debug Enable debug logging\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
73
|
" --help Display help information\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
74
|
" --version Display version information\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
75
|
; |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
76
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
77
|
const char *const version = |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
78
|
"ESH, version " PROJECT_VERSION "\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
79
|
"Copyright (C) 2023, Jakob Wakeling\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
80
|
"All rights reserved.\n" |
a1eb486 |
Jakob Wakeling |
2023-12-27 13:01:35 |
81
|
; |
|
|
|
82
|
|