亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tokens.cpp

?? Using the UnderC Tokenizer Class It s often necessary to parse complex text files, where standard
?? CPP
字號:
/* TOKENS.CPP
*/
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#ifdef _MSC_VER
#define _EXPORTING_DLL
#endif

#include "../include/UC/tokens.h"

/// a useful function for extracting a substring
static char *copy_str(char *tok, char *start, char *end)
{
 int sz = (long)end - (long)start;
 strncpy(tok,start,sz);
 tok[sz] = '\0';
 return tok;
}

static long convert_int(char *buff, int base)
{
// *fix 1.2.1 Use 'strtoul' instead of 'strtol' to input ints larger than MAXINT
 char endptr[10];
 long val = strtoul(buff,(char **)&endptr,base);
 return val;
}

// some machines may not have this!
// Written by Kent Irwin, irwin@leland.stanford.edu.
char *strrstr(const char *s1,const char *s2)
{
	const char *sc2, *psc1, *ps1;

	if (*s2 == '\0')
		return (char *)s1;
		
	ps1 = s1 + strlen(s1);
	
	while(ps1 != s1) {
		--ps1;
		for (psc1 = ps1, sc2 = s2; ; )
			if (*(psc1++) != *(sc2++))
				break;
			else if (*sc2 == '\0')
				return (char*)ps1;
	}
	return NULL;
}


static char g_sbuff[STRSIZE];
static char g_obuff[10];
static char g_tbuff[STRSIZE];

//-----------------Tokenizer class------------------------

Tokenizer::Tokenizer(const char *fname)
{
    m_inf = NULL;
    m_file = NULL;
    if(fname) open(fname);
	reset();
	m_flags = 0;
	m_comment = NULL;
	m_search_fn = (SearchFn)&strstr;
}

void Tokenizer::set_str(char *str)
{
  m_start = m_P = m_start_P = str;
}

Tokenizer::~Tokenizer()
{
    close();
}

void Tokenizer::set_flags(int flags)
{
	m_flags = flags;
}

void Tokenizer::set_comment(const char *c)
{
 m_comment = c;
}

bool Tokenizer::open(const char *fname)
{
 close();
 m_inf = fopen(fname,"r");
 m_file = fname;
 *m_buff = 0;
 reset();
 return m_inf != NULL;
}

void Tokenizer::close()
{
    if (m_inf) {
        fclose((FILE*)m_inf);
        m_inf = NULL;
    }
}

void Tokenizer::reset()
{
 m_line = 0;
 set_str(m_buff);
}

bool Tokenizer::fetch_line(bool skipws /*= true*/)
{
 do {
   if (! m_inf) return false;
   fgets(m_buff,LINESIZE,(FILE*)m_inf);
   if (feof((FILE*)m_inf)) return false;
   if (m_flags & STRIP_LINEFEEDS) {
     m_buff[strlen(m_buff)-1] = 0;
   }
   ++m_line;
   if (m_comment) {
     char *pc =  strrstr(m_buff,m_comment);
     if (pc) *pc = 0;
   }
   set_str(m_buff);
   if (skipws) skip_space();
 } while (*m_P == 0);
 return true;
}

char *Tokenizer::get_upto(char ch, bool discard_ch)
// Grab characters from the stream, upto (and optionally including) ch.
{
  bool found_end;
  m_start_P = m_P;
  while(*m_P && *m_P != ch) m_P++;
  found_end = *m_P == ch;
  if (! discard_ch) m_P++;
  m_end_P = m_P;
  if (discard_ch) m_P++;
  if (found_end) {
      return get_str(g_tbuff);
  }
  else return NULL;
}

void Tokenizer::discard_line()
{
 *m_P = 0;
 skip_whitespace();
}

// note: 
// getline() will always trim off a linefeed, even if not present
// called w/ null arguments, will merely skip to the next line.
char* Tokenizer::getline(char* buff /*= NULL*/, int sz /*= 0*/)
{
 if (buff != NULL) {
   strncpy(buff,m_P,sz);
   int end = strlen(buff) - 1;
   if (buff[end] == '\n') buff[end] = 0;
 }
 discard_line();
 return buff;
}

char Tokenizer::getch()
{
  if (*m_P == NULL) fetch_line(false);
  return *m_P++;
}

