DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T i

⟦1586c6921⟧ TextFile

    Length: 4496 (0x1190)
    Types: TextFile
    Names: »init_tai.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Lib/tai/init_tai.c« 

TextFile

/* init_tai.c: tailoring initialisation */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/tai/RCS/init_tai.c,v 5.0 90/09/20 16:16:22 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/tai/RCS/init_tai.c,v 5.0 90/09/20 16:16:22 pp Exp Locker: pp $
 *
 * $Log:	init_tai.c,v $
 * Revision 5.0  90/09/20  16:16:22  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "head.h"
#include <sys/stat.h>
#include <isode/tailor.h>


#define MAXTAIARGS	100
#define COMMENTCHAR	'#'


extern char		*pptailor,
			*isodelogpath,
			*tbldfldir,
			*logdfldir;

int			pptailor_size;
static void		tai_size ();
typedef int		(*PF[])();
static char		*getlines();
static void pp_tailor_export ();
extern void pp_log_init ();
extern void err_abrt ();
extern void pp_log_export ();
extern void siginit ();

/* ---------------------  Begin	 Routines  -------------------------------- */




int tai_init (pf, name)
PF	pf;
char	*name;
{
	FILE		*fp;
	char		buf[8192],
			*args[MAXTAIARGS],
			*rname;
	int		ac,
			done,
			pfc;


	if (rname = rindex (name, '/'))
		rname ++;
	if (rname == NULLCP || *rname == 0)
		rname = name;

	isodetailor (rname, 0);
	ll_hdinit (pp_log_oper, rname);
	ll_hdinit (pp_log_stat, rname);
	ll_hdinit (pp_log_norm, rname);
	siginit();

	pp_log_init ();

	(void) sprintf (buf, "%s/", logdfldir);
	isodelogpath = strdup (buf);

	tai_size();

	if ((fp = fopen (pptailor, "r")) == NULL)
		err_abrt (RP_FIO,
			"Lib/init_tai.c: Cannot open tailor file '%s'",
			 pptailor);

	while (getlines (buf, sizeof buf, fp) != NULL) {
		if (buf[0] == '\0' || buf[0] == COMMENTCHAR || buf[0] == '\n')
			continue;
		PP_DBG (("tailor line='%s'", buf));
		if ((ac = sstr2arg (buf, MAXTAIARGS, args, " \t,")) == NOTOK)
			err_abrt (RP_MECH,
				"Lib/init_tai.c: too many tailor parameters");

		if (ac <= 1)
			continue;

		if (sys_tai (ac, args) == OK)
			continue;

		done = 0;
		if (pf != 0) {
			for (pfc = 0 ; pf[pfc] != 0 ; pfc++)
				if ((*pf[pfc]) (ac, args) == OK) {
					done = 1;
					break;
				}
		}
		if (!done && lexequ (rname, args[0]) == 0) {
			PP_TRACE (("Adding tailor %s for %s",
					args[1], rname));
			sys_tai (ac - 1, &args[1]);
		}
	}

	(void) fclose (fp);

	pp_tailor_export ();
	return OK;
}




/* ---------------------  Static  Routines  ------------------------------- */




static void pp_tailor_export ()
{
	extern char	*cmddfldir, *chndfldir, *formdfldir,
			*quedfldir, *aquedir, *mquedir, *tquedir,
			*ppdbm, *wrndfldir;
	extern char	*dupfpath();
	char		buf[BUFSIZ];


	if (isodelogpath)
		free (isodelogpath);

#if ISODE >= 62
	isodexport (NULLCP);
#else
	isodexport ();
#endif
	(void) sprintf (buf, "%s/", logdfldir);
	isodelogpath = strdup (buf);

	chndfldir		= dupfpath (cmddfldir, chndfldir);
	formdfldir		= dupfpath (cmddfldir, formdfldir);
/*	aquedir			= dupfpath (quedfldir, aquedir);
	mquedir			= dupfpath (quedfldir, mquedir);
	tquedir			= dupfpath (quedfldir, tquedir); */
	ppdbm			= dupfpath (tbldfldir, ppdbm);
	wrndfldir		= dupfpath (tbldfldir, wrndfldir);
	pp_log_export ();
}




static char	*getlines (bp, size, fp)
char	*bp;
int	size;
FILE	*fp;
{
	char *p;
	int count, n, c;

	p = bp;			/* leave bp pointing to start */
	count = size;

	while (1) {		/* loop until end of folding */
		if (fgets (p, count, fp) == NULL) {	/* get one line */
			if (p != bp)
				return bp;	/* input on previous lines */
			else return NULL;
		}
		n = strlen (p) - 1;		/* not including new line */
		count -= n;
		p += n;
		*p = '\0';	/* null over new line character */
				/* this relies on the leading space/tab on following
				folded lines to separate next parameter */

		while (1) {	/* look at first char on next line */
			ungetc ( (c = getc(fp)), fp);
			if (c == COMMENTCHAR) {
				/* to allow for comment WITHIN folded line */
				/* rather than allocate another buffer ... */
				if (fgets (p, count, fp) == NULL) {
					/* Can't happen. Still... */
					if (p != bp)
						return bp;
					else return NULL;
				}
				else {
					/* throw it away */
					*p = '\0';
				}
			}
			else {
				break;
			}
		}

		if (c != ' ' && c != '\t')	/* not folded */
			return bp;

		/* folded - carry on looking */
		if (count <= 0)			/* no room ! */
			return bp;
	}
}


/* -- gets the tailor file size so that the correct memory is allocated -- */

static void tai_size()
{
	struct stat		st_rec;

	if (stat (pptailor, &st_rec) == NOTOK)
		pptailor_size = BUFSIZ;
	else pptailor_size = st_rec.st_size;
}