ftp.nice.ch/pub/next/text/tex/library/TeX.fonts.d.tar.gz#/tex-font/xhershey/parse.c

This is parse.c in view mode; [Download] [Up]

#include	<stdio.h>
#include	<ctype.h>
#include	"parse.h"

static char	copyright[]	= "Copyright (C) Ken Yap 1988";

static char	zerostring[]	= "0";
static char	onestring[]	= "1";
charinfo	global		= {
	-1, -1,
	onestring, onestring,
	};
charinfo	perchar;

static char *skipblanks(p)
	char		*p;
{
	while (isspace(*p) || *p == ',')	/* , is also space */
		++p;
	return (p);
}

static char *skipnonblanks(p)
	char		*p;
{
	while (*p != '\0' && !(isspace(*p) || *p == ','))
		++p;
	return (p);
}

static char *skippast(p, c)
	char		*p, c;
{
	while (*p != '\0' && *p != c)
		++p;
	return (*p == c ? p + 1 : p);
}

static int match(p, word)
	char		*p, *word;
{
	register int	l;

	l = strlen(word);
	return (strncmp(p, word, l) == 0);
}

static int getparams(p, ci)
	char		*p;
	charinfo	*ci;
{
	if (*p == '\'')			/* collect ascii index */
	{
		if (*++p != '\\')
			ci->asciiindex = (int)*p;
		else if (*++p == '\\')
			ci->asciiindex = (int)*p;
		else if (sscanf(p, "%o", &ci->asciiindex) != 1)
		{
			(void)fprintf(stderr, "Bad char index spec %s", p);
			return (0);
		}
		p = skippast(p+1, ',');
		p = skipblanks(p);
		if (!isdigit(*p))
		{
			(void)fprintf(stderr, "Missing Hershey index %s", p);
			return (0);
		}
		ci->hersheyindex = atoi(p);
		p = skippast(p, ',');
	}
	else if (isdigit(*p))
	{
		if (*p == '0')
		{
			if (sscanf(p, "%o", &ci->asciiindex) != 1)
			{
				(void)fprintf(stderr, "Bad char index spec %s", p);
				return (0);
			}
		}
		else
		{
			if (sscanf(p, "%d", &ci->asciiindex) != 1)
			{
				(void)fprintf(stderr, "Bad char index spec %s", p);
				return (0);
			}
		}
		p = skippast(p+1, ',');
		p = skipblanks(p);
		if (!isdigit(*p))
		{
			(void)fprintf(stderr, "Missing Hershey index %s", p);
			return (0);
		}
		ci->hersheyindex = atoi(p);
		p = skippast(p, ',');
	}
	p = skipblanks(p);
	while (*p != '\0')
	{
		if (match(p, "hoff"))
		{
			p = skippast(p, '=');
			p = skipblanks(p);
			ci->hoff = p;
		}
		if (match(p, "voff"))
		{
			p = skippast(p, '=');
			p = skipblanks(p);
			ci->voff = p;
		}
		if (match(p, "hratio"))
		{
			p = skippast(p, '=');
			p = skipblanks(p);
			ci->hratio = p;
		}
		if (match(p, "vratio"))
		{
			p = skippast(p, '=');
			p = skipblanks(p);
			ci->vratio = p;
		}
		p = skipnonblanks(p);
		if (*p != '\0')
		{
			*p = '\0';
			p = skipblanks(p+1);
		}
	}
	return (1);
}

int parsespecs(line)
	char		*line;
{
	register int	l;
	register char	*p;
	char		*malloc();

	line = skipblanks(line);
	if (*line == '\'')
	{
		perchar = global;		/* copy globals */
		return (getparams(line, &perchar));
	}
	else
	{
		l = strlen(line) + 1;
		if ((p = malloc(l)) == NULL)
		{
			perror("malloc");
			exit(1);
		}
		(void)strcpy(p, line);
		if (!getparams(p, &global))
			(void)fprintf(stderr, "Bad global spec %s", line);
		return (0);
	}
	/*NOTREACHED*/
}

#ifdef	STANDALONE
main()
{
	char		line[256];

	while (fgets(line, sizeof(line), stdin) != NULL)
		parsespecs(line);
	exit(0);
}
#endif	STANDALONE

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.