PERFORCE change 144660 for review
Gabor Kovesdan
gabor at FreeBSD.org
Fri Jul 4 20:12:56 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=144660
Change 144660 by gabor at gabor_server on 2008/07/04 20:12:48
- Implement --from-file and --to-file
Affected files ...
.. //depot/projects/soc2008/gabor_textproc/diff/diff.c#9 edit
Differences ...
==== //depot/projects/soc2008/gabor_textproc/diff/diff.c#9 (text+ko) ====
@@ -58,7 +58,9 @@
HELP_OPT = CHAR_MAX + 1,
NORMAL_OPT,
FCASE_SENSITIVE_OPT,
- FCASE_IGNORE_OPT
+ FCASE_IGNORE_OPT,
+ FROMFILE_OPT,
+ TOFILE_OPT
};
#define OPTIONS "0123456789abC:cdD:efhI:iL:lnNPpqrS:sTtU:uvwX:x:"
@@ -75,9 +77,10 @@
{ "line-format", required_argument, NULL, OPT_LF },
{ "LTYPE-line-format", required_argument, NULL, OPT_LLF },
{ "tabsize", optional_argument, NULL, OPT_TSIZE },
- { "unidirectional-new-file", no_argument, NULL, OPT_UNINF },
- { "from-file", required_argument, NULL, OPT_FFILE },
- { "to-file", required_argument, NULL, OPT_TOFILE },
+ { "unidirectional-new-file", no_argument, NULL, OPT_UNINF }, */
+ { "from-file", required_argument, NULL, FROMFILE_OPT },
+ { "to-file", required_argument, NULL, TOFILE_OPT },
+/* XXX: UNIMPLEMENTED
{ "horizon-lines", required_argument, NULL, OPT_HLINES },
{ "speed-large-files", no_argument, NULL, OPT_LFILES }, */
{ "help", no_argument, NULL, HELP_OPT },
@@ -129,8 +132,9 @@
int
main(int argc, char **argv)
{
- char *ep, **oargv;
+ char *ep, *fromfile = NULL, *tofile = NULL, **oargv;
int ch, lastch, gotstdin, prevoptind, newarg;
+ char *dst, *src;
oargv = argv;
gotstdin = 0;
@@ -252,10 +256,22 @@
case 'x':
push_excludes(optarg);
break;
+ case FROMFILE_OPT:
+ if (tofile != NULL)
+ err(2, "--from-file and --to-file are both specified");
+ asprintf(&fromfile, "%s", optarg);
+ break;
+ case TOFILE_OPT:
+ if (fromfile != NULL)
+ err(2, "--from-file and --to-file are both specified");
+ asprintf(&tofile, "%s", optarg);
+ break;
case FCASE_SENSITIVE_OPT:
+ /* this is the default */
break;
case FCASE_IGNORE_OPT:
fcase_behave = FCASE_IGNORE;
+ break;
case NORMAL_OPT:
/* compatibility, this is the default */
break;
@@ -275,7 +291,11 @@
* Do sanity checks, fill in stb1 and stb2 and call the appropriate
* driver routine. Both drivers use the contents of stb1 and stb2.
*/
- if (argc != 2)
+ if (fromfile != NULL || tofile != NULL) {
+ if (argc < 1)
+ usage();
+ }
+ else if (argc != 2 )
usage();
if (ignore_pats != NULL) {
char buf[BUFSIZ];
@@ -290,36 +310,58 @@
errx(2, "%s", buf);
}
}
- if (strcmp(argv[0], "-") == 0) {
- fstat(STDIN_FILENO, &stb1);
- gotstdin = 1;
- } else if (stat(argv[0], &stb1) != 0)
- err(2, "%s", argv[0]);
- if (strcmp(argv[1], "-") == 0) {
- fstat(STDIN_FILENO, &stb2);
- gotstdin = 1;
- } else if (stat(argv[1], &stb2) != 0)
- err(2, "%s", argv[1]);
- if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode)))
- errx(2, "can't compare - to a directory");
- set_argstr(oargv, argv);
- if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) {
- if (format == D_IFDEF)
- errx(2, "-D option not supported with directories");
- diffdir(argv[0], argv[1]);
+
+ if (fromfile != NULL) {
+ src = fromfile;
+ dst = argv[0];
+ } else if (tofile != NULL) {
+ dst = tofile;
+ src = argv[0];
} else {
- if (S_ISDIR(stb1.st_mode)) {
- argv[0] = splice(argv[0], argv[1]);
- if (stat(argv[0], &stb1) < 0)
- err(2, "%s", argv[0]);
+ src = argv[0];
+ dst = argv[1];
+ }
+
+ for (ch = 1; src && dst;ch++) {
+ if (strcmp(src, "-") == 0) {
+ fstat(STDIN_FILENO, &stb1);
+ gotstdin = 1;
+ } else if (stat(src, &stb1) != 0)
+ err(2, "%s", src);
+ if (strcmp(dst, "-") == 0) {
+ fstat(STDIN_FILENO, &stb2);
+ gotstdin = 1;
+ } else if (stat(dst, &stb2) != 0)
+ err(2, "%s", dst);
+ if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode)))
+ errx(2, "can't compare - to a directory");
+/* XXX: ???
+ set_argstr(oargv, argv); */
+ if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) {
+ if (format == D_IFDEF)
+ errx(2, "-D option not supported with directories");
+ diffdir(src, dst);
+ } else {
+ if (S_ISDIR(stb1.st_mode)) {
+ src = splice(src, dst);
+ if (stat(argv[0], &stb1) < 0)
+ err(2, "%s", argv[0]);
+ }
+ if (S_ISDIR(stb2.st_mode)) {
+ argv[1] = splice(dst, src);
+ if (stat(argv[1], &stb2) < 0)
+ err(2, "%s", argv[1]);
+ }
+ print_status(diffreg(src, dst, 0), src, dst,
+ NULL);
+ if (fromfile != NULL)
+ dst = argv[ch];
+ else if (tofile != NULL)
+ src = argv[ch];
+ else
+ break;
}
- if (S_ISDIR(stb2.st_mode)) {
- argv[1] = splice(argv[1], argv[0]);
- if (stat(argv[1], &stb2) < 0)
- err(2, "%s", argv[1]);
- }
- print_status(diffreg(argv[0], argv[1], 0), argv[0], argv[1],
- NULL);
+
}
exit(status);
}
More information about the p4-projects
mailing list