diff --git a/carray/carray.c++ b/carray/carray.c++ index 45395574..e3c73ec6 100644 --- a/carray/carray.c++ +++ b/carray/carray.c++ @@ -27,10 +27,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) diff --git a/mkinitrd/initrdfs.cpp b/mkinitrd/initrdfs.cpp index 2e038f18..5af18983 100644 --- a/mkinitrd/initrdfs.cpp +++ b/mkinitrd/initrdfs.cpp @@ -238,25 +238,31 @@ bool PrintFile(int fd, initrd_superblock_t* sb, initrd_inode_t* inode) return true; } -void Usage(FILE* fp, const char* argv0) +static void compact_arguments(int* argc, char*** argv) { - fprintf(fp, "usage: %s [--check] (ls | cat) \n", argv0); + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +static void help(FILE* fp, const char* argv0) +{ + fprintf(fp, "Usage: %s [OPTION]... INITRD (ls | cat) PATH\n", argv0); fprintf(fp, "Accesses data in a Sortix kernel init ramdisk.\n"); } -void Help(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - Usage(fp, argv0); -} - -void Version(FILE* fp, const char* argv0) -{ - (void) argv0; - fprintf(fp, "initrdfs 0.2\n"); - fprintf(fp, "Copyright (C) 2012 Jonas 'Sortie' Termansen\n"); - fprintf(fp, "This is free software; see the source for copying conditions. There is NO\n"); - fprintf(fp, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); - fprintf(fp, "website: http://www.maxsi.org/software/sortix/\n"); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -264,50 +270,51 @@ int main(int argc, char* argv[]) bool all = false; bool check = false; const char* argv0 = argv[0]; - if ( argc < 2 ) { Usage(stdout, argv0); exit(0); } for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) { continue; } + if ( arg[0] != '-' || !arg[1] ) + continue; argv[i] = NULL; - if ( !strcmp(arg, "--") ) { break; } - if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - if ( !strcmp(arg, "--usage") ) { Usage(stdout, argv0); exit(0); } - if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } - if ( !strcmp(arg, "-a") ) { all = true; continue; } - if ( !strcmp(arg, "--check") ) { check = true; continue; } - fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Usage(stderr, argv0); - exit(1); - } - - const char* initrd = NULL; - const char* cmd = NULL; - const char* path = NULL; - int args = 0; - for ( int i = 1; i < argc; i++ ) - { - if ( !argv[i] ) { continue; } - switch ( ++args ) + if ( !strcmp(arg, "--") ) + break; + if ( arg[1] != '-' ) { - case 1: initrd = argv[i]; break; - case 2: cmd = argv[i]; break; - case 3: path = argv[i]; break; + while ( char c = *++arg ) switch ( c ) + { + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); + exit(1); + } + } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); + else if ( !strcmp(arg, "-a") ) + all = true; + else if ( !strcmp(arg, "--check") ) + check = true; + else + { + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); + exit(1); } } - const char* errmsg = NULL; - if ( !errmsg && !initrd ) { errmsg = "no initrd specified"; } - if ( !errmsg && !cmd ) { errmsg = "no command specified"; } - if ( !errmsg && !path ) { errmsg = "no path specified"; } - if ( !errmsg && 3 < args ) { errmsg = "too many arguments"; } + compact_arguments(&argc, &argv); - if ( errmsg ) - { - fprintf(stderr, "%s: %s\n", argv0, errmsg), - Usage(stderr, argv0); - exit(1); - } + if ( argc == 1 ) + error(1, 0, "No initrd specified"); + const char* initrd = argv[1]; + if ( argc == 2 ) + error(1, 0, "No command specified"); + const char* cmd = argv[2]; + if ( argc == 3 ) + error(1, 0, "No path specified"); + const char* path = argv[3]; int fd = open(initrd, O_RDONLY); if ( fd < 0 ) { error(1, errno, "open: %s", initrd); } diff --git a/tix/Makefile b/tix/Makefile index 5dcd91ea..0e06329a 100644 --- a/tix/Makefile +++ b/tix/Makefile @@ -4,10 +4,9 @@ include ../build-aux/version.mak include ../build-aux/dirs.mak OPTLEVEL?=$(DEFAULT_OPTLEVEL) -CPPFLAGS?= CXXFLAGS?=$(OPTLEVEL) -CPPFLAGS:=$(CPPFLAGS) +CPPFLAGS:=$(CPPFLAGS) -DVERSIONSTR=\"$(VERSION)\" CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra -fno-exceptions -fno-rtti BINARIES:=\ diff --git a/tix/porttix-create.cpp b/tix/porttix-create.cpp index 114bfa8c..feec20c3 100644 --- a/tix/porttix-create.cpp +++ b/tix/porttix-create.cpp @@ -55,17 +55,19 @@ int redirect(const char* path, int flags, mode_t mode = 0) return 0; } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... --tarball=TARBALL --normalized=NORMALIZED SOURCE-TIX\n", argv0); fprintf(fp, "Creates a port tix by generating patches using source code and tarballs.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - help(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } - int main(int argc, char* argv[]) { char* cp = strdup(getenv_def("CP", "cp")); @@ -82,7 +84,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -92,13 +94,15 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else if ( GET_OPTION_VARIABLE("--cp", &cp) ) { } else if ( GET_OPTION_VARIABLE("--diff", &diff) ) { } else if ( GET_OPTION_VARIABLE("--normalized", &input_normalized_path) ) { } @@ -110,7 +114,7 @@ int main(int argc, char* argv[]) else if ( GET_OPTION_VARIABLE("--tmp", &tmp) ) { } else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); help(stderr, argv0); exit(1); } @@ -122,7 +126,7 @@ int main(int argc, char* argv[]) exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( argc <= 1 ) { diff --git a/tix/srctix-create.cpp b/tix/srctix-create.cpp index c8b84d81..841eba17 100644 --- a/tix/srctix-create.cpp +++ b/tix/srctix-create.cpp @@ -45,15 +45,18 @@ #include "util.h" -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... PORT-TIX\n", argv0); fprintf(fp, "Converts an archived port tix into an archived source tix.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - help(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } bool is_file_name(const char* path) @@ -75,7 +78,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -85,13 +88,15 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else if ( GET_OPTION_VARIABLE("--output-directory", &output_directory) ) { } else if ( GET_OPTION_VARIABLE("--output", &output) ) { } else if ( GET_OPTION_VARIABLE("--patch", &patch) ) { } @@ -101,7 +106,7 @@ int main(int argc, char* argv[]) else if ( GET_OPTION_VARIABLE("--tmp", &tmp) ) { } else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); help(stderr, argv0); exit(1); } @@ -113,21 +118,13 @@ int main(int argc, char* argv[]) exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( argc <= 1 ) - { - fprintf(stderr, "%s: no archived port tix specified\n", argv0); - help(stderr, argv0); - exit(1); - } + error(1, 0, "No archived port tix specified"); if ( 3 <= argc ) - { - fprintf(stderr, "%s: unexpected extra operand `%s'\n", argv0, argv[2]); - help(stderr, argv0); - exit(1); - } + error(1, 0, "extra operand"); const char* porttix_path = argv[1]; diff --git a/tix/tix-build.cpp b/tix/tix-build.cpp index 055b93f3..19e87c89 100644 --- a/tix/tix-build.cpp +++ b/tix/tix-build.cpp @@ -800,20 +800,18 @@ void PurifyMakeflags() string_array_reset(&makeflags); } -void Usage(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... PACKAGE\n", argv0); fprintf(fp, "Compile a source tix into a tix suitable for installation.\n"); } -void Help(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - Usage(fp, argv0); -} - -void Version(FILE* fp, const char* argv0) -{ - Usage(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -839,7 +837,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -849,14 +847,15 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--usage") ) { Usage(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else if ( GET_OPTION_VARIABLE("--build", &minfo.build) ) { } else if ( GET_OPTION_VARIABLE("--destination", &minfo.destination) ) { } else if ( GET_OPTION_VARIABLE("--end", &end_step_string) ) { } @@ -872,8 +871,8 @@ int main(int argc, char* argv[]) else if ( GET_OPTION_VARIABLE("--tmp", &minfo.tmp) ) { } else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); exit(1); } } @@ -881,24 +880,22 @@ int main(int argc, char* argv[]) if ( !(minfo.start_step = step_of_step_name(start_step_string)) ) { fprintf(stderr, "%s: no such step `%s'\n", argv0, start_step_string); - Usage(stderr, argv0); exit(1); } if ( !(minfo.end_step = step_of_step_name(end_step_string)) ) { fprintf(stderr, "%s: no such step `%s'\n", argv0, end_step_string); - Usage(stderr, argv0); exit(1); } if ( argc == 1 ) { - Usage(stdout, argv0); + help(stdout, argv0); exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( minfo.prefix && !strcmp(minfo.prefix, "/") ) minfo.prefix[0] = '\0'; @@ -906,14 +903,12 @@ int main(int argc, char* argv[]) if ( argc < 2 ) { fprintf(stderr, "%s: no package specified\n", argv0); - Usage(stderr, argv0); exit(1); } if ( 2 < argc ) { fprintf(stderr, "%s: unexpected extra operand `%s'\n", argv0, argv[2]); - Usage(stderr, argv0); exit(1); } diff --git a/tix/tix-collection.cpp b/tix/tix-collection.cpp index 6fed80b6..0fa52b07 100644 --- a/tix/tix-collection.cpp +++ b/tix/tix-collection.cpp @@ -44,20 +44,18 @@ #include "util.h" -void Usage(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s PREFIX [OPTION]... COMMAND\n", argv0); fprintf(fp, "Administer and configure a tix collection.\n"); } -void Help(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - Usage(fp, argv0); -} - -void Version(FILE* fp, const char* argv0) -{ - Usage(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -81,7 +79,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -91,34 +89,37 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--usage") ) { Usage(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else if ( GET_OPTION_VARIABLE("--collection", &collection) ) { } else if ( GET_OPTION_VARIABLE("--platform", &platform) ) { } else if ( GET_OPTION_VARIABLE("--prefix", &prefix) ) { } - else if ( !strcmp(arg, "--enable-multiarch") ) { use_multiarch = true; } - else if ( !strcmp(arg, "--disable-multiarch") ) { use_multiarch = false; } + else if ( !strcmp(arg, "--enable-multiarch") ) + use_multiarch = true; + else if ( !strcmp(arg, "--disable-multiarch") ) + use_multiarch = false; else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); exit(1); } } if ( argc == 1 ) { - Usage(stdout, argv0); + help(stdout, argv0); exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); ParseOptionalCommandLineCollectionPrefix(&collection, &argc, &argv); VerifyCommandLineCollection(&collection); @@ -129,7 +130,6 @@ int main(int argc, char* argv[]) if ( argc == 1 ) { error(0, 0, "error: no command specified."); - Usage(stderr, argv0); exit(1); } @@ -189,7 +189,6 @@ int main(int argc, char* argv[]) else { fprintf(stderr, "%s: unknown command: `%s'\n", argv0, cmd); - Usage(stderr, argv0); exit(1); } diff --git a/tix/tix-execdiff.cpp b/tix/tix-execdiff.cpp index 41e122e9..9f6e5460 100644 --- a/tix/tix-execdiff.cpp +++ b/tix/tix-execdiff.cpp @@ -145,15 +145,18 @@ void execdiff(int tree_a, const char* tree_a_path, closedir(dir_b); } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... TREE-A TREE-B\n", argv0); fprintf(fp, "Reports which files have had the executable bit changed between two trees.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - help(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -162,7 +165,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -172,16 +175,18 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); help(stderr, argv0); exit(1); } @@ -193,21 +198,13 @@ int main(int argc, char* argv[]) exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( argc < 3 ) - { - fprintf(stderr, "%s: you need to specify two directories\n", argv0); - help(stderr, argv0); - exit(1); - } + error(1, 0, "You need to specify two directories"); if ( 3 < argc ) - { - fprintf(stderr, "%s: unexpected extra operand `%s'\n", argv0, argv[2]); - help(stderr, argv0); - exit(1); - } + error(1, 0, "extra operand"); const char* tree_a_path = argv[1]; int tree_a = open(tree_a_path, O_RDONLY | O_DIRECTORY); diff --git a/tix/tix-execpatch.cpp b/tix/tix-execpatch.cpp index dcffef3c..d8a1160b 100644 --- a/tix/tix-execpatch.cpp +++ b/tix/tix-execpatch.cpp @@ -173,15 +173,18 @@ bool execpatch(FILE* input, const char* input_path, bool check) return result; } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... [PATCH]\n", argv0); fprintf(fp, "Patches the executable bits of files in the current source directory.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - help(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -193,7 +196,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -204,31 +207,30 @@ int main(int argc, char* argv[]) { case 'c': check = true; break; default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--check") ) { check = true; } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--check") ) + check = true; else if ( GET_OPTION_VARIABLE("--directory", &directory) ) { } else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); help(stderr, argv0); exit(1); } } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( 2 < argc ) - { - fprintf(stderr, "%s: unexpected extra operand `%s'\n", argv0, argv[2]); - help(stderr, argv0); - exit(1); - } + error(1, 0, "extra operand"); const char* input_path = ""; FILE* input = stdin; diff --git a/tix/tix-install.cpp b/tix/tix-install.cpp index 82867ed0..918a388d 100644 --- a/tix/tix-install.cpp +++ b/tix/tix-install.cpp @@ -142,20 +142,18 @@ void MarkPackageAsInstalled(const char* tixdb_path, const char* package) free(installed_list_path); } -void Usage(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... --collection=PREFIX PACKAGE\n", argv0); fprintf(fp, "Install a tix into a tix collection.\n"); } -void Help(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - Usage(fp, argv0); -} - -void Version(FILE* fp, const char* argv0) -{ - Usage(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -169,7 +167,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -179,38 +177,39 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--usage") ) { Usage(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else if ( GET_OPTION_VARIABLE("--collection", &collection) ) { } else if ( GET_OPTION_VARIABLE("--prefix", &prefix) ) { } else if ( GET_OPTION_VARIABLE("--tar", &tar) ) { } - else if ( !strcmp(arg, "--reinstall") ) { reinstall = true; } + else if ( !strcmp(arg, "--reinstall") ) + reinstall = true; else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); exit(1); } } if ( argc == 1 ) { - Usage(stdout, argv0); + help(stdout, argv0); exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( argc <= 1 ) { fprintf(stderr, "%s: no package specified\n", argv0); - Usage(stderr, argv0); exit(1); } @@ -222,7 +221,6 @@ int main(int argc, char* argv[]) fprintf(stderr, "%s: no collection prefix specified, use --collection " "or TIX_COLLECTION to specify where the package will " "installed.\n", argv0); - Usage(stderr, argv0); exit(1); } diff --git a/tix/tix-rmpatch.cpp b/tix/tix-rmpatch.cpp index efc845c9..af5a8cae 100644 --- a/tix/tix-rmpatch.cpp +++ b/tix/tix-rmpatch.cpp @@ -166,15 +166,18 @@ bool rmpatch(FILE* input, const char* input_path, bool check) return result; } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... [PATCH]\n", argv0); fprintf(fp, "Removes files from the current source directory.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - help(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -186,7 +189,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -202,26 +205,25 @@ int main(int argc, char* argv[]) exit(1); } } - else if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--check") ) { check = true; } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--check") ) + check = true; else if ( GET_OPTION_VARIABLE("--directory", &directory) ) { } else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); help(stderr, argv0); exit(1); } } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); if ( 2 < argc ) - { - fprintf(stderr, "%s: unexpected extra operand `%s'\n", argv0, argv[2]); - help(stderr, argv0); - exit(1); - } + error(1, 0, "extra operand"); const char* input_path = ""; FILE* input = stdin; diff --git a/tix/tix.cpp b/tix/tix.cpp index ad0e8ab9..c50ee944 100644 --- a/tix/tix.cpp +++ b/tix/tix.cpp @@ -151,20 +151,18 @@ void InstallPackageOfName(params_t* params, const char* pkg_name) free(pkg_path); } -void Usage(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s PREFIX COMMAND [OPTION]...\n", argv0); fprintf(fp, "Front end to the Tix package management system.\n"); } -void Help(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { - Usage(fp, argv0); -} - -void Version(FILE* fp, const char* argv0) -{ - Usage(fp, argv0); + fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); + fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); + fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); + fprintf(fp, "There is NO WARRANTY, to the extent permitted by law.\n"); } int main(int argc, char* argv[]) @@ -178,7 +176,7 @@ int main(int argc, char* argv[]) for ( int i = 0; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) @@ -188,32 +186,33 @@ int main(int argc, char* argv[]) while ( char c = *++arg ) switch ( c ) { default: - fprintf(stderr, "%s: unknown option -- `%c'\n", argv0, c); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); exit(1); } } - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--usage") ) { Usage(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else if ( GET_OPTION_VARIABLE("--collection", ¶ms.collection) ) { } else if ( GET_OPTION_VARIABLE("--tar", ¶ms.tar) ) { } else if ( GET_OPTION_VARIABLE("--tix-install", ¶ms.tix_install) ) { } else { - fprintf(stderr, "%s: unknown option: `%s'\n", argv0, arg); - Usage(stderr, argv0); + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); exit(1); } } if ( argc == 1 ) { - Usage(stdout, argv0); + help(stdout, argv0); exit(0); } - CompactArguments(&argc, &argv); + compact_arguments(&argc, &argv); ParseOptionalCommandLineCollectionPrefix(¶ms.collection, &argc, &argv); VerifyCommandLineCollection(¶ms.collection); @@ -242,7 +241,6 @@ int main(int argc, char* argv[]) if ( argc == 1 ) { error(0, 0, "error: no command specified."); - Usage(stderr, argv0); exit(1); } @@ -252,7 +250,6 @@ int main(int argc, char* argv[]) if ( argc == 2 ) { error(0, 0, "expected list of packages to install after `install'"); - Usage(stderr, argv0); exit(1); } @@ -280,7 +277,6 @@ int main(int argc, char* argv[]) else { fprintf(stderr, "%s: unknown command: `%s'\n", argv0, cmd); - Usage(stderr, argv0); exit(1); } } diff --git a/tix/util.h b/tix/util.h index 6b4ea553..7e89c9c9 100644 --- a/tix/util.h +++ b/tix/util.h @@ -443,14 +443,16 @@ int mkdir_p(const char* path, mode_t mode) return 0; } -void CompactArguments(int* argc, char*** argv) +static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) - while ( i < *argc && !(*argv)[i] ) { - for ( int n = i; n < *argc; n++ ) - (*argv)[n] = (*argv)[n+1]; - (*argc)--; + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } } } @@ -708,7 +710,7 @@ void ParseOptionalCommandLineCollectionPrefix(char** collection, int* argcp, free(*collection); *collection = strdup((*argvp)[1]); (*argvp)[1] = NULL; - CompactArguments(argcp, argvp); + compact_arguments(argcp, argvp); } } @@ -1009,13 +1011,13 @@ retry_ask_recovery_method: selection = (int) strtol(input, &input_end, 0); if ( *input_end ) { - error(0, 0, "error: `%s' is not an allowed choice\n", input); + error(0, 0, "error: `%s' is not an allowed choice", input); goto retry_ask_recovery_method; } if ( 5 < selection ) { - error(0, 0, "error: `%i' is not an allowed choice\n", selection); + error(0, 0, "error: `%i' is not an allowed choice", selection); goto retry_ask_recovery_method; } } diff --git a/utils/cat.cpp b/utils/cat.cpp index dcd2e86e..1a02ab57 100644 --- a/utils/cat.cpp +++ b/utils/cat.cpp @@ -31,10 +31,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - static bool cat_fd(int fd, const char* path) { struct stat st; @@ -95,12 +91,14 @@ static bool cat_arguments(int argc, char* argv[]) static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) + { while ( i < *argc && !(*argv)[i] ) { for ( int n = i; n < *argc; n++ ) (*argv)[n] = (*argv)[n+1]; (*argc)--; } + } } static void help(FILE* fp, const char* argv0) diff --git a/utils/chvideomode.cpp b/utils/chvideomode.cpp index 6779af7b..4c0d36f2 100644 --- a/utils/chvideomode.cpp +++ b/utils/chvideomode.cpp @@ -39,10 +39,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - bool SetCurrentMode(struct dispmsg_crtc_mode mode) { struct dispmsg_set_crtc_mode msg; @@ -177,7 +173,7 @@ static void compact_arguments(int* argc, char*** argv) } } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION ...] [-- PROGRAM-TO-RUN [ARG ...]]\n", argv0); fprintf(fp, "Changes the video mode and optionally runs a program\n"); @@ -196,7 +192,7 @@ void help(FILE* fp, const char* argv0) fprintf(fp, " --height=NUM, --min-heigh= NUM, --max-height=NUM\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -297,8 +293,8 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) - break; + if ( arg[0] != '-' || !arg[1] ) + break; // Intentionally not continue. argv[i] = NULL; if ( !strcmp(arg, "--") ) break; diff --git a/utils/column.cpp b/utils/column.cpp index ec847f55..f991e80a 100644 --- a/utils/column.cpp +++ b/utils/column.cpp @@ -32,10 +32,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - struct line { const char* string; @@ -138,7 +134,7 @@ bool append_lines_from_file(FILE* fp, } } -void compact_arguments(int* argc, char*** argv) +static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) { @@ -151,7 +147,7 @@ void compact_arguments(int* argc, char*** argv) } } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... FILE...\n", argv0); fprintf(fp, "Columnate lists.\n"); @@ -162,7 +158,7 @@ void help(FILE* fp, const char* argv0) fprintf(fp, " --version output version information and exit\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -191,7 +187,7 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) diff --git a/utils/cp.cpp b/utils/cp.cpp index c7e6fbee..f1a50775 100644 --- a/utils/cp.cpp +++ b/utils/cp.cpp @@ -35,10 +35,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - const char* BaseName(const char* path) { size_t len = strlen(path); @@ -419,7 +415,7 @@ bool CopyAmbigious(int srcdirfd, const char* srcrel, const char* srcpath, flags, symbolic_dereference); } -void compact_arguments(int* argc, char*** argv) +static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) { @@ -432,7 +428,7 @@ void compact_arguments(int* argc, char*** argv) } } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... [-T] SOURCE DEST\n", argv0); fprintf(fp, " or: %s [OPTION]... SOURCE... DIRECTORY\n", argv0); @@ -444,7 +440,7 @@ void help(FILE* fp, const char* argv0) #endif } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -462,7 +458,7 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) diff --git a/utils/du.cpp b/utils/du.cpp index 9395f3df..888feb86 100644 --- a/utils/du.cpp +++ b/utils/du.cpp @@ -36,10 +36,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - const int FLAG_ALL = 1 << 0; const int FLAG_SUMMARIZE = 1 << 1; const int FLAG_SAME_DEVICE = 1 << 2; @@ -320,12 +316,14 @@ static void version(FILE* fp, const char* argv0) static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) + { while ( i < *argc && !(*argv)[i] ) { for ( int n = i; n < *argc; n++ ) (*argv)[n] = (*argv)[n+1]; (*argc)--; } + } } static diff --git a/utils/env.cpp b/utils/env.cpp index 75d44d1a..7b629df8 100644 --- a/utils/env.cpp +++ b/utils/env.cpp @@ -88,7 +88,7 @@ int main(int argc, char* argv[]) { const char* arg = argv[i]; if ( arg[0] != '-' ) - break; + break; // Intentionally not continue. if ( arg[0] == '-' && !arg[1] ) { ignore_environment = true; diff --git a/utils/kernelinfo.cpp b/utils/kernelinfo.cpp index 66f2811a..35a6e759 100644 --- a/utils/kernelinfo.cpp +++ b/utils/kernelinfo.cpp @@ -27,23 +27,18 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - -void help(const char* argv0) +static void help(FILE* fp, const char* argv0) { - printf("usage: %s ...\n", argv0); - printf("Prints a kernel information string.\n"); - printf("example: %s name\n", argv0); - printf("example: %s version\n", argv0); - printf("example: %s builddate\n", argv0); - printf("example: %s buildtime\n", argv0); + fprintf(fp, "Usage: %s [OPTION]... REQUEST...\n", argv0); + fprintf(fp, "Prints a kernel information string.\n"); + fprintf(fp, "example: %s name\n", argv0); + fprintf(fp, "example: %s version\n", argv0); + fprintf(fp, "example: %s builddate\n", argv0); + fprintf(fp, "example: %s buildtime\n", argv0); } -void version(const char* argv0) +static void version(FILE* fp, const char* argv0) { - FILE* fp = stdout; fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); @@ -53,14 +48,34 @@ void version(const char* argv0) int main(int argc, char* argv[]) { const char* argv0 = argv[0]; - if ( argc < 2 ) { help(argv0); return 0; } for ( int i = 1; i < argc; i++ ) { - if ( argv[i][0] != '-' ) { continue; } - if ( strcmp(argv[i], "--help") == 0 ) { help(argv0); return 0; } - if ( strcmp(argv[i], "--version") == 0 ) { version(argv0); return 0; } - fprintf(stderr, "%s: unknown option: %s\n", argv0, argv[i]); - return 1; + const char* arg = argv[i]; + if ( arg[0] != '-' || !arg[1] ) + continue; + argv[i] = NULL; + if ( !strcmp(arg, "--") ) + break; + if ( arg[1] != '-' ) + { + while ( char c = *++arg ) switch ( c ) + { + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); + exit(1); + } + } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); + else + { + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); + exit(1); + } } size_t bufsize = 32; char* buf = (char*) malloc(bufsize); diff --git a/utils/ln.cpp b/utils/ln.cpp index 49374bce..959b1462 100644 --- a/utils/ln.cpp +++ b/utils/ln.cpp @@ -28,17 +28,26 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} -void Help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... TARGET LINK_NAME\n", argv0); fprintf(fp, "Create a hard or symbolic link.\n"); } -void Version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -55,54 +64,46 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) break; if ( arg[1] != '-' ) - for ( size_t i = 1; arg[i]; i++ ) - switch ( arg[i] ) - { - case 'f': force = true; break; - case 's': symbolic = true; break; - case 'v': verbose = true; break; - default: - fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); - Help(stderr, argv0); - exit(1); - } + { + while ( char c = *++arg ) switch ( c ) + { + case 'f': force = true; break; + case 's': symbolic = true; break; + case 'v': verbose = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); + help(stderr, argv0); + exit(1); + } + } else if ( !strcmp(arg, "--force") ) force = true; else if ( !strcmp(arg, "--symbolic") ) symbolic = true; else if ( !strcmp(arg, "--verbose") ) verbose = true; - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Help(stderr, argv0); + help(stderr, argv0); exit(1); } } - for ( int i = 0; i < argc; i++ ) - while ( i < argc && !argv[i] ) - { - for ( int n = i; n < argc; n++ ) - argv[n] = argv[n+1]; - argc--; - } + compact_arguments(&argc, &argv); if ( argc != 3 ) - { - const char* what = argc < 3 ? "missing" : "extra"; - fprintf(stderr, "%s: %s operand\n", argv0, what); - Help(stderr, argv0); - exit(1); - } + error(1, 0, "%s operand", argc < 3 ? "missing" : "extra"); const char* oldname = argv[1]; const char* newname = argv[2]; diff --git a/utils/ls.cpp b/utils/ls.cpp index 5b54dd9b..77c2b3ee 100644 --- a/utils/ls.cpp +++ b/utils/ls.cpp @@ -40,10 +40,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - int current_year; bool option_colors = false; diff --git a/utils/mkdir.cpp b/utils/mkdir.cpp index 941f139b..95c0714f 100644 --- a/utils/mkdir.cpp +++ b/utils/mkdir.cpp @@ -30,10 +30,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - void CreateDirectory(const char* path, bool parents, bool verbose) { if ( mkdir(path, 0777) < 0 ) @@ -66,13 +62,26 @@ void CreateDirectory(const char* path, bool parents, bool verbose) fprintf(stderr, "%s: created directory `%s'\n", program_invocation_name, path); } -void Help(FILE* fp, const char* argv0) +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... DIRECTORY...\n", argv0); fprintf(fp, "Create directories if they don't already exist.\n"); } -void Version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -88,46 +97,43 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) break; if ( arg[1] != '-' ) - for ( size_t i = 1; arg[i]; i++ ) - switch ( arg[i] ) - { - case 'p': parents = true; break; - case 'v': verbose = true; break; - default: - fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); - Help(stderr, argv0); - exit(1); - } + { + while ( char c = *++arg ) switch ( c ) + { + case 'p': parents = true; break; + case 'v': verbose = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); + help(stderr, argv0); + exit(1); + } + } else if ( !strcmp(arg, "--parents") ) parents = true; else if ( !strcmp(arg, "--verbose") ) verbose = true; - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Help(stderr, argv0); + help(stderr, argv0); exit(1); } } - int num_args = 0; - for ( int i = 1; i < argc; i++ ) - if ( argv[i] ) - num_args++; + compact_arguments(&argc, &argv); - if ( !num_args ) - { - fprintf(stderr, "%s: missing operand\n", argv0); - exit(1); - } + if ( argc < 2 ) + error(1, 0, "missing operand"); for ( int i = 1; i < argc; i++ ) { diff --git a/utils/mv.cpp b/utils/mv.cpp index b5ec3895..a0988c6f 100644 --- a/utils/mv.cpp +++ b/utils/mv.cpp @@ -102,7 +102,7 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) diff --git a/utils/pager.cpp b/utils/pager.cpp index 9d767680..a8f02990 100644 --- a/utils/pager.cpp +++ b/utils/pager.cpp @@ -36,10 +36,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - struct display_entry { wchar_t c; @@ -323,7 +319,7 @@ void pager_push_path(struct pager* pager, const char* path) close(fd); } -void compact_arguments(int* argc, char*** argv) +static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) { @@ -336,13 +332,13 @@ void compact_arguments(int* argc, char*** argv) } } -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... [FILES]...\n", argv0); fprintf(fp, "Displays files one page at a time.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -358,7 +354,7 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) diff --git a/utils/pwd.cpp b/utils/pwd.cpp index 923152db..9cf24cab 100644 --- a/utils/pwd.cpp +++ b/utils/pwd.cpp @@ -27,10 +27,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - static bool nul_or_slash(char c) { return !c || c == '/'; diff --git a/utils/rm.cpp b/utils/rm.cpp index b62df25a..414a73f2 100644 --- a/utils/rm.cpp +++ b/utils/rm.cpp @@ -32,10 +32,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - // TODO: Wrong implementation of -f! It means ignore *nonexistent files*, not // ignore all errors! @@ -124,13 +120,26 @@ bool RemoveRecursively(int dirfd, const char* full, const char* rel, return ret; } -void Help(FILE* fp, const char* argv0) +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... FILE...\n", argv0); fprintf(fp, "Remove files by unlinking their directory entries.\n"); } -void Version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -147,57 +156,52 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) break; if ( arg[1] != '-' ) - for ( size_t i = 1; arg[i]; i++ ) - switch ( arg[i] ) - { - case 'f': force = true; break; - case 'r': recursive = true; break; - case 'R': recursive = true; break; - case 'v': verbose = true; break; - default: - fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); - Help(stderr, argv0); - exit(1); - } + { + while ( char c = *++arg ) switch ( c ) + { + case 'f': force = true; break; + case 'r': recursive = true; break; + case 'R': recursive = true; break; + case 'v': verbose = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); + help(stderr, argv0); + exit(1); + } + } else if ( !strcmp(arg, "--force") ) force = true; else if ( !strcmp(arg, "--recursive") ) recursive = true; else if ( !strcmp(arg, "--verbose") ) verbose = true; - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Help(stderr, argv0); + help(stderr, argv0); exit(1); } } - int num_args = 0; - for ( int i = 1; i < argc; i++ ) - if ( argv[i] ) - num_args++; + compact_arguments(&argc, &argv); - if ( !num_args && !force ) - { - fprintf(stderr, "%s: missing operand\n", argv0); - exit(1); - } + if ( argc < 2 && !force ) + error(1, 0, "missing operand"); int main_ret = 0; for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( !arg ) - continue; if ( unlink(arg) < 0 ) { if ( !recursive || errno != EISDIR ) diff --git a/utils/rmdir.cpp b/utils/rmdir.cpp index 8abecfac..16104708 100644 --- a/utils/rmdir.cpp +++ b/utils/rmdir.cpp @@ -30,17 +30,26 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} -void Help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]... DIRECTORY...\n", argv0); fprintf(fp, "Remove directories if they are empty.\n"); } -void Version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -57,54 +66,49 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) break; if ( arg[1] != '-' ) - for ( size_t i = 1; arg[i]; i++ ) - switch ( arg[i] ) - { - case 'p': parents = true; break; - case 'v': verbose = true; break; - default: - fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); - Help(stderr, argv0); - exit(1); - } + { + while ( char c = *++arg ) switch ( c ) + { + case 'p': parents = true; break; + case 'v': verbose = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); + help(stderr, argv0); + exit(1); + } + } else if ( !strcmp(arg, "--ignore-fail-on-non-empty") ) ignore_non_empty = true; else if ( !strcmp(arg, "--parents") ) parents = true; else if ( !strcmp(arg, "--verbose") ) verbose = true; - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Help(stderr, argv0); + help(stderr, argv0); exit(1); } } - int num_args = 0; - for ( int i = 1; i < argc; i++ ) - if ( argv[i] ) - num_args++; + compact_arguments(&argc, &argv); - if ( !num_args ) - { - fprintf(stderr, "%s: missing operand\n", argv0); - exit(1); - } + if ( argc < 2 ) + error(1, 0, "missing operand"); for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( !arg ) - continue; // TODO: Support --parents option. (void) parents; int ret = rmdir(arg); diff --git a/utils/tail.cpp b/utils/tail.cpp index 87a26318..3b964a87 100644 --- a/utils/tail.cpp +++ b/utils/tail.cpp @@ -29,10 +29,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - #ifdef HEAD #define TAIL false #else @@ -119,20 +115,26 @@ bool processfp(const char* inputname, FILE* fp) return true; } -void help(const char* argv0) +static void compact_arguments(int* argc, char*** argv) { - printf("usage: %s [-n ] [-q | -v] [ ...]\n", argv0); + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } } -void errusage(const char* argv0) +static void help(FILE* fp, const char* argv0) { - help(argv0); - exit(1); + fprintf(fp, "Usage: %s [OPTION]... [FILE]...\n", argv0); } -void version(const char* argv0) +static void version(FILE* fp, const char* argv0) { - FILE* fp = stdout; fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); fprintf(fp, "This is free software: you are free to change and redistribute it.\n"); @@ -141,54 +143,73 @@ void version(const char* argv0) int main(int argc, char* argv[]) { - const char* argv0 = argv[0]; + const char* nlinesstr = NULL; + const char* argv0 = argv[0]; for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) { continue; } + if ( arg[0] != '-' || !arg[1] ) + continue; argv[i] = NULL; - if ( strcmp(arg, "--") == 0 ) { break; } - const char* nlinesstr = NULL; - if ( strcmp(arg, "--help") == 0 ) { help(argv0); return 0; } - if ( strcmp(arg, "--version") == 0 ) { version(argv0); return 0; } - if ( strcmp(arg, "-q") == 0 || - strcmp(arg, "--quiet") == 0 || - strcmp(arg, "--silent") == 0 ) + if ( !strcmp(arg, "--") ) + break; + if ( isdigit((unsigned char) arg[1]) ) + nlinesstr = arg + 1; + else if ( arg[1] != '-' ) { - quiet = true; - verbose = false; - continue; - } - if ( strcmp(arg, "-v") == 0 || - strcmp(arg, "--verbose") == 0 ) - { - quiet = false; - verbose = true; - continue; - } - if ( strcmp(arg, "-n") == 0 ) { nlinesstr = argv[++i]; argv[i] = NULL; } - if ( isdigit(arg[1]) ) { nlinesstr = arg+1; } - if ( nlinesstr ) - { - char* nlinesstrend; - long nlines = strtol(nlinesstr, &nlinesstrend, 10); - if ( *nlinesstrend ) + while ( char c = *++arg ) switch ( c ) { - fprintf(stderr, "Bad number of lines: %s\n", nlinesstr); - errusage(argv0); + case 'n': + if ( !*(nlinesstr = arg + 1) ) + { + if ( i + 1 == argc ) + { + error(0, 0, "option requires an argument -- 'n'"); + fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); + exit(125); + } + nlinesstr = argv[i+1]; + argv[++i] = NULL; + } + arg = "n"; + break; + case 'q': quiet = true; verbose = false; break; + case 'v': quiet = false; verbose = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); + exit(1); } - numlines = nlines; - continue; } - fprintf(stderr, "%s: unrecognized option '%s'\n", argv0, arg); - errusage(argv0); + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--quiet") || !strcmp(arg, "--silent") ) + quiet = true, verbose = false; + else if ( !strcmp(arg, "--verbose") ) + quiet = false, verbose = true; + else + { + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); + exit(1); + } } - size_t numfiles = 0; - for ( int i = 1; i < argc; i++ ) { if ( argv[i] ) { numfiles++; } } + compact_arguments(&argc, &argv); - if ( !numfiles ) + if ( nlinesstr ) + { + char* nlinesstrend; + long nlines = strtol(nlinesstr, &nlinesstrend, 10); + if ( *nlinesstrend ) + error(1, 0, "Bad number of lines: %s", nlinesstr); + numlines = nlines; + } + + if ( argc < 2 ) { bool header = verbose; if ( header ) @@ -203,7 +224,6 @@ int main(int argc, char* argv[]) const char* prefix = ""; for ( int i = 1; i < argc; i++ ) { - if ( !argv[i] ) { continue; } bool isstdin = strcmp(argv[i], "-") == 0; FILE* fp = isstdin ? stdin : fopen(argv[i], "r"); if ( !fp ) @@ -212,7 +232,7 @@ int main(int argc, char* argv[]) result = 1; continue; } - bool header = !quiet && (verbose || 1 < numfiles); + bool header = !quiet && (verbose || 2 < argc); if ( header ) printf("%s==> %s <==\n", prefix, argv[i]); prefix = "\n"; diff --git a/utils/type.cpp b/utils/type.cpp index 274cd220..666619da 100644 --- a/utils/type.cpp +++ b/utils/type.cpp @@ -29,17 +29,13 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - -void help(FILE* fp, const char* argv0) +static void help(FILE* fp, const char* argv0) { - fprintf(fp, "usage: %s [--help | --version]\n", argv0); + fprintf(fp, "Usage: %s [OPTION]...\n", argv0); fprintf(fp, "Lets you type freely onto the tty.\n"); } -void version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -54,14 +50,31 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) { continue; } + if ( arg[0] != '-' || !arg[1] ) + continue; argv[i] = NULL; - if ( !strcmp(arg, "--") ) { break; } - if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } - if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } - error(0, 0, "unrecognized option: %s", arg); - help(stderr, argv0); - exit(1); + if ( !strcmp(arg, "--") ) + break; + if ( arg[1] != '-' ) + { + while ( char c = *++arg ) switch ( c ) + { + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + help(stderr, argv0); + exit(1); + } + } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); + else + { + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + help(stderr, argv0); + exit(1); + } } if ( !isatty(0) || !isatty(1) ) diff --git a/utils/uname.cpp b/utils/uname.cpp index 0c8e5666..0979caa6 100644 --- a/utils/uname.cpp +++ b/utils/uname.cpp @@ -30,18 +30,14 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - -const unsigned long PRINT_KERNELNAME = 1UL << 0UL; -const unsigned long PRINT_NODENAME = 1UL << 1UL; -const unsigned long PRINT_KERNELREL = 1UL << 2UL; -const unsigned long PRINT_KERNELVER = 1UL << 3UL; -const unsigned long PRINT_MACHINE = 1UL << 4UL; -const unsigned long PRINT_PROCESSOR = 1UL << 5UL; -const unsigned long PRINT_HWPLATFORM = 1UL << 6UL; -const unsigned long PRINT_OPSYS = 1UL << 7UL; +static const int PRINT_KERNELNAME = 1 << 0; +static const int PRINT_NODENAME = 1 << 1; +static const int PRINT_KERNELREL = 1 << 2; +static const int PRINT_KERNELVER = 1 << 3; +static const int PRINT_MACHINE = 1 << 5; +static const int PRINT_PROCESSOR = 1 << 6; +static const int PRINT_HWPLATFORM = 1 << 7; +static const int PRINT_OPSYS = 1 << 8; bool has_printed = false; @@ -53,13 +49,26 @@ void DoPrint(const char* msg) has_printed = true; } -void Help(FILE* fp, const char* argv0) +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [OPTION]...\n", argv0); fprintf(fp, "Print certain system information.\n"); } -void Version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -70,34 +79,34 @@ void Version(FILE* fp, const char* argv0) int main(int argc, char* argv[]) { const char* argv0 = argv[0]; - unsigned long flags = 0; + int flags = 0; for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) - { - fprintf(stderr, "%s: extra operand: %s\n", argv0, arg); - Help(stderr, argv0); - exit(1); - } + if ( arg[0] != '-' || !arg[1] ) + continue; + argv[i] = NULL; + if ( !strcmp(arg, "--") ) + break; if ( arg[1] != '-' ) - for ( size_t i = 1; arg[i]; i++ ) - switch ( arg[i] ) - { - case 'a': flags |= LONG_MAX; break; - case 's': flags |= PRINT_KERNELNAME; break; - case 'n': flags |= PRINT_NODENAME; break; - case 'r': flags |= PRINT_KERNELREL; break; - case 'v': flags |= PRINT_KERNELVER; break; - case 'm': flags |= PRINT_MACHINE; break; - case 'p': flags |= PRINT_PROCESSOR; break; - case 'i': flags |= PRINT_HWPLATFORM; break; - case 'o': flags |= PRINT_OPSYS; break; - default: - fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); - Help(stderr, argv0); - exit(1); - } + { + while ( char c = *++arg ) switch ( c ) + { + case 'a': flags |= LONG_MAX; break; + case 's': flags |= PRINT_KERNELNAME; break; + case 'n': flags |= PRINT_NODENAME; break; + case 'r': flags |= PRINT_KERNELREL; break; + case 'v': flags |= PRINT_KERNELVER; break; + case 'm': flags |= PRINT_MACHINE; break; + case 'p': flags |= PRINT_PROCESSOR; break; + case 'i': flags |= PRINT_HWPLATFORM; break; + case 'o': flags |= PRINT_OPSYS; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); + help(stderr, argv0); + exit(1); + } + } else if ( !strcmp(arg, "--kernel-name") ) flags |= PRINT_KERNELNAME; else if ( !strcmp(arg, "--nodename") ) @@ -114,16 +123,23 @@ int main(int argc, char* argv[]) flags |= PRINT_HWPLATFORM; else if ( !strcmp(arg, "--operating-system") ) flags |= PRINT_OPSYS; - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Help(stderr, argv0); + help(stderr, argv0); exit(1); } } + compact_arguments(&argc, &argv); + + if ( 1 < argc ) + error(1, 0, "extra operand"); + static struct utsname utsname; if ( uname(&utsname) < 0 ) error(1, errno, "uname"); diff --git a/utils/wc.cpp b/utils/wc.cpp index 0233c3be..838219e8 100644 --- a/utils/wc.cpp +++ b/utils/wc.cpp @@ -35,10 +35,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - const int FLAG_PRINT_NUM_BYTES = 1 << 0; const int FLAG_PRINT_NUM_CHARACTERS = 1 << 1; const int FLAG_PRINT_NUM_WORDS = 1 << 2; @@ -162,12 +158,14 @@ static void version(FILE* fp, const char* argv0) static void compact_arguments(int* argc, char*** argv) { for ( int i = 0; i < *argc; i++ ) + { while ( i < *argc && !(*argv)[i] ) { for ( int n = i; n < *argc; n++ ) (*argv)[n] = (*argv)[n+1]; (*argc)--; } + } } bool word_count_file(FILE* fp, const char* path, int flags, diff --git a/utils/which.cpp b/utils/which.cpp index 8eaab1ee..8035f176 100644 --- a/utils/which.cpp +++ b/utils/which.cpp @@ -31,10 +31,6 @@ #include #include -#if !defined(VERSIONSTR) -#define VERSIONSTR "unknown version" -#endif - // NOTE: The PATH-searching logic is repeated multiple places. Until this logic // can be shared somehow, you need to keep this comment in sync as well // as the logic in these files: @@ -123,13 +119,26 @@ bool Which(const char* filename, const char* path, bool all) return found; } -void Help(FILE* fp, const char* argv0) +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +static void help(FILE* fp, const char* argv0) { fprintf(fp, "Usage: %s [-a] FILENAME...\n", argv0); fprintf(fp, "Locate a program in the PATH.\n"); } -void Version(FILE* fp, const char* argv0) +static void version(FILE* fp, const char* argv0) { fprintf(fp, "%s (Sortix) %s\n", argv0, VERSIONSTR); fprintf(fp, "License GPLv3+: GNU GPL version 3 or later .\n"); @@ -144,41 +153,38 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( arg[0] != '-' ) + if ( arg[0] != '-' || !arg[1] ) continue; argv[i] = NULL; if ( !strcmp(arg, "--") ) break; if ( arg[1] != '-' ) - for ( size_t i = 1; arg[i]; i++ ) - switch ( arg[i] ) - { - case 'a': all = true; break; - default: - fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); - Help(stderr, argv0); - exit(1); - } - else if ( !strcmp(arg, "--help") ) { Help(stdout, argv0); exit(0); } - else if ( !strcmp(arg, "--version") ) { Version(stdout, argv0); exit(0); } + { + while ( char c = *++arg ) switch ( c ) + { + case 'a': all = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, arg[i]); + help(stderr, argv0); + exit(1); + } + } + else if ( !strcmp(arg, "--help") ) + help(stdout, argv0), exit(0); + else if ( !strcmp(arg, "--version") ) + version(stdout, argv0), exit(0); else { fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); - Help(stderr, argv0); + help(stderr, argv0); exit(1); } } - int num_args = 0; - for ( int i = 1; i < argc; i++ ) - if ( argv[i] ) - num_args++; + compact_arguments(&argc, &argv); - if ( !num_args ) - { - fprintf(stderr, "%s: missing operand\n", argv0); - exit(1); - } + if ( argc < 2 ) + error(1, 0, "missing operand"); const char* path = getenv("PATH"); @@ -186,8 +192,6 @@ int main(int argc, char* argv[]) for ( int i = 1; i < argc; i++ ) { const char* arg = argv[i]; - if ( !arg ) - continue; if ( !Which(arg, path, all) ) success = false; }