ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=0101b988d5b04ccd43f3746f686ecf5d368e81ae

commit 0101b988d5b04ccd43f3746f686ecf5d368e81ae
Author: Andy Williams <a...@andywilliams.me>
Date:   Sat Aug 29 12:05:56 2015 +0100

    [elm_code] trim all trailing whitespace on save
    
    Rather than just blank lines remove all trailing whitespace from lines
---
 ChangeLog                               |  2 +-
 elm_code/src/lib/elm_code_file.c        |  7 ++---
 elm_code/src/lib/elm_code_text.c        | 53 ++++++++++++++++++++++++++++++---
 elm_code/src/lib/elm_code_text.h        |  4 +++
 elm_code/src/tests/elm_code_test_text.c | 19 ++++++++++++
 5 files changed, 75 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index bd14aeb..b3e2fc8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,6 @@
 2015-08-27 ajwillia.ms (Andy Williams)
 
-       * Trim lines that are purely whitespace during save
+       * Trim trailing whitespace from lines during save
 
 2015-07-17 ajwillia.ms (Andy Williams)
 
diff --git a/elm_code/src/lib/elm_code_file.c b/elm_code/src/lib/elm_code_file.c
index 8832fe0..387e249 100644
--- a/elm_code/src/lib/elm_code_file.c
+++ b/elm_code/src/lib/elm_code_file.c
@@ -178,12 +178,9 @@ EAPI void elm_code_file_save(Elm_Code_File *file)
 
    EINA_LIST_FOREACH(file->lines, item, line_item)
      {
+        elm_code_line_text_trailing_whitespace_strip(line_item);
         content = elm_code_line_text_get(line_item, &length);
-        if (elm_code_text_is_whitespace(content, length))
-          {
-             length = 0;
-             elm_code_line_text_set(line_item, "", 0);
-          }
+
         fwrite(content, sizeof(char), length, out);
         fwrite(crchars, sizeof(char), crlength, out);
      }
