summaryrefslogtreecommitdiff
path: root/usr.bin/patch
diff options
context:
space:
mode:
authormycroft <mycroft@NetBSD.org>2004-08-06 14:54:26 +0000
committermycroft <mycroft@NetBSD.org>2004-08-06 14:54:26 +0000
commitee776b9f857158e362f583ca100b5bd9a904958f (patch)
tree01a3f94744f3bf2f2f2d7005af205a16062d4d8c /usr.bin/patch
parentdebe5a31ce718c0d13ad8977b4c789006f6dc4f1 (diff)
Parse multiple options that are specified together; e.g. "-fs".
XXX It is not clear to me why patch(1) doesn't get getopt_long(3).
Diffstat (limited to 'usr.bin/patch')
-rw-r--r--usr.bin/patch/patch.c208
1 files changed, 109 insertions, 99 deletions
diff --git a/usr.bin/patch/patch.c b/usr.bin/patch/patch.c
index 7540f286ec7..ea75d1d29a5 100644
--- a/usr.bin/patch/patch.c
+++ b/usr.bin/patch/patch.c
@@ -1,4 +1,4 @@
-/* $NetBSD: patch.c,v 1.19 2003/07/30 08:51:04 itojun Exp $ */
+/* $NetBSD: patch.c,v 1.20 2004/08/06 14:54:26 mycroft Exp $ */
/* patch - a program to apply diffs to original files
*
@@ -25,7 +25,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: patch.c,v 1.19 2003/07/30 08:51:04 itojun Exp $");
+__RCSID("$NetBSD: patch.c,v 1.20 2004/08/06 14:54:26 mycroft Exp $");
#endif /* not lint */
#include "INTERN.h"
@@ -461,116 +461,126 @@ exclusive\n");
if (*(s + 1) == '-') {
opt = decode_long_option(s + 2);
- s += strlen(s) - 1;
+ s = "";
}
else
opt = *++s;
- switch (opt) {
- case 'b':
- simple_backup_suffix = xstrdup(nextarg());
- break;
- case 'B':
- origprae = xstrdup(nextarg());
- break;
- case 'c':
- diff_type = CONTEXT_DIFF;
- break;
- case 'd':
- if (!*++s)
- s = nextarg();
- if (chdir(s) < 0)
- pfatal("can't cd to %s", s);
- break;
- case 'D':
- do_defines = TRUE;
- if (!*++s)
- s = nextarg();
- if (!isalpha((unsigned char)*s) && '_' != *s)
- fatal("argument to -D is not an identifier\n");
- snprintf(if_defined, sizeof(if_defined), "#ifdef %s\n", s);
- snprintf(not_defined, sizeof(not_defined), "#ifndef %s\n", s);
- snprintf(end_defined, sizeof(end_defined),
- "#endif /* %s */\n", s);
- break;
- case 'e':
- diff_type = ED_DIFF;
- break;
- case 'E':
- remove_empty_files = TRUE;
- break;
- case 'f':
- force = TRUE;
- break;
- case 'F':
- if (*++s == '=')
- s++;
- maxfuzz = atoi(s);
- break;
- case 'i':
- if (filearg[1] != NULL)
- free(filearg[1]);
- filearg[1] = xstrdup(nextarg());
- break;
- case 'l':
- canonicalize = TRUE;
- break;
- case 'n':
- diff_type = NORMAL_DIFF;
- break;
- case 'N':
- noreverse = TRUE;
- break;
- case 'o':
- outname = xstrdup(nextarg());
- break;
- case 'p':
- if (*++s == '=')
- s++;
- strippath = atoi(s);
- break;
- case 'r':
- strlcpy(rejname, nextarg(), sizeof(rejname));
- break;
- case 'R':
- reverse = TRUE;
- reverse_flag_specified = TRUE;
- break;
- case 's':
- verbose = FALSE;
- break;
- case 'S':
- skip_rest_of_patch = TRUE;
- break;
- case 't':
- batch = TRUE;
- break;
- case 'u':
- diff_type = UNI_DIFF;
- break;
- case 'v':
- version();
- break;
- case 'V':
+ do {
+ printf("PARSING OPTION %c\n", opt);
+ switch (opt) {
+ case 'b':
+ simple_backup_suffix = xstrdup(nextarg());
+ break;
+ case 'B':
+ origprae = xstrdup(nextarg());
+ break;
+ case 'c':
+ diff_type = CONTEXT_DIFF;
+ break;
+ case 'd':
+ if (!*++s)
+ s = nextarg();
+ if (chdir(s) < 0)
+ pfatal("can't cd to %s", s);
+ s = "";
+ break;
+ case 'D':
+ do_defines = TRUE;
+ if (!*++s)
+ s = nextarg();
+ if (!isalpha((unsigned char)*s) && '_' != *s)
+ fatal("argument to -D is not an identifier\n");
+ snprintf(if_defined, sizeof(if_defined), "#ifdef %s\n", s);
+ snprintf(not_defined, sizeof(not_defined), "#ifndef %s\n", s);
+ snprintf(end_defined, sizeof(end_defined),
+ "#endif /* %s */\n", s);
+ s = "";
+ break;
+ case 'e':
+ diff_type = ED_DIFF;
+ break;
+ case 'E':
+ remove_empty_files = TRUE;
+ break;
+ case 'f':
+ force = TRUE;
+ break;
+ case 'F':
+ if (*++s == '=')
+ s++;
+ maxfuzz = atoi(s);
+ s = "";
+ break;
+ case 'i':
+ if (filearg[1] != NULL)
+ free(filearg[1]);
+ filearg[1] = xstrdup(nextarg());
+ break;
+ case 'l':
+ canonicalize = TRUE;
+ break;
+ case 'n':
+ diff_type = NORMAL_DIFF;
+ break;
+ case 'N':
+ noreverse = TRUE;
+ break;
+ case 'o':
+ outname = xstrdup(nextarg());
+ break;
+ case 'p':
+ if (*++s == '=')
+ s++;
+ strippath = atoi(s);
+ s = "";
+ break;
+ case 'r':
+ strlcpy(rejname, nextarg(), sizeof(rejname));
+ break;
+ case 'R':
+ reverse = TRUE;
+ reverse_flag_specified = TRUE;
+ break;
+ case 's':
+ verbose = FALSE;
+ break;
+ case 'S':
+ skip_rest_of_patch = TRUE;
+ break;
+ case 't':
+ batch = TRUE;
+ break;
+ case 'u':
+ diff_type = UNI_DIFF;
+ break;
+ case 'v':
+ version();
+ break;
+ case 'V':
#ifndef NODIR
- backup_type = get_version (nextarg ());
+ backup_type = get_version (nextarg ());
#endif
- break;
+ break;
#ifdef DEBUGGING
- case 'x':
- debug = atoi(s+1);
- break;
+ case 'x':
+ debug = atoi(s+1);
+ s = "";
+ break;
#endif
- default:
- fprintf(stderr, "patch: unrecognized option `%s'\n", Argv[0]);
- fprintf(stderr, "\
+ default:
+ fprintf(stderr, "patch: unrecognized option `%s'\n",
+ Argv[0]);
+ fprintf(stderr, "\
Usage: patch [options] [origfile [patchfile]] [+ [options] [origfile]]...\n\
Options:\n\
[-ceEflnNRsStuv] [-b backup-ext] [-B backup-prefix] [-d directory]\n\
[-D symbol] [-Fmax-fuzz] [-o out-file] [-p[strip-count]]\n\
[-r rej-name] [-V {numbered,existing,simple}]\n");
- my_exit(1);
- }
+ my_exit(1);
+ }
+ opt = *++s;
+ } while (opt != '\0');
}
}
}