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