// back to start of file
void  Tokenizer::rewind()
{
	if (! m_inf) {
       open(m_file);
    } else {
      set_pos(0);
      reset();
    }
}

// file position
long  Tokenizer::pos()
{ return ftell((FILE*)m_inf); }

void  Tokenizer::set_pos(long p)
{ fseek((FILE*)m_inf,p,SEEK_SET); }

int Tokenizer::eof()
{ return feof((FILE*)m_inf);  }

bool Tokenizer::skip_whitespace()
{
 top:
   skip_space();
   if (*m_P == 0) {
     if(!fetch_line()) return false; // EOF will pass through as T_END
     goto top;
   }
   return true;
}

void Tokenizer::skip_space()
{
   while(*m_P && isspace(*m_P)) m_P++;
}

void Tokenizer::skip_digits()
{
 while(isdigit(*m_P)) m_P++;
}

TokenType Tokenizer::next()
{
  if (! skip_whitespace()) return T_END;  // means: finis, end of file, bail out.
  char ch = *m_P;
  int c_iden = m_flags & C_IDEN;
  if (isalpha(ch) || ch == '_' && c_iden) { //--------------------- TOKENS --------------
     m_start_P = m_P;
     while (isalnum(*m_P) || *m_P == '_' && c_iden) m_P++;
     m_end_P = m_P;
     copy_str(g_tbuff,m_start_P,m_end_P);
     return T_TOKEN;
  } else
  if (isdigit(ch)  ||  (ch == '.' || ch == '-') && isdigit(*(m_P+1))) { //------- NUMBERS ------------------
    int c_num = m_flags & C_NUMBER;
    m_int_type = c_num ? T_INT : T_NUMBER;  
    TokenType ntype = m_int_type;
    m_start_P = m_P;
     if (*m_P != '.') {
      if (*m_P == '0' && c_num) {
        // actual verification of hex or octal constants must happen in lexer
        if (*(m_P+1) == 'x') {       // hex constant
          while (isxdigit(*m_P)) m_P++; // a preliminary check!
          ntype = m_int_type = T_HEX;
        } else
  	 if (isdigit(*(m_P+1))) {      // octal constant
         skip_digits();
         ntype = m_int_type = T_OCT;
	 }
	 else skip_digits();         // plain zero!	
	} else {
     m_P++;                        // skip first - might be '-'
     skip_digits();
    }
	 }
     if (*m_P == '.') {               // (opt) fractional part
        m_P++;
        skip_digits();
        ntype = T_DOUBLE;
     }
     if (*m_P == 'e' || *m_P == 'E') { // (opt) exponent part
        m_P++;
        if (*m_P == '+' || *m_P == '-') m_P++;  // (opt) exp sign
        skip_digits();
        ntype = T_DOUBLE;
     }
     m_end_P = m_P;
     return ntype;
  } else
  if (ch == '\"' || ch == '\'') { //------------CHAR OR STRING CONSTANT-------
     char ch, endch = *m_P++;  char *p = g_sbuff;
	 int c_str = m_flags & C_STRING;
     m_start_P = g_sbuff;
     while (*m_P && *m_P != endch) {
         if (*m_P == '\\' && c_str) {
             m_P++;
             switch(*m_P) {
             case '\\': ch = '\\'; break;
             case 'n':  ch = '\n'; break;
             case 'r':  ch = '\r'; break;
             case 't':  ch = '\t'; break;
             case 'b':  ch = '\b'; break;
             case '\"': ch = '\"'; break;
             case '\'': ch = '\''; break;
             case '0':  { //..collecting OCTAL constant
                char *start_oct = m_P;
                skip_digits();
                copy_str(g_obuff,start_oct,m_P);
                ch = (char)convert_int(g_obuff,8);
                m_P--;  // leave us on last digit
		} break;
              default: *p++ = '\\'; ch = *m_P; break;
             } // switch
             *p++ = ch;
              m_P++;
         } else *p++ = *m_P++;
     }
     if (! *m_P) return T_END; //fatal_error(*this,"Unterminated string constant");
     m_P++;  // skip the endch
     *p = '\0';
     m_end_P = p;
     return (endch == '\"' || ! c_str) ? T_STRING : T_CHAR;    
  } else { // this is to allow us to use get_str() for ALL token types
    m_start_P = m_P;
    m_P++;
    m_end_P = m_P;
    return (TokenType)ch;
  }
}

