xref: /dflybsd-src/gnu/usr.bin/rcs/merge/merge.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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