home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
PASM.LZH
/
TOKEN.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-12
|
4KB
|
215 lines
#include <stdio.h>
//#include <iostream.h>
#include <string.h>
#include "token.h"
char errormessage[1024];
static inline int iskanji(char c)
{
if ((0x80 <= (unsigned char) c && (unsigned char) c <= 0x9f)
|| (0xe0 <= (unsigned char) c && (unsigned char) c <= 0xfc)) {
return TRUE;
}
return FALSE;
}
static const int BUFFERSIZE = 1024*4;
static const char IndependentSet[] = "{}(),;/*";
int TokenReader::FileReadCheck( void )
{
if ( size == 0 ) {
if ( !continueflag || tokenreadfp == NULL || tokenreadbuffer == NULL) {
return FALSE ;
}
size = fread( tokenreadbuffer, 1, BUFFERSIZE, tokenreadfp );
if ( size != BUFFERSIZE ) {
continueflag = FALSE ;
} else {
ungetc( tokenreadbuffer[BUFFERSIZE] = getc( tokenreadfp ), tokenreadfp );
}
readpointer = tokenreadbuffer;
if ( size == 0 )
return FALSE ;
}
return TRUE ;
}
TokenReader::~TokenReader()
{
if (tokenreadbuffer != NULL) {
delete[] tokenreadbuffer;
tokenreadbuffer = NULL;
}
if ( tokenreadfp != NULL ) {
fclose( tokenreadfp );
tokenreadfp = NULL;
}
}
TokenReader::TokenReader( char *filename )
{
InString = '\0';
tokenreadbuffer = new char[BUFFERSIZE+1];
if ((tokenreadfp = fopen( filename, "rb" ) ) == NULL ) {
return;
}
continueflag = TRUE ;
size = 0;
if ( FileReadCheck() == 0 )
{
fclose( tokenreadfp );
tokenreadfp = NULL;
return;
}
strcpy(nowname, filename);
nowline = 0;
return;
}
void TokenReader::commentout(void)
{
while (1) {
if (0 <= *readpointer && *readpointer <= ' ') {
if (*readpointer == '\n') {
nowline++;
}
readpointer++;
--size;
if ( !FileReadCheck() )
{
return;
}
#if 0
} else if (*readpointer == '/' && readpointer[1] == '*') {
readpointer++;
--size;
if ( !FileReadCheck() )
{
return;
}
while (*readpointer != '*' || readpointer[1] != '/') {
if (*readpointer == '\n') {
nowline++;
}
readpointer++;
--size;
if ( !FileReadCheck() )
{
return;
}
}
#endif
} else {
break;
}
}
}
int TokenReader::GetToken( char *buf )
{
char *buffer = buf;
int inkanji = FALSE;
if (!FileReadCheck()) {
*buf = '\0';
return 0 ;
}
commentout();
if (!FileReadCheck()) {
*buf = '\0';
return 0 ;
}
if (iskanji(*readpointer)) {
inkanji = TRUE;
}
*buf++ = *readpointer++ ;
--size ;
if ( !FileReadCheck())
{
*buf = '\0';
return 1 ;
}
if ( strchr( IndependentSet, *(buf-1) ) )
{
*buf = '\0';
return 1 ;
}
if ( *(buf-1) == '\'' || *(buf-1) == '"' ) {
InString = *(buf-1);
}
while ( InString || (*readpointer > ' ' || *readpointer < 0)) {
if ( *readpointer == InString ) {
InString = '\0';
} else if ( *readpointer == '\'' || *readpointer == '"' )
InString = *readpointer;
#if 0
if (!InString && !inkanji
&& ( (strchr( IndependentSet, *readpointer ) != NULL)
|| ( *readpointer == '/' && *(readpointer+1) == '*'))) {
#else
if (!InString && !inkanji
&& strchr( IndependentSet, *readpointer ) != NULL) {
#endif
break;
}
if (inkanji) {
inkanji = FALSE;
} else if (iskanji(*readpointer)) {
inkanji = TRUE;
}
*buf++ = *readpointer++ ;
--size ;
if ( !FileReadCheck() ) {
break;
}
}
*buf = '\0';
return (int)(buf - buffer) ;
}
int TokenReader::GetLine(char *buf)
{
char *p = buf;
while (*readpointer != '\n') {
*p++ = *readpointer++;
size--;
if ( !FileReadCheck() )
{
break;
}
}
nowline++;
readpointer++;
size--;
*p = '\0';
return (int)(p - buf);
}
char *TokenReader::GetFileName(void)
{
return nowname;
}
int TokenReader::GetFileLine(void)
{
return nowline;
}
int TokenReader::Suceed(void)
{
if (tokenreadfp == NULL) {
return FALSE;
}
return TRUE;
}