int Tokenizer::peek_ahead(int count)
{
 return *(m_P+count);
}

char *Tokenizer::get_string()
{
  return g_sbuff;
}

char *Tokenizer::get_str(char *tok)
{
 if (tok==NULL) tok = g_tbuff;
 copy_str(tok,m_start_P,m_end_P);
 return tok;
}

char *Tokenizer::get_token()
{  return g_tbuff; }

double Tokenizer::get_float()
{
 char buff[20];
 return atof(get_str(buff));
}

int Tokenizer::get_int()
{
 char buff[20];
 return convert_int(get_str(buff),m_int_type == T_INT ? 10 : 16);
}

double Tokenizer::next_float()
{
 TokenType t;
 do {
  t = next();
  if (t == T_NUMBER) return get_float();
 } while (t != T_END);
 return 0.0;
}

bool Tokenizer::next_is(const char* str)
{
 return strncmp(m_P,str,strlen(str)) == 0;
}

bool Tokenizer::go_to_word(const char* str)
{
   TokenType t = next();
   while (t != T_END) {
         if (t == T_TOKEN && strcmp(get_str(),str)==0) return true;
         t = next();
  }
  return false;
}

bool Tokenizer::go_to(const char* str)
{
 do {
    char* p = m_search_fn(m_P,str);
    if (p) {
     m_start_P = p;
     m_end_P = p + strlen(str);
     m_P = m_end_P;
     return true;
   }
 } while (fetch_line());
  return false;
}




