Mercurial > bcc
changeset 20:9c10473a0e66
misc: remove getopt for more portability
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 04 Oct 2022 13:58:18 +0200 |
parents | 24c861aebd99 |
children | 0f94fc026b69 |
files | CHANGES.md INSTALL.md arg.h bcc.c |
diffstat | 4 files changed, 86 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGES.md Thu Sep 15 10:55:19 2022 +0200 +++ b/CHANGES.md Tue Oct 04 13:58:18 2022 +0200 @@ -5,6 +5,7 @@ -------------------- - Add `pledge` support on OpenBSD. +- Remove `getopt()` usage for non POSIX support. bcc 2.0.0 2021-04-13 --------------------
--- a/INSTALL.md Thu Sep 15 10:55:19 2022 +0200 +++ b/INSTALL.md Tue Oct 04 13:58:18 2022 +0200 @@ -7,15 +7,21 @@ ------------ - C99, a C99 compiler (GCC, Clang), -- Standard make, -- Some POSIX functionalities (getopt). +- Standard make. Basic installation ------------------ Quick install. - $ bsdtar -xvf bcc-x.y.z.tar.xz + $ bsdtar -xf bcc-x.y.z.tar.xz $ cd bcc-x.y.z $ make # sudo make install + +Embedding bcc +------------- + +You can easily embed `bcc` directly into your project as long as you use a host +C compiler in case of cross-compilation. To do that, simply carry out the two +files `bcc.c` and `arg.h` into your project.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/arg.h Tue Oct 04 13:58:18 2022 +0200 @@ -0,0 +1,49 @@ +/* + * Copy me if you can. + * by 20h + */ + +#ifndef ARG_H__ +#define ARG_H__ + +extern char *argv0; + +/* use main(int argc, char *argv[]) */ +#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ + argv[0] && argv[0][0] == '-'\ + && argv[0][1];\ + argc--, argv++) {\ + char argc_;\ + char **argv_;\ + int brk_;\ + if (argv[0][1] == '-' && argv[0][2] == '\0') {\ + argv++;\ + argc--;\ + break;\ + }\ + for (brk_ = 0, argv[0]++, argv_ = argv;\ + argv[0][0] && !brk_;\ + argv[0]++) {\ + if (argv_ != argv)\ + break;\ + argc_ = argv[0][0];\ + switch (argc_) + +#define ARGEND }\ + } + +#define ARGC() argc_ + +#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ + ((x), abort(), (char *)0) :\ + (brk_ = 1, (argv[0][1] != '\0')?\ + (&argv[0][1]) :\ + (argc--, argv++, argv[0]))) + +#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ + (char *)0 :\ + (brk_ = 1, (argv[0][1] != '\0')?\ + (&argv[0][1]) :\ + (argc--, argv++, argv[0]))) + +#endif
--- a/bcc.c Thu Sep 15 10:55:19 2022 +0200 +++ b/bcc.c Tue Oct 04 13:58:18 2022 +0200 @@ -21,7 +21,10 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> + +#include "arg.h" + +char *argv0; static const char *charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; static char findentchar = '\t'; @@ -125,7 +128,7 @@ } int -main(int argc, char **argv) +main(int argc, char *argv[]) { int ch; @@ -134,32 +137,28 @@ die("abort: %s\n", strerror(errno)); #endif - while ((ch = getopt(argc, argv, "0cI:i:s")) != -1) { - switch (ch) { - case '0': - fnull = 1; - break; - case 'c': - fconst = 1; - break; - case 'I': - findentchar = '\t'; - findent = atoi(optarg); - break; - case 'i': - findentchar = ' '; - findent = atoi(optarg); - break; - case 's': - fstatic = 1; - break; - default: - break; - } - } - - argc -= optind; - argv += optind; + ARGBEGIN { + case '0': + fnull = 1; + break; + case 'c': + fconst = 1; + break; + case 'I': + findentchar = '\t'; + findent = atoi(EARGF(usage())); + break; + case 'i': + findentchar = ' '; + findent = atoi(EARGF(usage())); + break; + case 's': + fstatic = 1; + break; + default: + usage(); + break; + } ARGEND if (argc < 2) usage();