getfieldsdictionary : add the marker of end table 64/16364/4
Sylvain GENIN [Tue, 14 Apr 2015 09:01:39 +0000 (11:01 +0200)]
a.b = 2
a.bb = 3
a.c = 4
a.cc = 42

M=mlist(['V','name','value'],['a','b';'c' 'd'],[1 2;3 4]);

// segfault on Windows
a.{tabulation}
M.{tabulation}

Change-Id: I4fc78b84c836b07db7a3c07c008416d32eb221a9

scilab/modules/completion/src/cpp/getfieldsdictionary.cpp

index b64c1a9..2ad260e 100644 (file)
@@ -40,10 +40,11 @@ static int cmpNames(const void *a, const void *b)
 char **getfieldsdictionary(char *lineBeforeCaret, char *pattern, int *size)
 {
     int rc = 0;
-    char **pstData = NULL;
+    wchar_t **pstData = NULL;
     char **fields = NULL;
     char *pstVar = NULL;
     wchar_t* pwstVar = NULL;
+    int iXlist = 0;
 
     char *lineBeforePoint = NULL;
     int pos = (int)(strlen(lineBeforeCaret) - strlen(pattern) - 1);
@@ -108,12 +109,7 @@ char **getfieldsdictionary(char *lineBeforeCaret, char *pattern, int *size)
 
         iSize = pFields->getSize();
 
-        pstData = (char**)MALLOC(sizeof(char*) * iSize);
-
-        for (int i = 0 ; i < iSize ; i++)
-        {
-            pstData[i] = wide_string_to_UTF8(pFields->get(i));
-        }
+        pstData = pFields->get();
     }
     else if (pIT->isTList() || pIT->isMList())
     {
@@ -127,53 +123,32 @@ char **getfieldsdictionary(char *lineBeforeCaret, char *pattern, int *size)
             return NULL;
         }
 
-        pstData = (char**)MALLOC(sizeof(char*) * iSize);
-
-        for (int i = 0 ; i < iSize ; i++)
-        {
-            pstData[i] = wide_string_to_UTF8(pFields->get(i + 1));
-        }
+        pstData = pFields->get();
+        iXlist = 1;
     }
     else
     {
         return NULL;
     }
 
-    int iFieldsSize = 0;
-    fields = (char**)getFieldsForType(pstData[0], NULL, NULL, 0, &iFieldsSize);
-    if (fields)
-    {
-        freeArrayOfString(pstData, rc);
-        pstData = fields;
-        for (rc = 0; fields[rc]; rc++)
-        {
-            ;
-        }
-    }
-
     int iLast = 0;
-    for (int i = 0 ; i < iSize ; i++)
+    char** _fields = (char**)MALLOC(sizeof(char*) * (iSize + 1));
+    wchar_t* wpattern = to_wide_string(pattern);
+    for (int i = iXlist; i < (iSize + iXlist); ++i)
     {
-        if (strstr(pstData[i], pattern) != pstData[i])
-        {
-            FREE(pstData[i]);
-            pstData[i] = NULL;
-        }
-        else if (pstData[iLast] != pstData[i])
+        if (wcsstr(pstData[i], wpattern) == pstData[i])
         {
-            pstData[iLast] = pstData[i];
-            pstData[i] = NULL;
-            iLast++;
-        }
-        else
-        {
-            iLast++;
+            _fields[iLast++] = wide_string_to_UTF8(pstData[i]);
         }
+
     }
 
+    FREE(wpattern);
+
+    _fields[iLast] = NULL;
     *size = iLast;
-    qsort(pstData, *size, sizeof(char*), cmpNames);
+    qsort(_fields, *size, sizeof(char*), cmpNames);
 
-    return pstData;
+    return _fields;
 }
 /*--------------------------------------------------------------------------*/