build.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1989 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* University Copyright- Copyright (c) 1982, 1986, 1988
* The Regents of the University of California
* All Rights Reserved
*
* University Acknowledgment- Portions of this document are derived from
* software developed by the University of California, Berkeley, and its
* contributors.
*/
#include <stdio.h>
#define LIBDIR "charlib" /* files found in *fontdir/LIBDIR */
/*
*
* These variables are used to save and later restore the post-processor's
* environment.
*
*/
int ohpos;
int ovpos;
int ofont;
int osize;
int env = 0; /* nonzero if environment is saved */
extern int hpos;
extern int vpos;
extern int font;
extern int size;
extern char *fontdir;
extern char devname[];
extern FILE *tf;
#define oput(n) putc(n, tf)
/*****************************************************************************/
newfile(name, size)
char *name; /* start reading from this file */
int size; /* may use it to get the file */
{
FILE *fp;
FILE *charfile();
/********************************************************************
* *
* Used when we want to take the post-processor's input from *
* a different file for a while. Added to handle problems with the *
* new logos, but it could easily be used to define other special *
* characters. *
* *
********************************************************************/
if ( env || (fp = charfile(name, size)) == NULL )
return(1);
save_env();
nconv(fp);
restore_env();
fclose(fp);
return(0);
} /* End of newfile */
/*****************************************************************************/
FILE *charfile(name, size)
char *name; /* start reading from this file */
int size; /* size of the character to print */
{
char path[100]; /* file pathname put here */
FILE *fp; /* file pointer for *path */
/********************************************************************
* *
* First tries to open file *name.size in the right directory, *
* and if it can't then it tries *name. Returns the file pointer *
* or NULL if either file can't be opened. *
* *
********************************************************************/
sprintf(path, "%s/dev%s/%s/%s.%d", fontdir, devname, LIBDIR, name, size);
if ( (fp = fopen(path, "r")) == NULL ) {
sprintf(path, "%s/dev%s/%s/%s", fontdir, devname, LIBDIR, name);
fp = fopen(path, "r");
} /* End if */
return(fp);
} /* End of charfile */
/*****************************************************************************/
save_env()
{
/********************************************************************
* *
* Before we start reading from a different file we'll want *
* to save the values of the variables that will be needed to get *
* back to where we were. *
* *
********************************************************************/
hflush();
ohpos = hpos;
ovpos = vpos;
ofont = font;
osize = size;
env = 1;
} /* End of save_env */
/*****************************************************************************/
restore_env()
{
/********************************************************************
* *
* Hopefully does everything needed to get the post-processor *
* back to where it was before the input was diverted. *
* *
********************************************************************/
hgoto(ohpos);
vgoto(ovpos);
setfont(ofont);
setsize(osize);
env = 0;
} /* End of restore_env */
/*****************************************************************************/
nconv(fp)
FILE *fp; /* new file we're reading from */
{
int ch; /* first character of the command */
int c, n; /* used in reading chars from *fp */
char str[100]; /* don't really need this much room */
/********************************************************************
* *
* A restricted and slightly modified version of the conv() *
* routine found in all of troff's post-processors. It should only *
* be used to interpret the special character building files found *
* in directory *fontdir/LIBDIR. *
* *
********************************************************************/
while ( (ch = getc(fp)) != EOF ) {
switch ( ch ) {
case 'w': /* just ignore these guys */
case ' ':
case '\n':
case 0:
break;
case 'c': /* single ASCII character */
put1(getc(fp));
break;
case 'C': /* special character */
fscanf(fp, "%s", str);
put1s(str);
break;
case 'h': /* relative horizontal motion */
fscanf(fp, "%d", &n);
hmot(n);
break;
case 'v':
fscanf(fp, "%d", &n);
vmot(n);
break;
case 'x': /* device control - font change only */
fscanf(fp, "%s", str);
if ( str[0] == 'f' ) {
fscanf(fp, "%d %s", &n, str);
loadfont(n, str, "");
} /* End if */
break;
case 's': /* set point size */
fscanf(fp, "%d", &n);
setsize(t_size(n));
break;
case 'f': /* use this font */
fscanf(fp, "%s", str);
setfont(t_font(str));
break;
case 'b':
fscanf(fp, "%d", &n);
oput(n);
break;
case 'W':
fscanf(fp, "%d", &n);
putint(n);
break;
case '#': /* comment */
while ( (c = getc(fp)) != '\n' && c != EOF ) ;
break;
} /* End switch */
} /* End while */
} /* End of nconv */
/*****************************************************************************/