From 29b9cb9bd5d6fbc0a7b5021bdf9898a210609b5b Mon Sep 17 00:00:00 2001 From: dtb Date: Thu, 7 Jul 2022 20:50:19 -0400 Subject: [PATCH] make nutshell build --- Makefile | 7 +++++-- src/nutshell.c | 38 +++++++++++++---------------------- src/nutshell.h | 38 ++--------------------------------- src/nutshell_builtins.c | 44 +++++++++++++++++++++++++++++++++++------ 4 files changed, 59 insertions(+), 68 deletions(-) diff --git a/Makefile b/Makefile index 90b8d86..54d49c0 100644 --- a/Makefile +++ b/Makefile @@ -84,8 +84,11 @@ lowercase: sysexits src/lowercase.c nonzero: src/nonzero.c $(CC) $(CFLAGS) -o bin/nonzero src/nonzero.c -nutshell: src/nutshell.c src/nutshell.h src/nutshell_builtins.c - $(CC) $(CFLAGS) -o bin/nutshell src/nutshell.c +nutshell.o: libio usefulmacros src/nutshell.c src/nutshell.h src/nutshell_builtins.c + $(CC) $(CFLAGS) -c -o build/nutshell.o src/nutshell.c + +nutshell: libio nutshell.o + $(CC) $(CFLAGS) -o bin/nutshell build/libio.o build/nutshell.o roll.o: lib/libio.h src/roll.c sysexits $(CC) $(CFLAGS) -c -o build/roll.o src/roll.c diff --git a/src/nutshell.c b/src/nutshell.c index 612b5cd..09fc63d 100644 --- a/src/nutshell.c +++ b/src/nutshell.c @@ -1,26 +1,17 @@ +#include /* isspace(3) */ +#include /* NULL */ +#include /* getc(3) */ +#include /* getenv(3), rand(3), srand(3) */ +#include /* strcmp(3) */ +#include /* wait(2) */ +#include /* time(3) */ +#include /* fork(2), write(2) */ +#include "libio.h" +#include "usefulmacros.h" + #include "nutshell.h" #include "nutshell_builtins.c" -int -fdputd(int fd, int d){ - if(d < 0){ - putc('-', stdout); - d *= -1; - } - return printf("%d\n", d); -} - -/* Probably not buggy. */ -int -fdputs(int fd, char *s){ - int r; - - r = write(1, s, strlen(s)); - r += write(1, "\n", 1); - - return r; -} - static int parse_argv(char *buffer, char **argv, int argc_max){ int i; @@ -82,9 +73,8 @@ run(char *buf){ argc = parse_argv(buf, argv, ARRAYLEN(argv)); /* builtins get priority */ - for(i = 0; i < ARRAYLEN(builtins); ++i) - if(strcmp(builtins[i].name, argv[0]) == 0) - return builtins[i].f(argc, argv); + if((i = isbuiltin(argv[0])) != 0) + return builtins[i - 1].f(argc, argv); if(state.jailed) goto runerr; @@ -96,8 +86,8 @@ runerr: int main(int argc, char *argv[]){ static char buf[BUF_MAX]; + static char prompt[] = DEFAULT_PROMPT; - srand(time(NULL)); builtin_init(0, empty_argv); for(;;){ diff --git a/src/nutshell.h b/src/nutshell.h index 62349bd..b7f733d 100644 --- a/src/nutshell.h +++ b/src/nutshell.h @@ -1,41 +1,10 @@ -#include /* - isspace(3) -*/ -#include /* - NULL -*/ -#include /* - getc(3) -*/ -#include /* - getenv(3) - rand(3) - srand(3) -*/ -#include /* - strcmp(3) - strlen(3) -*/ -#include /* - wait(2) -*/ -#include /* - time(3) -*/ -#include /* - fork(2) - write(2) -*/ - -#define ARRAYLEN(a) sizeof(a) / sizeof(*(a)) - /* conservative defaults */ #define ARGV_MAX 10 #define BUF_MAX 100 +#define DEFAULT_PROMPT "^_^?: " + char *empty_argv[1] = { NULL }; -char *nethack_name = "nethack"; -char prompt[] = "^_^?: "; struct { int jailed; @@ -44,6 +13,3 @@ struct { 0, 0 }; - -int fdputd(int fd, int d); -int fdputs(int fd, char *s); diff --git a/src/nutshell_builtins.c b/src/nutshell_builtins.c index 3d1d96c..18f3b63 100644 --- a/src/nutshell_builtins.c +++ b/src/nutshell_builtins.c @@ -1,3 +1,6 @@ +#define NETHACK_NAME "nethack" + +int builtin_builtin (int, char **); int builtin_escape (int, char **); int builtin_init (int, char **); int builtin_jail (int, char **); @@ -9,13 +12,44 @@ struct { char *name; int (*f)(int, char **); }builtins[] = { - {"escape", builtin_escape}, + /* guaranteed to exist */ + {"builtin", builtin_builtin}, {"init", builtin_init}, + + /* optional additions */ + {"escape", builtin_escape}, {"jail", builtin_jail}, {"nethack", builtin_nethack}, {"status", builtin_status} }; +int +isbuiltin(char *s){ + int i; + + for(i = 0; i < ARRAYLEN(builtins); ++i) + if(strcmp(builtins[i].name, s) == 0) + return i + 1; + return 0; +} + +int +builtin_builtin(int argc, char **argv){ + int i; + + if(argc < 2){ + fdputs(2, "%s: needs argument(s)"); + return 1; + } + + ++argv; + + while(*argv != NULL) + if(!isbuiltin(*argv)) + return 1; + return 0; +} + int builtin_escape(int argc, char **argv){ char *s; @@ -32,11 +66,7 @@ builtin_escape(int argc, char **argv){ int builtin_init(int argc, char **argv){ - fdputs(1,"\ -\ - A voice whispers to you. \"Play NetHack...\" (\"nethack\" [enter]).\n\ - What would you like to do?" - ); + srand(time(NULL)); return 0; } @@ -54,7 +84,9 @@ builtin_jail(int argc, char **argv){ int builtin_nethack(int argc, char **argv){ + static char *nethack_name = NETHACK_NAME; char *a[2]; + if(fork() == 0){ a[0] = nethack_name; a[1] = NULL;