Files
cdesktop/cde/programs/dtudcfonted/libfuty/oakfuty.c
2021-10-08 17:30:48 +09:00

1420 lines
29 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: oakfuty.c /main/12 1996/11/11 10:55:57 drk $ */
/*
* (c) Copyright 1995 FUJITSU LIMITED
* This is source code modified by FUJITSU LIMITED under the Joint
* Development Agreement for the CDEnext PST.
* This is unpublished proprietary source code of FUJITSU LIMITED
*/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifndef SVR4
#if !defined( SYSV )
#include <sys/resource.h>
#endif
#include <sys/wait.h>
#else
#include <sys/mman.h>
#include <wait.h>
#endif
#include <unistd.h>
#include <sys/stat.h>
#include <signal.h>
#include <fcntl.h>
#include "bdfgpf.h"
#include "udcutil.h"
static void exline(char *sp, char *dbuf, int sw, int dw);
char *oakgtobdf;
char *bdftosnf = BDFTOSNF;
char *bdftopcf;
static int put_file_create_err_msg = 0;
#define DEVICE_FAIL 2
#define WRITE_FAIL 3
#define OPEN_FAIL 4
#define READ_FAIL 5
int
ReadBdfHeader(struct btophead *head, char *buf)
{
char *p;
unsigned int getstat = 0;
if (NULL == fgets(buf, BUFSIZE, head->input)) {
return(BDF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p)
if (strncmp(p, STARTFONT, STARTFONTsz)) {
return(BDF_INVAL);
}
while( 1 ) {
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return (BDF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p)
if (!strncmp(p, SIZE, SIZEsz)) {
if ((sscanf(p, "SIZE %f%d",
&(head->bdf_point), &(head->bdf_xdpi))) != 2) {
return(BDF_INVAL);
}
getstat |= 0x01;
} else if (!strncmp(p, FONTBOUNDINGBOX, FONTBOUNDINGBOXsz)) {
if (sscanf(p, "FONTBOUNDINGBOX %d%d%d%d",
&(head->bdf_width), &(head->bdf_height),
&(head->bdf_x), &(head->bdf_y)) != 4) {
return BDF_INVAL;
}
getstat |= 0x02;
} else if (!strncmp(p, CHARS, CHARSsz)) {
if ((sscanf(p, "CHARS %d", &(head->num_chars))) != 1) {
return(BDF_INVAL);
}
getstat |= 0x04;
} else if (!strncmp(p, STARTCHAR, STARTCHARsz)) {
break;
}
}
if (getstat != 0x07) {
return(BDF_INVAL);
}
return 0;
}
int
ReadGpfHeader(struct ptobhead *head, char *buf)
{
char *p;
unsigned int getstat = 0;
while(1) {
if (getstat == 0x07) break;
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return GPF_INVAL;
}
p = buf;
SCAN_TO_NONSP(p)
if (!strncmp(p, NUMFONTS, NUMFONTSsz)) {
if (sscanf(p, "numfonts:%d", &(head->num_chars)) != 1) {
return(GPF_INVAL);
}
getstat |= 0x01;
} else if (!strncmp(p, WIDTH, WIDTHsz)) {
if (sscanf(p, "width:%d", &(head->p_width)) != 1) {
return(GPF_INVAL);
}
getstat |= 0x02;
} else if (!strncmp(p, HEIGHT, HEIGHTsz)) {
if (sscanf(p, "height:%d", &(head->p_height)) != 1) {
return(GPF_INVAL);
}
getstat |= 0x04;
}
}
return 0;
}
int
WriteBdfHeader( struct ptobhead *head )
{
FILE *fp;
int fd[2];
unsigned int getstat;
char buf[BUFSIZE], *p;
pid_t chld_pid = 0;
#if defined( SVR4 ) || defined( SYSV ) || defined(CSRG_BASED) || defined(__linux__)
int chld_stat ;
#else
union wait chld_stat ;
#endif
if (head->snf_file != NULL) {
if (pipe(fd) != 0) {
return PIPE_ERROR;
}
switch (chld_pid = fork()) {
case 0:
close(1);
if(dup(fd[1]) < 0) {
return(DUP_ERROR);
}
close(fd[0]);
close(fd[1]);
execl( oakgtobdf, oakgtobdf, head->snf_file, 0);
return EXEC_ERROR;
case -1:
return(FORK_ERROR);
default:
break;
}
close(fd[1]);
if((fp = (FILE *)fdopen(fd[0], "r")) == NULL) {
close( fd[0] );
kill( chld_pid, SIGKILL );
WaitID( chld_pid, chld_stat ) ;
return FDOPEN_ERROR;
}
} else {
if ((fp = fopen(head->bdf_file, "r")) == NULL) {
return(BDF_OPEN_HEAD);
}
}
getstat = 0;
while ( 1 ) {
if (fgets(buf, BUFSIZE, fp) == NULL) {
fclose( fp );
if (head->snf_file != NULL) {
kill( chld_pid, SIGKILL );
WaitID( chld_pid, chld_stat ) ;
}
return(BDF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p);
if (!strncmp(p, CHARS, CHARSsz)) {
fclose( fp );
if (head->snf_file != NULL) {
kill( chld_pid, SIGKILL );
WaitID( chld_pid, chld_stat ) ;
}
break;
}
fprintf(head->output, "%s", buf);
if (!strncmp(p, SIZE, SIZEsz)) {
if ((sscanf(p, "SIZE %f%d",
&(head->bdf_point), &(head->bdf_xdpi))) != 2) {
fclose(fp);
if (head->snf_file != NULL) {
kill( chld_pid, SIGKILL );
WaitID( chld_pid, chld_stat ) ;
}
return(BDF_INVAL);
}
getstat |= 0x01;
continue;
}
if (!strncmp(p, FONTBOUNDINGBOX, FONTBOUNDINGBOXsz)) {
if ( sscanf( p, "FONTBOUNDINGBOX %d%d%d%d",
&(head->bdf_width),
&(head->bdf_height),
&(head->bdf_x),
&(head->bdf_y)) != 4
) {
fclose(fp);
if (head->snf_file != NULL) {
kill( chld_pid, SIGKILL );
WaitID( chld_pid, chld_stat ) ;
}
return BDF_INVAL;
}
getstat |= 0x02;
continue;
}
get_charset_registry(head, p) ;
}
if (getstat != 0x03) {
return BDF_INVAL;
}
return 0;
}
void
WriteGpfHeader( struct btophead *head )
{
fprintf(head->output, "numfonts:%d\n", head->num_chars);
fprintf(head->output, "width:%d\n", head->p_width );
fprintf(head->output, "height:%d\n", head->p_height );
}
int
WritePtnToBdf( struct ptobhead *head )
{
int msize, swidth, rtn, i, nchar;
char *zoomptn;
int bbw, bbh, bbx, bby, dw ;
char glyph_name[BUFSIZE] ;
nchar = head->num_chars;
put_default_chars(head, nchar, rtn) ;
if (head->zoomf) {
msize = ((head->bdf_width + 7) / 8) * head->bdf_height;
if ((zoomptn = (char *)malloc(msize)) == NULL) {
return(MALLOC_ERROR);
}
}
for (i=0; i<head->num_chars; i++) {
sprintf( glyph_name, "%x", head->code[i]);
swidth = (head->bdf_width * 72270)/((int)(head->bdf_point * (float)head->bdf_xdpi));
dw = head->bdf_width ;
bbw = head->bdf_width ;
bbh = head->bdf_height ;
bbx = head->bdf_x ;
bby = head->bdf_y ;
fprintf(head->output, "STARTCHAR %s\n", glyph_name );
fprintf(head->output, "ENCODING %d\n", head->code[i]);
fprintf(head->output, "SWIDTH %d 0\n", swidth );
fprintf(head->output, "DWIDTH %d 0\n", dw );
fprintf(head->output, "BBX %d %d %d %d\n", bbw, bbh, bbx, bby );
fprintf(head->output, "BITMAP\n");
if (head->zoomf) {
if ((rtn = PtnZoom(zoomptn, head->ptn[i], head->p_width,
head->p_height, head->bdf_width, head->bdf_height))) {
return(rtn);
}
if( (rtn = PutBdfPtn(zoomptn, head->bdf_width,
head->bdf_height, head->output))) {
return(rtn);
}
} else {
if( (rtn = PutBdfPtn(head->ptn[i],
head->bdf_width, head->bdf_height, head->output))) {
return(rtn);
}
}
fprintf(head->output, "ENDCHAR\n");
free(head->ptn[i]);
}
fprintf(head->output, "ENDFONT\n");
return(0);
}
int
putDefaultChars( struct ptobhead *head )
{
int swidth, bytew, i, j;
unsigned int posbit ;
unsigned char *ptnbuf, *ptnbuf2 ;
unsigned char tmp;
put_default_encode( head ) ;
swidth = (head->bdf_width * 72270)/((int)(head->bdf_point * (float)head->bdf_xdpi));
fprintf(head->output, "SWIDTH %d 0\n", swidth);
fprintf(head->output, "DWIDTH %d 0\n", head->bdf_width);
fprintf( head->output, "BBX %d %d %d %d\n", head->bdf_width, head->bdf_height, head->bdf_x, head->bdf_y );
fprintf(head->output, "BITMAP\n");
bytew = (head->bdf_width + 7) / 8;
if ((ptnbuf = (unsigned char *)malloc(bytew * 2)) == NULL) {
return(MALLOC_ERROR);
}
put_default_bitmap(head, bytew, posbit, i, j, ptnbuf, ptnbuf2, tmp) ;
fprintf(head->output, "ENDCHAR\n");
free(ptnbuf);
return 0;
}
int
WritePtnToGpf( struct btophead *head )
{
int msize, rtn, i;
char *zoomptn;
if (head->zoomf) {
msize = ((head->p_width + 7) / 8) * head->p_height;
if ((zoomptn = (char *)malloc(msize)) == NULL) {
return(MALLOC_ERROR);
}
}
for (i=0; i<head->num_chars; i++) {
if ( head->code[i] > 0xff ) {
fprintf(head->output, "code:0x%x\n", SHIFT_ON(head->code[i]) );
} else {
fprintf(head->output, "code:0x%x\n", head->code[i]);
}
if (head->zoomf) {
if ((rtn = PtnZoom(zoomptn, head->ptn[i], head->bdf_width,
head->bdf_height, head->p_width, head->p_height))) {
return(rtn);
}
if ((rtn = PutGpfPtn(zoomptn, head->p_width,
head->p_height, head->output))) {
return(rtn);
}
} else {
if ((rtn = PutGpfPtn(head->ptn[i],
head->bdf_width, head->bdf_height, head->output))) {
return(rtn);
}
}
free(head->ptn[i]);
}
fprintf(head->output, "enddata\n");
return(0);
}
int
ReadBdfToMemory(struct btophead *head, char *buf)
{
int code, mwidth, num_char, bsize, rtn;
char *ptn;
num_char = 0;
mwidth = (head->bdf_width + 7) / 8;
bsize = mwidth * head->bdf_height;
while(1) {
if ((rtn = GetBdfCode(head, buf, &code)) < 0) {
return(rtn); /* contain BDF_INVAL */
} else if (rtn == FILE_END) {
head->num_chars = num_char;
break;
}
if ( ( code > head->end_code )
|| ( code < head->start_code )
|| ( !IN_CODE( head->code_category, SHIFT_ON( code ) ) )
|| COMM_ISDEFAULTCHAR( code )
) {
continue;
}
head->code[num_char] = code;
if ( ( ptn = head->ptn[num_char++] = (char *)malloc( bsize ) ) == NULL ) {
return(MALLOC_ERROR);
}
if ((rtn = GetBdfPtn(head, buf, ptn, mwidth, bsize)) != 0) {
return(rtn);
}
}
return(0);
}
int
ReadBdfToMemory_with_init(
struct btophead *head,
int init_start,
int init_end,
char *buf)
{
int code, mwidth, num_char, bsize, rtn;
char *ptn;
num_char = 0;
mwidth = (head->bdf_width + 7) / 8;
bsize = mwidth * head->bdf_height;
while(1) {
if ((rtn = GetBdfCode(head, buf, &code)) < 0) {
return(rtn); /* contain BDF_INVAL */
} else if (rtn == FILE_END) {
head->num_chars = num_char;
break;
}
if ( ( code > head->end_code )
|| ( code < head->start_code )
|| ( !IN_CODE( head->code_category, SHIFT_ON( code ) ) )
|| ( ( code >= init_start ) && ( code <= init_end ) )
|| COMM_ISDEFAULTCHAR( code )
) {
continue;
}
head->code[num_char] = code;
if ((ptn = head->ptn[num_char++] =
(char *)malloc(bsize)) == NULL) {
return(MALLOC_ERROR);
}
if ((rtn = GetBdfPtn(head, buf, ptn, mwidth, bsize)) != 0) {
return(rtn);
}
}
return(0);
}
int
GetBdfCode(
struct btophead *head,
char *buf,
int *code
)
{
char *p;
while(1) {
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return (BDF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p)
if (!strncmp(p, ENDFONT, ENDFONTsz)) {
return(FILE_END);
}
if (!strncmp(p, ENCODING, ENCODINGsz)) {
if ((sscanf(p, "ENCODING %d", code)) != 1) {
return(BDF_INVAL);
}
break;
}
}
return(0);
}
int
GetBdfPtn(
struct btophead *head,
char *buf,
char *ptn,
int mwidth,
int bsize)
{
int skip, i, j;
char *p;
while(1) {
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return (BDF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p)
if (!strncmp(p, BITMAP, BITMAPsz)) {
break;
}
}
ptn[bsize - 1] = 0;
for (i=0, skip=0; i<head->bdf_height; i++) {
if (skip) {
for(j=0; j<mwidth; j++) {
ptn[j] = 0;
}
ptn += mwidth;
continue;
}
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return (BDF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p);
if (!strncmp(p, ENDCHAR, ENDCHARsz)) {
skip = 1;
for(j=0; j<mwidth; j++) {
ptn[j] = 0;
}
ptn += mwidth;
continue;
}
GetBdfLinePtn(ptn, buf, head->bdf_width);
ptn += mwidth;
}
return(0);
}
int
ReadGpfToMemory(struct ptobhead *head, char *buf)
{
int code, mwidth, num_char, bsize, rtn;
char *ptn;
num_char = 0;
mwidth = (head->p_width + 7) / 8;
bsize = mwidth * head->p_height;
while(1) {
if ((rtn = GetGpfCode(head, buf, &code)) < 0) {
return(rtn); /* contain GPF_INVAL */
} else if (rtn == FILE_END) {
head->num_chars = num_char;
break;
}
if ( ( code > head->end_code )
|| (code < head->start_code )
|| ( !IN_CODE( head->code_category, SHIFT_ON( code ) ) )
|| COMM_ISDEFAULTCHAR( code )
) {
continue;
}
head->code[num_char] = code;
if ((ptn = head->ptn[num_char++] =
(char *)malloc(bsize)) == NULL) {
return(MALLOC_ERROR);
}
if ((rtn = GetGpfPtn(head, buf, ptn, mwidth, bsize)) != 0) {
return(rtn);
}
}
return(0);
}
int
GetGpfCode(struct ptobhead *head, char *buf, int *code)
{
char *p;
while(1) {
p = buf;
SCAN_TO_NONSP(p)
if (!strncmp(p, ENDDATA, ENDDATAsz)) {
return(FILE_END);
}
if (!strncmp(p, CODE, CODEsz)) {
*code = (int)strtol(buf+CODEsz, NULL, 0);
CONVGLYPHINDEX( *code ) ;
break;
}
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return (GPF_INVAL);
}
}
return(0);
}
int
GetGpfPtn(
struct ptobhead *head,
char *buf,
char *ptn,
int mwidth,
int bsize
)
{
int skip, i, j;
char *p;
for (i=0, skip=0; i<head->p_height; i++) {
if (skip) {
for (j=0; j<mwidth; j++) {
ptn[j] = 0;
}
ptn += mwidth;
continue;
}
if (fgets(buf, BUFSIZE, head->input) == NULL) {
return (GPF_INVAL);
}
p = buf;
SCAN_TO_NONSP(p);
if ((!strncmp(p, CODE, CODEsz)) ||
(!strncmp(p, ENDDATA, ENDDATAsz))) {
skip = 1;
for (j=0; j<mwidth; j++) {
ptn[j] = 0;
}
ptn += mwidth;
continue;
}
GetGpfLinePtn(ptn, buf, head->p_width);
ptn += mwidth;
}
return(0);
}
void
GetBdfLinePtn(char *mem, char *buf, int width)
{
int i, iend, len;
char *p, str[3];
str[2] = 0;
SCAN_TO_NONSP(buf);
iend = (width + 3) / 4;
if ((len = strlen(buf)) < iend) {
p = buf+len;
for (i=0; i<(iend-len); i++) {
*p++ = '0';
}
*p ='\0';
}
for (i=0; i<iend/2; i++) {
str[0] = *buf++;
str[1] = *buf++;
*mem++ = (char)strtol(str, NULL, 16);
}
if (iend%2) {
str[0] = *buf;
str[1] = 0;
*mem = (char)strtol(str, NULL, 16) << 4;
}
}
void
GetGpfLinePtn(char *mem, char *buf, int width)
{
unsigned int skip, i, iend, j;
unsigned char ptn;
SCAN_TO_NONSP(buf);
iend = (width + 7) / 8;
for (i=0, skip=0; i<iend; i++) {
if (skip) {
*mem++ = 0;
continue;
}
for (j=0, ptn = 0; j<8; j++) {
if ((*buf == '\n') || (*buf == 0)) {
skip = 1;
ptn <<= (8-j);
break;
}
if (j) ptn <<= 1;
if (*buf == '0') {
ptn |= 1;
}
buf++;
}
*mem++ = ptn;
}
}
int
PutBdfPtn(unsigned char *ptn, int width, int height, FILE *fp)
{
int i, j, nbyte ;
unsigned char *pbuf, x, c;
static unsigned char *buf=NULL;
if (buf==NULL) {
buf = (unsigned char *)malloc(width*height+2);
if ( buf == NULL) {
return(MALLOC_ERROR);
}
}
nbyte = (width + 7) / 8;
pbuf=buf;
for(i=0; i<height; i++) {
for (j=0 ; j<nbyte; j++) {
x = *ptn >> 4;
c = (x>=10)? 'a'-0xa : '0';
*pbuf++ = c + x;
x = *ptn++ & 0x0f;
c = (x>=10)? 'a'-0xa : '0';
*pbuf++ = c + x;
}
*pbuf++ = '\n';
}
*pbuf = '\0';
fprintf(fp, "%s", buf);
return(0);
}
int
PutGpfPtn(char *ptn, int width, int height, FILE *fp)
{
int i, j, k, nbyte, tw;
unsigned char p, *pbuf;
static unsigned char *buf=NULL;
if (buf==NULL) {
buf = (unsigned char *)malloc(((width+1)*height)+1);
if ( buf == NULL) {
return(MALLOC_ERROR);
}
}
nbyte = (width + 7) / 8;
pbuf=buf;
for(i=0; i<height; i++) {
for (j=0, tw=width; j<nbyte; j++) {
p = *ptn++;
for (k=0; k<8 && tw>0; k++, tw--) {
if (p & 0x80) {
*pbuf++ = '0';
} else {
*pbuf++ = '-';
}
p = p << 1;
}
}
*pbuf++ = '\n';
}
*pbuf = '\0';
fprintf(fp, "%s", buf);
return(0);
}
int
PtnZoom(char *dmem, char *smem, int sw, int sh, int dw, int dh)
{
int swidth;
int dwidth;
int i, lcnt;
char *dbuf, *sp, *dp;
swidth = (sw + 7) / 8;
dwidth = (dw + 7) / 8;
if ((dbuf = (char *)malloc(dwidth)) == NULL) {
return(MALLOC_ERROR);
}
lcnt = 0;
sp = smem;
dp = dmem;
for(i=0; i < sh; i++) {
lcnt += dh;
if (lcnt >= sh) {
exline(sp, dbuf, sw, dw);
sp += swidth;
lcnt -= sh;
memcpy(dp, dbuf, dwidth);
dp += dwidth;
for (; lcnt >= sh; lcnt -= sh) {
memcpy(dp, dbuf, dwidth);
dp += dwidth;
}
} else {
sp += swidth;
}
}
free(dbuf);
return(0);
}
static void
exline(char *sp, char *dbuf, int sw, int dw)
{
unsigned int i, bit, sval, dval, dcnt, bcnt;
bcnt = dval = 0;
dcnt = 8;
for(i=0; i<sw; i++) {
if (i % 8 == 0) {
sval = *sp++;
}
bit = ((sval & 0x80) ? 1 : 0);
sval <<= 1;
for (bcnt += dw; bcnt >= sw; bcnt -= sw) {
dval = (dval << 1) | bit;
if (--dcnt == 0) {
*dbuf++ = (char)dval;
dval = 0;
dcnt = 8;
}
}
}
if (dcnt != 8) {
dval <<= dcnt;
*dbuf = (char)dval;
}
}
char *
GetTmpPath( char *path )
{
char *p=NULL, *sp, *buf ;
int len ;
struct stat statbuf ;
/* Get directory of temporary file */
if( !(p = (char *)getenv( "TMPDIR" )) ){
p = DEFAULT_TMPPATH ;
}
/* Get memory for temporary file name */
sp = p ;
len = strlen(p) ;
if( *(sp + len -1) == '/' ){
len += (strlen( TEMPFILEKEY ) + 1) ;
}else{
len += (strlen( TEMPFILEKEY ) +1 + 1) ;
}
if ((buf = (char *)malloc( len )) == NULL) {
return NULL;
}
/* Get temporary file path */
strcpy( buf, p ) ;
sp = buf + strlen(buf) -1 ;
if( *sp == '/' ) *sp-- = '\0' ;
sprintf( sp+1, "/%s", TEMPFILEKEY ) ;
/* Get temporary file name */
return mktemp( buf );
}
int
Link_NewFile( char *rd_file, char *wr_file )
{
FILE *rfp, *wfp ;
int i, c ;
int rfd, wfd ;
struct stat statbuf ;
unsigned char bufc ;
char *buf ;
int ismmap = 0 ;
if( stat( wr_file, &statbuf ) == -1 ){
if( (wfd = open( wr_file, O_CREAT | O_WRONLY, 0644 )) == -1 ){
return -1 ;
}
}else{
if( (wfd = open( wr_file, O_WRONLY | O_TRUNC )) == -1 ){
return -1 ;
}
}
if( stat( rd_file, &statbuf ) == -1 ){
close(wfd) ;
return -1 ;
}
if( (rfd = open( rd_file, O_RDONLY )) == -1 ){
close(wfd) ;
return -1 ;
}
#if defined( SVR4 )
if( (buf = (char *)mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, rfd, 0)) == (char *)-1 ){
#endif /* SVR4 */
if( !(buf = (char *)malloc(statbuf.st_size)) ){
close(wfd) ;
close(rfd) ;
return -1 ;
}
if( read(rfd, buf, statbuf.st_size) != statbuf.st_size ){
close(wfd) ;
close(rfd) ;
free(buf) ;
return -1 ;
}
#if defined( SVR4 )
}else{
ismmap = 1 ;
}
#endif /* SVR4 */
close(rfd) ;
if( write(wfd, buf, statbuf.st_size) != statbuf.st_size ){
#if defined( SVR4 )
if( ismmap ){
munmap(buf, statbuf.st_size) ;
}else{
#endif /* SVR4 */
free(buf) ;
#if defined( SVR4 )
}
#endif /* SVR4 */
close(wfd) ;
return (DEVICE_FAIL);
}
#if defined( SVR4 )
if( ismmap ){
munmap(buf, statbuf.st_size) ;
}else{
#endif /* SVR4 */
free(buf) ;
#if defined( SVR4 )
}
#endif /* SVR4 */
close(wfd) ;
return 0 ;
}
int
ChkNumString( char *str )
{
char *tmp;
int num;
num = (int)strtol( str, &tmp, 10 );
if ((num == 0)&&(tmp == str)) {
return(-1);
}
if ((size_t)(tmp - str) != strlen(str)){
return(-1);
}
return( 0 );
}
void
ErrMsgTable_AndExit(
int er_no,
char *snf_in,
char *snf_out,
char *gpf_in,
char *gpf_out,
char *bdf_in,
char *prog_name
)
{
int rtn = 0 ;
switch(er_no) {
case 0:
break;
case BDF_OPEN_IN :
USAGE2("%s : The input font file cannot be opened.\"%s\"\A1\A5\n", prog_name, (snf_in != NULL)? snf_in : "\0" );
rtn = OPEN_FAIL ;
break;
case BDF_OPEN_OUT :
USAGE2("%s : The output font file cannot be opened.\"%s\"\A1\A5\n", prog_name, (snf_out != NULL)? snf_out : "\0" );
rtn = OPEN_FAIL ;
break;
case BDF_READ :
USAGE2("%s : Information from the font file cannot be extracted.\"%s\"\A1\A5 \n", prog_name, (snf_in != NULL) ? snf_in : "\0" );
rtn = READ_FAIL ;
break;
case BDF_WRITE :
USAGE2("%s : It is not possible to write to the font file.\"%s\"\A1\A5\n", prog_name, (snf_out != NULL) ? snf_out : "\0" );
rtn = DEVICE_FAIL ;
break;
case BDF_INVAL :
USAGE2("%s : The format of the font file is illegal.\"%s\"\A1\A5 \n", prog_name, (snf_in != NULL) ? snf_in : "\0" );
rtn = 1 ;
break;
case BDF_OPEN_HEAD :
USAGE2("%s : The BDF file cannot be opened.\"%s\"\A1\A5\n", prog_name, (bdf_in != NULL)? bdf_in : "\0" );
rtn = OPEN_FAIL ;
break;
case BDF_READ_HEAD :
USAGE2("%s : Information of the BDF file cannot be extracted.\"%s\"\A1\A5 \n", prog_name, (bdf_in != NULL) ? bdf_in : "\0" );
rtn = READ_FAIL ;
break;
case GPF_OPEN_IN :
USAGE2("%s : The input character pattern file cannot be opened.\"%s\"\A1\A5\n", prog_name, (gpf_in != NULL) ? gpf_in : "\0" );
rtn = OPEN_FAIL ;
break;
case GPF_OPEN_OUT :
USAGE2("%s : The output character pattern file cannot be opened.\"%s\"\A1\A5\n", prog_name, (gpf_out != NULL) ? gpf_out : "\0" );
rtn = OPEN_FAIL ;
break;
case GPF_READ :
USAGE2("%s : The character pattern file cannot be read.\"%s\"\A1\A5\n", prog_name, (gpf_in != NULL) ? gpf_in : "\0" );
rtn = READ_FAIL ;
break;
case GPF_WRITE :
USAGE2("%s : It is not possible to write to the character pattern file.\"%s\"\A1\A5\n", prog_name, (gpf_out != NULL) ? gpf_out : "\0" );
rtn = DEVICE_FAIL ;
break;
case GPF_INVAL :
USAGE2("%s : The format of the character pattern file is illegal.\"%s\"\A1\A5\n", prog_name, (gpf_in != NULL) ? gpf_in : "\0" );
rtn = 1 ;
break;
default :
fatal_err_msg( er_no, prog_name );
rtn = 1 ;
break;
}
exit(rtn);
}
void
fatal_err_msg(int er_no, char *prog_name)
{
USAGE1("%s : The font file failed to be converted. ", prog_name);
switch( er_no ) {
case MALLOC_ERROR:
USAGE("There is no memory any more.\n");
break;
case FORK_ERROR:
USAGE("The child process cannot be created.\n" );
break;
case EXEC_ERROR:
USAGE("Cannot execute dtgpftobdf.\n" );
break;
case PIPE_ERROR:
USAGE("The pipe buffer cannot be open.\n" );
break;
case DUP_ERROR:
USAGE("The file descripter cannot be duplicated.\n" );
break;
case POPEN_ERROR:
USAGE("The X font compiler cannot be executed.\n" );
break;
case PCLOSE_ERROR:
USAGE("The pipe buffer cannot be close.\n" );
break;
case FDOPEN_ERROR:
USAGE("The file descripter cannot be got.\n" );
break;
case STAT_ERROR:
USAGE("The status of font cannot be got.\n" );
break;
case MKTMP_ERROR:
USAGE("The temporally file cannot be got.\n" );
break;
case PCFFONTC_ERROR:
USAGE("Cannot execute bdftopcf.\n" );
break;
case SNFFONTC_ERROR:
USAGE("Cannot execute bdftosnf.\n" );
break;
default:
USAGE1("Terminates abnormally. ( err_code(%d) )\n", er_no);
break;
}
return;
}
static int sig_flg=0;
#define GPF_BUCK_UP_FAIL 1
#define GPF_MODIFY_FAIL 2
#define RESTORE_FAIL 3
#define CATCH_SIGNAL 10
void
ChatchSig(void)
{
sig_flg = 1;
}
void
Put_File_Create_Err_Msg(
int msg_level,
char *org_name,
char *tmp_name,
char *save_name,
char *com
)
{
switch( msg_level ) {
case GPF_BUCK_UP_FAIL:
USAGE1("%s : Failed to write temporary file. Terminates abnormally.\n", com );
put_file_create_err_msg = DEVICE_FAIL ;
break;
case GPF_MODIFY_FAIL:
USAGE1("%s : Failed in the renewal of the font file. Terminates abnormally.\n", com );
put_file_create_err_msg = WRITE_FAIL ;
break;
case RESTORE_FAIL:
USAGE3("%s : The file before updating cannot be changed to former file name.\tPlease execute the following command after the inquiry the system manager.\n\t mv %s %s\n",
com, save_name, org_name);
put_file_create_err_msg = WRITE_FAIL ;
break;
case CATCH_SIGNAL:
USAGE1("%s : The signal was received. Terminates abnormally.\n", com);
put_file_create_err_msg = 1 ;
break;
}
}
int
Make_NewFefFile(
char *org_name,
char *tmp_name,
mode_t mode,
uid_t owner,
gid_t group,
char *com
)
{
struct stat statbuf;
char *save_name = NULL;
int ret_val;
int msg_level;
int rtn ;
#ifndef SVR4
signal( SIGHUP , (void(*)())ChatchSig);
signal( SIGINT , (void(*)())ChatchSig);
signal( SIGQUIT, (void(*)())ChatchSig);
signal( SIGTERM, (void(*)())ChatchSig);
#else
sigset( SIGHUP , (void(*)())ChatchSig);
sigset( SIGINT , (void(*)())ChatchSig);
sigset( SIGQUIT, (void(*)())ChatchSig);
sigset( SIGTERM, (void(*)())ChatchSig);
#endif
errno = 0;
if (sig_flg || ((save_name = GetTmpPath( org_name )) == NULL)) {
msg_level = (sig_flg) ? CATCH_SIGNAL : GPF_BUCK_UP_FAIL;
Put_File_Create_Err_Msg( msg_level, org_name, tmp_name,
(char *)NULL, com );
Unlink_Tmpfile ( tmp_name, com );
return(put_file_create_err_msg);
}
if (sig_flg || ((rtn=Link_NewFile( org_name, save_name )) != 0)) {
msg_level = (sig_flg) ? CATCH_SIGNAL : GPF_BUCK_UP_FAIL;
Put_File_Create_Err_Msg( msg_level, org_name, tmp_name,
save_name, com );
Unlink_Tmpfile ( save_name, com );
Unlink_Tmpfile ( tmp_name, com );
free(save_name);
return( (put_file_create_err_msg == DEVICE_FAIL)?
put_file_create_err_msg : rtn );
}
if (sig_flg || ((rtn=Link_NewFile( tmp_name, org_name )) != 0)) {
msg_level = (sig_flg) ? CATCH_SIGNAL : GPF_MODIFY_FAIL;
Put_File_Create_Err_Msg( msg_level, org_name, tmp_name,
save_name, com );
if ( (rtn=Link_NewFile( save_name, org_name )) != 0 ) {
Put_File_Create_Err_Msg( RESTORE_FAIL, org_name,
tmp_name, save_name, com );
Unlink_Tmpfile ( tmp_name, com );
} else {
Unlink_Tmpfile ( tmp_name, com );
Unlink_Tmpfile ( save_name, com );
}
free(save_name);
return( (put_file_create_err_msg == DEVICE_FAIL)?
put_file_create_err_msg : rtn );
}
ret_val = 0;
ret_val += Unlink_Tmpfile ( tmp_name, com );
ret_val += Unlink_Tmpfile ( save_name, com );
free(save_name);
return( (ret_val)? 1 : 0 );
}
int
Unlink_Tmpfile(char *file,char *com)
{
errno = 0;
if ( unlink( file ) != 0 ) {
USAGE2("%s : The work file cannot be deleted. Please unlink the following files\tafter the inquiry the system manager.\"%s\" \n", com, file );
return(1);
}
return(0);
}
int
Chmod_File (char *fname, mode_t mode, char *com)
{
errno = 0;
if ( mode == 0 ) return( 0 ) ;
if ( chmod (fname, mode) != 0) {
USAGE3("%s : Failed in the mode change of the following files. Please change the mode to %o\tafter the inquiry the system manager.\"%s\" \n", com, (int)mode, fname );
return( 1 );
}
return( 0 );
}
int
Chown_File (char *fname, uid_t owner, gid_t group, char *com)
{
errno = 0;
if ( chown (fname, owner, group) != 0) {
USAGE2("%s : Failed in setteing of the owner and the group of the following files. \tPlease change to the file of the owner and the group of following ID \tafter the inquiry the system manager.\"%s\"\n", com, fname );
USAGE1("\t\t Owner ID \A1\A7%d\n", (int)owner);
USAGE1("\t\t Group ID \A1\A7%d\n", (int)group);
return( 1 );
}
return( 0 );
}
int
ChkPcfFontFile( char *filename )
{
char *suffix;
if ( !filename ) {
return -1;
}
suffix = ( char * )strrchr( filename, '.' );
if ( !suffix ) {
return -1;
}
return strcmp( PCFSUFFIX, suffix );
}
int
ChkSnfFontFile( char *filename )
{
char *suffix;
if ( !filename ) {
return -1;
}
suffix = ( char * )strrchr( filename, '.' );
if ( !suffix ) {
return -1;
}
return strcmp( SNFSUFFIX, suffix );
}
char *
get_cmd_path(char *path, char *cmd)
{
char *cmd_path = NULL;
struct stat st;
char *end;
char chr_sv;
if ( !path || !cmd ) {
return NULL;
}
for ( ; end = ( char * )strchr( path, ':' ); path = end + 1 ) {
chr_sv = *end;
*end = 0;
AllocString( cmd_path, path, NULL ) ;
*end = chr_sv;
AddString( cmd_path, "/", NULL ) ;
AddString( cmd_path, cmd, NULL ) ;
if ( stat( cmd_path, &st ) == 0 ) {
if( st.st_mode & S_IFREG ) {
cmd_path = realloc( cmd_path, strlen( cmd_path ) + 1 );
return cmd_path;
}
}
FreeString( cmd_path ) ;
}
free(cmd_path);
AllocString( cmd_path, path, NULL ) ;
AddString( cmd_path, "/", NULL ) ;
AddString( cmd_path, cmd, NULL ) ;
if ( stat( cmd_path, &st ) == 0 ) {
if( st.st_mode & S_IFREG ) {
cmd_path = realloc( cmd_path, strlen( cmd_path ) + 1 );
return cmd_path;
}
}
free( cmd_path );
return NULL;
}
int
SetCmdPath(char *com, char **path, char *dflt_path, char *cmd)
{
struct stat statbuf ;
char *pbuf ;
if( stat( dflt_path, &statbuf ) ){
if( !( pbuf = (char *)get_cmd_path( getenv( "PATH" ), cmd )) ){
USAGE2("%s: There is not \"%s\" command in \"PATH\".\n", com, cmd ) ;
return -1 ;
}
if( stat( pbuf, &statbuf ) ){
USAGE2("%s: There is not \"%s\" command.\n", com, cmd ) ;
free(pbuf);
return STAT_ERROR ;
}
if( !(statbuf.st_mode & S_IXUSR) ){
USAGE2("%s: \"%s\" command don't have permission to execute.\n", com, cmd ) ;
free(pbuf);
return STAT_ERROR ;
}
}else{
if( !(statbuf.st_mode & S_IXUSR) ){
USAGE2("%s: \"%s\" command don't have permission to execute.\n", com, cmd ) ;
return STAT_ERROR ;
}
pbuf = dflt_path ;
}
*path = pbuf ;
return 0 ;
}
/*****************************< end of oakfuty.c >************************/