?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚欧色一区w666天堂| 欧美系列一区二区| 久久久久99精品一区| 国产在线日韩欧美| 精品盗摄一区二区三区| 久久国产精品免费| 久久久久久久久久看片| 成人免费毛片app| 国产精品国产三级国产普通话蜜臀| 国产一区二区影院| 中文字幕一区二区三中文字幕| 99麻豆久久久国产精品免费优播| 国产精品大尺度| 欧洲国内综合视频| 七七婷婷婷婷精品国产| 久久久蜜桃精品| 成人av电影观看| 亚洲影视在线播放| 日韩欧美一二区| 成人永久aaa| 亚洲高清在线视频| 精品美女一区二区| 99精品黄色片免费大全| 亚洲v日本v欧美v久久精品| 日韩免费一区二区三区在线播放| 国产成人午夜电影网| 亚洲视频在线一区| 日韩精品一区二区三区中文不卡| 国产成人精品免费| 成人国产精品免费网站| 91福利视频久久久久| 亚洲妇女屁股眼交7| 精品久久久久99| 97se亚洲国产综合自在线不卡| 亚洲第一会所有码转帖| 久久婷婷一区二区三区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产精品主播直播| 亚洲激情五月婷婷| 久久久久久久久久久99999| 欧美在线视频不卡| 成人一区二区在线观看| 丝袜国产日韩另类美女| 成人免费在线播放视频| 日韩视频在线观看一区二区| 99热国产精品| 狠狠色伊人亚洲综合成人| 亚洲综合图片区| 国产日韩精品一区二区浪潮av| 欧美日韩精品一区二区天天拍小说| 国产精品久久久久影院亚瑟| 麻豆一区二区在线| 亚洲婷婷在线视频| 久久综合久久久久88| 欧美日本一区二区在线观看| 日韩欧美专区在线| av亚洲精华国产精华| 美日韩一级片在线观看| 亚洲动漫第一页| **性色生活片久久毛片| 国产日韩欧美一区二区三区综合| 91.麻豆视频| 欧美午夜不卡视频| 色综合天天综合网天天狠天天| 国产精品羞羞答答xxdd| 精品一区二区三区蜜桃| 日韩高清中文字幕一区| 一区二区三区高清不卡| 亚洲免费观看在线观看| 国产午夜亚洲精品午夜鲁丝片| 日韩欧美国产精品一区| 欧美精品vⅰdeose4hd| 欧美色国产精品| 日本韩国欧美国产| 在线视频你懂得一区二区三区| 成人免费看片app下载| 国产精品99久久久久久似苏梦涵 | 国产欧美va欧美不卡在线| 欧美成人精品高清在线播放| 3d动漫精品啪啪一区二区竹菊| 在线观看日韩电影| 91久久精品一区二区三区| 一本到不卡免费一区二区| 成人美女在线观看| 91免费观看视频| 欧美最猛性xxxxx直播| 欧美日韩免费一区二区三区视频| 欧美日韩一区在线观看| 欧美日韩精品电影| 51精品视频一区二区三区| 91精品国产乱码| 久久青草国产手机看片福利盒子| 欧美高清你懂得| 制服丝袜在线91| 精品国内片67194| 久久综合久色欧美综合狠狠| 国产亚洲欧美色| 欧美日韩国产高清一区| 日韩欧美专区在线| 久久久av毛片精品| 日韩理论片中文av| 一级女性全黄久久生活片免费| 亚洲成人自拍偷拍| 精品一区二区久久久| 成人精品小蝌蚪| 欧美在线免费观看视频| 日韩欧美在线123| 国产亚洲一二三区| 亚洲精品国产精品乱码不99| 丝袜诱惑亚洲看片| 国产精品一区在线观看你懂的| 成人涩涩免费视频| 欧美男人的天堂一二区| 2021国产精品久久精品| 专区另类欧美日韩| 毛片av一区二区| 99在线精品视频| 这里只有精品视频在线观看| 久久九九久精品国产免费直播| 亚洲日本免费电影| 国产a久久麻豆| av一区二区三区| 91精品国产欧美一区二区18 | 一区二区三国产精华液| 麻豆专区一区二区三区四区五区| 福利电影一区二区三区| 欧美高清视频在线高清观看mv色露露十八| 欧美电影免费观看高清完整版在线| 国产精品萝li| 蜜桃传媒麻豆第一区在线观看| 国产精品一卡二| 欧美日韩国产一级片| 久久日一线二线三线suv| 亚洲精品国产精品乱码不99| 麻豆精品国产传媒mv男同| 一本色道**综合亚洲精品蜜桃冫 | 亚洲激情校园春色| 久久成人av少妇免费| 在线精品视频小说1| 国产视频不卡一区| 男男gaygay亚洲| 欧美主播一区二区三区美女| 国产免费观看久久| 免费亚洲电影在线| 欧美日韩一级黄| 国产精品美女久久久久久久久久久| 日韩成人一区二区三区在线观看| 99re视频精品| 国产欧美日韩激情| 老鸭窝一区二区久久精品| 日本高清不卡在线观看| 日韩一区二区在线看片| 成人欧美一区二区三区1314| 另类小说欧美激情| 欧美浪妇xxxx高跟鞋交| 亚洲欧美日韩小说| 99久久亚洲一区二区三区青草 | 91福利社在线观看| 国产精品污污网站在线观看| 久久99久久99| 欧美一级免费观看| 日本怡春院一区二区| 在线不卡一区二区| 亚洲一区二区影院| 日本韩国欧美一区| 伊人夜夜躁av伊人久久| 色老综合老女人久久久| 亚洲视频一二三区| 91视频.com| 一区二区三区四区中文字幕| www.亚洲人| 自拍视频在线观看一区二区| 99国产精品99久久久久久| 自拍偷在线精品自拍偷无码专区| 成人看片黄a免费看在线| 国产精品乱人伦| 欧美在线三级电影| 亚洲欧美自拍偷拍色图| 成人精品视频网站| 亚洲欧美另类久久久精品2019| 色综合久久久久| 性久久久久久久久| 欧美一区三区四区| 激情亚洲综合在线| 亚洲一二三专区| 91麻豆精品国产91久久久久| 日韩影视精彩在线| 精品久久久久av影院 | 2020国产精品自拍| 成人免费观看av| 亚洲黄一区二区三区| 欧美日韩和欧美的一区二区| 蜜桃视频在线一区| 国产日韩欧美不卡在线| 91丨porny丨蝌蚪视频| 图片区小说区国产精品视频| 欧美大尺度电影在线| 成人国产精品免费观看视频| 一区二区三区欧美日韩| 欧美videofree性高清杂交|