📄 safescanner.c
字号:
config = scanner->config; (*value_p).v_int = 0; if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) || scanner->token == SAFE_TOKEN_EOF) { *token_p = SAFE_TOKEN_EOF; return; } in_comment_multi = FALSE; in_comment_single = FALSE; in_string_sq = FALSE; in_string_dq = FALSE; gstring = NULL; i_saw_escape_char = FALSE; do /* while (ch != 0) */ { gboolean dotted_float = FALSE; ch = safe_scanner_get_char (scanner, line_p, position_p); value.v_int = 0; token = SAFE_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 = SAFE_TOKEN_EOF; (*position_p)++; /* ch = 0; */ break; case '/': if (!config->scan_comment_multi || safe_scanner_peek_next_char (scanner) != '*') goto default_case; safe_scanner_get_char (scanner, line_p, position_p); token = SAFE_TOKEN_COMMENT_MULTI; in_comment_multi = TRUE; gstring = g_string_new (""); while ((ch = safe_scanner_get_char (scanner, line_p, position_p)) != 0) { if (ch == '*' && safe_scanner_peek_next_char (scanner) == '/') { safe_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 '\'':/*printf("I saw sq.\n");*/ if (!config->scan_string_sq) goto default_case; token = SAFE_TOKEN_STRING; in_string_sq = TRUE; gstring = g_string_new (""); while ((ch = safe_scanner_get_char (scanner, line_p, position_p)) != 0) {/*printf("%c\n", ch);*/ if (ch == '\'') { in_string_sq = FALSE;/*printf("Ending...\n");*/ i_saw_escape_char = FALSE; break; } else if (ch == '\\') { ch = safe_scanner_get_char (scanner, line_p, position_p); switch (ch) { guint i; guint fchar; case 0: break; case '\\': gstring = g_string_append_c (gstring, '\\');/*printf("I see '\\'\n");*/ i_saw_escape_char = TRUE; 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 = safe_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = safe_scanner_get_char (scanner, line_p, position_p); i = i * 8 + ch - '0'; fchar = safe_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = safe_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_string_dq) goto default_case; token = SAFE_TOKEN_STRING; in_string_dq = TRUE; gstring = g_string_new (""); while ((ch = safe_scanner_get_char (scanner, line_p, position_p)) != 0) { if (ch == '"') { in_string_dq = FALSE; break; } else { if (ch == '\\') { ch = safe_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 = safe_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = safe_scanner_get_char (scanner, line_p, position_p); i = i * 8 + ch - '0'; fchar = safe_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = safe_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 = SAFE_TOKEN_FLOAT; dotted_float = TRUE; ch = safe_scanner_get_char (scanner, line_p, position_p); goto number_parsing; case '$': if (!config->scan_hex_dollar) goto default_case; token = SAFE_TOKEN_HEX; ch = safe_scanner_get_char (scanner, line_p, position_p); goto number_parsing; case '0': if (config->scan_octal) token = SAFE_TOKEN_OCTAL; else token = SAFE_TOKEN_INT; ch = safe_scanner_peek_next_char (scanner); if (config->scan_hex && (ch == 'x' || ch == 'X')) { token = SAFE_TOKEN_HEX; safe_scanner_get_char (scanner, line_p, position_p); ch = safe_scanner_get_char (scanner, line_p, position_p); if (ch == 0) { token = SAFE_TOKEN_ERROR; value.v_error = G_ERR_UNEXP_EOF; (*position_p)++; break; } if (safe_scanner_char_2_num (ch, 16) < 0) { token = SAFE_TOKEN_ERROR; value.v_error = G_ERR_DIGIT_RADIX; ch = 0; break; } } else if (config->scan_binary && (ch == 'b' || ch == 'B')) { token = SAFE_TOKEN_BINARY; safe_scanner_get_char (scanner, line_p, position_p); ch = safe_scanner_get_char (scanner, line_p, position_p); if (ch == 0) { token = SAFE_TOKEN_ERROR; value.v_error = G_ERR_UNEXP_EOF; (*position_p)++; break; } if (safe_scanner_char_2_num (ch, 10) < 0) { token = SAFE_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 == SAFE_TOKEN_NONE) token = SAFE_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 == SAFE_TOKEN_FLOAT && (ch == 'e' || ch == 'E'); ch = safe_scanner_peek_next_char (scanner); if (safe_scanner_char_2_num (ch, 36) >= 0 || (config->scan_float && ch == '.') || (is_E && (ch == '+' || ch == '-'))) { ch = safe_scanner_get_char (scanner, line_p, position_p); switch (ch) { case '.': if (token != SAFE_TOKEN_INT && token != SAFE_TOKEN_OCTAL) { value.v_error = token == SAFE_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX; token = SAFE_TOKEN_ERROR; in_number = FALSE; } else { token = SAFE_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 != SAFE_TOKEN_FLOAT) { token = SAFE_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 != SAFE_TOKEN_HEX && !config->scan_float) || (token != SAFE_TOKEN_HEX && token != SAFE_TOKEN_OCTAL && token != SAFE_TOKEN_FLOAT && token != SAFE_TOKEN_INT)) { token = SAFE_TOKEN_ERROR; value.v_error = G_ERR_NON_DIGIT_IN_CONST; in_number = FALSE; } else { if (token != SAFE_TOKEN_HEX) token = SAFE_TOKEN_FLOAT; gstring = g_string_append_c (gstring, ch); } break; default: if (token != SAFE_TOKEN_HEX) { token = SAFE_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 SAFE_TOKEN_BINARY: value.v_binary = strtol (gstring->str, &endptr, 2); break; case SAFE_TOKEN_OCTAL: value.v_octal = strtol (gstring->str, &endptr, 8); break; case SAFE_TOKEN_INT: value.v_int = strtol (gstring->str, &endptr, 10); break; case SAFE_TOKEN_FLOAT: value.v_float = g_strtod (gstring->str, &endptr); break; case SAFE_TOKEN_HEX: value.v_hex = strtol (gstring->str, &endptr, 16); break; default: break; } if (endptr && *endptr) { token = SAFE_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 = SAFE_TOKEN_COMMENT_SINGLE; in_comment_single = TRUE; gstring = g_string_new (""); ch = safe_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 = safe_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, safe_scanner_peek_next_char (scanner))) { token = SAFE_TOKEN_IDENTIFIER; gstring = g_string_new (""); gstring = g_string_append_c (gstring, ch); do { ch = safe_scanner_get_char (scanner, line_p, position_p); gstring = g_string_append_c (gstring, ch); ch = safe_scanner_peek_next_char (scanner); } while (ch && strchr (config->cset_identifier_nth, ch)); ch = 0; } else if (config->scan_identifier_1char) { token = SAFE_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 = SAFE_TOKEN_CHAR; value.v_char = ch; } ch = 0; } } /* default_case:... */ break; } g_assert (ch == 0 && token != SAFE_TOKEN_NONE); /* paranoid */ } while (ch != 0); if (in_comment_multi || in_comment_single || in_string_sq || in_string_dq) {printf("Still error!\n"); token = SAFE_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) {/*printf("hey: %s\n", gstring->str);*/ value.v_string = gstring->str; g_string_free (gstring, FALSE); gstring = NULL; } if (token == SAFE_TOKEN_IDENTIFIER) { if (config->scan_symbols) { SafeScannerKey *key; guint scope_id; scope_id = scanner->scope_id; key = safe_scanner_lookup_internal (scanner, scope_id, value.v_identifier); if (!key && scope_id && scanner->config->scope_0_fallback) key = safe_scanner_lookup_internal (scanner, 0, value.v_identifier); if (key) { g_free (value.v_identifier); token = SAFE_TOKEN_SYMBOL; value.v_symbol = key->value; } } if (token == SAFE_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 = SAFE_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 = SAFE_TOKEN_IDENTIFIER_NULL; } } } *token_p = token; *value_p = value;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -