diff options
author | Joris Vink <joris@cvs.openbsd.org> | 2005-10-13 12:35:31 +0000 |
---|---|---|
committer | Joris Vink <joris@cvs.openbsd.org> | 2005-10-13 12:35:31 +0000 |
commit | 873596e3aa77600512af5a6b533a4a45e43d4cfa (patch) | |
tree | 0f15027ebb93690267bd66b03a3c1452fd25f747 /usr.bin | |
parent | 302b817fc4816dc40393a080e646204e3aa08e87 (diff) |
To be fully compatibly with the GNU RCS tools we need to have the
same way of parsing commandline options. Since getopt(3) allows spaces
between arguments and GNU RCS tools does not we needed to roll out our
own way of option handling, and here it is.
ok niallo@
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/rcs/ci.c | 25 | ||||
-rw-r--r-- | usr.bin/rcs/co.c | 20 | ||||
-rw-r--r-- | usr.bin/rcs/ident.c | 8 | ||||
-rw-r--r-- | usr.bin/rcs/rcsclean.c | 12 | ||||
-rw-r--r-- | usr.bin/rcs/rcsdiff.c | 15 | ||||
-rw-r--r-- | usr.bin/rcs/rcsprog.c | 82 | ||||
-rw-r--r-- | usr.bin/rcs/rcsprog.h | 6 | ||||
-rw-r--r-- | usr.bin/rcs/rlog.c | 8 |
8 files changed, 121 insertions, 55 deletions
diff --git a/usr.bin/rcs/ci.c b/usr.bin/rcs/ci.c index f1d3c56a2b9..c2783d54829 100644 --- a/usr.bin/rcs/ci.c +++ b/usr.bin/rcs/ci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ci.c,v 1.23 2005/10/12 22:57:26 niallo Exp $ */ +/* $OpenBSD: ci.c,v 1.24 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Niall O'Higgins <niallo@openbsd.org> * All rights reserved. @@ -89,10 +89,10 @@ checkin_main(int argc, char **argv) exit(1); } - while ((ch = getopt(argc, argv, "j:l::M:N:qu::d:r::m:k:V")) != -1) { + while ((ch = rcs_getopt(argc, argv, "j:l::M:N:qu::d:r::m:k:V")) != -1) { switch (ch) { case 'd': - if ((date = cvs_date_parse(optarg)) <= 0) { + if ((date = cvs_date_parse(rcs_optarg)) <= 0) { cvs_log(LP_ERR, "invalide date"); exit(1); } @@ -101,7 +101,7 @@ checkin_main(int argc, char **argv) (usage)(); exit(0); case 'm': - rcs_msg = optarg; + rcs_msg = rcs_optarg; interactive = 0; break; case 'q': @@ -111,8 +111,8 @@ checkin_main(int argc, char **argv) printf("%s\n", rcs_version); exit(0); case 'l': - if (optarg != NULL) { - if ((newrev = rcsnum_parse(optarg)) == NULL) { + if (rcs_optarg != NULL) { + if ((newrev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit(1); } @@ -120,8 +120,8 @@ checkin_main(int argc, char **argv) lkmode = LOCK_LOCK; break; case 'u': - if (optarg != NULL) { - if ((newrev = rcsnum_parse(optarg)) == NULL) { + if (rcs_optarg != NULL) { + if ((newrev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit(1); } @@ -130,8 +130,8 @@ checkin_main(int argc, char **argv) break; case 'r': rflag = 1; - if (optarg != NULL) { - if ((newrev = rcsnum_parse(optarg)) == NULL) { + if (rcs_optarg != NULL) { + if ((newrev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit(1); } @@ -143,8 +143,9 @@ checkin_main(int argc, char **argv) } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; + if (argc == 0) { cvs_log(LP_ERR, "no input file"); (usage)(); diff --git a/usr.bin/rcs/co.c b/usr.bin/rcs/co.c index 50e910f8ec6..a2cb90d9024 100644 --- a/usr.bin/rcs/co.c +++ b/usr.bin/rcs/co.c @@ -1,4 +1,4 @@ -/* $OpenBSD: co.c,v 1.12 2005/10/12 17:43:18 xsa Exp $ */ +/* $OpenBSD: co.c,v 1.13 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -61,14 +61,14 @@ checkout_main(int argc, char **argv) exit (1); } - while ((ch = getopt(argc, argv, "l::qr::u::V")) != -1) { + while ((ch = rcs_getopt(argc, argv, "l::qr::u::V")) != -1) { switch (ch) { case 'l': if (rev != RCS_HEAD_REV) cvs_log(LP_WARN, "redefinition of revision number"); - if (optarg != NULL) { - if ((rev = rcsnum_parse(optarg)) == NULL) { + if (rcs_optarg != NULL) { + if ((rev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit (1); } @@ -82,8 +82,8 @@ checkout_main(int argc, char **argv) if (rev != RCS_HEAD_REV) cvs_log(LP_WARN, "redefinition of revision number"); - if (optarg != NULL) { - if ((rev = rcsnum_parse(optarg)) == NULL) { + if (rcs_optarg != NULL) { + if ((rev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit (1); } @@ -93,8 +93,8 @@ checkout_main(int argc, char **argv) if (rev != RCS_HEAD_REV) cvs_log(LP_WARN, "redefinition of revision number"); - if (optarg != NULL) { - if ((rev = rcsnum_parse(optarg)) == NULL) { + if (rcs_optarg != NULL) { + if ((rev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit (1); } @@ -110,8 +110,8 @@ checkout_main(int argc, char **argv) } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; if (argc == 0) { cvs_log(LP_ERR, "no input file"); diff --git a/usr.bin/rcs/ident.c b/usr.bin/rcs/ident.c index 1e79d329e4c..44d00437363 100644 --- a/usr.bin/rcs/ident.c +++ b/usr.bin/rcs/ident.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ident.c,v 1.4 2005/10/12 17:13:30 deraadt Exp $ */ +/* $OpenBSD: ident.c,v 1.5 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org> * All rights reserved. @@ -50,7 +50,7 @@ ident_main(int argc, char **argv) int i, ch; FILE *fp; - while ((ch = getopt(argc, argv, "qV")) != -1) { + while ((ch = rcs_getopt(argc, argv, "qV")) != -1) { switch(ch) { case 'q': verbose = 0; @@ -64,8 +64,8 @@ ident_main(int argc, char **argv) } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; if (argc == 0) ident_file(NULL, stdin); diff --git a/usr.bin/rcs/rcsclean.c b/usr.bin/rcs/rcsclean.c index 20af41e88ae..6642cd2855f 100644 --- a/usr.bin/rcs/rcsclean.c +++ b/usr.bin/rcs/rcsclean.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsclean.c,v 1.6 2005/10/12 17:43:18 xsa Exp $ */ +/* $OpenBSD: rcsclean.c,v 1.7 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -52,10 +52,10 @@ rcsclean_main(int argc, char **argv) rev = RCS_HEAD_REV; - while ((ch = getopt(argc, argv, "k:nqr:V")) != -1) { + while ((ch = rcs_getopt(argc, argv, "k:nqr:V")) != -1) { switch (ch) { case 'k': - kflag = rcs_kflag_get(optarg); + kflag = rcs_kflag_get(rcs_optarg); if (RCS_KWEXP_INVAL(kflag)) { cvs_log(LP_ERR, "invalid RCS keyword expansion mode"); @@ -70,7 +70,7 @@ rcsclean_main(int argc, char **argv) verbose = 0; break; case 'r': - if ((rev = rcsnum_parse(optarg)) == NULL) { + if ((rev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit(1); } @@ -83,8 +83,8 @@ rcsclean_main(int argc, char **argv) } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; if (argc == 0) { if ((dirp = opendir(".")) == NULL) { diff --git a/usr.bin/rcs/rcsdiff.c b/usr.bin/rcs/rcsdiff.c index a2c3aed57ac..9ca3b650ad3 100644 --- a/usr.bin/rcs/rcsdiff.c +++ b/usr.bin/rcs/rcsdiff.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsdiff.c,v 1.10 2005/10/12 17:43:18 xsa Exp $ */ +/* $OpenBSD: rcsdiff.c,v 1.11 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -52,7 +52,7 @@ rcsdiff_main(int argc, char **argv) rev2 = NULL; status = 0; - while ((ch = getopt(argc, argv, "cnqr:uV")) != -1) { + while ((ch = rcs_getopt(argc, argv, "cnqr:uV")) != -1) { switch (ch) { case 'c': diff_format = D_CONTEXT; @@ -71,24 +71,25 @@ rcsdiff_main(int argc, char **argv) exit(0); case 'r': if (rev == RCS_HEAD_REV) { - if ((rev = rcsnum_parse(optarg)) == NULL) { + if ((rev = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit(1); } } else { - if ((rev2 = rcsnum_parse(optarg)) == NULL) { + if ((rev2 = rcsnum_parse(rcs_optarg)) == NULL) { cvs_log(LP_ERR, "bad revision number"); exit(1); } } break; default: - break; + (usage)(); + exit (1); } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; if (argc == 0) { cvs_log(LP_ERR, "no input file"); diff --git a/usr.bin/rcs/rcsprog.c b/usr.bin/rcs/rcsprog.c index 0bcacd92091..b259797a2d9 100644 --- a/usr.bin/rcs/rcsprog.c +++ b/usr.bin/rcs/rcsprog.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsprog.c,v 1.27 2005/10/12 17:43:18 xsa Exp $ */ +/* $OpenBSD: rcsprog.c,v 1.28 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -45,6 +45,9 @@ const char rcs_version[] = "OpenCVS RCS version 3.6"; int verbose = 1; +int rcs_optind; +char *rcs_optarg; + struct rcs_prog { char *prog_name; int (*prog_hdlr)(int, char **); @@ -60,6 +63,62 @@ struct rcs_prog { }; int +rcs_getopt(int argc, char **argv, const char *optstr) +{ + char *a; + const char *c; + static int i = 1; + int opt, hasargument, ret; + + hasargument = 0; + rcs_optarg = NULL; + + if (i >= argc) + return (-1); + + a = argv[i++]; + if (*a++ != '-') + return (-1); + + ret = 0; + opt = *a; + for (c = optstr; *c != '\0'; c++) { + if (*c == opt) { + a++; + ret = opt; + + if (*(c + 1) == ':') { + if (*(c + 2) == ':') { + if (*a != '\0') + hasargument = 1; + } else { + if (*a != '\0') { + hasargument = 1; + } else { + ret = 1; + break; + } + } + } + + if (hasargument == 1) + rcs_optarg = a; + + if (ret == opt) + rcs_optind++; + break; + } + } + + if (ret == 0) + cvs_log(LP_ERR, "unknown option -%c", opt); + else if (ret == 1) + cvs_log(LP_ERR, "missing argument for option -%c", opt); + + return (ret); +} + +int rcs_statfile(char *fname, char *out, size_t len) { int l; @@ -108,6 +167,7 @@ main(int argc, char **argv) int ret; ret = -1; + rcs_optind = 1; cvs_strtab_init(); cvs_log_init(LD_STD, 0); @@ -154,19 +214,19 @@ rcs_main(int argc, char **argv) flags = RCS_RDWR; logstr = oldfile = alist = comment = elist = NULL; - while ((ch = getopt(argc, argv, "A:a:b::c:e::hik:Lm:MqUV")) != -1) { + while ((ch = rcs_getopt(argc, argv, "A:a:b::c:e::hik:Lm:MqUV")) != -1) { switch (ch) { case 'A': - oldfile = optarg; + oldfile = rcs_optarg; break; case 'a': - alist = optarg; + alist = rcs_optarg; break; case 'c': - comment = optarg; + comment = rcs_optarg; break; case 'e': - elist = optarg; + elist = rcs_optarg; break; case 'h': (usage)(); @@ -175,11 +235,11 @@ rcs_main(int argc, char **argv) flags |= RCS_CREATE; break; case 'k': - kflag = rcs_kflag_get(optarg); + kflag = rcs_kflag_get(rcs_optarg); if (RCS_KWEXP_INVAL(kflag)) { cvs_log(LP_ERR, "invalid keyword substitution mode `%s'", - optarg); + rcs_optarg); exit(1); } break; @@ -189,7 +249,7 @@ rcs_main(int argc, char **argv) lkmode = RCS_LOCK_STRICT; break; case 'm': - if ((logstr = strdup(optarg)) == NULL) { + if ((logstr = strdup(rcs_optarg)) == NULL) { cvs_log(LP_ERRNO, "failed to copy logstring"); exit(1); } @@ -214,8 +274,8 @@ rcs_main(int argc, char **argv) } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; if (argc == 0) { cvs_log(LP_ERR, "no input file"); (usage)(); diff --git a/usr.bin/rcs/rcsprog.h b/usr.bin/rcs/rcsprog.h index 84fb8596091..8eacd0d9290 100644 --- a/usr.bin/rcs/rcsprog.h +++ b/usr.bin/rcs/rcsprog.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsprog.h,v 1.9 2005/10/11 15:50:25 niallo Exp $ */ +/* $OpenBSD: rcsprog.h,v 1.10 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -31,6 +31,9 @@ extern char *__progname; extern const char rcs_version[]; extern int verbose; +extern int rcs_optind; +extern char *rcs_optarg; + /* date.y */ time_t cvs_date_parse(const char *); @@ -43,6 +46,7 @@ void rlog_usage(void); void ident_usage(void); void (*usage)(void); +int rcs_getopt(int, char **, const char *); int rcs_statfile(char *, char *, size_t); int checkout_main(int, char **); int checkin_main(int, char **); diff --git a/usr.bin/rcs/rlog.c b/usr.bin/rcs/rlog.c index 767ec0871ce..8e312db9c15 100644 --- a/usr.bin/rcs/rlog.c +++ b/usr.bin/rcs/rlog.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rlog.c,v 1.4 2005/10/12 17:13:30 deraadt Exp $ */ +/* $OpenBSD: rlog.c,v 1.5 2005/10/13 12:35:30 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -57,7 +57,7 @@ rlog_main(int argc, char **argv) RCSFILE *file; hflag = Rflag = 0; - while ((ch = getopt(argc, argv, "hNqRtV")) != -1) { + while ((ch = rcs_getopt(argc, argv, "hNqRtV")) != -1) { switch (ch) { case 'h': hflag = 1; @@ -82,8 +82,8 @@ rlog_main(int argc, char **argv) } } - argc -= optind; - argv += optind; + argc -= rcs_optind; + argv += rcs_optind; if (argc == 0) { cvs_log(LP_ERR, "no input file"); |