logo

utils-std

Collection of commonly available Unix tools
commit: 1aeeadeaa0405eaaeccdd4e2a897d2334adc1672
parent e5d7e7e39bd832c9ef2303b491443807db984548
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Sun, 21 Apr 2024 14:03:10 +0200

Formatting

Diffstat:

Mcmd/chmod.c4+++-
Mcmd/realpath.c2+-
Mcmd/test.c277++++++++++++++++++++++++++++++++++++-------------------------------------------
Mcmd/uname.c30+++++++++++++++++-------------
4 files changed, 147 insertions(+), 166 deletions(-)

diff --git a/cmd/chmod.c b/cmd/chmod.c @@ -165,8 +165,8 @@ int main(int argc, char *argv[]) { bool opt_R = false; - int c = -1; + int c = -1; while((c = getopt(argc, argv, ":cRv")) != -1) { switch(c) @@ -224,4 +224,6 @@ getopt_out: int ret = do_fchmodat(AT_FDCWD, argv[0], argv[i], argv[i], opt_R); if(ret != 0) return ret; } + + return 0; } diff --git a/cmd/realpath.c b/cmd/realpath.c @@ -22,9 +22,9 @@ usage() int main(int argc, char *argv[]) { - int c = -1; bool must_exists = false; + int c = -1; while((c = getopt(argc, argv, ":Ee")) != -1) { switch(c) diff --git a/cmd/test.c b/cmd/test.c @@ -12,20 +12,18 @@ * This program is in the Public Domain. */ -#include <sys/types.h> -#include <sys/stat.h> - #include <ctype.h> #include <err.h> #include <errno.h> #include <inttypes.h> +#include <locale.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <sys/stat.h> +#include <sys/types.h> #include <unistd.h> -#include <locale.h> - static void error(const char *msg, ...) { @@ -53,15 +51,17 @@ error(const char *msg, ...) operand ::= <any legal UNIX file name> */ -enum token_types { - UNOP = 0x100, - BINOP = 0x200, - BUNOP = 0x300, +enum token_types +{ + UNOP = 0x100, + BINOP = 0x200, + BUNOP = 0x300, BBINOP = 0x400, - PAREN = 0x500 + PAREN = 0x500 }; -enum token { +enum token +{ EOI, OPERAND, FILRD = UNOP + 1, @@ -106,10 +106,13 @@ enum token { #define TOKEN_TYPE(token) ((token) & 0xff00) -static const struct t_op { +static const struct t_op +{ char op_text[2]; short op_num; -} ops1[] = { +} ops1[] = + { + // clang-format off {"=", STREQ}, {"<", STRLT}, {">", STRGT}, @@ -153,64 +156,65 @@ static const struct t_op { {"nt", FILNT}, {"ot", FILOT}, {"ef", FILEQ}, + // clang-format on }; static int nargc; static char **t_wp; static int parenlevel; -static int aexpr(enum token); -static int binop(enum token); -static int equalf(const char *, const char *); -static int filstat(char *, enum token); -static int getn(const char *); -static intmax_t getq(const char *); -static int intcmp(const char *, const char *); -static int isunopoperand(void); -static int islparenoperand(void); -static int isrparenoperand(void); -static int newerf(const char *, const char *); -static int nexpr(enum token); -static int oexpr(enum token); -static int olderf(const char *, const char *); -static int primary(enum token); -static void syntax(const char *, const char *); -static enum token t_lex(char *); +static int aexpr(enum token); +static int binop(enum token); +static int equalf(const char *, const char *); +static int filstat(char *, enum token); +static int getn(const char *); +static intmax_t getq(const char *); +static int intcmp(const char *, const char *); +static int isunopoperand(void); +static int islparenoperand(void); +static int isrparenoperand(void); +static int newerf(const char *, const char *); +static int nexpr(enum token); +static int oexpr(enum token); +static int olderf(const char *, const char *); +static int primary(enum token); +static void syntax(const char *, const char *); +static enum token t_lex(char *); int main(int argc, char **argv) { - int res; - char *p; + int res; + char *p; - if ((p = strrchr(argv[0], '/')) == NULL) + if((p = strrchr(argv[0], '/')) == NULL) p = argv[0]; else p++; - if (strcmp(p, "[") == 0) { - if (strcmp(argv[--argc], "]") != 0) - error("missing ]"); + if(strcmp(p, "[") == 0) + { + if(strcmp(argv[--argc], "]") != 0) error("missing ]"); argv[argc] = NULL; } /* no expression => false */ - if (--argc <= 0) - return 1; + if(--argc <= 0) return 1; (void)setlocale(LC_CTYPE, ""); - nargc = argc; - t_wp = &argv[1]; + nargc = argc; + t_wp = &argv[1]; parenlevel = 0; - if (nargc == 4 && strcmp(*t_wp, "!") == 0) { + if(nargc == 4 && strcmp(*t_wp, "!") == 0) + { /* Things like ! "" -o x do not fit in the normal grammar. */ --nargc; ++t_wp; res = oexpr(t_lex(*t_wp)); - } else + } + else res = !oexpr(t_lex(*t_wp)); - if (--nargc > 0) - syntax(*t_wp, "unexpected operator"); + if(--nargc > 0) syntax(*t_wp, "unexpected operator"); return res; } @@ -219,7 +223,7 @@ static void syntax(const char *op, const char *msg) { - if (op && *op) + if(op && *op) error("%s: %s", op, msg); else error("%s", msg); @@ -231,9 +235,8 @@ oexpr(enum token n) int res; res = aexpr(n); - if (t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL) == BOR) - return oexpr(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)) || - res; + if(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL) == BOR) + return oexpr(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)) || res; t_wp--; nargc++; return res; @@ -245,9 +248,8 @@ aexpr(enum token n) int res; res = nexpr(n); - if (t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL) == BAND) - return aexpr(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)) && - res; + if(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL) == BAND) + return aexpr(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)) && res; t_wp--; nargc++; return res; @@ -256,8 +258,7 @@ aexpr(enum token n) static int nexpr(enum token n) { - if (n == UNOT) - return !nexpr(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)); + if(n == UNOT) return !nexpr(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)); return primary(n); } @@ -267,26 +268,27 @@ primary(enum token n) enum token nn; int res; - if (n == EOI) - return 0; /* missing expression */ - if (n == LPAREN) { + if(n == EOI) return 0; /* missing expression */ + if(n == LPAREN) + { parenlevel++; - if ((nn = t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)) == - RPAREN) { + if((nn = t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL)) == RPAREN) + { parenlevel--; - return 0; /* missing expression */ + return 0; /* missing expression */ } res = oexpr(nn); - if (t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL) != RPAREN) + if(t_lex(nargc > 0 ? (--nargc, *++t_wp) : NULL) != RPAREN) syntax(NULL, "closing paren expected"); parenlevel--; return res; } - if (TOKEN_TYPE(n) == UNOP) { + if(TOKEN_TYPE(n) == UNOP) + { /* unary expression */ - if (--nargc == 0) - syntax(NULL, "argument expected"); /* impossible */ - switch (n) { + if(--nargc == 0) syntax(NULL, "argument expected"); /* impossible */ + switch(n) + { case STREZ: return strlen(*++t_wp) == 0; case STRNZ: @@ -299,8 +301,7 @@ primary(enum token n) } nn = t_lex(nargc > 0 ? t_wp[1] : NULL); - if (TOKEN_TYPE(nn) == BINOP) - return binop(nn); + if(TOKEN_TYPE(nn) == BINOP) return binop(nn); return strlen(*t_wp) > 0; } @@ -311,12 +312,12 @@ binop(enum token n) const char *opnd1, *op, *opnd2; opnd1 = *t_wp; - op = nargc > 0 ? (--nargc, *++t_wp) : NULL; + op = nargc > 0 ? (--nargc, *++t_wp) : NULL; - if ((opnd2 = nargc > 0 ? (--nargc, *++t_wp) : NULL) == NULL) - syntax(op, "argument expected"); + if((opnd2 = nargc > 0 ? (--nargc, *++t_wp) : NULL) == NULL) syntax(op, "argument expected"); - switch (n) { + switch(n) + { case STREQ: return strcmp(opnd1, opnd2) == 0; case STRNE: @@ -338,11 +339,11 @@ binop(enum token n) case INTLT: return intcmp(opnd1, opnd2) < 0; case FILNT: - return newerf (opnd1, opnd2); + return newerf(opnd1, opnd2); case FILOT: - return olderf (opnd1, opnd2); + return olderf(opnd1, opnd2); case FILEQ: - return equalf (opnd1, opnd2); + return equalf(opnd1, opnd2); default: abort(); /* NOTREACHED */ @@ -354,10 +355,10 @@ filstat(char *nm, enum token mode) { struct stat s; - if (mode == FILSYM ? lstat(nm, &s) : stat(nm, &s)) - return 0; + if(mode == FILSYM ? lstat(nm, &s) : stat(nm, &s)) return 0; - switch (mode) { + switch(mode) + { case FILRD: return (access(nm, R_OK) == 0); case FILWR: @@ -403,9 +404,9 @@ find_op_1char(const struct t_op *op, const struct t_op *end, const char *s) char c; c = s[0]; - while (op != end) { - if (c == *op->op_text) - return op->op_num; + while(op != end) + { + if(c == *op->op_text) return op->op_num; op++; } return OPERAND; @@ -414,9 +415,9 @@ find_op_1char(const struct t_op *op, const struct t_op *end, const char *s) static int find_op_2char(const struct t_op *op, const struct t_op *end, const char *s) { - while (op != end) { - if (s[0] == op->op_text[0] && s[1] == op->op_text[1]) - return op->op_num; + while(op != end) + { + if(s[0] == op->op_text[0] && s[1] == op->op_text[1]) return op->op_num; op++; } return OPERAND; @@ -425,16 +426,15 @@ find_op_2char(const struct t_op *op, const struct t_op *end, const char *s) static int find_op(const char *s) { - if (s[0] == '\0') + if(s[0] == '\0') return OPERAND; - else if (s[1] == '\0') + else if(s[1] == '\0') return find_op_1char(ops1, (&ops1)[1], s); - else if (s[2] == '\0') - return s[0] == '-' ? find_op_1char(opsm1, (&opsm1)[1], s + 1) : - find_op_2char(ops2, (&ops2)[1], s); - else if (s[3] == '\0') - return s[0] == '-' ? find_op_2char(opsm2, (&opsm2)[1], s + 1) : - OPERAND; + else if(s[2] == '\0') + return s[0] == '-' ? find_op_1char(opsm1, (&opsm1)[1], s + 1) + : find_op_2char(ops2, (&ops2)[1], s); + else if(s[3] == '\0') + return s[0] == '-' ? find_op_2char(opsm2, (&opsm2)[1], s + 1) : OPERAND; else return OPERAND; } @@ -444,14 +444,13 @@ t_lex(char *s) { int num; - if (s == NULL) { + if(s == NULL) + { return EOI; } num = find_op(s); - if (((TOKEN_TYPE(num) == UNOP || TOKEN_TYPE(num) == BUNOP) - && isunopoperand()) || - (num == LPAREN && islparenoperand()) || - (num == RPAREN && isrparenoperand())) + if(((TOKEN_TYPE(num) == UNOP || TOKEN_TYPE(num) == BUNOP) && isunopoperand()) || + (num == LPAREN && islparenoperand()) || (num == RPAREN && isrparenoperand())) return OPERAND; return num; } @@ -463,15 +462,12 @@ isunopoperand(void) char *t; int num; - if (nargc == 1) - return 1; + if(nargc == 1) return 1; s = *(t_wp + 1); - if (nargc == 2) - return parenlevel == 1 && strcmp(s, ")") == 0; - t = *(t_wp + 2); + if(nargc == 2) return parenlevel == 1 && strcmp(s, ")") == 0; + t = *(t_wp + 2); num = find_op(s); - return TOKEN_TYPE(num) == BINOP && - (parenlevel == 0 || t[0] != ')' || t[1] != '\0'); + return TOKEN_TYPE(num) == BINOP && (parenlevel == 0 || t[0] != ')' || t[1] != '\0'); } static int @@ -480,13 +476,10 @@ islparenoperand(void) char *s; int num; - if (nargc == 1) - return 1; + if(nargc == 1) return 1; s = *(t_wp + 1); - if (nargc == 2) - return parenlevel == 1 && strcmp(s, ")") == 0; - if (nargc != 3) - return 0; + if(nargc == 2) return parenlevel == 1 && strcmp(s, ")") == 0; + if(nargc != 3) return 0; num = find_op(s); return TOKEN_TYPE(num) == BINOP; } @@ -496,11 +489,9 @@ isrparenoperand(void) { char *s; - if (nargc == 1) - return 0; + if(nargc == 1) return 0; s = *(t_wp + 1); - if (nargc == 2) - return parenlevel == 1 && strcmp(s, ")") == 0; + if(nargc == 2) return parenlevel == 1 && strcmp(s, ")") == 0; return 0; } @@ -512,22 +503,18 @@ getn(const char *s) long r; errno = 0; - r = strtol(s, &p, 10); + r = strtol(s, &p, 10); - if (s == p) - error("%s: bad number", s); + if(s == p) error("%s: bad number", s); - if (errno != 0) - error((errno == EINVAL) ? "%s: bad number" : - "%s: out of range", s); + if(errno != 0) error((errno == EINVAL) ? "%s: bad number" : "%s: out of range", s); - while (isspace((unsigned char)*p)) + while(isspace((unsigned char)*p)) p++; - if (*p) - error("%s: bad number", s); + if(*p) error("%s: bad number", s); - return (int) r; + return (int)r; } /* atoi with error detection and 64 bit range */ @@ -538,71 +525,59 @@ getq(const char *s) intmax_t r; errno = 0; - r = strtoimax(s, &p, 10); + r = strtoimax(s, &p, 10); - if (s == p) - error("%s: bad number", s); + if(s == p) error("%s: bad number", s); - if (errno != 0) - error((errno == EINVAL) ? "%s: bad number" : - "%s: out of range", s); + if(errno != 0) error((errno == EINVAL) ? "%s: bad number" : "%s: out of range", s); - while (isspace((unsigned char)*p)) + while(isspace((unsigned char)*p)) p++; - if (*p) - error("%s: bad number", s); + if(*p) error("%s: bad number", s); return r; } static int -intcmp (const char *s1, const char *s2) +intcmp(const char *s1, const char *s2) { intmax_t q1, q2; - q1 = getq(s1); q2 = getq(s2); - if (q1 > q2) - return 1; + if(q1 > q2) return 1; - if (q1 < q2) - return -1; + if(q1 < q2) return -1; return 0; } static int -newerf (const char *f1, const char *f2) +newerf(const char *f1, const char *f2) { struct stat b1, b2; - if (stat(f1, &b1) != 0 || stat(f2, &b2) != 0) - return 0; + if(stat(f1, &b1) != 0 || stat(f2, &b2) != 0) return 0; - if (b1.st_mtim.tv_sec > b2.st_mtim.tv_sec) - return 1; - if (b1.st_mtim.tv_sec < b2.st_mtim.tv_sec) - return 0; + if(b1.st_mtim.tv_sec > b2.st_mtim.tv_sec) return 1; + if(b1.st_mtim.tv_sec < b2.st_mtim.tv_sec) return 0; - return (b1.st_mtim.tv_nsec > b2.st_mtim.tv_nsec); + return (b1.st_mtim.tv_nsec > b2.st_mtim.tv_nsec); } static int -olderf (const char *f1, const char *f2) +olderf(const char *f1, const char *f2) { return (newerf(f2, f1)); } static int -equalf (const char *f1, const char *f2) +equalf(const char *f1, const char *f2) { struct stat b1, b2; - return (stat (f1, &b1) == 0 && - stat (f2, &b2) == 0 && - b1.st_dev == b2.st_dev && - b1.st_ino == b2.st_ino); + return (stat(f1, &b1) == 0 && stat(f2, &b2) == 0 && b1.st_dev == b2.st_dev && + b1.st_ino == b2.st_ino); } diff --git a/cmd/uname.c b/cmd/uname.c @@ -3,31 +3,34 @@ // SPDX-License-Identifier: MPL-2.0 #define _POSIX_C_SOURCE 200809L +#include "../lib/bitmasks.h" + #include <errno.h> -#include <string.h> // strerror #include <stdio.h> // printf #include <stdlib.h> // exit, abort +#include <string.h> // strerror #include <sys/utsname.h> // uname -#include <unistd.h> // getopt - -#include "../lib/bitmasks.h" +#include <unistd.h> // getopt -enum uname_names { - CMD_UNAME_SYSNAME = 1 << 1, +enum uname_names +{ + CMD_UNAME_SYSNAME = 1 << 1, CMD_UNAME_NODENAME = 1 << 2, - CMD_UNAME_RELEASE = 1 << 3, - CMD_UNAME_VERSION = 1 << 4, - CMD_UNAME_MACHINE = 1 << 5, - CMD_UNAME_ALL = CMD_UNAME_SYSNAME | CMD_UNAME_NODENAME | CMD_UNAME_RELEASE | CMD_UNAME_VERSION | CMD_UNAME_MACHINE, + CMD_UNAME_RELEASE = 1 << 3, + CMD_UNAME_VERSION = 1 << 4, + CMD_UNAME_MACHINE = 1 << 5, + CMD_UNAME_ALL = CMD_UNAME_SYSNAME | CMD_UNAME_NODENAME | CMD_UNAME_RELEASE | CMD_UNAME_VERSION | + CMD_UNAME_MACHINE, }; -const char *fmt = "%s"; +const char *fmt = "%s"; enum uname_names names = 0; static void maybe_print_name(enum uname_names key, char *value) { - if(FIELD_MATCH(names, key)) { + if(FIELD_MATCH(names, key)) + { if(printf(fmt, value) < 0) { fprintf(stderr, "uname: Write Error: %s", strerror(errno)); @@ -86,7 +89,8 @@ main(int argc, char *argv[]) struct utsname name; if(uname(&name) != 0) { - fprintf(stderr, "uname: Failed getting current system names via uname(): %s\n", strerror(errno)); + fprintf( + stderr, "uname: Failed getting current system names via uname(): %s\n", strerror(errno)); return 1; }