]> Trent Huber's Code - thus.git/commitdiff
Refactor arrays and pointers
authorTrent Huber <trentmhuber@gmail.com>
Sat, 27 Sep 2025 00:15:45 +0000 (20:15 -0400)
committerTrent Huber <trentmhuber@gmail.com>
Sat, 27 Sep 2025 00:15:45 +0000 (20:15 -0400)
src/build.c
src/builtins/alias.c
src/builtins/build.c
src/builtins/cd.c
src/builtins/pwd.c
src/context.c
src/input.c
src/options.c
src/parse.c
src/utils.c

index 177e59cc2b7c2a193846dc7d6414ddda923d1221..91ca5efd08bcdd63c3960ca4535d81735e963c72 100644 (file)
@@ -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;
index e798f772f174ce45a6ba9545d2785fbce7df28cb..4bc3f49ea5872a78367dfa9f3bce39ffc5b260f7 100644 (file)
@@ -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;
 }
index 24eae10a5b25f6b242b36c5efbe60a3f94433e16..a032421cf54f1e69d8ef427e8f336f284d044301 100644 (file)
@@ -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 <stddef.h>\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;
 }
index 023c9db101cf2f9ff42f16862fc4f37771b274cb..0d4d856b9e8dcf2bdd0438bc38332f54976059e3 100644 (file)
@@ -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]");
index d16c3f7acd5a310ec4bacfb38a6bd8558678594f..bbde98d928e764bd1d712108d5dea49d527f54c3 100644 (file)
@@ -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;
        }
index a3f76555de6493dde849553bc105a0b29de9460c..323527b32cc0b13158d9b431fdf564a940aa248a 100644 (file)
@@ -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;
index 8cf72655735a23f7981c08ad50770662f8a2cc83..5160b6f896c0569f4f7776db6135446830ed24b4 100644 (file)
@@ -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;
 }
index 611d91685483dc873a5e1af00e8abad8c84e571e..3276d7dcac45c2dd347a9d21a480c4070c02b213 100644 (file)
@@ -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);
index bda7ae19b5ee26fed8a1bfbef736935a5b58b906..ac78b00249ad410274e8e466f1841b612325c83c 100644 (file)
@@ -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) {
index 1cdf06850146de81b0e06c7518a7d708f242a42d..55d350279423c07df953a58ba825da1c0df864c3 100644 (file)
@@ -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);