186d7f5d3SJohn Marino /* merge - three-way file merge */
286d7f5d3SJohn Marino
386d7f5d3SJohn Marino /* Copyright 1991, 1992, 1993, 1994, 1995 Paul Eggert
486d7f5d3SJohn Marino Distributed under license by the Free Software Foundation, Inc.
586d7f5d3SJohn Marino
686d7f5d3SJohn Marino This file is part of RCS.
786d7f5d3SJohn Marino
886d7f5d3SJohn Marino RCS is free software; you can redistribute it and/or modify
986d7f5d3SJohn Marino it under the terms of the GNU General Public License as published by
1086d7f5d3SJohn Marino the Free Software Foundation; either version 2, or (at your option)
1186d7f5d3SJohn Marino any later version.
1286d7f5d3SJohn Marino
1386d7f5d3SJohn Marino RCS is distributed in the hope that it will be useful,
1486d7f5d3SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
1586d7f5d3SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1686d7f5d3SJohn Marino GNU General Public License for more details.
1786d7f5d3SJohn Marino
1886d7f5d3SJohn Marino You should have received a copy of the GNU General Public License
1986d7f5d3SJohn Marino along with RCS; see the file COPYING.
2086d7f5d3SJohn Marino If not, write to the Free Software Foundation,
2186d7f5d3SJohn Marino 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2286d7f5d3SJohn Marino
2386d7f5d3SJohn Marino Report problems and direct all questions to:
2486d7f5d3SJohn Marino
2586d7f5d3SJohn Marino rcs-bugs@cs.purdue.edu
2686d7f5d3SJohn Marino
2786d7f5d3SJohn Marino */
2886d7f5d3SJohn Marino /*
2986d7f5d3SJohn Marino * $FreeBSD: src/gnu/usr.bin/rcs/merge/merge.c,v 1.5 1999/08/27 23:36:51 peter Exp $
3086d7f5d3SJohn Marino * $DragonFly: src/gnu/usr.bin/rcs/merge/merge.c,v 1.2 2003/06/17 04:25:47 dillon Exp $
3186d7f5d3SJohn Marino */
3286d7f5d3SJohn Marino
3386d7f5d3SJohn Marino #include "rcsbase.h"
3486d7f5d3SJohn Marino
3586d7f5d3SJohn Marino static void badoption P((char const*));
3686d7f5d3SJohn Marino
3786d7f5d3SJohn Marino static char const usage[] =
3886d7f5d3SJohn Marino "\nmerge: usage: merge [-AeEpqxX3] [-L lab [-L lab [-L lab]]] file1 file2 file3";
3986d7f5d3SJohn Marino
4086d7f5d3SJohn Marino static void
badoption(a)4186d7f5d3SJohn Marino badoption(a)
4286d7f5d3SJohn Marino char const *a;
4386d7f5d3SJohn Marino {
4486d7f5d3SJohn Marino error("unknown option: %s%s", a, usage);
4586d7f5d3SJohn Marino }
4686d7f5d3SJohn Marino
4786d7f5d3SJohn Marino
4886d7f5d3SJohn Marino mainProg(mergeId, "merge", "$DragonFly: src/gnu/usr.bin/rcs/merge/merge.c,v 1.2 2003/06/17 04:25:47 dillon Exp $")
4986d7f5d3SJohn Marino {
5086d7f5d3SJohn Marino register char const *a;
5186d7f5d3SJohn Marino char const *arg[3], *label[3], *edarg = 0;
5286d7f5d3SJohn Marino int labels, tostdout;
5386d7f5d3SJohn Marino
5486d7f5d3SJohn Marino labels = 0;
5586d7f5d3SJohn Marino tostdout = false;
5686d7f5d3SJohn Marino
5786d7f5d3SJohn Marino for (; (a = *++argv) && *a++ == '-'; --argc) {
5886d7f5d3SJohn Marino switch (*a++) {
5986d7f5d3SJohn Marino case 'A': case 'E': case 'e':
6086d7f5d3SJohn Marino if (edarg && edarg[1] != (*argv)[1])
6186d7f5d3SJohn Marino error("%s and %s are incompatible",
6286d7f5d3SJohn Marino edarg, *argv
6386d7f5d3SJohn Marino );
6486d7f5d3SJohn Marino edarg = *argv;
6586d7f5d3SJohn Marino break;
6686d7f5d3SJohn Marino
6786d7f5d3SJohn Marino case 'p': tostdout = true; break;
6886d7f5d3SJohn Marino case 'q': quietflag = true; break;
6986d7f5d3SJohn Marino
7086d7f5d3SJohn Marino case 'L':
7186d7f5d3SJohn Marino if (3 <= labels)
7286d7f5d3SJohn Marino faterror("too many -L options");
7386d7f5d3SJohn Marino if (!(label[labels++] = *++argv))
7486d7f5d3SJohn Marino faterror("-L needs following argument");
7586d7f5d3SJohn Marino --argc;
7686d7f5d3SJohn Marino break;
7786d7f5d3SJohn Marino
7886d7f5d3SJohn Marino case 'V':
7986d7f5d3SJohn Marino printf("RCS version %s\n", RCS_version_string);
8086d7f5d3SJohn Marino exitmain(0);
8186d7f5d3SJohn Marino
8286d7f5d3SJohn Marino default:
8386d7f5d3SJohn Marino badoption(a - 2);
8486d7f5d3SJohn Marino continue;
8586d7f5d3SJohn Marino }
8686d7f5d3SJohn Marino if (*a)
8786d7f5d3SJohn Marino badoption(a - 2);
8886d7f5d3SJohn Marino }
8986d7f5d3SJohn Marino
9086d7f5d3SJohn Marino if (argc != 4)
9186d7f5d3SJohn Marino faterror("%s arguments%s",
9286d7f5d3SJohn Marino argc<4 ? "not enough" : "too many", usage
9386d7f5d3SJohn Marino );
9486d7f5d3SJohn Marino
9586d7f5d3SJohn Marino /* This copy keeps us `const'-clean. */
9686d7f5d3SJohn Marino arg[0] = argv[0];
9786d7f5d3SJohn Marino arg[1] = argv[1];
9886d7f5d3SJohn Marino arg[2] = argv[2];
9986d7f5d3SJohn Marino
10086d7f5d3SJohn Marino for (; labels < 3; labels++)
10186d7f5d3SJohn Marino label[labels] = arg[labels];
10286d7f5d3SJohn Marino
10386d7f5d3SJohn Marino if (nerror)
10486d7f5d3SJohn Marino exiterr();
10586d7f5d3SJohn Marino exitmain(merge(tostdout, edarg, label, arg));
10686d7f5d3SJohn Marino }
10786d7f5d3SJohn Marino
10886d7f5d3SJohn Marino
10986d7f5d3SJohn Marino #if RCS_lint
11086d7f5d3SJohn Marino # define exiterr mergeExit
11186d7f5d3SJohn Marino #endif
11286d7f5d3SJohn Marino void
exiterr()11386d7f5d3SJohn Marino exiterr()
11486d7f5d3SJohn Marino {
11586d7f5d3SJohn Marino tempunlink();
11686d7f5d3SJohn Marino _exit(DIFF_TROUBLE);
11786d7f5d3SJohn Marino }
118