hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=fb7224f4a928c29935dfbd76825e1638c39d5c86

commit fb7224f4a928c29935dfbd76825e1638c39d5c86
Author: Hermet Park <[email protected]>
Date:   Mon Jul 4 12:58:07 2016 +0900

    auto_comp: code refactoring.
    
    added descriptive comments for the main logic of context analysis.
---
 src/lib/auto_comp.c | 126 +++++++++++++++++++++++++++++++---------------------
 1 file changed, 76 insertions(+), 50 deletions(-)

diff --git a/src/lib/auto_comp.c b/src/lib/auto_comp.c
index 44e3560..0ff3131 100644
--- a/src/lib/auto_comp.c
+++ b/src/lib/auto_comp.c
@@ -8,7 +8,7 @@
 #define QUEUE_SIZE 20
 #define COMPSET_PAIR_MINIMUM 1
 #define MAX_CONTEXT_STACK 40
-#define MAX_KEYWORD_LENGHT 40
+#define MAX_KEYWORD_LENGTH 40
 
 typedef struct lexem_s
 {
@@ -127,49 +127,46 @@ lexem_tree_free(lexem **root)
 static void
 context_lexem_thread_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
 {
+   const int quot_len = QUOT_UTF8_LEN;
+
    ctx_lexem_td *td = (ctx_lexem_td *)data;
+   if (!td->utf8) return;
 
-   Eina_Bool find_flag = EINA_FALSE;
-   Eina_Bool dot_lex = EINA_FALSE;
-   Eina_List *l = NULL;
-   Eina_List *nodes = td->ad->lexem_root->nodes;
-   td->result = (lexem *)td->ad->lexem_root;
    int cur_pos = td->cur_pos;
    if (cur_pos <= 1) return;
 
+   Eina_List *l = NULL;
+   Eina_List *nodes = td->ad->lexem_root->nodes;
+   td->result = (lexem *)td->ad->lexem_root;
    int i = 0;
-
-   if (!td->utf8) return;
-
+   int k = 0;
+   int depth = 0;
+   int context_len = 0;
+   char stack[MAX_CONTEXT_STACK][MAX_KEYWORD_LENGTH];
    char *utf8 = td->utf8;
    char *cur = utf8;
    char *end = cur + cur_pos;
-   char stack[MAX_CONTEXT_STACK][MAX_KEYWORD_LENGHT];
-   int depth = 0;
    char *help_ptr = NULL;
    char *help_end_ptr = NULL;
-
    const char *quot = QUOT_UTF8;
-   const int quot_len = QUOT_UTF8_LEN;
-   int quot_cnt = 0;
-   int context_len = 0;
+   Eina_Bool inside_quot = EINA_FALSE;
+   Eina_Bool find_flag = EINA_FALSE;
+   Eina_Bool dot_lex = EINA_FALSE;
 
    while (cur && cur <= end)
      {
+        //Check inside quote
         if ((cur != end) && (!strncmp(cur, quot, quot_len)))
           {
-             /*TODO: add exception for case '\"'*/
-            quot_cnt++;
-            cur++;
-            continue;
+             /* TODO: add exception for case '\"' */
+             inside_quot = !inside_quot;
           }
-        if (quot_cnt % 2)
+        if (inside_quot)
           {
              cur++;
              continue;
           }
 
-
         //Check inside comment
         if (*cur == '/')
           {
@@ -185,75 +182,101 @@ context_lexem_thread_cb(void *data, Ecore_Thread *thread 
EINA_UNUSED)
                }
           }
 
+        //Case 1. Find a context and store it.
         if (*cur == '{')
           {
-             for (help_end_ptr = cur;
-                  !isalnum(*help_end_ptr);
-                  help_end_ptr--);
-             for (help_ptr = help_end_ptr;
-                  ((help_ptr >= utf8) &&
-                   ((isalnum(*help_ptr )) || (*help_ptr == '_')));
-                  help_ptr--);
+             //Skip non-alpha numberics.
+             help_end_ptr = cur;
+             while (!isalnum(*help_end_ptr))
+               help_end_ptr--;
+
+             help_ptr = help_end_ptr;
+
+             //Figure out current context keyword
+             while ((help_ptr >= utf8) &&
+                    (isalnum(*help_ptr) || (*help_ptr == '_')))
+               {
+                  help_ptr--;
+               }
+
              if (help_ptr != utf8)
                help_ptr++;
 
+             //Exceptional case for size.
              context_len = help_end_ptr - help_ptr + 1;
-             if (context_len >= MAX_KEYWORD_LENGHT)
+             if (context_len >= MAX_KEYWORD_LENGTH)
                {
                   cur++;
                   continue;
                }
 
-             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
+             //Store this context.
              strncpy(stack[depth], help_ptr, context_len);
-             depth++;
-             if (depth == MAX_CONTEXT_STACK) break;
+             if ((++depth) == MAX_CONTEXT_STACK) break;
           }
+
+        //Case 2. Find a context and store it.
         if (*cur == '.')
           {
              Eina_Bool alpha_present = EINA_FALSE;
              help_end_ptr = cur - 1;
-             for (help_ptr = help_end_ptr; help_ptr && isalnum(*help_ptr); 
help_ptr--)
-                if (isalpha(*help_ptr)) alpha_present = EINA_TRUE;
+
+             //Backtrace to the beginning of a certain keyword.
+             for (help_ptr = help_end_ptr; help_ptr && isalnum(*help_ptr);
+                  help_ptr--)
+               {
+                  if (isalpha(*help_ptr)) alpha_present = EINA_TRUE;
+               }
+
+             //Hanlding Exception cases.
              if ((!alpha_present) || (!strncmp(help_ptr, quot, quot_len)))
                {
                   cur++;
                   continue;
                }
+
              if (help_ptr != utf8) help_ptr++;
+
              context_len = help_end_ptr - help_ptr + 1;
-             if (context_len >= MAX_KEYWORD_LENGHT)
+             if (context_len >= MAX_KEYWORD_LENGTH)
                {
                   cur++;
                   continue;
                }
-             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
+
+             //Store this context.
+             strncpy(stack[depth], help_ptr, context_len);
              strncpy(stack[depth], help_ptr, context_len);
-             depth++;
-             if (depth == MAX_CONTEXT_STACK) break;
+             if ((++depth) == MAX_CONTEXT_STACK) break;
+
              dot_lex = EINA_TRUE;
-         }
-        if ((*cur == ';') && dot_lex)
+          }
+
+        //End of a dot lex context.
+        //Reset the previous context if its out of scope.
+        if (dot_lex && (*cur == ';'))
           {
              dot_lex = EINA_FALSE;
-             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGTH);
              if (depth > 0) depth--;
           }
