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 p

⟦ed3ca0d7c⟧ TextFile

    Length: 2390 (0x956)
    Types: TextFile
    Names: »parse_hdr.c«

Derivation

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

TextFile

/* parse_hdr: attempt to parse a header file */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/822-local/RCS/parse_hdr.c,v 5.0 90/09/20 15:45:02 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Chans/822-local/RCS/parse_hdr.c,v 5.0 90/09/20 15:45:02 pp Exp Locker: pp $
 *
 * $Log:	parse_hdr.c,v $
 * Revision 5.0  90/09/20  15:45:02  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "util.h"
#include "expand.h"
#include "loc.h"

extern void	compress();

parse_hdr (fd, vars, maxvp)
int	fd;
Expand	vars[];
int	maxvp;
{
	FILE	*fp;
	Symbol	*sp;
	char	*name, *contents;
	int	vp = 0;

	PP_TRACE (("parse_hdr (%d, vars, %d)", fd, maxvp));

	fp = fdopen (dup(fd), "r");

	while (hdr_read (fp, &name, &contents) == OK) {
		if ((sp = lookup (name)) != NULL && sp -> type == field) {
			if (vp >= maxvp)
				adios (NULLCP, "More than %s variables!",
				       maxvp);
			if (contents == NULLCP)
				contents = "";
			if (sp -> str && *sp -> str) {
				char *cp;
				int i;

				cp = smalloc (strlen (sp -> str) +
					      strlen (contents) + 2);
				strcpy (cp, sp -> str);
				strcat (cp, " ");
				strcat (cp, contents);
				free (sp -> str);
				sp -> str = cp;
				for (i = 0; i < vp; i++)
					if (lexequ (vars[i].macro, name) == 0) {
						vars[i].expansion = sp -> str;
						break;
					}
				if (i >= vp) {
					vars[vp].macro = strdup (name);
					vars[vp++].expansion = sp -> str;
				}
			}
			else {
				sp -> str = strdup (contents);
				vars[vp].macro = strdup (name);
				vars[vp++].expansion = sp -> str;
			}
		}
	}
	fclose (fp);
	return vp;
}

hdr_read (fp, np, cp)
FILE	*fp;
char	**np, **cp;
{
	int	c;
	char	buf[8192], *p;

	PP_TRACE (("hdr_read (fp, np, cp)"));

	*cp = NULLCP;
	*np = buf;

	for (p = buf; (c = getc (fp)) != EOF;) {
		if (c == '\n') {
			if ((c = getc(fp)) == ' ' || c == '\t')
				continue;
			else {
				ungetc (c, fp);
				break;
			}
		}
		else if (c == ':' && *cp == NULLCP) {
			*cp = p + 1;
			*p++ = '\0';
			continue;
		}
		*p++ = c;
	}
	if (c == EOF && p == buf)
		return DONE;
	else if (p == buf)
		return DONE;

	*p = 0;
	compress (buf, buf);
	compress (*cp, *cp);

	for (p = *np; *p; p++)
		if (isupper(*p))
			*p = tolower (*p);

	for (p = *cp; *p; p++)
		if (isupper (*p))
			*p = tolower (*p);
	PP_TRACE (("hdr_read field=%s contents=%s", *np, *cp));
	return OK;
}