147 lines
4.1 KiB
C
147 lines
4.1 KiB
C
//
|
|
// 行列 單字 轉碼程式
|
|
//
|
|
// 李傅魁 1998/03/15
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include "resource.h"
|
|
|
|
#define CharSize 2 //for unicode file format
|
|
|
|
typedef struct {
|
|
DWORD root;
|
|
WORD china;
|
|
} ROOTINFO;
|
|
|
|
|
|
int cvtword(char *FileName,char *OutName,DWORD *line)
|
|
{
|
|
FILE *fin;
|
|
FILE *fout;
|
|
BYTE buffer;
|
|
WORD temp;
|
|
ROOTINFO code;
|
|
int i;
|
|
|
|
*line =1;
|
|
|
|
// open input file
|
|
if((fin = fopen(FileName,"rb")) ==NULL)
|
|
return IDS_ERROPENFILE;
|
|
fread(&temp,CharSize,1,fin); // for unicode header
|
|
|
|
// open output file
|
|
if((fout=fopen(OutName,"wb"))==NULL)
|
|
{
|
|
fclose(fin);
|
|
return IDS_ERRCREATEFILE;
|
|
}
|
|
|
|
|
|
while(fread(&temp,1,CharSize,fin))
|
|
{
|
|
code.root=0;
|
|
code.china=0;
|
|
|
|
if (temp!=' ') //每列第一字為空白字元時,該列即為註解列
|
|
{
|
|
// get code
|
|
i=0;
|
|
do {
|
|
if(temp==' ') break;
|
|
if (temp>255) //error format
|
|
{
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return IDS_ERRFORMATROOT;
|
|
}
|
|
buffer=(BYTE)temp;
|
|
if(buffer>='a' && buffer<='z') buffer-=('a'-'A'); //upcase
|
|
|
|
// 字根轉編碼
|
|
if(buffer>='A' && buffer<='Z')
|
|
buffer=buffer-'A'+5;
|
|
else
|
|
switch(buffer)
|
|
{
|
|
case ',': buffer=1; break;
|
|
case '.': buffer=2; break;
|
|
case '/': buffer=3; break;
|
|
case ';': buffer=4; break;
|
|
default:
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return IDS_ERRFORMATROOT;
|
|
|
|
}
|
|
code.root <<= 5;
|
|
code.root |= (DWORD)buffer;
|
|
i++;
|
|
} while (fread(&temp,1,CharSize,fin));
|
|
|
|
if (i>5 || code.root==0) // to many roots!
|
|
{
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return IDS_ERRFORMATROOTS;
|
|
}
|
|
else
|
|
code.root <<= (5-i)*5;
|
|
|
|
// cut space char
|
|
while(fread(&temp,1,CharSize,fin))
|
|
if(temp!=' ') break;
|
|
|
|
if(feof(fin))
|
|
{
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return IDS_ERRFORMATCODE;
|
|
}
|
|
|
|
if(temp<=255)
|
|
for(i=0;i<4;i++)
|
|
{
|
|
buffer=(BYTE)temp;
|
|
if(buffer>'Z') buffer-=('a'-'A');
|
|
|
|
if( (buffer>'9' && buffer<'A') ||
|
|
buffer<'0' || buffer>'F' )
|
|
{
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return IDS_ERRFORMATCODE;
|
|
}
|
|
|
|
code.china<<=4;
|
|
if(buffer>='A') code.china|=(buffer-'A'+10);
|
|
else code.china|=(buffer-'0');
|
|
if(!fread(&temp,1,CharSize,fin))
|
|
{
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return IDS_ERRFORMATCODE;
|
|
}
|
|
|
|
}
|
|
else
|
|
code.china=temp;
|
|
|
|
if(code.china<255) return IDS_ERRFORMATCODE;
|
|
fwrite (&code,1,sizeof(ROOTINFO),fout); // write to output file
|
|
|
|
}
|
|
|
|
while(temp!=0x000a) // goto end of line ...
|
|
if(!fread(&temp,1,CharSize,fin))
|
|
break;
|
|
(*line) ++;
|
|
}
|
|
|
|
fclose(fin);
|
|
fclose(fout);
|
|
return 0;
|
|
}
|