diff options
Diffstat (limited to 'src/symbols.c')
-rw-r--r-- | src/symbols.c | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/src/symbols.c b/src/symbols.c index 003d745..fc2ec5b 100644 --- a/src/symbols.c +++ b/src/symbols.c @@ -24,6 +24,9 @@ #include <glib.h> +#include <Scintilla.h> +#include <Lexilla.h> + #include "sciteco.h" #include "string-utils.h" #include "error.h" @@ -194,26 +197,13 @@ teco_scintilla_parse_symbols(teco_machine_scintilla_t *scintilla, const teco_str gint v = teco_symbol_list_lookup(&teco_symbol_list_scilexer, symbols[1], ""); if (v < 0) { g_set_error(error, TECO_ERROR, TECO_ERROR_FAILED, - "Unknown Scintilla Lexer symbol \"%s\"", + "Unknown Lexilla style symbol \"%s\"", symbols[1]); return FALSE; } scintilla->wParam = v; } - if (!symbols[2]) - return TRUE; - if (*symbols[2]) { - gint v = teco_symbol_list_lookup(&teco_symbol_list_scilexer, symbols[2], ""); - if (v < 0) { - g_set_error(error, TECO_ERROR, TECO_ERROR_FAILED, - "Unknown Scintilla Lexer symbol \"%s\"", - symbols[2]); - return FALSE; - } - scintilla->lParam = v; - } - return TRUE; } @@ -263,35 +253,40 @@ gboolean teco_state_scintilla_symbols_process_edit_cmd(teco_machine_main_t *ctx, /*$ ES scintilla message * -- Send Scintilla message - * [lParam[,wParam]]ESmessage[,wParam[,lParam]]$[lParam]$ -> result + * [lParam,][wParam,][message]ES[message][,wParam]$[lParam]$ -> result * - * Send Scintilla message with code specified by symbolic - * name <message>, <wParam> and <lParam>. - * <wParam> may be symbolic when specified as part of the - * first string argument. - * If not it is popped from the stack. + * Send Scintilla message with code specified by + * <message>, <wParam> and <lParam>. + * <message> and <wParam> may be a symbolic names when specified as + * part of the first string argument. + * If not, they are popped from the stack. * <lParam> may be specified as a constant string whose * pointer is passed to Scintilla if specified as the second * string argument. + * It is automatically null-terminated. * If the second string argument is empty, <lParam> is popped * from the stack instead. * Parameters popped from the stack may be omitted, in which * case 0 is implied. * The message's return value is pushed onto the stack. * - * All messages defined by Scintilla (as C macros) can be - * used by passing their name as a string to ES + * All messages defined by Scintilla (as C macros in Scintilla.h) + * can be used by passing their name as a string to ES * (e.g. ESSCI_LINESONSCREEN...). * The \(lqSCI_\(rq prefix may be omitted and message symbols * are case-insensitive. - * Only the Scintilla lexer symbols (SCLEX_..., SCE_...) - * may be used symbolically with the ES command as <wParam>, - * other values must be passed as integers on the stack. + * Only the Lexilla style names (SCE_...) + * may be used symbolically with the ES command as <wParam>. * In interactive mode, symbols may be auto-completed by * pressing Tab. * String-building characters are by default interpreted * in the string arguments. * + * As a special exception, you can and must specify a + * Lexilla lexer name as a string argument for the \fBSCI_SETILEXER\fP + * message, ie. in order to load a Lexilla lexer + * (this works similar to the old \fBSCI_SETLEXERLANGUAGE\fP message). + * * .BR Warning : * Almost all Scintilla messages may be dispatched using * this command. @@ -322,26 +317,36 @@ teco_state_scintilla_lparam_done(teco_machine_main_t *ctx, const teco_string_t * if (ctx->mode > TECO_MODE_NORMAL) return &teco_state_start; - if (teco_string_contains(str, '\0')) { - g_set_error_literal(error, TECO_ERROR, TECO_ERROR_FAILED, - "Scintilla lParam string must not contain null-byte."); - return NULL; - } + sptr_t lParam = 0; + + if (ctx->scintilla.iMessage == SCI_SETILEXER) { + if (teco_string_contains(str, '\0')) { + g_set_error_literal(error, TECO_ERROR, TECO_ERROR_FAILED, + "Lexer name must not contain null-byte."); + return NULL; + } - if (!ctx->scintilla.lParam) { - if (str->len > 0) { - ctx->scintilla.lParam = (sptr_t)str->data; - } else { - teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, 0, error)) - return NULL; - ctx->scintilla.lParam = v; + lParam = (sptr_t)CreateLexer(str->data); + if (!lParam) { + g_set_error(error, TECO_ERROR, TECO_ERROR_FAILED, + "Lexilla lexer \"%s\" not found.", str->data); + return NULL; } + } else if (str->len > 0) { + /* + * NOTE: There may even be messages that read strings + * with embedded nulls. + */ + lParam = (sptr_t)str->data; + } else { + teco_int_t v; + if (!teco_expressions_pop_num_calc(&v, 0, error)) + return NULL; + lParam = v; } teco_expressions_push(teco_interface_ssm(ctx->scintilla.iMessage, - ctx->scintilla.wParam, - ctx->scintilla.lParam)); + ctx->scintilla.wParam, lParam)); return &teco_state_start; } |