+
+        //End of a context. Reset the previous context if its out of scope.
         if (*cur == '}')
           {
-             memset(stack[depth], 0x0, MAX_KEYWORD_LENGHT);
+             memset(stack[depth], 0x0, MAX_KEYWORD_LENGTH);
              if (depth > 0) depth--;
           }
         cur++;
      }
 
-   if (quot_cnt % 2)
+   if (inside_quot)
      {
         td->result = NULL;
         return;
      }
 
-   int k = 0;
+   // Find current context where a cursor is inside of among the stack.
    for (i = 0; i < depth; i++)
      {
         find_flag = EINA_FALSE;
@@ -261,12 +284,15 @@ context_lexem_thread_cb(void *data, Ecore_Thread *thread 
EINA_UNUSED)
           {
              for (k = 0; k < td->result->name_count; k++)
                {
-                 if (!strncmp(stack[i], td->result->name[k], 
strlen(td->result->name[k])))
-                   {
-                      nodes = td->result->nodes;
-                      find_flag = EINA_TRUE;
-                   }
-                 if (find_flag) break;
+                  //Ok, We go through this context.
+                  //FIXME: Need to compare elaborately?
+                  if (!strncmp(stack[i], td->result->name[k],
+                               strlen(td->result->name[k])))
+                    {
+                       nodes = td->result->nodes;
+                       find_flag = EINA_TRUE;
+                       break;
+                    }
                }
              if (find_flag) break;
           }

-- 


Reply via email to