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

📄 gscanner.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 3 页
字号:
  switch (*token_p)    {    case G_TOKEN_IDENTIFIER:      if (scanner->config->identifier_2_string)	*token_p = G_TOKEN_STRING;      break;          case G_TOKEN_SYMBOL:      if (scanner->config->symbol_2_token)	*token_p = (GTokenType) value_p->v_symbol;      break;          case G_TOKEN_BINARY:    case G_TOKEN_OCTAL:    case G_TOKEN_HEX:      if (scanner->config->numbers_2_int)	*token_p = G_TOKEN_INT;      break;          default:      break;    }    if (*token_p == G_TOKEN_INT &&      scanner->config->int_2_float)    {      *token_p = G_TOKEN_FLOAT;      value_p->v_float = value_p->v_int;    }    errno = 0;}static voidg_scanner_get_token_ll	(GScanner	*scanner,			 GTokenType	*token_p,			 GTokenValue	*value_p,			 guint		*line_p,			 guint		*position_p){  GScannerConfig *config;  GTokenType	   token;  gboolean	   in_comment_multi;  gboolean	   in_comment_single;  gboolean	   in_string_sq;  gboolean	   in_string_dq;  GString	  *gstring;  GTokenValue	   value;  guchar	   ch;    config = scanner->config;  (*value_p).v_int = 0;    if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) ||      scanner->token == G_TOKEN_EOF)    {      *token_p = G_TOKEN_EOF;      return;    }    in_comment_multi = FALSE;  in_comment_single = FALSE;  in_string_sq = FALSE;  in_string_dq = FALSE;  gstring = NULL;    do /* while (ch != 0) */    {      gboolean dotted_float = FALSE;            ch = g_scanner_get_char (scanner, line_p, position_p);            value.v_int = 0;      token = G_TOKEN_NONE;            /* this is *evil*, but needed ;(       * we first check for identifier first character, because	 it       * might interfere with other key chars like slashes or numbers       */      if (config->scan_identifier &&	  ch && strchr (config->cset_identifier_first, ch))	goto identifier_precedence;            switch (ch)	{	case 0:	  token = G_TOKEN_EOF;	  (*position_p)++;	  /* ch = 0; */	  break;	  	case '/':	  if (!config->scan_comment_multi ||	      g_scanner_peek_next_char (scanner) != '*')	    goto default_case;	  g_scanner_get_char (scanner, line_p, position_p);	  token = G_TOKEN_COMMENT_MULTI;	  in_comment_multi = TRUE;	  gstring = g_string_new ("");	  while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0)	    {	      if (ch == '*' && g_scanner_peek_next_char (scanner) == '/')		{		  g_scanner_get_char (scanner, line_p, position_p);		  in_comment_multi = FALSE;		  break;		}	      else		gstring = g_string_append_c (gstring, ch);	    }	  ch = 0;	  break;	  	case '\'':	  if (!config->scan_string_sq)	    goto default_case;	  token = G_TOKEN_STRING;	  in_string_sq = TRUE;	  gstring = g_string_new ("");	  while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0)	    {	      if (ch == '\'')		{		  in_string_sq = FALSE;		  break;		}	      else		gstring = g_string_append_c (gstring, ch);	    }	  ch = 0;	  break;	  	case '"':	  if (!config->scan_string_dq)	    goto default_case;	  token = G_TOKEN_STRING;	  in_string_dq = TRUE;	  gstring = g_string_new ("");	  while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0)	    {	      if (ch == '"')		{		  in_string_dq = FALSE;		  break;		}	      else		{		  if (ch == '\\')		    {		      ch = g_scanner_get_char (scanner, line_p, position_p);		      switch (ch)			{			  guint	i;			  guint	fchar;			  			case 0:			  break;			  			case '\\':			  gstring = g_string_append_c (gstring, '\\');			  break;			  			case 'n':			  gstring = g_string_append_c (gstring, '\n');			  break;			  			case 't':			  gstring = g_string_append_c (gstring, '\t');			  break;			  			case 'r':			  gstring = g_string_append_c (gstring, '\r');			  break;			  			case 'b':			  gstring = g_string_append_c (gstring, '\b');			  break;			  			case 'f':			  gstring = g_string_append_c (gstring, '\f');			  break;			  			case '0':			case '1':			case '2':			case '3':			case '4':			case '5':			case '6':			case '7':			  i = ch - '0';			  fchar = g_scanner_peek_next_char (scanner);			  if (fchar >= '0' && fchar <= '7')			    {			      ch = g_scanner_get_char (scanner, line_p, position_p);			      i = i * 8 + ch - '0';			      fchar = g_scanner_peek_next_char (scanner);			      if (fchar >= '0' && fchar <= '7')				{				  ch = g_scanner_get_char (scanner, line_p, position_p);				  i = i * 8 + ch - '0';				}			    }			  gstring = g_string_append_c (gstring, i);			  break;			  			default:			  gstring = g_string_append_c (gstring, ch);			  break;			}		    }		  else		    gstring = g_string_append_c (gstring, ch);		}	    }	  ch = 0;	  break;	  	case '.':	  if (!config->scan_float)	    goto default_case;	  token = G_TOKEN_FLOAT;	  dotted_float = TRUE;	  ch = g_scanner_get_char (scanner, line_p, position_p);	  goto number_parsing;	  	case '$':	  if (!config->scan_hex_dollar)	    goto default_case;	  token = G_TOKEN_HEX;	  ch = g_scanner_get_char (scanner, line_p, position_p);	  goto number_parsing;	  	case '0':	  if (config->scan_octal)	    token = G_TOKEN_OCTAL;	  else	    token = G_TOKEN_INT;	  ch = g_scanner_peek_next_char (scanner);	  if (config->scan_hex && (ch == 'x' || ch == 'X'))	    {	      token = G_TOKEN_HEX;	      g_scanner_get_char (scanner, line_p, position_p);	      ch = g_scanner_get_char (scanner, line_p, position_p);	      if (ch == 0)		{		  token = G_TOKEN_ERROR;		  value.v_error = G_ERR_UNEXP_EOF;		  (*position_p)++;		  break;		}	      if (g_scanner_char_2_num (ch, 16) < 0)		{		  token = G_TOKEN_ERROR;		  value.v_error = G_ERR_DIGIT_RADIX;		  ch = 0;		  break;		}	    }	  else if (config->scan_binary && (ch == 'b' || ch == 'B'))	    {	      token = G_TOKEN_BINARY;	      g_scanner_get_char (scanner, line_p, position_p);	      ch = g_scanner_get_char (scanner, line_p, position_p);	      if (ch == 0)		{		  token = G_TOKEN_ERROR;		  value.v_error = G_ERR_UNEXP_EOF;		  (*position_p)++;		  break;		}	      if (g_scanner_char_2_num (ch, 10) < 0)		{		  token = G_TOKEN_ERROR;		  value.v_error = G_ERR_NON_DIGIT_IN_CONST;		  ch = 0;		  break;		}	    }	  else	    ch = '0';	  /* fall through */	case '1':	case '2':	case '3':	case '4':	case '5':	case '6':	case '7':	case '8':	case '9':	number_parsing:	{          gboolean in_number = TRUE;	  gchar *endptr;	  	  if (token == G_TOKEN_NONE)	    token = G_TOKEN_INT;	  	  gstring = g_string_new (dotted_float ? "0." : "");	  gstring = g_string_append_c (gstring, ch);	  	  do /* while (in_number) */	    {	      gboolean is_E;	      	      is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E');	      	      ch = g_scanner_peek_next_char (scanner);	      	      if (g_scanner_char_2_num (ch, 36) >= 0 ||		  (config->scan_float && ch == '.') ||		  (is_E && (ch == '+' || ch == '-')))		{		  ch = g_scanner_get_char (scanner, line_p, position_p);		  		  switch (ch)		    {		    case '.':		      if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL)			{			  value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX;			  token = G_TOKEN_ERROR;			  in_number = FALSE;			}		      else			{			  token = G_TOKEN_FLOAT;			  gstring = g_string_append_c (gstring, ch);			}		      break;		      		    case '0':		    case '1':		    case '2':		    case '3':		    case '4':		    case '5':		    case '6':		    case '7':		    case '8':		    case '9':		      gstring = g_string_append_c (gstring, ch);		      break;		      		    case '-':		    case '+':		      if (token != G_TOKEN_FLOAT)			{			  token = G_TOKEN_ERROR;			  value.v_error = G_ERR_NON_DIGIT_IN_CONST;			  in_number = FALSE;			}		      else			gstring = g_string_append_c (gstring, ch);		      break;		      		    case 'e':		    case 'E':		      if ((token != G_TOKEN_HEX && !config->scan_float) ||			  (token != G_TOKEN_HEX &&			   token != G_TOKEN_OCTAL &&			   token != G_TOKEN_FLOAT &&			   token != G_TOKEN_INT))			{			  token = G_TOKEN_ERROR;			  value.v_error = G_ERR_NON_DIGIT_IN_CONST;			  in_number = FALSE;			}		      else			{			  if (token != G_TOKEN_HEX)			    token = G_TOKEN_FLOAT;			  gstring = g_string_append_c (gstring, ch);			}		      break;		      		    default:		      if (token != G_TOKEN_HEX)			{			  token = G_TOKEN_ERROR;			  value.v_error = G_ERR_NON_DIGIT_IN_CONST;			  in_number = FALSE;			}		      else			gstring = g_string_append_c (gstring, ch);		      break;		    }		}	      else		in_number = FALSE;	    }	  while (in_number);	  	  endptr = NULL;	  switch (token)	    {	    case G_TOKEN_BINARY:	      value.v_binary = strtoul (gstring->str, &endptr, 2);	      break;	      	    case G_TOKEN_OCTAL:	      value.v_octal = strtoul (gstring->str, &endptr, 8);	      break;	      	    case G_TOKEN_INT:	      value.v_int = strtoul (gstring->str, &endptr, 10);	      break;	      	    case G_TOKEN_FLOAT:	      value.v_float = g_strtod (gstring->str, &endptr);	      break;	      	    case G_TOKEN_HEX:	      value.v_hex = strtoul (gstring->str, &endptr, 16);	      break;	      	    default:	      break;	    }	  if (endptr && *endptr)	    {	      token = G_TOKEN_ERROR;	      if (*endptr == 'e' || *endptr == 'E')		value.v_error = G_ERR_NON_DIGIT_IN_CONST;	      else		value.v_error = G_ERR_DIGIT_RADIX;	    }	  g_string_free (gstring, TRUE);	  gstring = NULL;	  ch = 0;	} /* number_parsing:... */	break;		default:	default_case:	{	  if (config->cpair_comment_single &&	      ch == config->cpair_comment_single[0])	    {	      token = G_TOKEN_COMMENT_SINGLE;	      in_comment_single = TRUE;	      gstring = g_string_new ("");	      ch = g_scanner_get_char (scanner, line_p, position_p);	      while (ch != 0)		{		  if (ch == config->cpair_comment_single[1])		    {		      in_comment_single = FALSE;		      ch = 0;		      break;		    }		  		  gstring = g_string_append_c (gstring, ch);		  ch = g_scanner_get_char (scanner, line_p, position_p);		}	    }	  else if (config->scan_identifier && ch &&		   strchr (config->cset_identifier_first, ch))	    {	    identifier_precedence:	      	      if (config->cset_identifier_nth && ch &&		  strchr (config->cset_identifier_nth,			  g_scanner_peek_next_char (scanner)))		{		  token = G_TOKEN_IDENTIFIER;		  gstring = g_string_new ("");		  gstring = g_string_append_c (gstring, ch);		  do		    {		      ch = g_scanner_get_char (scanner, line_p, position_p);		      gstring = g_string_append_c (gstring, ch);		      ch = g_scanner_peek_next_char (scanner);		    }		  while (ch && strchr (config->cset_identifier_nth, ch));		  ch = 0;		}	      else if (config->scan_identifier_1char)		{		  token = G_TOKEN_IDENTIFIER;		  value.v_identifier = g_new0 (gchar, 2);		  value.v_identifier[0] = ch;		  ch = 0;		}	    }	  if (ch)	    {	      if (config->char_2_token)		token = ch;	      else		{		  token = G_TOKEN_CHAR;		  value.v_char = ch;		}	      ch = 0;	    }	} /* default_case:... */	break;	}      g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */    }  while (ch != 0);    if (in_comment_multi || in_comment_single ||      in_string_sq || in_string_dq)    {      token = G_TOKEN_ERROR;      if (gstring)	{	  g_string_free (gstring, TRUE);	  gstring = NULL;	}      (*position_p)++;      if (in_comment_multi || in_comment_single)	value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT;      else /* (in_string_sq || in_string_dq) */	value.v_error = G_ERR_UNEXP_EOF_IN_STRING;    }    if (gstring)    {      value.v_string = gstring->str;      g_string_free (gstring, FALSE);      gstring = NULL;    }    if (token == G_TOKEN_IDENTIFIER)    {      if (config->scan_symbols)	{	  GScannerKey *key;	  guint scope_id;	  	  scope_id = scanner->scope_id;	  key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier);	  if (!key && scope_id && scanner->config->scope_0_fallback)	    key = g_scanner_lookup_internal (scanner, 0, value.v_identifier);	  	  if (key)	    {	      g_free (value.v_identifier);	      token = G_TOKEN_SYMBOL;	      value.v_symbol = key->value;	    }	}            if (token == G_TOKEN_IDENTIFIER &&	  config->scan_identifier_NULL &&	  strlen (value.v_identifier) == 4)	{	  gchar *null_upper = "NULL";	  gchar *null_lower = "null";	  	  if (scanner->config->case_sensitive)	    {	      if (value.v_identifier[0] == null_upper[0] &&		  value.v_identifier[1] == null_upper[1] &&		  value.v_identifier[2] == null_upper[2] &&		  value.v_identifier[3] == null_upper[3])		token = G_TOKEN_IDENTIFIER_NULL;	    }	  else	    {	      if ((value.v_identifier[0] == null_upper[0] ||		   value.v_identifier[0] == null_lower[0]) &&		  (value.v_identifier[1] == null_upper[1] ||		   value.v_identifier[1] == null_lower[1]) &&		  (value.v_identifier[2] == null_upper[2] ||		   value.v_identifier[2] == null_lower[2]) &&		  (value.v_identifier[3] == null_upper[3] ||		   value.v_identifier[3] == null_lower[3]))		token = G_TOKEN_IDENTIFIER_NULL;	    }	}    }    *token_p = token;  *value_p = value;}

⌨️ 快捷键说明

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