EAPI void elm_code_line_token_add(Elm_Code_Line *line, int start, int end, int lines, Elm_Code_Token_Type type) { Elm_Code_Token *tok; unsigned int end_line; Elm_Code_Line *next_line; if (!line) return; tok = calloc(1, sizeof(Elm_Code_Token)); end_line = line->number; if (lines > 1) end_line += lines - 1; tok->start = start; tok->end = end; tok->end_line = end_line; tok->type = type; line->tokens = eina_list_append(line->tokens, tok); if (end_line > line->number) { next_line = elm_code_file_line_get(line->file, line->number + 1); elm_code_line_token_add(next_line, 1, end, lines - 1, type); } }
static void _elm_code_syntax_parse_token(Elm_Code_Syntax *syntax, Elm_Code_Line *line, unsigned int pos, const char *token, unsigned int length) { const char **keyword; unsigned int i; for (keyword = syntax->keywords; *keyword; keyword++) if (strlen(*keyword) == length && !strncmp(token, *keyword, length)) { elm_code_line_token_add(line, pos, pos + length - 1, 1, ELM_CODE_TOKEN_TYPE_KEYWORD); return; } for (i = 0; i < length; i++) { if (!_char_is_number(token[i], syntax)) break; if (i == length - 1) elm_code_line_token_add(line, pos, pos + length - 1, 1, ELM_CODE_TOKEN_TYPE_NUMBER); } }
EAPI void elm_code_syntax_parse_line(Elm_Code_Syntax *syntax, Elm_Code_Line *line) { unsigned int i, i2, count, length; const char *content; const char *sym, *ptr; Elm_Code_Token_Type previous_type; EINA_SAFETY_ON_NULL_RETURN(syntax); line->scope = _previous_line_scope(line) + _elm_code_syntax_scope_change_braces(line); i = 0; content = elm_code_line_text_get(line, &length); previous_type = _previous_line_continue_type(line); if (previous_type == ELM_CODE_TOKEN_TYPE_COMMENT) { for (i2 = i; i2 < length; i2++) if (_ends_comment(syntax, content + i2, length - i2)) { i2 += strlen(syntax->comment_end) - 1; break; } elm_code_line_token_add(line, 0, i2, 1, ELM_CODE_TOKEN_TYPE_COMMENT); if (i2 == length) { Elm_Code_Token *token = eina_list_last_data_get(line->tokens); token->continues = EINA_TRUE; return; } i = i2 + 1; } else if (previous_type == ELM_CODE_TOKEN_TYPE_PREPROCESSOR) { elm_code_line_token_add(line, 0, length, 1, ELM_CODE_TOKEN_TYPE_PREPROCESSOR); if (length >= 1 && content[length-1] == '\\') { Elm_Code_Token *token = eina_list_last_data_get(line->tokens); token->continues = EINA_TRUE; } return; } ptr = content; count = 0; for (; i < length; i++) { ptr = content + i - count; if (_elm_code_text_char_is_whitespace(content[i])) { if (count) _elm_code_syntax_parse_token(syntax, line, ptr-content, ptr, count); count = 0; continue; } if (syntax->preprocessor && _content_starts_with(content+i, syntax->preprocessor, strlen(syntax->preprocessor))) { elm_code_line_token_add(line, i, length - 1, 1, ELM_CODE_TOKEN_TYPE_PREPROCESSOR); if (content[length-1] == '\\') { Elm_Code_Token *token = eina_list_last_data_get(line->tokens); token->continues = EINA_TRUE; } return; } else if (_starts_single_comment(syntax, content + i, length - i)) { elm_code_line_token_add(line, i, length, 1, ELM_CODE_TOKEN_TYPE_COMMENT); return; } else if (_starts_comment(syntax, content + i, length - i)) { for (i2 = i+strlen(syntax->comment_start); i2 < length; i2++) if (_ends_comment(syntax, content + i2, length - i2)) { i2 += strlen(syntax->comment_end) - 1; break; } elm_code_line_token_add(line, i, i2, 1, ELM_CODE_TOKEN_TYPE_COMMENT); if (i2 == length) { Elm_Code_Token *token = eina_list_last_data_get(line->tokens); token->continues = EINA_TRUE; // TODO reset all below of here return; } i = i2; count = 0; continue; } else if (content[i] == '"') { unsigned int start = i, end; for (i++; i < length && (content[i] != '"' || (content[i-1] == '\\' && content[i-2] != '\\')); i++) {} end = i; elm_code_line_token_add(line, start, end, 1, ELM_CODE_TOKEN_TYPE_STRING); count = 0; continue; } else if (content[i] == '\'') { unsigned int start = i, end; for (i++; i < length && (content[i] != '\'' || (content[i-1] == '\\' && content[i-2] != '\\')); i++) {} end = i; elm_code_line_token_add(line, start, end, 1, ELM_CODE_TOKEN_TYPE_STRING); count = 0; continue; } for (sym = syntax->symbols; *sym; sym++) if (content[i] == *sym) { if (count) _elm_code_syntax_parse_token(syntax, line, ptr-content, ptr, count); elm_code_line_token_add(line, i, i, 1, ELM_CODE_TOKEN_TYPE_BRACE); count = -1; break; } count++; } if (count) _elm_code_syntax_parse_token(syntax, line, ptr-content, ptr, count); }