2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2008 - DIGITEO - Allan CORNET
5 * Copyright (C) 2012 - 2016 - Scilab Enterprises
7 * This file is hereby licensed under the terms of the GNU GPL v2.0,
8 * pursuant to article 5.3.4 of the CeCILL v.2.1.
9 * This file was originally licensed under the terms of the CeCILL v2.1,
10 * and continues to be available under such terms.
11 * For more information, see the COPYING file which you should have received
12 * along with this program.
16 /*--------------------------------------------------------------------------*/
22 #include "HistoryManager.h"
23 #include "TermConsole.h"
24 #include "localization.h"
25 #include "sci_malloc.h"
26 #include "TermPosition.h"
27 #include "../../../windows_tools/src/c/scilab_windows/console.h"
28 #include "os_string.h"
29 #include "storeCommand.h"
30 /*--------------------------------------------------------------------------*/
31 static int CURRENT_MAX_LINE_SIZE = bsiz;
32 static char *cur_line = NULL; /* current contents of the line */
33 static char *currentPrompt = NULL;
34 static int cur_pos = 0; /* current position of the cursor */
35 static int max_pos = 0;
36 /*--------------------------------------------------------------------------*/
37 /* do backspace on line */
38 static void backSpace(void);
39 static void initializeLineBuffer(void);
40 static void reallocLineBuffer(void);
41 /*--------------------------------------------------------------------------*/
42 static void initializeLineBuffer(void)
50 cur_line = (char*) MALLOC(sizeof(char) * CURRENT_MAX_LINE_SIZE);
53 for (i = 0; i < CURRENT_MAX_LINE_SIZE; i++)
60 fprintf(stderr, "Error: Buffer line allocation.\n");
64 /*--------------------------------------------------------------------------*/
65 static void reallocLineBuffer(void)
69 if ( max_pos > (CURRENT_MAX_LINE_SIZE - 1) )
71 char *ptrBackup = cur_line;
72 int newCURRENT_MAX_LINE_SIZE = CURRENT_MAX_LINE_SIZE * 2;
73 cur_line = (char*)REALLOC(cur_line, sizeof(char) * (newCURRENT_MAX_LINE_SIZE));
80 CURRENT_MAX_LINE_SIZE = newCURRENT_MAX_LINE_SIZE;
86 initializeLineBuffer();
89 /*--------------------------------------------------------------------------*/
90 void moveBeginningLine(void)
99 /*--------------------------------------------------------------------------*/
100 void moveEndLine(void)
103 while (cur_pos < max_pos)
105 TerminalPutc (cur_line[cur_pos]);
109 /*--------------------------------------------------------------------------*/
110 void moveBackSingleChar(void)
119 /*--------------------------------------------------------------------------*/
120 void moveForwardSingleChar(void)
123 if (cur_pos < max_pos)
125 TerminalPutc(cur_line[cur_pos]);
129 /*--------------------------------------------------------------------------*/
130 void moveBackSingleWord(void)
133 while ((cur_pos > 0) && (isspace(cur_line[cur_pos - 1]) ))
138 while ((cur_pos > 0) && ( !isspace(cur_line[cur_pos - 1]) ))
145 /*--------------------------------------------------------------------------*/
146 void moveForwardSingleWord(void)
149 while ( !isspace(cur_line[cur_pos]) && (cur_pos < max_pos) )
151 TerminalPutc(cur_line[cur_pos]);
154 while ( isspace(cur_line[cur_pos]) && (cur_pos < max_pos) )
156 TerminalPutc(cur_line[cur_pos]);
161 /*--------------------------------------------------------------------------*/
162 void killCurrentPositionToEndLine(void)
166 for (i = cur_pos; i < max_pos; i++)
170 for (i = cur_pos; i < max_pos; i++)
172 TerminalPutc(VK_SPACE);
174 for (i = cur_pos; i < max_pos; i++)
180 /*--------------------------------------------------------------------------*/
181 void deletePreviousChar(void)
189 for (i = cur_pos; i < max_pos; i++)
191 cur_line[i] = cur_line[i + 1];
201 /*--------------------------------------------------------------------------*/
202 void deleteCurrentChar(void)
207 StorePrioritaryCommand("exit");
211 if (cur_pos < max_pos)
214 for (i = cur_pos; i < max_pos; i++)
216 cur_line[i] = cur_line[i + 1];
223 /*--------------------------------------------------------------------------*/
224 void moveBackHistory(void)
226 char *newline = NULL;
230 cur_line[max_pos + 1] = '\0';
231 if (cur_line[0] == '\0')
233 resetSearchedTokenInScilabHistory();
234 setSearchedTokenInScilabHistory(NULL);
237 newline = getPreviousLineInScilabHistory();
247 /*--------------------------------------------------------------------------*/
248 void moveForwardHistory(void)
250 char *newline = NULL;
254 cur_line[max_pos + 1] = '\0';
255 if (cur_line[0] == '\0')
257 resetSearchedTokenInScilabHistory();
258 setSearchedTokenInScilabHistory(NULL);
261 newline = getNextLineInScilabHistory();
271 /*--------------------------------------------------------------------------*/
272 void redrawLine(void)
275 char *line = getCurrentLine();
278 for (i = max_pos; i > cur_pos; i--)
289 /*--------------------------------------------------------------------------*/
290 void copyLine(char *line)
296 TerminalPrintf(line);
297 CharToOem(line, cur_line);
298 cur_pos = max_pos = (int)strlen (cur_line);
301 /*--------------------------------------------------------------------------*/
302 void killLastWord(void)
306 while ((cur_pos > 0) && (cur_line[cur_pos - 1] == VK_SPACE))
311 while ((cur_pos > 0) && (cur_line[cur_pos - 1] != VK_SPACE))
317 killCurrentPositionToEndLine();
319 /*--------------------------------------------------------------------------*/
328 /*--------------------------------------------------------------------------*/
329 void refreshLine(void)
335 /* write tail of string */
336 for (i = cur_pos; i < max_pos; i++)
338 TerminalPutc(cur_line[i]);
341 /* write a space at the end of the line in case we deleted one */
342 TerminalPutc(VK_SPACE);
344 /* backup to original position */
345 for (i = max_pos + 1; i > cur_pos; i--)
351 /*--------------------------------------------------------------------------*/
352 void clearCurrentLine(void)
358 for (i = 0; i < max_pos; i++)
365 for (i = 0; i < max_pos; i++)
367 TerminalPutc(VK_SPACE);
375 /*--------------------------------------------------------------------------*/
376 static void backSpace(void)
381 TermGetPosition(&X, &Y);
384 X = getXConsoleScreenSize();
386 TermSetPosition(X, Y);
390 TerminalPutc(VK_BACK);
393 /*--------------------------------------------------------------------------*/
394 static char *getCurrentPrompt(void)
396 return currentPrompt;
398 /*--------------------------------------------------------------------------*/
399 void setCurrentPrompt(char *prompt)
401 currentPrompt = prompt;
403 /*--------------------------------------------------------------------------*/
404 void displayPrompt(void)
409 TermGetPosition(&X, &Y);
412 TerminalPrintf("\n");
415 TerminalPrintf(getCurrentPrompt());
417 /*--------------------------------------------------------------------------*/
418 char *getCurrentLine(void)
424 cur_line[max_pos + 1] = '\0';
425 line = os_strdup(cur_line);
428 OemToChar(cur_line, line);
432 /*--------------------------------------------------------------------------*/
433 char *getLineBeforeCaret(void)
438 line = os_strdup(cur_line);
439 line[cur_pos] = '\0';
442 /*--------------------------------------------------------------------------*/
443 char *getLineAfterCaret(void)
448 if (cur_pos != max_pos)
450 line = os_strdup(&cur_line[cur_pos]);
454 line = os_strdup("");
458 /*--------------------------------------------------------------------------*/
459 void addCharacterCurrentLine(unsigned char ch)
465 for (i = max_pos; i > cur_pos; i--)
467 cur_line[i] = cur_line[i - 1];
470 cur_line[cur_pos] = ch;
473 cur_line[max_pos] = '\0';
475 setSearchedTokenInScilabHistory(cur_line);
477 if (cur_pos < max_pos)
482 /*--------------------------------------------------------------------------*/
483 BOOL isHistorySearch(void)
485 return (cur_line[0] == '!');
487 /*--------------------------------------------------------------------------*/
488 void putLineSearchedHistory(void)
491 char *token = getCurrentLine();
495 if ( (int)strlen(token) > 1 )
497 setSearchedTokenInScilabHistory(&token[1]);
498 line = getNextLineInScilabHistory();
513 /*--------------------------------------------------------------------------*/
514 void pasteClipBoard(void)
516 HGLOBAL hGMem = NULL;
517 LPSTR lpMem; /* Ptr on clipboard */
519 int typeClipboard = CF_TEXT;
523 hGMem = GetClipboardData (typeClipboard);
527 char *CurrentLine = getCurrentLine();
529 lpMem = (LPSTR)GlobalLock( hGMem );
532 char *newline = (char*)MALLOC(sizeof(char) * (strlen(CurrentLine) + strlen(lpMem) + 1));
533 memset(newline, 0x00, strlen(CurrentLine) + strlen(lpMem) + 1);
534 strncpy(newline, CurrentLine, cur_pos);
535 strcat(newline, lpMem);
541 GlobalUnlock (hGMem);
547 /*--------------------------------------------------------------------------*/
548 void finalizeLineBuffer(void)