diff --git a/elm_code/src/lib/elm_code_text.c b/elm_code/src/lib/elm_code_text.c
index 83216c6..abb5a69 100644
--- a/elm_code/src/lib/elm_code_text.c
+++ b/elm_code/src/lib/elm_code_text.c
@@ -24,19 +24,22 @@ EAPI void
 elm_code_line_text_set(Elm_Code_Line *line, const char *chars, unsigned int 
length)
 {
    Elm_Code_File *file;
-   char *newtext;
+   char *newtext, *oldtext = NULL;
 
    if (!line)
      return;
 
    if (line->modified)
-     free(line->modified);
+     oldtext = line->modified;
 
    newtext = malloc(sizeof(char) * length);
    strncpy(newtext, chars, length);
    line->modified = newtext;
    line->length = length;
 
+   if (oldtext)
+     free(oldtext);
+
    file = line->file;
    if (file->parent)
      {
@@ -207,6 +210,20 @@ elm_code_line_text_remove(Elm_Code_Line *line, unsigned 
int position, int length
    elm_code_callback_fire(file->parent, &ELM_CODE_EVENT_LINE_LOAD_DONE, line);
 }
 
+EAPI void elm_code_line_text_trailing_whitespace_strip(Elm_Code_Line *line)
+{
+   unsigned int length, trailing;
+   const char *content;
+
+   content = elm_code_line_text_get(line, &length);
+   trailing = elm_code_text_trailing_whitespace_length(content, length);
+   if (trailing == 0)
+     return;
+
+   length -= trailing;;
+   elm_code_line_text_set(line, content, length);
+}
+
 /* generic text functions */
 
 EAPI int
@@ -238,6 +255,12 @@ elm_code_text_newlinenpos(const char *text, unsigned int 
length, short *nllen)
    return crpos;
 }
 
+static Eina_Bool
+_elm_code_text_char_is_whitespace(char c)
+{
+   return c == ' ' || c == '\t';
+}
+
 EAPI unsigned int
 elm_code_text_leading_whitespace_length(const char *text, unsigned int length)
 {
@@ -246,7 +269,7 @@ elm_code_text_leading_whitespace_length(const char *text, 
unsigned int length)
 
    while (count < length)
      {
-        if (!(*ptr == ' ' || *ptr == '\t'))
+        if (!_elm_code_text_char_is_whitespace(*ptr))
           break;
 
         count++;
@@ -257,11 +280,33 @@ elm_code_text_leading_whitespace_length(const char *text, 
unsigned int length)
 }
 
 EAPI unsigned int
+elm_code_text_trailing_whitespace_length(const char *text, unsigned int length)
+{
+   unsigned int count = 0;
+   char *ptr;
+
+   if (length == 0)
+     return 0;
+
+   ptr = (char *)text + length - 1;
+   while (count < length)
+     {
+        if (!_elm_code_text_char_is_whitespace(*ptr))
+          break;
+
+        count++;
+        ptr--;
+     }
+
+   return count;
+}
+
+EAPI unsigned int
 elm_code_text_is_whitespace(const char *text, unsigned int length)
 {
    unsigned int leading;
 
-   leading = elm_code_text_leading_whitespace_length(text, length);
+   leading = elm_code_text_trailing_whitespace_length(text, length);
 
    return leading == length;
 }
diff --git a/elm_code/src/lib/elm_code_text.h b/elm_code/src/lib/elm_code_text.h
index 66bfbff..02d2cc4 100644
--- a/elm_code/src/lib/elm_code_text.h
+++ b/elm_code/src/lib/elm_code_text.h
@@ -36,6 +36,8 @@ EAPI void elm_code_line_text_insert(Elm_Code_Line *line, 
unsigned int position,
 
 EAPI void elm_code_line_text_remove(Elm_Code_Line *line, unsigned int 
position, int length);
 
+EAPI void elm_code_line_text_trailing_whitespace_strip(Elm_Code_Line *line);
+
 /**
  * @}
  *
@@ -54,6 +56,8 @@ EAPI int elm_code_text_newlinenpos(const char *text, unsigned 
int length, short
 
 EAPI unsigned int elm_code_text_leading_whitespace_length(const char *text, 
unsigned int length);
 
+EAPI unsigned int elm_code_text_trailing_whitespace_length(const char *text, 
unsigned int length);
+
 EAPI unsigned int elm_code_text_is_whitespace(const char *text, unsigned int 
length);
 
 /**
diff --git a/elm_code/src/tests/elm_code_test_text.c 
b/elm_code/src/tests/elm_code_test_text.c
index 9644ba2..26e1aa1 100644
--- a/elm_code/src/tests/elm_code_test_text.c
+++ b/elm_code/src/tests/elm_code_test_text.c
@@ -112,6 +112,24 @@ START_TEST (elm_code_text_leading_whitespace_test)
 }
 END_TEST
 
+START_TEST (elm_code_text_trailing_whitespace_test)
+{
+   const char *text;
+
+   text = "testing";
+   ck_assert_int_eq(0, elm_code_text_trailing_whitespace_length(text, 
strlen(text)));
+
+   text = "spaces  ";
+   ck_assert_int_eq(2, elm_code_text_trailing_whitespace_length(text, 
strlen(text)));
+
+   text = "tabs\t\t";
+   ck_assert_int_eq(2, elm_code_text_trailing_whitespace_length(text, 
strlen(text)));
+
+   text = "mix \t ";
+   ck_assert_int_eq(3, elm_code_text_trailing_whitespace_length(text, 
strlen(text)));
+}
+END_TEST
+
 START_TEST (elm_code_text_is_whitespace_test)
 {
    const char *text;
@@ -135,5 +153,6 @@ void elm_code_test_text(TCase *tc)
    tcase_add_test(tc, elm_code_text_strpos_test);
    tcase_add_test(tc, elm_code_text_newline_position_test);
    tcase_add_test(tc, elm_code_text_leading_whitespace_test);
+   tcase_add_test(tc, elm_code_text_trailing_whitespace_test);
    tcase_add_test(tc, elm_code_text_is_whitespace_test);
 }

-- 


Reply via email to