⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 token.h

📁 源码漏洞检查
💻 H
字号:
/* token.H * John Viega * * Jul 28, 1999 (with some mods in Jan 2000) */#ifndef __TOKEN_H__#define __TOKEN_H__#include "config.H"#include "fatal.H"typedef enum token_id_enum       { 	OPERATOR, 	STRING,  	CHAR,	IDENTIFIER,	INTEGER, 	REAL,	PREPROC_START,	PREPROC_END,        PREPROC_NUM,	COMMENT      } TokenId;const int DEFAULT_TOKEN_CONTAINER_UNIT = 1024;class Token {public:  // RTTI isn't too portable, so just use this hack.  TokenId GetTokenType() { return type; }  int     GetLineNo() { return lineno; }  virtual char  * GetValue() = 0;  virtual int AllocedValue() = 0;  virtual ~Token() {}  //##TODO: You are responsible for deletes right now.  virtual char* GetRepr() = 0;protected:  TokenId type;  int lineno;};class TokenContainer {public:  TokenContainer();  TokenContainer(int incr);  ~TokenContainer()  {    for(int i=0;i<current_size;i++)      {	Token *t = list[i];	delete t;      }    delete[] list;  }  void Add(Token* t);  Token* GetToken(int i);  int GetCurrentSize() { return current_size; }  /* Debugging  */  void PrintAll(); private:  Token **list;  int increment;  int current_size;  int current_capacity;  void Resize();};class OperatorTok : public Token {public:  // char *name is almost always staticly alloc'd here.  OperatorTok(char *name, int line)    {      lineno = line;      type = OPERATOR;      opname = name;    }  char *GetOperatorName() { return opname; }  char *GetValue() { return GetOperatorName(); }  int  AllocedValue() { return 0; }  char *GetRepr()    {      char *fmt = "OPERATOR %s <line=%d>";      int  len  = sizeof(lineno)*3 + strlen(GetOperatorName()) + 	          strlen(fmt);      char *buf = new char[len];      if(!buf)	OutOfMemory();      // ITS4: ignore sprintf      sprintf(buf, fmt, GetOperatorName(), lineno);      return buf;    }private:  char *opname;};class CommentTok : public Token { public:  CommentTok(char *val, unsigned int str_size, int line, int cpp, int tindex, 	     int line2, int df)    {      dont_free = df;      type      = COMMENT;      value     = val;      val_len   = str_size;      lineno    = line;      cpp_style = cpp;      tok_index = tindex;      endline   = line2;    }  virtual ~CommentTok()    {      if(value && !dont_free) delete[] value;    }  int GetTokenIndex() { return tok_index; }  char *GetValue() { return value; }  int  AllocedValue() { return 0; }  int GetEndLineNo() { return endline; }  char *GetRepr()    {      char *format = "COMMENT <value = %s> <line=%d> <style=%s>\n";      int len = strlen(format) + val_len + sizeof(lineno)*3 + 3;      char *buf = new char[len];      if(!buf)	OutOfMemory();#ifdef HAVE_SNPRINTF      // The format string is constant, as above.      // ITS4: Ignore snprintf       snprintf(buf, len, format, GetValue(), lineno, 	       cpp_style ? "c++" : "c");#else      if(val_len < strlen(GetValue()))	{	  fprintf(stderr, "Internal inconsistancy, sorry :-(\n");	  exit(-3);	}      // ITS4: Ignore sprintf      sprintf(buf, format, GetValue(), lineno, cpp_style ? "c++" : "c");#endif      return buf;    } private:  int dont_free;  char *value;  unsigned int val_len;  int cpp_style;  int tok_index;  int endline;};class StringTok : public Token {public:  StringTok(char *val, unsigned int str_size, int line)    {      type = STRING;      value = val;      val_len = str_size;      lineno = line;    }  virtual ~StringTok()  {    if(value)      delete[] value;  }  char *GetContents() { return value; }  int  GetContentLength() { return val_len; }  char *GetValue()  {    char *str = new char[val_len+3];    sprintf(str, "\"%s\"", value); // ITS4: ignore sprintf    return str;  }  int  AllocedValue() { return 1; }  char *GetRepr()    {      char *format = "STRING <value = %s> <line=%d>";      unsigned int  len = strlen(format) + val_len + sizeof(lineno)*3;      char *buf = new char[len];      if(!buf)	OutOfMemory();#ifdef HAVE_SNPRINTF      // The format string is constant, as above.      // ITS4: Ignore snprintf      snprintf(buf, len, format, GetValue(), lineno);#else      if(val_len +2 < strlen(GetValue()))	{	  fprintf(stderr, "Internal inconsistancy, sorry...\n");	  exit(-4);	}      // ITS4: Ignore sprintf      sprintf(buf, format, GetValue(), lineno);#endif      return buf;    }private:  char *value;  unsigned int  val_len;};class CharTok : public Token {public:  CharTok(long val, int line)    {      lineno = line;      type = CHAR;      value = val;    }  long GetNumericValue() { return value; }  char *GetValue() {    char *buf = new char[13];    sprintf(buf, "chr(%ld)", value);    return buf;  }  int  AllocedValue() { return 1; }  char *GetRepr()    {      char *format = "CHAR <ascii=%ld> <line=%d>";      unsigned int  len = strlen(format) + sizeof(value)*3 + sizeof(lineno)*3;      char *buf = new char[len];      if(!buf)	OutOfMemory();      sprintf(buf, format, value, lineno);  // ITS4: ignore sprintf      return buf;    }private:  long value;};class IdTok : public Token {public:  virtual ~IdTok()  {    delete[] value;  }  IdTok(char *name, unsigned int len_str, int line, int line2)    {      lineno  = line;      type    = IDENTIFIER;      value   = name;      val_len = len_str;      endline = line2;    }  int GetEndLineNo() { return endline; }  char *GetName() { return value; }  char *GetValue(){ return GetName(); }  int  AllocedValue() { return 0; }  char *GetRepr()    {      char *format = "ID <name = %s> <line=%d>";      int  len = strlen(format) + val_len + sizeof(lineno)*3;      char *buf = new char[len];      if(!buf)	OutOfMemory();#ifdef HAVE_SNPRINTF           // The format string is constant, as above.      // ITS4: Ignore snprintf      snprintf(buf, len, format, GetName(), lineno);#else      if(val_len < strlen(GetName()))	{	  fprintf(stderr, "Internal inconsistancy, sorry!\n");	  exit(-3);	}      sprintf(buf, format, GetName(), lineno); // ITS4: ignore sprintf#endif      return buf;    }private:  char *value;  unsigned int  val_len;  int  endline;};class IntegerTok : public Token {public:  IntegerTok(long num, int u, int l, int line) {    lineno = line;    type = INTEGER;    value = num;    is_unsigned = u;    is_long = l;  }    char *GetRepr()    {      char *format = "INT <value = %ld> <long=%c> <unsigned=%c> <line=%d>";      int  len = strlen(format) + sizeof(GetValue()) * 3 + sizeof(lineno) * 3;      char *buf = new char[len];      if(!buf)	OutOfMemory();      // ITS4: ignore sprintf      sprintf(buf, format, GetValue(), IsLong() ? 't' : 'f', 	       IsUnsigned() ? 't' : 'f', lineno);      return buf;    }  long GetNumericValue() { return value; }  char *GetValue() {    char *buf = new char[13];    sprintf(buf, "%ld", value);    return buf;  }  int  AllocedValue() { return 1; }  int IsLong() { return is_long; }  int IsUnsigned() { return is_unsigned; }private:  long value;  int is_unsigned;  int is_long;};typedef enum real_size_enum {FLOAT, DOUBLE, LONG_DOUBLE} RealSize;class RealTok : public Token {public:  RealTok(long i, long m, long e, RealSize s, int line) {    lineno = line;    type = REAL;    integer_part = i;    mantissa = m;    exponent = e;    size = s;  }  char *GetValue()  {    char *arr = new char[30];    sprintf(arr, "%ld.%lde%ld", GetIntegerPart(), GetMantissa(), GetExponent());    return arr;  }  int  AllocedValue() { return 1; }  char *GetRepr()    {      char *format = "REAL <INTPART = %ld> <MANT=%ld> <EXP=%ld> <size=%c> <line=%d>";      int  len = strlen(format) + sizeof(GetIntegerPart())*3 + 	         sizeof(GetMantissa()) * 3 + sizeof(GetExponent())*3 +	         sizeof(lineno) * 3;      char *buf = new char[len];      if(!buf)	OutOfMemory();      // ITS4: ignore sprintf      sprintf(buf, format, GetIntegerPart(), GetMantissa(), GetExponent(),	       (size == FLOAT) ? 'f' : (size == DOUBLE) ? 'd' : 'l', lineno);      return buf;    }  long GetIntegerPart() { return integer_part; }  long GetMantissa() { return mantissa; }  long GetExponent() { return exponent; }private:  long integer_part;  long mantissa;  long exponent;  RealSize  size;};typedef enum preproc_cond_type_enum {IF, ELIF, ELSE, IFDEF, IFNDEF}PreprocCond;class PreprocStartToken : public Token {public:  PreprocStartToken(int line)    {      lineno = line;      type = PREPROC_START;    }  char *GetValue() { return "#"; }  int  AllocedValue() { return 0; }  char *GetRepr()    {      char *fmt = "PREPROC_START <line=%d>";      int len = sizeof(lineno)*3 + strlen(fmt);      char *buf = new char[len];      if(!buf)	OutOfMemory();      sprintf(buf, fmt, lineno); // ITS4: ignore sprintf      return buf;    }};typedef enum preproc_macro_type_enum {DEF, UNDEF}PreprocMacro;class PreprocEndToken : public Token {public:  PreprocEndToken(int line)    {      lineno = line;      type = PREPROC_END;    }  char *GetValue() { return "<<null>>"; }  int  AllocedValue() { return 0; }  char *GetRepr()    {      char *fmt = "PREPROC_END <line=%d>";      int len = sizeof(lineno)*3 + strlen(fmt);      char *buf = new char[len];      if(!buf)	OutOfMemory();      sprintf(buf, fmt, lineno); // ITS4: ignore sprintf      return buf;    }};class PreprocNumTok : public Token {public:  PreprocNumTok(char *val, unsigned int str_size, int line)    {      type = PREPROC_NUM;      value = val;      val_len = str_size;      lineno = line;    }  virtual ~PreprocNumTok()  {    if(value)      delete[] value;  }  char *GetContents() { return value; }  int  GetContentLength() { return val_len; }  char *GetValue()  {    char *str = new char[val_len+3];    sprintf(str, "\"%s\"", value); // ITS4: ignore sprintf    return str;  }  int  AllocedValue() { return 1; }  char *GetRepr()    {      char *format = "PPNUM <value = %s> <line=%d>";      unsigned int  len = strlen(format) + val_len + sizeof(lineno)*3;      char *buf = new char[len];      if(!buf)	OutOfMemory();#ifdef HAVE_SNPRINTF      // The format string is constant, as above.      // ITS4: Ignore snprintf      snprintf(buf, len, format, GetValue(), lineno);#else      if(val_len +2 < strlen(GetValue()))	{	  fprintf(stderr, "Internal inconsistancy, sorry...\n");	  exit(-4);	}      // ITS4: Ignore sprintf      sprintf(buf, format, GetValue(), lineno);#endif      return buf;    }private:  char *value;  unsigned int  val_len;};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -