4.4BSD/usr/src/contrib/mkmf/src/editmf.c
/*
* Copyright (c) 1983, 1985, 1991, 1993 Peter J. Nicklin.
* Copyright (c) 1991, 1993 Version Technology.
* All Rights Reserved.
*
* $License: VT.1.1 $
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met: (1) Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer. (2) Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution. (3) All advertising materials mentioning
* features or use of this software must display the following
* acknowledgement: ``This product includes software developed by
* Version Technology.'' Neither the name of Version Technology nor
* the name of Peter J. Nicklin may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY VERSION TECHNOLOGY ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL VERSION TECHNOLOGY BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* Report problems and direct questions to nicklin@netcom.com
*
* $Header: editmf.c,v 4.6 93/05/25 21:49:09 nicklin Exp $
*
* Author: Peter J. Nicklin
*/
#include <ctype.h>
#include <signal.h>
#include <stdio.h>
#include "Mkmf.h"
#include "config.h"
#include "dlist.h"
#include "hash.h"
#include "macro.h"
#include "null.h"
#include "slist.h"
#include "yesno.h"
static char Mftemp[] = "mkmfXXXXXX"; /* temporary makefile */
/*
* editmf() replaces macro definitions within a makefile.
*/
void
editmf(mfname, mfpath)
char *mfname; /* makefile name */
char *mfpath; /* makefile template pathname */
{
extern char IOBUF[]; /* I/O buffer line */
extern int DEPEND; /* dependency analysis? */
extern SLIST *EXTLIST; /* external header file name list */
extern SLIST *HEADLIST; /* header file name list */
extern SLIST *LIBLIST; /* library pathname list */
extern SLIST *SRCLIST; /* source file name list */
extern SLIST *SYSLIST; /* system header file name list */
extern HASH *MDEFTABLE; /* macro definition table */
char *findmacro(); /* is the line a macro definition? */
char *getlin(); /* get a line from input stream */
char *mktemp(); /* make file name */
char mnam[MACRONAMSIZE]; /* macro name buffer */
DLIST *dlp; /* dependency list */
DLIST *mkdepend(); /* generate object-include file deps */
FILE *ifp; /* input stream */
FILE *mustfopen(); /* must open file or die */
FILE *ofp; /* output stream */
HASHBLK *htb; /* hash table block */
HASHBLK *htlookup(); /* find hash table entry */
void cleanup(); /* remove temporary makefile and exit */
void dlprint(); /* print dependency list */
void purgcontinue(); /* get rid of continuation lines */
void putmacro(); /* put macro defs from table */
void putlin(); /* put a makefile line */
void putobjmacro(); /* put object file name macro def */
void putslmacro(); /* put macro defs from linked list */
ifp = mustfopen(mfpath, "r");
mktemp("Mftemp");
if (signal(SIGINT, SIG_IGN) != SIG_IGN)
{
signal(SIGINT, cleanup);
signal(SIGHUP, cleanup);
signal(SIGQUIT, cleanup);
}
ofp = mustfopen(Mftemp, "w");
if (DEPEND)
{
dlp = mkdepend();
}
while (getlin(ifp) != NULL)
{
if (DEPEND && EQUAL(IOBUF, DEPENDMARK))
break;
if (findmacro(mnam, IOBUF) != NULL)
{
if (EQUAL(mnam, MHEADERS))
{
putslmacro(HEADLIST, ofp);
purgcontinue(ifp);
}
else if (EQUAL(mnam, MOBJECTS))
{
putobjmacro(ofp);
purgcontinue(ifp);
}
else if (EQUAL(mnam, MSOURCES))
{
putslmacro(SRCLIST, ofp);
purgcontinue(ifp);
}
else if (EQUAL(mnam, MSYSHDRS))
{
putslmacro(SYSLIST, ofp);
purgcontinue(ifp);
}
else if (EQUAL(mnam, MEXTERNALS))
{
if (DEPEND)
{
putslmacro(EXTLIST, ofp);
purgcontinue(ifp);
}
else {
putlin(ofp);
}
}
else if (EQUAL(mnam, MLIBLIST) && LIBLIST != NULL)
{
putslmacro(LIBLIST, ofp);
purgcontinue(ifp);
}
else if ((htb = htlookup(mnam, MDEFTABLE)) != NULL)
{
if (htb->h_val == VREADWRITE)
{
putmacro(htb->h_def, ofp);
purgcontinue(ifp);
}
else {
putlin(ofp);
}
}
else {
putlin(ofp);
}
}
else {
putlin(ofp);
}
}
fclose(ifp);
if (DEPEND)
{
dlprint(dlp, ofp);
}
fclose(ofp);
signal(SIGINT, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
RENAME(Mftemp, mfname);
}
/*
* cleanup() removes the temporary makefile and dependency file, and
* calls exit(1).
*/
void
cleanup(sig)
int sig; /* value of signal causing cleanup */
{
signal(SIGINT, cleanup);
signal(SIGHUP, cleanup);
signal(SIGQUIT, cleanup);
unlink(Mftemp);
exit(1);
}