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 >
C/C++ Source or Header  |  1996-07-12  |  4KB  |  215 lines

  1. #include    <stdio.h>
  2. //#include    <iostream.h>
  3. #include    <string.h>
  4. #include    "token.h"
  5.  
  6. char errormessage[1024];
  7.  
  8. static inline int iskanji(char c)
  9. {
  10.  
  11.     if ((0x80 <= (unsigned char) c && (unsigned char) c <= 0x9f)
  12.      || (0xe0 <= (unsigned char) c && (unsigned char) c <= 0xfc)) {
  13.         return TRUE;
  14.      }
  15.      return FALSE;
  16. }
  17.  
  18. static const int BUFFERSIZE = 1024*4;
  19.  
  20. static const char    IndependentSet[] = "{}(),;/*";
  21.  
  22. int    TokenReader::FileReadCheck( void )
  23. {
  24.     if ( size == 0 ) {
  25.         if ( !continueflag || tokenreadfp == NULL || tokenreadbuffer == NULL) {
  26.             return FALSE ;
  27.         }
  28.         size = fread( tokenreadbuffer, 1, BUFFERSIZE, tokenreadfp );
  29.         if ( size != BUFFERSIZE ) {
  30.             continueflag = FALSE ;
  31.         } else {
  32.             ungetc( tokenreadbuffer[BUFFERSIZE] = getc( tokenreadfp ), tokenreadfp );
  33.         }
  34.         readpointer = tokenreadbuffer;
  35.         if ( size == 0 )
  36.             return FALSE ;
  37.     }
  38.     return TRUE ;
  39. }
  40.  
  41. TokenReader::~TokenReader()
  42. {
  43.     if (tokenreadbuffer != NULL) {
  44.         delete[] tokenreadbuffer;
  45.         tokenreadbuffer = NULL;
  46.     }
  47.     if ( tokenreadfp != NULL ) {
  48.         fclose( tokenreadfp );
  49.         tokenreadfp = NULL;
  50.     }
  51. }
  52.  
  53. TokenReader::TokenReader( char *filename )
  54. {
  55.     InString = '\0';
  56.     tokenreadbuffer = new char[BUFFERSIZE+1];
  57.     if ((tokenreadfp = fopen( filename, "rb" ) ) == NULL ) {
  58.         return;
  59.     }
  60.     continueflag = TRUE ;
  61.     size = 0;
  62.     if ( FileReadCheck() == 0 )
  63.     {
  64.         fclose( tokenreadfp );
  65.         tokenreadfp = NULL;
  66.         return;
  67.     }
  68.     strcpy(nowname, filename);
  69.     nowline = 0;
  70.     return;
  71. }
  72.  
  73. void TokenReader::commentout(void)
  74. {
  75.     while (1) {
  76.         if (0 <= *readpointer && *readpointer <= ' ') {
  77.             if (*readpointer == '\n') {
  78.                 nowline++;
  79.             }
  80.             readpointer++;
  81.             --size;
  82.             if ( !FileReadCheck() )
  83.             {
  84.                 return;
  85.             }
  86. #if 0
  87.         } else if (*readpointer == '/' && readpointer[1] == '*') {
  88.             readpointer++;
  89.             --size;
  90.             if ( !FileReadCheck() )
  91.             {
  92.                 return;
  93.             }
  94.             while (*readpointer != '*' || readpointer[1] != '/') {
  95.                 if (*readpointer == '\n') {
  96.                     nowline++;
  97.                 }
  98.                 readpointer++;
  99.                 --size;
  100.                 if ( !FileReadCheck() )
  101.                 {
  102.                     return;
  103.                 }
  104.             }
  105. #endif
  106.         } else {
  107.             break;
  108.         }
  109.     }
  110. }
  111.  
  112. int    TokenReader::GetToken( char *buf )
  113. {
  114.     char *buffer = buf;
  115.     int inkanji = FALSE;
  116.  
  117.     if (!FileReadCheck()) {
  118.         *buf = '\0';
  119.         return 0 ;
  120.     }
  121.  
  122.     commentout();
  123.  
  124.     if (!FileReadCheck()) {
  125.         *buf = '\0';
  126.         return 0 ;
  127.     }
  128.  
  129.     if (iskanji(*readpointer)) {
  130.         inkanji = TRUE;
  131.     }
  132.     *buf++ = *readpointer++ ;
  133.     --size ;
  134.     if ( !FileReadCheck())
  135.     {
  136.         *buf = '\0';
  137.         return 1 ;
  138.     }
  139.  
  140.     if ( strchr( IndependentSet, *(buf-1) ) )
  141.     {
  142.         *buf = '\0';
  143.         return 1 ;
  144.     }
  145.  
  146.     if ( *(buf-1) == '\'' || *(buf-1) == '"' ) {
  147.         InString = *(buf-1);
  148.     }
  149.     while ( InString || (*readpointer > ' ' || *readpointer < 0)) {
  150.         if ( *readpointer == InString ) {
  151.             InString = '\0';
  152.         } else if ( *readpointer == '\'' || *readpointer == '"' )
  153.             InString = *readpointer;
  154. #if 0
  155.         if (!InString && !inkanji
  156.           && ( (strchr( IndependentSet, *readpointer ) != NULL)
  157.             || ( *readpointer == '/' && *(readpointer+1) == '*'))) {
  158. #else
  159.         if (!InString && !inkanji
  160.           && strchr( IndependentSet, *readpointer ) != NULL) {
  161. #endif
  162.             break;
  163.         }
  164.         if (inkanji) {
  165.             inkanji = FALSE;
  166.         } else if (iskanji(*readpointer)) {
  167.             inkanji = TRUE;
  168.         }
  169.         *buf++ = *readpointer++ ;
  170.         --size ;
  171.         if ( !FileReadCheck() ) {
  172.             break;
  173.         }
  174.     }
  175.     *buf = '\0';
  176.     return (int)(buf - buffer) ;
  177. }
  178.  
  179. int TokenReader::GetLine(char *buf)
  180. {
  181.     char *p = buf;
  182.     while (*readpointer != '\n') {
  183.         *p++ = *readpointer++;
  184.         size--;
  185.         if ( !FileReadCheck() )
  186.         {
  187.             break;
  188.         }
  189.     }
  190.     nowline++;
  191.     readpointer++;
  192.     size--;
  193.     *p = '\0';
  194.     return (int)(p - buf);
  195. }
  196.  
  197. char    *TokenReader::GetFileName(void)
  198. {
  199.     return nowname;
  200. }
  201.  
  202. int        TokenReader::GetFileLine(void)
  203. {
  204.     return nowline;
  205. }
  206.  
  207. int TokenReader::Suceed(void)
  208. {
  209.     if (tokenreadfp == NULL) {
  210.         return FALSE;
  211.     }
  212.     return TRUE;
  213. }
  214.  
  215.