2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2008-2010 - DIGITEO - Allan CORNET
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution. The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
13 /*--------------------------------------------------------------------------*/
16 #include "TermCompletion.h"
17 #include "sci_malloc.h"
18 #include "freeArrayOfString.h"
19 #include "localization.h"
21 #include "TermConsole.h"
22 #include "getPartLine.h"
23 #include "getCommonPart.h"
24 #include "completion.h"
26 #include "os_string.h"
27 #include "completeLine.h"
28 #include "configvariable_interface.h"
29 /*--------------------------------------------------------------------------*/
30 static void displayCompletionDictionary(char **dictionary, int sizedictionary, char *namedictionary);
31 static char **concatenateStrings(int *sizearrayofstring, char *string1,
32 char *string2, char *string3,
33 char *string4, char *string5);
34 static void TermCompletionOnFiles(char **dictionaryFiles, int sizedictionaryFiles,
35 char *lineBeforeCaret, char *lineAfterCaret, char *filePattern, char *defaultPattern);
36 static void TermCompletionOnAll(char *lineBeforeCaret, char *lineAfterCaret, char *defaultPattern);
37 /*--------------------------------------------------------------------------*/
38 static void TermCompletionOnFiles(char **dictionaryFiles, int sizedictionaryFiles,
39 char *lineBeforeCaret, char *lineAfterCaret, char *filePattern, char *defaultPattern)
43 if (sizedictionaryFiles == 1)
45 char *newline = completeLine(lineBeforeCaret, dictionaryFiles[0], filePattern, defaultPattern, TRUE, lineAfterCaret);
56 char *common = getCommonPart(dictionaryFiles, sizedictionaryFiles);
58 displayCompletionDictionary(dictionaryFiles,
59 sizedictionaryFiles, gettext("File or Directory"));
64 if (defaultPattern[0] == 0)
66 int lennewline = (int)strlen(lineBeforeCaret) + (int)strlen(lineAfterCaret);
67 char *newline = (char*)MALLOC(sizeof(char) * (lennewline + 1));
72 strcpy(newline, lineBeforeCaret);
73 strcat(newline, lineAfterCaret);
81 char *newline = completeLine(lineBeforeCaret, common, filePattern, defaultPattern, TRUE, lineAfterCaret);
92 int lennewline = (int)strlen(lineBeforeCaret) + (int)strlen(lineAfterCaret);
93 newline = (char*)MALLOC(sizeof(char) * (lennewline + 1));
98 strcpy(newline, lineBeforeCaret);
99 strcat(newline, lineAfterCaret);
111 /*--------------------------------------------------------------------------*/
112 static void TermCompletionOnAll(char *lineBeforeCaret, char *lineAfterCaret, char *defaultPattern)
116 int numberWordFound = 0;
117 char **completionDictionaryFunctions = NULL;
118 int sizecompletionDictionaryFunctions = 0;
120 char **completionDictionaryCommandWords = NULL;
121 int sizecompletionDictionaryCommandWords = 0;
123 char **completionDictionaryMacros = NULL;
124 int sizecompletionDictionaryMacros = 0;
126 char **completionDictionaryVariables = NULL;
127 int sizecompletionDictionaryVariables = 0;
129 char **completionDictionaryHandleGraphicsProperties = NULL;
130 int sizecompletionDictionaryHandleGraphicsProperties = 0;
132 char **completionDictionaryFields = NULL;
133 int sizecompletionDictionaryFields = 0;
135 completionDictionaryFields = completionOnFields(lineBeforeCaret, defaultPattern, &sizecompletionDictionaryFields);
137 if ((completionDictionaryFields == NULL) && strcmp(defaultPattern, ""))
139 completionDictionaryFunctions = completionOnFunctions(defaultPattern, &sizecompletionDictionaryFunctions);
140 completionDictionaryCommandWords = completionOnCommandWords(defaultPattern, &sizecompletionDictionaryCommandWords);
141 completionDictionaryMacros = completionOnMacros(defaultPattern, &sizecompletionDictionaryMacros);
142 completionDictionaryVariables = completionOnVariablesWithoutMacros(defaultPattern, &sizecompletionDictionaryVariables);
143 completionDictionaryHandleGraphicsProperties = completionOnHandleGraphicsProperties(defaultPattern, &sizecompletionDictionaryHandleGraphicsProperties);
145 numberWordFound = sizecompletionDictionaryFunctions + sizecompletionDictionaryCommandWords +
146 sizecompletionDictionaryMacros + sizecompletionDictionaryVariables +
147 sizecompletionDictionaryHandleGraphicsProperties + sizecompletionDictionaryFields;
149 if (numberWordFound > 0)
151 if (numberWordFound == 1)
153 char **completionDictionary = NULL;
154 char *new_line = NULL;
156 if (completionDictionaryFields)
158 completionDictionary = completionDictionaryFields;
160 if (completionDictionaryFunctions)
162 completionDictionary = completionDictionaryFunctions;
164 if (completionDictionaryCommandWords)
166 completionDictionary = completionDictionaryCommandWords;
168 if (completionDictionaryMacros)
170 completionDictionary = completionDictionaryMacros;
172 if (completionDictionaryVariables)
174 completionDictionary = completionDictionaryVariables;
176 if (completionDictionaryHandleGraphicsProperties)
178 completionDictionary = completionDictionaryHandleGraphicsProperties;
181 new_line = completeLine(lineBeforeCaret, completionDictionary[0], NULL, defaultPattern, FALSE, lineAfterCaret);
191 char *commonAll = NULL;
192 if (completionDictionaryFields)
194 commonAll = getCommonPart(completionDictionaryFields, sizecompletionDictionaryFields);
195 displayCompletionDictionary(completionDictionaryFields, sizecompletionDictionaryFields, (char *)_("Scilab Fields"));
196 freeArrayOfString(completionDictionaryFields, sizecompletionDictionaryFields);
200 char *commonFunctions = getCommonPart(completionDictionaryFunctions, sizecompletionDictionaryFunctions);
201 char *commonCommandWords = getCommonPart(completionDictionaryCommandWords, sizecompletionDictionaryCommandWords);
202 char *commonMacros = getCommonPart(completionDictionaryMacros, sizecompletionDictionaryMacros);
203 char *commonVariables = getCommonPart(completionDictionaryVariables, sizecompletionDictionaryVariables);
204 char *commonHandleGraphicsProperties = getCommonPart(completionDictionaryHandleGraphicsProperties, sizecompletionDictionaryHandleGraphicsProperties);
206 int sizecommonsDictionary = 0;
207 char **commonsDictionary = concatenateStrings(&sizecommonsDictionary, commonFunctions,
208 commonMacros, commonCommandWords, commonVariables, commonHandleGraphicsProperties);
210 if (sizecommonsDictionary > 0)
212 if (sizecommonsDictionary == 1)
214 commonAll = os_strdup(commonsDictionary[0]);
218 commonAll = getCommonPart(commonsDictionary, sizecommonsDictionary);
220 freeArrayOfString(commonsDictionary, sizecommonsDictionary);
223 displayCompletionDictionary(completionDictionaryFunctions, sizecompletionDictionaryFunctions, (char *)_("Scilab Function"));
224 displayCompletionDictionary(completionDictionaryCommandWords, sizecompletionDictionaryCommandWords, (char *)_("Scilab Command"));
225 displayCompletionDictionary(completionDictionaryMacros, sizecompletionDictionaryMacros, (char *)_("Scilab Macro"));
226 displayCompletionDictionary(completionDictionaryVariables, sizecompletionDictionaryVariables, (char *)_("Scilab Variable"));
227 displayCompletionDictionary(completionDictionaryHandleGraphicsProperties, sizecompletionDictionaryHandleGraphicsProperties, (char *)_("Graphics handle field"));
228 freeArrayOfString(completionDictionaryFunctions, sizecompletionDictionaryFunctions);
229 freeArrayOfString(completionDictionaryCommandWords, sizecompletionDictionaryCommandWords);
230 freeArrayOfString(completionDictionaryMacros, sizecompletionDictionaryMacros);
231 freeArrayOfString(completionDictionaryVariables, sizecompletionDictionaryVariables);
232 freeArrayOfString(completionDictionaryHandleGraphicsProperties, sizecompletionDictionaryHandleGraphicsProperties);
240 char *newline = NULL;
242 newline = completeLine(lineBeforeCaret, commonAll, NULL, defaultPattern, FALSE, lineAfterCaret);
257 /*--------------------------------------------------------------------------*/
258 void TermCompletion(void)
260 char *LineBeforeCaret = getLineBeforeCaret();
261 char *LineAfterCaret = getLineAfterCaret();
262 char *fileSearchedPattern = getFilePartLevel(LineBeforeCaret);
263 char *SearchedPattern = getPartLevel(LineBeforeCaret);
266 char **completionDictionaryFiles = NULL;
267 int sizecompletionDictionaryFiles = 0;
269 completionDictionaryFiles = completionOnFiles(fileSearchedPattern, &sizecompletionDictionaryFiles);
270 if (completionDictionaryFiles)
272 TermCompletionOnFiles(completionDictionaryFiles, sizecompletionDictionaryFiles,
273 LineBeforeCaret, LineAfterCaret, fileSearchedPattern, SearchedPattern);
275 freeArrayOfString(completionDictionaryFiles, sizecompletionDictionaryFiles);
279 TermCompletionOnAll(LineBeforeCaret, LineAfterCaret, SearchedPattern);
284 FREE(LineBeforeCaret);
285 LineBeforeCaret = NULL;
289 FREE(LineAfterCaret);
290 LineAfterCaret = NULL;
292 if (fileSearchedPattern)
294 FREE(fileSearchedPattern);
295 fileSearchedPattern = NULL;
299 FREE(SearchedPattern);
300 SearchedPattern = NULL;
303 /*--------------------------------------------------------------------------*/
304 static void displayCompletionDictionary(char **dictionary, int sizedictionary, char *namedictionary)
309 int lenCurrentLine = 0;
311 TerminalPrintf("\n");
312 TerminalPrintf(namedictionary);
314 TerminalPrintf("\n");
316 for (i = 0; i < sizedictionary; i++)
318 int newlenLine = lenCurrentLine + (int)strlen(dictionary[i]) + (int)strlen(" ");
319 if ( newlenLine >= (getConsoleWidth() - 10) )
321 TerminalPrintf("\n");
326 lenCurrentLine = newlenLine;
329 TerminalPrintf(dictionary[i]);
332 TerminalPrintf("\n");
335 /*--------------------------------------------------------------------------*/
336 static char **concatenateStrings(int *sizearrayofstring, char *string1,
337 char *string2, char *string3,
338 char *string4, char *string5)
341 char **arrayOfString = NULL;
342 *sizearrayofstring = 0;
367 arrayOfString = (char**)MALLOC(sizeof(char*) * (newsize));
373 arrayOfString[i] = string1;
378 arrayOfString[i] = string2;
383 arrayOfString[i] = string3;
388 arrayOfString[i] = string4;
393 arrayOfString[i] = string5;
396 *sizearrayofstring = i;
400 *sizearrayofstring = 0;
403 return arrayOfString;
405 /*--------------------------------------------------------------------------*/