ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f6486473ed6a106216655f34042d0ae2218fe046

commit f6486473ed6a106216655f34042d0ae2218fe046
Author: Andy Williams <[email protected]>
Date:   Sun Nov 27 23:13:42 2016 +0000

    elm_code: Slightly smarter indent logic
    
    Continue comment blocks where appropriate...
    A bunch of refactoring of text/indent code to expand further
---
 src/Makefile_Elementary.am            |  2 +
 src/lib/elementary/elm_code.h         |  1 +
 src/lib/elementary/elm_code_indent.c  | 57 ++++++++++++++++++++
 src/lib/elementary/elm_code_indent.h  | 33 ++++++++++++
 src/lib/elementary/elm_code_private.h |  2 +
 src/lib/elementary/elm_code_text.c    | 97 ++++++++++++++++-------------------
 src/lib/elementary/elm_code_text.h    |  4 --
 src/lib/elementary/elm_code_widget.c  | 11 ++--
 8 files changed, 145 insertions(+), 62 deletions(-)

diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 97ff78b..480f683 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -276,6 +276,7 @@ includesunstable_HEADERS = \
        lib/elementary/elm_code_common.h \
        lib/elementary/elm_code_line.h \
        lib/elementary/elm_code_text.h \
+       lib/elementary/elm_code_indent.h \
        lib/elementary/elm_code_file.h \
        lib/elementary/elm_code_parse.h
 includesunstabledir = $(includedir)/elementary-@VMAJ@
@@ -553,6 +554,7 @@ lib_elementary_libelementary_la_SOURCES = \
        lib/elementary/elm_cnp.c \
        lib/elementary/elm_code_line.c \
        lib/elementary/elm_code_text.c \
+       lib/elementary/elm_code_indent.c \
        lib/elementary/elm_code_file.c \
        lib/elementary/elm_code_parse.c \
        lib/elementary/elm_code_widget_selection.c \
diff --git a/src/lib/elementary/elm_code.h b/src/lib/elementary/elm_code.h
index e93e30b..545142c 100644
--- a/src/lib/elementary/elm_code.h
+++ b/src/lib/elementary/elm_code.h
@@ -6,6 +6,7 @@
 #include "elm_code_common.h"
 #include "elm_code_line.h"
 #include "elm_code_text.h"
+#include "elm_code_indent.h"
 #include "elm_code_file.h"
 #include "elm_code_parse.h"
 #include "elm_code_widget.eo.h"
diff --git a/src/lib/elementary/elm_code_indent.c 
b/src/lib/elementary/elm_code_indent.c
new file mode 100644
index 0000000..0ff9fd0
--- /dev/null
+++ b/src/lib/elementary/elm_code_indent.c
@@ -0,0 +1,57 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include "Elementary.h"
+
+#include "elm_code_private.h"
+
+EAPI char *
+elm_code_line_indent_get(const char *prevtext, unsigned int prevlength)
+{
+   unsigned int count = 0;
+   char *buf, *ptr = (char *)prevtext;
+   char next;
+
+   buf = malloc((prevlength + 3) * sizeof(char));
+   while (count < prevlength)
+     {
+        if (!_elm_code_text_char_is_whitespace(*ptr))
+          break;
+
+        count++;
+        ptr++;
+     }
+
+   strncpy(buf, prevtext, count);
+   buf[count] = '\0';
+   if (count < prevlength)
+     {
+        next = *ptr;
+        // TODO this should all be based on comment SCOPE not text matching
+        if (next == '/')
+          {
+             if (count == prevlength - 1)
+               return buf;
+
+             if (*(ptr+1) == '/')
+               strcpy(buf + count, "//");
+             else if (*(ptr+1) == '*')
+               strcpy(buf + count, " * ");
+          }
+        else if (next == '*')
+          {
+             if (count < prevlength - 1 && *(ptr+1) == ' ')
+               strcpy(buf + count, "* ");
+             else if (count < prevlength - 1 && *(ptr+1) == '/')
+               {
+                  if (count >= 1)
+                    buf[count-1] = '\0';
+               }
+             else
+               strcpy(buf + count, "*");
+          }
+     }
+   return buf;
+}
+
diff --git a/src/lib/elementary/elm_code_indent.h 
b/src/lib/elementary/elm_code_indent.h
new file mode 100644
index 0000000..2bbb5a1
--- /dev/null
+++ b/src/lib/elementary/elm_code_indent.h
@@ -0,0 +1,33 @@
+#ifndef ELM_CODE_INDENT_H_
+# define ELM_CODE_INDENT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file
+ * @brief These routines are used for calculating text indentation of lines in 
Elm Code.
+ */
+
+/**
+ * @brief Line indent handling functions.
+ * @defgroup Indent management of indentation of lines
+ *
+ * @{
+ *
+ * Functions for calculation indentation of lines within elm code.
+ *
+ */
+
+EAPI char *elm_code_line_indent_get(const char *prevtext, unsigned int 
prevlength);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ELM_CODE_INDENT_H_ */
diff --git a/src/lib/elementary/elm_code_private.h 
b/src/lib/elementary/elm_code_private.h
index ef08aab..e234782 100644
--- a/src/lib/elementary/elm_code_private.h
+++ b/src/lib/elementary/elm_code_private.h
@@ -24,6 +24,8 @@ extern int _elm_code_lib_log_dom;
 #endif
 #define DBG(...) EINA_LOG_DOM_DBG(_elm_code_lib_log_dom, __VA_ARGS__)
 
