4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
0
|
// Copyright (C) 2023, Jakob Wakeling |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
1
|
// All rights reserved. |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
2
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
3
|
#include "../eval.h" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
4
|
#include "../util/optget.h" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
5
|
#include "../util/util.h" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
6
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
7
|
#include <stdio.h> |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
8
|
#include <string.h> |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
9
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
10
|
static const char *const help; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
11
|
extern const char *const version; /* main.c */ |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
12
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
13
|
int bltn_eval(int ac, char *av[]) { |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
14
|
struct opt opt = OPTGET_INIT; opt.str = ""; opt.lops = (struct lop[]){ |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
15
|
{ "help", ARG_NUL, 256 }, |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
16
|
{ "version", ARG_NUL, 257 }, |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
17
|
{ NULL, 0, 0 }, |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
18
|
}; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
19
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
20
|
for (int c; (c = optget(&opt, av, 0)) != -1;) { |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
21
|
switch (c) { |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
22
|
case 256: { fputs(help, stdout); } return 0; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
23
|
case 257: { fputs(version, stdout); } return 0; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
24
|
default: {} return -1; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
25
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
26
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
27
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
28
|
char *args, *dest; u64 size = 0; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
29
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
30
|
for (u64 i = 0; i < ac - opt.ind; i += 1) { |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
31
|
size += (strlen(av[opt.ind + i]) + 1); |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
32
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
33
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
34
|
args = xcalloc(size, sizeof (*args)); dest = args; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
35
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
36
|
for (u64 i = 0; i < ac - opt.ind; i += 1) { |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
37
|
if (i != 0) { strncat(dest, " ", 1); dest += 1; } |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
38
|
strcat(dest, av[opt.ind + i]); dest += strlen(av[opt.ind + i]); |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
39
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
40
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
41
|
eval(args, size); return 0; |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
42
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
43
|
|
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
44
|
static const char *const help = |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
45
|
"eval - Execute arguments as a command\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
46
|
"Usage:\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
47
|
" eval [argument...]\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
48
|
"Options:\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
49
|
" --help Display help information\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
50
|
" --version Display version information\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
51
|
; |
|
|
|
52
|
|