1/*	$NetBSD: merge.c,v 1.1.1.2 1996/10/13 21:57:34 veego Exp $	*/
2
3/* merge - three-way file merge */
4
5/* Copyright 1991, 1992, 1993, 1994, 1995 Paul Eggert
6   Distributed under license by the Free Software Foundation, Inc.
7
8This file is part of RCS.
9
10RCS is free software; you can redistribute it and/or modify
11it under the terms of the GNU General Public License as published by
12the Free Software Foundation; either version 2, or (at your option)
13any later version.
14
15RCS is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with RCS; see the file COPYING.
22If not, write to the Free Software Foundation,
2359 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25Report problems and direct all questions to:
26
27    rcs-bugs@cs.purdue.edu
28
29*/
30
31#include "rcsbase.h"
32
33static void badoption P((char const*));
34
35static char const usage[] =
36 "\nmerge: usage: merge [-AeEpqxX3] [-L lab [-L lab [-L lab]]] file1 file2 file3";
37
38	static void
39badoption(a)
40	char const *a;
41{
42	error("unknown option: %s%s", a, usage);
43}
44
45
46mainProg(mergeId, "merge", "Id: merge.c,v 1.8 1995/06/16 06:19:24 eggert Exp")
47{
48	register char const *a;
49	char const *arg[3], *label[3], *edarg = 0;
50	int labels, tostdout;
51
52	labels = 0;
53	tostdout = false;
54
55	for (;  (a = *++argv)  &&  *a++ == '-';  --argc) {
56		switch (*a++) {
57			case 'A': case 'E': case 'e':
58				if (edarg  &&  edarg[1] != (*argv)[1])
59					error("%s and %s are incompatible",
60						edarg, *argv
61					);
62				edarg = *argv;
63				break;
64
65			case 'p': tostdout = true; break;
66			case 'q': quietflag = true; break;
67
68			case 'L':
69				if (3 <= labels)
70					faterror("too many -L options");
71				if (!(label[labels++] = *++argv))
72					faterror("-L needs following argument");
73				--argc;
74				break;
75
76			case 'V':
77				printf("RCS version %s\n", RCS_version_string);
78				exitmain(0);
79
80			default:
81				badoption(a - 2);
82				continue;
83		}
84		if (*a)
85			badoption(a - 2);
86	}
87
88	if (argc != 4)
89		faterror("%s arguments%s",
90			argc<4 ? "not enough" : "too many",  usage
91		);
92
93	/* This copy keeps us `const'-clean.  */
94	arg[0] = argv[0];
95	arg[1] = argv[1];
96	arg[2] = argv[2];
97
98	for (;  labels < 3;  labels++)
99		label[labels] = arg[labels];
100
101	if (nerror)
102		exiterr();
103	exitmain(merge(tostdout, edarg, label, arg));
104}
105
106
107#if RCS_lint
108#	define exiterr mergeExit
109#endif
110	void
111exiterr()
112{
113	tempunlink();
114	_exit(DIFF_TROUBLE);
115}
116