+Eina_Bool _elm_code_text_char_is_whitespace(char c);
+
 /* Private parser callbacks */
 
 void _elm_code_parse_setup();
diff --git a/src/lib/elementary/elm_code_text.c 
b/src/lib/elementary/elm_code_text.c
index f1503e7..d472894 100644
--- a/src/lib/elementary/elm_code_text.c
+++ b/src/lib/elementary/elm_code_text.c
@@ -210,18 +210,55 @@ 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);
 }
 
+Eina_Bool
+_elm_code_text_char_is_whitespace(char c)
+{
+   return c == ' ' || c == '\t';
+}
+
+static 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 void elm_code_line_text_leading_whitespace_strip(Elm_Code_Line *line)
 {
-   unsigned int length = 0;
-   unsigned int leading;
+   unsigned int length, count = 0;
    const char *content;
+   char *ptr;
 
    content = elm_code_line_text_get(line, &length);
-   leading = elm_code_text_leading_whitespace_length(content, length);
-   if (leading == 0)
+   if (length == 0)
      return;
 
-   elm_code_line_text_remove(line, 0, leading);
+   ptr = (char *)content;
+   while (count < length)
+     {
+        if (!_elm_code_text_char_is_whitespace(*ptr))
+          break;
+
+        count++;
+        ptr++;
+     }
+
+   elm_code_line_text_remove(line, 0, count);
 }
 
 EAPI void elm_code_line_text_trailing_whitespace_strip(Elm_Code_Line *line)
@@ -231,7 +268,7 @@ EAPI void 
elm_code_line_text_trailing_whitespace_strip(Elm_Code_Line *line)
    const char *content;
 
    content = elm_code_line_text_get(line, &length);
-   trailing = elm_code_text_trailing_whitespace_length(content, length);
+   trailing = _elm_code_text_trailing_whitespace_length(content, length);
    if (trailing == 0)
      return;
 
@@ -269,58 +306,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)
-{
-   unsigned int count = 0;
-   char *ptr = (char *)text;
-
-   while (count < length)
-     {
-        if (!_elm_code_text_char_is_whitespace(*ptr))
-          break;
-
-        count++;
-        ptr++;
-     }
-
-   return count;
-}
-
-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_trailing_whitespace_length(text, length);
+   leading = _elm_code_text_trailing_whitespace_length(text, length);
 
    return leading == length;
 }
diff --git a/src/lib/elementary/elm_code_text.h 
b/src/lib/elementary/elm_code_text.h
index 54b64d1..97d6765 100644
--- a/src/lib/elementary/elm_code_text.h
+++ b/src/lib/elementary/elm_code_text.h
@@ -56,10 +56,6 @@ EAPI int elm_code_text_strnpos(const char *text, unsigned 
int length, const char
 
 EAPI int elm_code_text_newlinenpos(const char *text, unsigned int length, 
short *nllen);
 
-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/src/lib/elementary/elm_code_widget.c 
b/src/lib/elementary/elm_code_widget.c
index e243bf9..443348d 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -1289,8 +1289,8 @@ _elm_code_widget_newline(Elm_Code_Widget *widget)
    Elm_Code *code;
    Elm_Code_Line *line;
    Elm_Code_Widget_Change_Info *change;
-   unsigned int row, col, position, oldlen, leading, width, indent;
-   char *oldtext;
+   unsigned int row, col, position, oldlen, width, indent;
+   char *oldtext, *leading;
 
    _elm_code_widget_delete_selection(widget);
    code = elm_obj_code_widget_code_get(widget);
@@ -1310,12 +1310,13 @@ _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_text_leading_whitespace_length(oldtext, oldlen);
+   leading = elm_code_line_indent_get(oldtext, oldlen);
    elm_code_line_text_leading_whitespace_strip(line);
-   elm_code_line_text_insert(line, 0, oldtext, leading);
+   elm_code_line_text_insert(line, 0, leading, strlen(leading));
    free(oldtext);
 
-   indent = elm_obj_code_widget_line_text_column_width_to_position(widget, 
line, leading);
+   indent = elm_obj_code_widget_line_text_column_width_to_position(widget, 
line,
+     strlen(leading));
    elm_obj_code_widget_cursor_position_set(widget, indent, row + 1);
    efl_event_callback_legacy_call(widget, 
ELM_OBJ_CODE_WIDGET_EVENT_CHANGED_USER, NULL);
 

-- 


Reply via email to