gcs7.c

0000/*********************************************
0001
0002 Simple Vector Font
0003
0004********************************************/
0005
0006#include <stdio.h>
0007#include <string.h>
0008#include <iconv.h>
0009#include "gcs7.h"
0010#include <gdbm.h>
0011
0012FILE *fontIDX=0;
0013FILE *fontDAT;
0014extern int *myfonts;
0015extern int nmyfonts;
0016extern void fatal_func();
0017
0018/*******************************************
0019 input : one character (ASCII or SHIFT-JIS)
0020*******************************************/
0021int getVF16s(char *s,unsigned char a[])
0022{
0023  int i,posIDX,posDAT;
0024  int ch;
0025  int k1,k2,k3,k4;
0026  char s2[5];
0027  GDBM_FILE dbf=NULL;
0028  datum dt1;
0029  datum dt2;
0030
0031  if(fontIDX==0){
0032    fontIDX=fopen("/var/gcs/KFONT16.IDX","rb");
0033    fontDAT=fopen("/var/gcs/KFONT16.DAT","rb");
0034  }
0035  if(strlen(s)==1){ /* ascii code */
0036    posIDX=s[0];
0037    posIDX&=0xff;
0038    posIDX*=4;
0039  }
0040  else{ /* shift-jis */
0041    strcpy(s2,s);
0042    k2=s2[1];
0043    k2&=0xff; // MSB
0044    k3=s2[0];
0045    k3&=0xff; // LSB
0046    if(k2>0x9f) k2-=0x40;
0047    k1=k2*0x100+k3;
0048
0049    k4=k1;
0050    if(k3>0x7f) k4--;
0051 
0052    k4=k4-0x44*(k2-0x81)-0x8040;
0053    posIDX=k4*4;
0054  }
0055  k4=posIDX/4;
0056  for(i=0;i<nmyfonts;i++) if(k4==myfonts[i]) break;
0057  if(i==nmyfonts){
0058    fsetpos(fontIDX,(fpos_t *)&posIDX);
0059    fread(&posDAT,sizeof(int),1,fontIDX);
0060    fsetpos(fontDAT,(fpos_t *)&posDAT);
0061    i=0;
0062    while((ch=fgetc(fontDAT))!=EOF){
0063      a[i++]=ch;
0064      if(ch==0xff) break;
0065    }
0066  }
0067  else{
0068    dbf=gdbm_open("/var/gcs/d036",512,GDBM_READER,0666,fatal_func);
0069    dt1.dptr=(void *)&myfonts[i];
0070    dt1.dsize=sizeof(int);
0071    dt2=gdbm_fetch(dbf,dt1);
0072    for(i=0;i<dt2.dsize;i++) a[i]=*((char *)dt2.dptr+i);
0073    i=dt2.dsize;
0074    free(dt2.dptr);
0075    gdbm_close(dbf);
0076  }
0077  return i;
0078}
0079
0080/*******************************************
0081 input : one character (ASCII or UTF-8)
0082*******************************************/
0083int getVF16u(char *s,unsigned char a[])
0084{
0085  int i,posIDX,posDAT;
0086  int ch;
0087  int k1,k2,k3,k4;
0088  iconv_t cd;
0089  char s1[5],s2[5];
0090  size_t inleft,outleft;
0091  GDBM_FILE dbf=NULL;
0092  datum dt1;
0093  datum dt2;
0094
0095  if(fontIDX==0){
0096    fontIDX=fopen("/var/gcs/KFONT16.IDX","rb");
0097    fontDAT=fopen("/var/gcs/KFONT16.DAT","rb");
0098  }
0099  if(strlen(s)==1){ /* ascii code */
0100    posIDX=s[0];
0101    posIDX&=0xff;
0102    posIDX*=4;
0103  }
0104  else{ /* utf-8 */
0105    strcpy(s1,s);
0106    inleft=strlen(s1);
0107    outleft=4;
0108    cd=iconv_open("SHIFT-JIS","UTF-8");
0109    iconv(cd,(char **)&s1,&inleft,(char **)&s2,&outleft);
0110    iconv_close(cd);
0111    k2=s2[1];
0112    k2&=0xff; // MSB
0113    k3=s2[0];
0114    k3&=0xff; // LSB
0115    if(k2>0x9f) k2-=0x40;
0116    k1=k2*0x100+k3;
0117
0118    k4=k1;
0119    if(k3>0x7f) k4--;
0120 
0121    k4=k4-0x44*(k2-0x81)-0x8040;
0122    posIDX=k4*4;
0123  }
0124  k4=posIDX/4;
0125  for(i=0;i<nmyfonts;i++) if(k4==myfonts[i]) break;
0126  if(i==nmyfonts){
0127    fsetpos(fontIDX,(fpos_t *)&posIDX);
0128    fread(&posDAT,sizeof(int),1,fontIDX);
0129    fsetpos(fontDAT,(fpos_t *)&posDAT);
0130    i=0;
0131    while((ch=fgetc(fontDAT))!=EOF){
0132      a[i++]=ch;
0133      if(ch==0xff) break;
0134    }
0135  }
0136  else{
0137    dbf=gdbm_open("/var/gcs/d036",512,GDBM_READER,0666,fatal_func);
0138    dt1.dptr=(void *)&myfonts[i];
0139    dt1.dsize=sizeof(int);
0140    dt2=gdbm_fetch(dbf,dt1);
0141    for(i=0;i<dt2.dsize;i++) a[i]=*((char *)dt2.dptr+i);
0142    i=dt2.dsize;
0143    free(dt2.dptr);
0144    gdbm_close(dbf);
0145  }
0146  return i;
0147}
0148
0149/*******************************************
0150 input : one character (font number)
0151*******************************************/
0152int getVF16n(int k,unsigned char a[])
0153{
0154  int i,posIDX,posDAT;
0155  int ch;
0156  GDBM_FILE dbf=NULL;
0157  datum dt1;
0158  datum dt2;
0159
0160  if(fontIDX==0){
0161    fontIDX=fopen("/var/gcs/KFONT16.IDX","rb");
0162    fontDAT=fopen("/var/gcs/KFONT16.DAT","rb");
0163  }
0164  posIDX=k*4;
0165  for(i=0;i<nmyfonts;i++) if(k==myfonts[i]) break;
0166  if(i==nmyfonts){
0167    fsetpos(fontIDX,(fpos_t *)&posIDX);
0168    fread(&posDAT,sizeof(int),1,fontIDX);
0169    fsetpos(fontDAT,(fpos_t *)&posDAT);
0170    i=0;
0171    while((ch=fgetc(fontDAT))!=EOF){
0172      a[i++]=ch;
0173      if(ch==0xff) break;
0174    }
0175  }
0176  else{
0177    dbf=gdbm_open("/var/gcs/d036",512,GDBM_READER,0666,fatal_func);
0178    dt1.dptr=(void *)&myfonts[i];
0179    dt1.dsize=sizeof(int);
0180    dt2=gdbm_fetch(dbf,dt1);
0181    for(i=0;i<dt2.dsize;i++) a[i]=*((char *)dt2.dptr+i);
0182    i=dt2.dsize;
0183    free(dt2.dptr);
0184    gdbm_close(dbf);
0185  }
0186  return i;
0187}
0188
0189/*******************************************
0190 utf-8 string to font number array
0191*******************************************/
0192int u8tofn(char *s,int *f)
0193{
0194  int i,j,k,k1,k2,k3,k4;
0195  iconv_t cd;
0196  char s1[400];
0197  char *sp,*sp1;
0198  size_t inleft,outleft;
0199
0200  cd=iconv_open("SHIFT-JIS","UTF-8");
0201  j=strlen(s);
0202  inleft=j;
0203  i=0;
0204  sp=s;
0205  sp1=s1;
0206  outleft=400;
0207  iconv(cd,&sp,&inleft,&sp1,&outleft);
0208  j=400-outleft;
0209  k=0;
0210  for(i=0;i<j;i++){
0211    if(((unsigned char)s1[i])<0x7f) f[k]=s1[i];
0212    else{
0213      k2=s1[i]; // MSB
0214      k3=s1[i+1]; // LSB
0215      k2&=0xff;
0216      k3&=0xff;
0217      if(k2>0x9f) k2-=0x40;
0218      k4=k2*0x100+k3;
0219      if(k3>0x7f) k4--;
0220      f[k]=k4-0x44*(k2-0x81)-0x8040;
0221      i++;
0222    }
0223    k++;
0224  }
0225  f[k]=0;
0226  iconv_close(cd);
0227}
0228