From 92eacde6e7e1a4a53185691fd97b549029724320 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 3 Dec 2016 15:59:40 +0000 Subject: [PATCH] elm_code: refactoring of the elm_code_line_indent to work with lines --- src/lib/elementary/elm_code_indent.c | 15 +++- src/lib/elementary/elm_code_indent.h | 2 +- src/lib/elementary/elm_code_widget.c | 6 +- src/tests/elementary/elm_code_test_indent.c | 87 +++++++++++++-------- 4 files changed, 72 insertions(+), 38 deletions(-) diff --git a/src/lib/elementary/elm_code_indent.c b/src/lib/elementary/elm_code_indent.c index b1b13d32b6..70b66cd42c 100644 --- a/src/lib/elementary/elm_code_indent.c +++ b/src/lib/elementary/elm_code_indent.c @@ -7,12 +7,21 @@ #include "elm_code_private.h" EAPI char * -elm_code_line_indent_get(const char *prevtext, unsigned int prevlength) +elm_code_line_indent_get(Elm_Code_Line *line) { - unsigned int count = 0; - char *buf, *ptr = (char *)prevtext; + Elm_Code_Line *prevline; + const char *prevtext; + unsigned int prevlength, count = 0; + char *buf, *ptr; char next, last; + if (line->number <= 1) + return strdup(""); + + prevline = elm_code_file_line_get(line->file, line->number - 1); + prevtext = elm_code_line_text_get(prevline, &prevlength); + + ptr = (char *)prevtext; buf = malloc((prevlength + 3) * sizeof(char)); while (count < prevlength) { diff --git a/src/lib/elementary/elm_code_indent.h b/src/lib/elementary/elm_code_indent.h index 1cf889123b..41eaccd4d6 100644 --- a/src/lib/elementary/elm_code_indent.h +++ b/src/lib/elementary/elm_code_indent.h @@ -20,7 +20,7 @@ extern "C" { * */ -EAPI char *elm_code_line_indent_get(const char *prevtext, unsigned int prevlength); +EAPI char *elm_code_line_indent_get(Elm_Code_Line *line); EAPI char *elm_code_line_indent_matching_braces_get(Elm_Code_Line *line); diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c index a05cf32591..f0b54fe128 100644 --- a/src/lib/elementary/elm_code_widget.c +++ b/src/lib/elementary/elm_code_widget.c @@ -1237,8 +1237,8 @@ _elm_code_widget_text_at_cursor_insert_do(Elm_Code_Widget *widget, const char *t count = 0; while (count < curlen) { - if (!_elm_code_text_char_is_whitespace(*curtext)) - break; + if (*curtext != ' ' && *curtext != '\t') + break; count++; curtext++; @@ -1338,7 +1338,7 @@ _elm_code_widget_newline(Elm_Code_Widget *widget) width = elm_code_widget_line_text_column_width_get(widget, line); line = elm_code_file_line_get(code->file, row + 1); - leading = elm_code_line_indent_get(oldtext, oldlen); + leading = elm_code_line_indent_get(line); elm_code_line_text_leading_whitespace_strip(line); elm_code_line_text_insert(line, 0, leading, strlen(leading)); free(oldtext); diff --git a/src/tests/elementary/elm_code_test_indent.c b/src/tests/elementary/elm_code_test_indent.c index 70ecc9e562..f4887d5d8c 100644 --- a/src/tests/elementary/elm_code_test_indent.c +++ b/src/tests/elementary/elm_code_test_indent.c @@ -8,55 +8,80 @@ #include "Elementary.h" #include "elm_code_indent.h" +static void +_indent_check(Elm_Code_File *file, const char *prev, const char *expected) +{ + Elm_Code_Line *line; + char *str; + + elm_code_file_clear(file); + + elm_code_file_line_append(file, prev, strlen(prev), NULL); + elm_code_file_line_append(file, "", 0, NULL); + line = elm_code_file_line_get(file, 2); + + str = elm_code_line_indent_get(line); + ck_assert_str_eq(expected, str); + + free(str); +} + START_TEST (elm_code_indent_whitespace_test) { - const char *str; + Elm_Code *code; + Elm_Code_File *file; - str = elm_code_line_indent_get("", 0); - ck_assert_str_eq("", str); - str = elm_code_line_indent_get(" ", 2); - ck_assert_str_eq(" ", str); - str = elm_code_line_indent_get("\t", 1); - ck_assert_str_eq("\t", str); - str = elm_code_line_indent_get("\t ", 3); - ck_assert_str_eq("\t ", str); + elm_init(1, NULL); + code = elm_code_create(); + file = elm_code_file_new(code); + + _indent_check(file, "", ""); + _indent_check(file, " ", " "); + _indent_check(file, "\t", "\t"); + _indent_check(file, "\t ", "\t "); + + elm_shutdown(); } END_TEST START_TEST (elm_code_indent_comments_test) { - const char *str; + Elm_Code *code; + Elm_Code_File *file; - str = elm_code_line_indent_get(" /**", 4); - ck_assert_str_eq(" * ", str); - str = elm_code_line_indent_get(" * ", 4); - ck_assert_str_eq(" * ", str); - str = elm_code_line_indent_get(" */", 4); - ck_assert_str_eq(" ", str); - str = elm_code_line_indent_get("\t//", 3); - ck_assert_str_eq("\t//", str); + elm_init(1, NULL); + code = elm_code_create(); + file = elm_code_file_new(code); + + _indent_check(file, " /**", " * "); + _indent_check(file, " * ", " * "); + _indent_check(file, " */", " "); + _indent_check(file, "\t//", "\t//"); // test these are not comments - str = elm_code_line_indent_get(" / ", 3); - ck_assert_str_eq(" ", str); - str = elm_code_line_indent_get(" hi//", 5); - ck_assert_str_eq(" ", str); + _indent_check(file, " / ", " "); + _indent_check(file, " hi//", " "); + + elm_shutdown(); } END_TEST START_TEST (elm_code_indent_simple_braces) { - const char *str; + Elm_Code *code; + Elm_Code_File *file; - str = elm_code_line_indent_get("if() {", 6); - ck_assert_str_eq(" ", str); - str = elm_code_line_indent_get("}", 1); - ck_assert_str_eq("", str); + elm_init(1, NULL); + code = elm_code_create(); + file = elm_code_file_new(code); - str = elm_code_line_indent_get(" {", 3); - ck_assert_str_eq(" ", str); - str = elm_code_line_indent_get(" }", 3); - ck_assert_str_eq("", str); + _indent_check(file, "if() {", " "); + _indent_check(file, "}", ""); + + _indent_check(file, " {", " "); + _indent_check(file, " }", ""); + + elm_shutdown(); } END_TEST