98 lines
2.1 KiB
C
98 lines
2.1 KiB
C
/* merge - three-way file merge */
|
|
|
|
/* Copyright 1991 by Paul Eggert
|
|
Distributed under license by the Free Software Foundation, Inc.
|
|
|
|
This file is part of RCS.
|
|
|
|
RCS is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
RCS is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with RCS; see the file COPYING. If not, write to
|
|
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
Report problems and direct all questions to:
|
|
|
|
rcs-bugs@cs.purdue.edu
|
|
|
|
*/
|
|
|
|
#include "rcsbase.h"
|
|
|
|
|
|
static char const usage[] =
|
|
"\nmerge: usage: merge [-p] [-q] [-L label1 [-L label3]] file1 file2 file3\n";
|
|
|
|
static exiting void
|
|
badoption(a)
|
|
char const *a;
|
|
{
|
|
faterror("unknown option: %s%s", a-2, usage);
|
|
}
|
|
|
|
|
|
mainProg(mergeId, "merge", "$Id: merge.c,v 1.2 1993/08/02 17:47:36 mycroft Exp $")
|
|
{
|
|
register char const *a;
|
|
char const *label[2], *arg[3];
|
|
int labels, tostdout;
|
|
|
|
labels = 0;
|
|
tostdout = false;
|
|
|
|
while ((a = *++argv) && *a++ == '-') {
|
|
switch (*a++) {
|
|
case 'p': tostdout = true; break;
|
|
case 'q': quietflag = true; break;
|
|
case 'L':
|
|
if (1<labels)
|
|
faterror("too many -L options");
|
|
if (!(label[labels++] = *++argv))
|
|
faterror("-L needs following argument");
|
|
--argc;
|
|
break;
|
|
default:
|
|
badoption(a);
|
|
}
|
|
if (*a)
|
|
badoption(a);
|
|
--argc;
|
|
}
|
|
|
|
if (argc != 4)
|
|
faterror("%s arguments%s",
|
|
argc<4 ? "not enough" : "too many", usage
|
|
);
|
|
|
|
/* This copy keeps us `const'-clean. */
|
|
arg[0] = argv[0];
|
|
arg[1] = argv[1];
|
|
arg[2] = argv[2];
|
|
|
|
switch (labels) {
|
|
case 0: label[0] = arg[0]; /* fall into */
|
|
case 1: label[1] = arg[2];
|
|
}
|
|
|
|
exitmain(merge(tostdout, label, arg));
|
|
}
|
|
|
|
|
|
#if lint
|
|
# define exiterr mergeExit
|
|
#endif
|
|
exiting void
|
|
exiterr()
|
|
{
|
|
tempunlink();
|
|
_exit(DIFF_TROUBLE);
|
|
}
|