4.4BSD/usr/src/contrib/dipress/src/bin/ipmetrics/generic.c

Compare this file to the similar file:
Show the results in this format:

/*
 * Copyright (c) 1984, 1985, 1986 Xerox Corp.
 *
 *  create Generic font files
 *
 * HISTORY
 * 03-Sep-86  Lee Moore (lee) at Xerox Webster Research Center
 *	Created from tex.c .
 *
 * 11-Feb-86  Lee Moore (lee) at Xerox Webster Research Center
 *	Added the creation of an extra text file which contains information
 *	on how to access characters in other character-sets than zero (0).
 *
 * 15-Dec-85  Lee Moore (lee) at Xerox Webster Research Center
 *	Created.
 *
 */

#include <stdio.h>
#include <math.h>
#include "stack.h"
#include "token.h"
#include "config.h"
#include "ipmetrics.h"
#include "generic.h"

#define TRUE	1
#define FALSE	0

#define public
#define private	static

extern unsigned char **getvector();

public char *malloc();

public char *DeviceName,
	    *LibraryDirectory;

public
CleanUpGeneric(configChain)
    struct FontConfig *configChain; {
	struct FontConfig *p;

	WriteGenericInstallFile(configChain);
	WriteGenericCleanUpFile(configChain);

	for( p = configChain; p != NULL; p = p->Next )
		if( !p->SeenFlag )
			printf("couldn't find: %s/%s/%s\n",
				p->FontPt1, p->FontPt2, p->FontPt3);
}


private
WriteGenericInstallFile(configChain)
    struct FontConfig *configChain; {
	FILE *installFile;
	struct FontConfig *p;

	if( (installFile = fopen(INSTALLNAME, "w")) == NULL ) {
	    fprintf(stderr, "can't open the file 'install' for writing\n");
	    return; }

	fprintf(installFile, "#! /bin/sh\n");
	fprintf(installFile, "if test ! -d %s/fonts/%s\n", LibraryDirectory, DeviceName);
	fprintf(installFile, "  then\n");
	fprintf(installFile, "    mkdir %s/fonts/%s\n", LibraryDirectory, DeviceName);
	fprintf(installFile, "  fi\n");
	fprintf(installFile, "if test ! -d %s/fonts/%s/generic\n", LibraryDirectory, DeviceName);
	fprintf(installFile, "  then\n");
	fprintf(installFile, "    mkdir %s/fonts/%s/generic\n", LibraryDirectory, DeviceName);
	fprintf(installFile, "  fi\n");


	for( p = configChain; p != NULL; p = p->Next )
		if( p->SeenFlag )
	    		fprintf(installFile, "cp %s.generic %s/fonts/%s/generic\n",
				p->TargetName, LibraryDirectory, DeviceName);

	fprintf(installFile, "cd %s/fonts/%s/generic\n", LibraryDirectory,
			DeviceName);
	(void) fclose(installFile);
	(void) chmod(INSTALLNAME, 0755); }


/*
 * write a file that rm's all the files created by this program
 */

private
WriteGenericCleanUpFile(configChain)
    struct FontConfig *configChain; {
	FILE *cleanupFile;
	struct FontConfig *p;

	if( (cleanupFile = fopen(CLEANUPNAME, "w")) == NULL ) {
	    fprintf(stderr, "can't open the file 'cleanup' for writing\n");
	    return; }

	fprintf(cleanupFile, "#! /bin/sh\n");

	for( p = configChain; p != NULL; p = p->Next )
		if( p->SeenFlag )
	    		fprintf(cleanupFile, "rm %s.generic\n", p->TargetName);

	fprintf(cleanupFile, "rm %s\n", CLEANUPNAME);
	fprintf(cleanupFile, "rm %s\n", INSTALLNAME);
	(void) fclose(cleanupFile);
	(void) chmod(CLEANUPNAME, 0755); }


PerGenericFont(configChain, fontDescVec)
struct FontConfig *configChain;
unsigned char *fontDescVec; {
	unsigned char *charMetricsProperty,
		      *width,
		      **array;
	char *fontName[40],
	     metricFileName[40];
	FILE *descFile;
	struct FontConfig *p;
	int n,
	    depth;
	double xWidth;

	if( !GetFontNameProperty(fontDescVec, fontName) ) {
		fprintf(stderr, "ipmetrics: can't get font name\n");
		return;
	}

	if( (charMetricsProperty = GetStringProp("characterMetrics", fontDescVec))
			== NULL ) {
		printf("ipmetrics: can't find 'characterMetrics' property\n");
		return;	}

	for( p = configChain; p != NULL; p = p->Next ) {
		if( !(strcmp(p->FontPt1,  fontName[0]) == 0 &&
			    strcmp(p->FontPt2,  fontName[1]) == 0 &&
			    strcmp(p->FontPt3,  fontName[2]) == 0) )
			continue;

		(void) sprintf(metricFileName, "%s.generic", p->TargetName);

		if( (descFile = fopen(metricFileName, "w")) == NULL ) {
			printf("ipmetrics: can't open %s for writing\n", metricFileName);
			return;}
	
		p->SeenFlag = TRUE;
	
		fprintf(descFile, "# %s/%s/%s for Interpress device %s\n", p->FontPt1, p->FontPt2, p->FontPt3, DeviceName);

		fprintf(descFile, "# for interpress device '%s'\n", DeviceName);
		fprintf(descFile, "#\n");
		fprintf(descFile, "# character\n");
		fprintf(descFile, "#   index\twidth\n");
		fprintf(descFile, "# (decimal)\t(ems)\n");

		if( gettype(charMetricsProperty) != type_vector ) {
			printf("ipmetrics: characterMetrics not a vector\n");
			return;}

		if( getsubtype(charMetricsProperty) != subtype_general ) {
			printf("ipmetrics: characterMetrics subtype != general\n");
			return;}

		if( (depth = getdepth(charMetricsProperty)) & 01 ) {
			printf("ipmetrics: characterMetrics vector is odd length\n");
			return;}

		array = getvector(charMetricsProperty);

		for (n = 0; n < depth; n += 2 ) {
			if( ! checktype(array[n], type_number, subtype_integer)) {
				printf("ipmetrics: property of incorrect type\n");
				return;}

			if( (width = GetStringProp("widthX", array[n+1])) == NULL ){
				printf("ipmetrics: can't find widthX property");
				continue;}

			if( gettype(width) != type_number ) {
				printf("width not of type number\n");
				continue;}

			if( getsubtype(width) != subtype_rational ) {
				printf("ipmetrics: width not of type rational\n");
				continue;}

			xWidth = ((float) getnumerator(width)) / ((float) getdenominator(width));
			fprintf(descFile, "%8d\t%7.5f\n", getint(array[n]), xWidth);
		}

		free((char *) array);


		(void) fclose(descFile); }
}