ESH

Executive Shell
git clone http://git.omkov.net/ESH
Log | Tree | Refs | README | Download

ESH/src/main.c (83 lines, 1.8 KiB) -rw-r--r-- file download

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