#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define KETASUU (4)
#define _SLOAD (13)
#define _SPLAY (23)
#define _GLOAD (33)
#define _GDRAW (43)
#define _GX (53)
#define _GY (63)
#define _GZ (73)
#define _BR (81)
#define _WAIT (92)
#define _GO (102)
#define _SIZE (112)
#define _COLOR (125)
#define _TX (132)
#define _TY (142)
#define _FLAG (154)
#define DUMMY ( 0)
#define BUFFER_SIZE (0xFFFF)
FILE *read_fp, *write_fp;
char readFile[] = "txt.txt";
char writeFile[20];
double org_atol(BYTE *buf)
{
double ret = (double)0;
for(; *buf != '\0'; buf++)
ret = ret * (double)10 + (double)*buf - (double)'0';
return( ret );
}
BYTE *StrA2a(BYTE *buf)
{
for(; ;)
{
if((*buf < 'a' || 'z' < *buf) && (*buf < 'A' || 'Z' < *buf))
break;
if('A' <= *buf && *buf <= 'Z')
*buf += 0x20;
buf++;
}
return( buf );
}
BYTE *Get09AZ(BYTE *b, BYTE *ret)
{
char c1, c2;
for(; ;)
{
if(*b != ' ')
break;
b++;
}
StrA2a(b);
c1 = '0';
c2 = '9';
if(*b < c1 || c2 < *b)
{
c1 = 'a';
c2 = 'z';
}
for(; ;)
{
if(*b < c1 || c2 < *b)
break;
*(ret++) = *(b++);
}
*ret = '\0';
return( b );
}
int CheckStrLen(char *str)
{
int i;
for(i = 0; str[i] != '\0'; i++)
;
return( i );
}
bool CheckStr2(BYTE *st1, char *st2)
{
int i, len;
len = CheckStrLen(st2);
for(i = 0; i < len; i++)
if(st1[i] != st2[i])
{
if(st1[i] == st2[i] + 0x20 && 'a' <= st1[i] && st1[i] <= 'z' && 'A' <= st2[i] && st2[i] <= 'Z');
else if(st1[i] + 0x20 == st2[i] && 'A' <= st1[i] && st1[i] <= 'Z' && 'a' <= st2[i] && st2[i] <= 'z');
else return( false );
}
return( true );
}
BYTE *GetStr2(BYTE *org, BYTE *toc, int word)
{
int i;
for(i = 0; i < word; i++)
toc[i] = org[i];
toc[word] = '\0';
return( toc );
}
char *org_itoa(int kazu, char *ret_moji, int retu, char c)
{
int i;
for(i = 0; i < retu; i++)
ret_moji[i] = c;
for(i = retu - 1; i > 0; i--)
{
ret_moji[i] = '0' + kazu % 10;
if(kazu - 10 < 0)
break;
kazu /= 10;
}
return( ret_moji );
}
char *nameCreate(long int no, char *name, int retu, char *c)
{
int i = 0;
org_itoa(no, name, retu, '0');
name[retu] = '.';
for(; ;)
{
name[retu+i+1] = c[i];
i++;
if(c[i-1] == '\0')
break;
}
return( name );
}
BYTE *wwmsg(BYTE *r, BYTE *w)
{
for(; ;)
{
if(*r == '\n')
break;
if(CheckStr2(r, "<br>"))
{
*(w++) = _BR;
*(w++) = DUMMY;
r += 4;
}
else
{
*(w++) = *(r + 1);
*(w++) = *r;
r += 2;
}
}
return( w );
}
BYTE *text_flag(BYTE *r, BYTE *w)
{
WORD u;
DWORD ud;
int i;
BYTE mode = NULL;
BYTE command[21];
r = Get09AZ(r, command);
if(CheckStr2(command, "br")) mode = _BR;
else if(CheckStr2(command, "go")) mode = _GO;
else if(CheckStr2(command, "wait")) mode = _WAIT;
else if(CheckStr2(command, "sload")) mode = _SLOAD;
else if(CheckStr2(command, "splay")) mode = _SPLAY;
else if(CheckStr2(command, "gload")) mode = _GLOAD;
else if(CheckStr2(command, "gdraw")) mode = _GDRAW;
else if(CheckStr2(command, "gx")) mode = _GX;
else if(CheckStr2(command, "gy")) mode = _GY;
else if(CheckStr2(command, "gz")) mode = _GZ;
else if(CheckStr2(command, "size")) mode = _SIZE;
else if(CheckStr2(command, "color")) mode = _COLOR;
else if(CheckStr2(command, "tx")) mode = _TX;
else if(CheckStr2(command, "ty")) mode = _TY;
else if(CheckStr2(command, "flag")) mode = _FLAG;
if(mode == NULL)
return( NULL );
*(w++) = mode;
*(w++) = DUMMY;
if((mode % 10 == 2) || (mode % 10 == 3))
{
r = Get09AZ(r, command);
u = (WORD)org_atol(command);
*(w++) = (u % 0x00FF);
*(w++) = (u / 0x0100);
}
if((mode % 10 == 3) || (mode % 10 == 5))
{
r = Get09AZ(r, command);
ud = (DWORD)org_atol(command);
*(w++) = (BYTE)(ud % 0xFF);
*(w++) = (BYTE)((ud / 0x00000100) % 0xFF);
*(w++) = (BYTE)((ud / 0x00010000) % 0xFF);
*(w++) = (BYTE)((ud / 0x01000000) % 0xFF);
}
if((mode % 10 == 4))
for(i = 0; i < u + 1; i++)
{
r = Get09AZ(r, command);
u = (WORD)org_atol(command);
*(w++) = (u % 0x00FF);
*(w++) = (u / 0x0100);
for(; ! ((0x81 <= *r && *r <= 0x9f) || (0xe0 <= *r && *r <= 0xfc)); r++);
w = wwmsg(r, w);
for(; *r != '\n'; r++);
r++;
}
return( w );
}
void main(void)
{
long int i;
long int fileCount = 0;
long int size;
char ch;
BYTE line[1001];
BYTE *r;
BYTE read_buf[BUFFER_SIZE];
BYTE *w;
BYTE write_buf[BUFFER_SIZE];
if(NULL == (read_fp = fopen(readFile, "rb")))
{
printf(" Not find. : %s", readFile);
getchar();
exit(1);
}
for(; ;)
{
for(i = 0; i < BUFFER_SIZE; i++)
{
read_buf[i] = 0;
write_buf[i] = 0;
}
r = read_buf;
for(; ;)
{
ch = fgetc(read_fp);
for(i = 0; (i < 1000) && (feof(read_fp) == 0) && (ch != '\r'); i++)
{
line[i] = (BYTE)ch;
ch = fgetc(read_fp);
}
ch = fgetc(read_fp);
line[i] = ch;
if((line[0] == '*'))
goto LOOP_EXIT;
if((line[0] == ':'))
{
*(r++) = ':';
*(r++) = ':';
*(r++) = ':';
break;
}
else
for(i = 0; ; i++)
{
if(line[i] == '\n' || line[i] == '\r')
{
*(r++) = '\n';
break;
}
else
*(r++) = line[i];
}
}
r = read_buf;
w = write_buf;
for(; ;)
{
if((0x81 <= *r && *r <= 0x9f) || (0xe0 <= *r && *r <= 0xfc))
w = wwmsg(r, w);
else if(*r == '<')
{
if(NULL == (w = text_flag(++r, w)))
goto ErrInn;
}
else if(*r != '\n')
{
ErrInn:
printf("Error %ld: %c(%d) in Block %ld", (long)(r - read_buf), (char)*r, (int)*r, fileCount);
getchar();
exit(1);
}
for(; *r != '\n'; r++);
r++;
if(*r == ':')
break;
}
*(w++) = 'E';
*(w++) = 'N';
*(w++) = 'D';
for(size = 0; ; size++)
if(write_buf[size] == 'E' && write_buf[size+1] == 'N' && write_buf[size+2] == 'D')
break;
if(NULL == (write_fp = fopen(nameCreate(fileCount, writeFile, 4, "tex"), "wb")))
{
printf("Don't open : %s", writeFile);
getchar();
exit(1);
}
fwrite(write_buf, size, 1, write_fp);
fclose(write_fp);
fileCount++;
}
LOOP_EXIT:
fclose(read_fp);
printf("Complete!!");
getchar();
}