From: Trent Huber Date: Sat, 27 Sep 2025 00:15:45 +0000 (-0400) Subject: Refactor arrays and pointers X-Git-Url: https://trenthuber.com/code?a=commitdiff_plain;h=4262ea5f77c5a719e9c9a250f7dd2e2282027395;p=thus.git Refactor arrays and pointers --- diff --git a/src/build.c b/src/build.c index 177e59c..91ca5ef 100644 --- a/src/build.c +++ b/src/build.c @@ -13,7 +13,6 @@ int main(void) { for (src = LIST(SRC1); *src; ++src) compile(*src); cflags = LIST("-Ibuiltins/"); for (src = LIST(SRC2); *src; ++src) compile(*src); - load('x', "../bin/thus", LIST(SRC1, SRC2, "builtins.a")); return EXIT_SUCCESS; diff --git a/src/builtins/alias.c b/src/builtins/alias.c index e798f77..4bc3f49 100644 --- a/src/builtins/alias.c +++ b/src/builtins/alias.c @@ -41,7 +41,7 @@ char **getalias(char *token) { context.b = context.buffer; if (!parse(&context)) return NULL; - if (!context.t) *context.tokens = NULL; + if (!context.t) context.tokens[0] = NULL; return context.tokens; } diff --git a/src/builtins/build.c b/src/builtins/build.c index 24eae10..a032421 100644 --- a/src/builtins/build.c +++ b/src/builtins/build.c @@ -9,9 +9,9 @@ #define MAXBUILTINS 50 int main(void) { - int listfd, l; + int listfd, d; DIR *dir; - char *src[MAXBUILTINS + 2 + 1], **p; + char *srcs[MAXBUILTINS + 2 + 1], **src, *decl; struct dirent *entry; build("./"); @@ -24,31 +24,31 @@ int main(void) { dprintf(listfd, "#include \n\n#include \"builtin.h\"\n" "#include \"list.h\"\n\n"); - p = src; + src = srcs; errno = 0; while ((entry = readdir(dir))) { if (strcmp(entry->d_name, "build.c") == 0 - || !(*p = strrchr(entry->d_name, '.')) || strcmp(*p, ".c") != 0) + || !(*src = strrchr(entry->d_name, '.')) || strcmp(*src, ".c") != 0) continue; - if (!(*p = strdup(entry->d_name))) + if (!(*src = strdup(entry->d_name))) err(EXIT_FAILURE, "Unable to duplicate directory entry"); - (*p)[strlen(*p) - 2] = '\0'; - if (p - src == 2 + MAXBUILTINS + 1) + (*src)[strlen(*src) - 2] = '\0'; + if (src - srcs == 2 + MAXBUILTINS + 1) errx(EXIT_FAILURE, "Unable to add %s built-in, maximum reached (%d)", - *p, MAXBUILTINS); - if (strcmp(*p, "builtin") != 0 && strcmp(*p, "list") != 0) - dprintf(listfd, "extern BUILTIN(%s);\n", *p); - ++p; + *src, MAXBUILTINS); + if (strcmp(*src, "builtin") != 0 && strcmp(*src, "list") != 0) + dprintf(listfd, "BUILTIN(%s);\n", *src); + ++src; } if (errno) err(EXIT_FAILURE, "Unable to read from current directory"); + *src = NULL; - *p = "struct builtin builtins[] = {"; - l = (int)strlen(*p); - dprintf(listfd, "\n%s", *p); - *p = NULL; - for (p = src; *p; ++p) - if (strcmp(*p, "builtin") != 0 && strcmp(*p, "list") != 0) - dprintf(listfd, "{\"%s\", %s},\n%*s", *p, *p, l, ""); + decl = "struct builtin builtins[] = {"; + d = (int)strlen(decl); + dprintf(listfd, "\n%s", decl); + for (src = srcs; *src; ++src) + if (strcmp(*src, "builtin") != 0 && strcmp(*src, "list") != 0) + dprintf(listfd, "{\"%s\", %s},\n%*s", *src, *src, d, ""); dprintf(listfd, "{NULL}};\n"); if (closedir(dir) == -1) @@ -56,10 +56,10 @@ int main(void) { if (close(listfd) == -1) err(EXIT_FAILURE, "Unable to close `list.c'"); cflags = LIST("-I../"); - for (p = src; *p; ++p) compile(*p); - load('s', "../builtins", src); + for (src = srcs; *src; ++src) compile(*src); + load('s', "../builtins", srcs); - for (p = src; *p; ++p) free(*p); + for (src = srcs; *src; ++src) free(*src); return EXIT_SUCCESS; } diff --git a/src/builtins/cd.c b/src/builtins/cd.c index 023c9db..0d4d856 100644 --- a/src/builtins/cd.c +++ b/src/builtins/cd.c @@ -15,13 +15,13 @@ BUILTIN(cd) { path = home; break; case 2: - if (!realpath(argv[1], path = buffer)) { + if (!(path = realpath(argv[1], buffer))) { note(argv[1]); return EXIT_FAILURE; } - l = strlen(path); - path[l + 1] = '\0'; - path[l] = '/'; + l = strlen(buffer); + buffer[l + 1] = '\0'; + buffer[l] = '/'; break; default: return usage(argv[0], "[directory]"); diff --git a/src/builtins/pwd.c b/src/builtins/pwd.c index d16c3f7..bbde98d 100644 --- a/src/builtins/pwd.c +++ b/src/builtins/pwd.c @@ -18,12 +18,12 @@ BUILTIN(pwd) { note("Unable to get current working directory"); return EXIT_FAILURE; } - l = strlen(cwd); - if (cwd[l - 1] != '/') { - cwd[l] = '/'; - cwd[l + 1] = '\0'; + l = strlen(buffer); + if (buffer[l - 1] != '/') { + buffer[l] = '/'; + buffer[l + 1] = '\0'; } - if (setenv("PWD", cwd, 1) == -1) { + if (setenv("PWD", buffer, 1) == -1) { note("Unable to set $PWD$"); return EXIT_FAILURE; } diff --git a/src/context.c b/src/context.c index a3f7655..323527b 100644 --- a/src/context.c +++ b/src/context.c @@ -7,7 +7,7 @@ int clear(struct context *c) { c->b = NULL; c->t = NULL; c->r = NULL; - *c->current.name = *c->buffer = '\0'; + c->current.name[0] = c->buffer[0] = '\0'; c->current.term = SEMI; return 1; diff --git a/src/input.c b/src/input.c index 8cf7265..5160b6f 100644 --- a/src/input.c +++ b/src/input.c @@ -29,27 +29,28 @@ enum { }; int stringinput(struct context *c) { - char *start; + char *end; size_t l; - if (!*c->string) { + if (!c->string[0]) { if (c->script && munmap(c->map, c->maplen) == -1) note("Unable to unmap memory associated with `%s'", c->script); return 0; } - start = c->string; - while (*c->string && *c->string != '\n') ++c->string; - l = c->string - start; - if (*c->string == '\n') ++c->string; + end = c->string; + while (*end && *end != '\n') ++end; + l = end - c->string; + while (*end == '\n') ++end; // scriptinput() repeatedly uses stringinput() if (l > MAXCHARS) { note("Line too long, exceeds %d character limit", MAXCHARS); return 0; } - strncpy(c->buffer, start, l); + strncpy(c->buffer, c->string, l); c->buffer[l] = ';'; c->buffer[l + 1] = '\0'; + c->string = end; return 1; } diff --git a/src/options.c b/src/options.c index 611d916..3276d7d 100644 --- a/src/options.c +++ b/src/options.c @@ -18,7 +18,7 @@ void options(struct context *context) { " -l Run as a login shell"; opt = 0; - if (*arglist[0] == '-') { + if (arglist[0][0] == '-') { ++arglist[0]; login = 1; } @@ -32,7 +32,7 @@ void options(struct context *context) { interactive = 0; context->string = optarg; context->input = stringinput; - arglist[--optind] = ""; // Empty program name when running a string + arglist[--optind] = arglist[0]; break; case 'h': usage(arglist[0], message); diff --git a/src/parse.c b/src/parse.c index bda7ae1..ac78b00 100644 --- a/src/parse.c +++ b/src/parse.c @@ -150,7 +150,8 @@ int parse(struct context *c) { if (c->r->mode) { switch (*c->r->oldname) { case '&': - if ((l = strtol(++c->r->oldname, &stlend, 10)) < 0 || l > INT_MAX || *stlend) { + if ((l = strtol(++c->r->oldname, &stlend, 10)) < 0 || l > INT_MAX + || *stlend) { case '\0': note("Invalid syntax for file redirection"); return quit(c); @@ -162,7 +163,8 @@ int parse(struct context *c) { globbing = 0; *c->t = c->b; - } else if (!c->alias && c->t == c->tokens && (sub = getalias(*c->tokens)) || globbing) { + } else if (!c->alias && c->t == c->tokens && (sub = getalias(c->tokens[0])) + || globbing) { if (globbing) { globflags = GLOB_MARK; if (prevsublen) globflags |= GLOB_APPEND; @@ -187,7 +189,7 @@ int parse(struct context *c) { if (term != ' ') { if (c->t != c->tokens) { *c->t = NULL; - strcpy(c->current.name, *c->tokens); + strcpy(c->current.name, c->tokens[0]); } else c->t = NULL; if (c->r == c->redirects) c->r = NULL; switch (term) { diff --git a/src/utils.c b/src/utils.c index 1cdf068..55d3502 100644 --- a/src/utils.c +++ b/src/utils.c @@ -96,7 +96,7 @@ char *catpath(char *dir, char *filename, char *buffer) { note("Path name `%s%s%s' too long", dir, slash ? "/" : "", filename); return NULL; } - + strcpy(buffer, dir); if (!slash) strcat(buffer, "/"); strcat(buffer, filename);