From 7e1dfa1e717940a4921c69a249ff26361e87aafc Mon Sep 17 00:00:00 2001 From: Carsten Larsen Date: Tue, 24 Jan 2017 20:48:02 +0100 Subject: [PATCH] Native character input --- app/lib/aengine.cpp | 6 ++++-- app/lib/aengine.h | 4 +++- app/lib/charval.h | 36 +++++++++++++++++++++++++++++++++++ app/system/console_stdc.cpp | 5 +++-- app/system/console_stdc.h | 3 ++- app/system/language.cpp | 17 +++++++++++++++++ app/system/language.h | 6 +++++- app/system/language_amiga.cpp | 9 +++++++++ app/system/language_amiga.h | 1 + app/system/language_posix.cpp | 5 +++++ app/system/language_posix.h | 1 + app/system/language_stdc.cpp | 5 ++++- app/system/language_stdc.h | 1 + app/system/program_amiga.cpp | 2 +- app/system/program_stdc.cpp | 4 ++-- app/system/window_amiga.cpp | 4 ++-- app/system/window_amiga.h | 2 +- 17 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 app/lib/charval.h diff --git a/app/lib/aengine.cpp b/app/lib/aengine.cpp index b985c78a..62fc11a5 100644 --- a/app/lib/aengine.cpp +++ b/app/lib/aengine.cpp @@ -26,10 +26,12 @@ #include "clib.h" #include "lib/charbuf.h" +#include "lib/charval.h" #include "lib/aengine.h" -AnsiConoleEngine::AnsiConoleEngine(const char *prompt) +AnsiConoleEngine::AnsiConoleEngine(const char *prompt, CharValidator *validator) { + this->validator = validator; AllocAndCopy(&this->prompt, prompt); linebuf = new CharBuffer(); out = new CharBuffer(); @@ -190,7 +192,7 @@ const char* AnsiConoleEngine::ProcessChar(const unsigned char character) cursor--; endpos--; linebuf->ptr = endpos; - } else if (ch >= 32 && ch <= 126) { + } else if (validator->Validate(ch)) { // Insert in middle of line if (cursor != endpos) { char *i = endpos; diff --git a/app/lib/aengine.h b/app/lib/aengine.h index 683ca89c..f144ac15 100644 --- a/app/lib/aengine.h +++ b/app/lib/aengine.h @@ -34,6 +34,7 @@ */ class CharBuffer; +class CharValidator; /** * @brief ANSI console controller. @@ -43,7 +44,7 @@ class CharBuffer; */ class AnsiConoleEngine { public: - AnsiConoleEngine(const char *prompt); + AnsiConoleEngine(const char *prompt, CharValidator *validator); ~AnsiConoleEngine(); void StartInput(); @@ -63,6 +64,7 @@ private: static const int lineSize = 1024; char **lines; CharBuffer *linebuf; + CharValidator *validator; unsigned int len; char *cursor; char *endpos; diff --git a/app/lib/charval.h b/app/lib/charval.h new file mode 100644 index 00000000..1d3ba59e --- /dev/null +++ b/app/lib/charval.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015-2017 Carsten Sonne Larsen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _CHAR_VALIDATOR_H +#define _CHAR_VALIDATOR_H + +class CharValidator { +public: + virtual ~CharValidator() {} + virtual bool Validate(char c) = 0; +}; + +#endif /* _CHAR_VALIDATOR_H */ diff --git a/app/system/console_stdc.cpp b/app/system/console_stdc.cpp index a758e1e5..c8f7fa70 100755 --- a/app/system/console_stdc.cpp +++ b/app/system/console_stdc.cpp @@ -26,14 +26,15 @@ #include "clib.h" #include +#include "lib/charval.h" #include "main/nodes.h" #include "main/evaluator.h" #include "system/console_stdc.h" -StandardConsole::StandardConsole(const char *prompt) : +StandardConsole::StandardConsole(const char *prompt, CharValidator *validator) : ConsoleBase(prompt) { - proc = new AnsiConoleEngine(prompt); + proc = new AnsiConoleEngine(prompt, validator); } StandardConsole::~StandardConsole() diff --git a/app/system/console_stdc.h b/app/system/console_stdc.h index 1c412b88..15511bea 100644 --- a/app/system/console_stdc.h +++ b/app/system/console_stdc.h @@ -34,6 +34,7 @@ */ #include "clib.h" +#include "lib/charval.h" #include "lib/aengine.h" #include "system/console.h" @@ -43,7 +44,7 @@ */ class StandardConsole : public ConsoleBase { public: - StandardConsole(const char *prompt); + StandardConsole(const char *prompt, CharValidator *validator); virtual ~StandardConsole(); virtual int GetStackSize(); virtual void Run(); diff --git a/app/system/language.cpp b/app/system/language.cpp index f3b216db..a29aac91 100644 --- a/app/system/language.cpp +++ b/app/system/language.cpp @@ -160,3 +160,20 @@ char* Language::UntagText(const char* text) return lastText; } + +bool Language::CharIsQuote(unsigned long character) +{ + return (character == '"'); +} + +bool Language::CharIsOperator(unsigned long character) +{ + static const unsigned int count = sizeof(operators) / sizeof(operatordef); + for (unsigned int i = 0; i < count; i++) { + if (operators[i].chr == (char)character) { + return true; + } + } + + return false; +} \ No newline at end of file diff --git a/app/system/language.h b/app/system/language.h index 81e31e61..2103eb5a 100644 --- a/app/system/language.h +++ b/app/system/language.h @@ -27,13 +27,14 @@ #ifndef _LANGUAGE_BASE_H #define _LANGUAGE_BASE_H +#include "lib/charval.h" #include "localize/lex.h" #include "localize/help.h" #include "localize/text.h" #include "localize/ident.h" #include "localize/kword.h" -class Language { +class Language : public CharValidator { public: Language(); virtual ~Language(); @@ -48,7 +49,10 @@ public: virtual bool CharIsPunct(unsigned long character) = 0; virtual bool CharIsSpace(unsigned long character) = 0; virtual bool CharIsCntrl(unsigned long character) = 0; + virtual bool CharIsQuote(unsigned long character); + virtual bool CharIsOperator(unsigned long character) ; virtual bool StrIsEqualLoc(const char *s1, const char *s2) = 0; + virtual bool Validate(char c) = 0; protected: virtual char* Translate(textdef *def) = 0; diff --git a/app/system/language_amiga.cpp b/app/system/language_amiga.cpp index 88bf920e..ec17b057 100644 --- a/app/system/language_amiga.cpp +++ b/app/system/language_amiga.cpp @@ -135,6 +135,15 @@ bool AmigaLanguage::StrIsEqualLoc(const char* s1, const char* s2) return (StrnCmp(locale, (char*)s1, (char*)s2, -1, SC_COLLATE1) == 0); } +bool AmigaLanguage::Validate(char c) +{ + return CharIsAlNum(c) || + CharIsPunct(c) || + CharIsSpace(c) || + CharIsQuote(c) || + CharIsOperator(c); +} + /* for numeric values */ //STRPTR loc_DecimalPoint; /* character before the decimals */ //STRPTR loc_GroupSeparator; /* separates groups of digits */ diff --git a/app/system/language_amiga.h b/app/system/language_amiga.h index 4ec883a0..b3429136 100644 --- a/app/system/language_amiga.h +++ b/app/system/language_amiga.h @@ -45,6 +45,7 @@ public: bool CharIsSpace(unsigned long character); bool CharIsCntrl(unsigned long character); bool StrIsEqualLoc(const char *s1, const char *s2); + bool Validate(char c); protected: char* Translate(textdef *def); diff --git a/app/system/language_posix.cpp b/app/system/language_posix.cpp index 4b06f3de..aa928440 100644 --- a/app/system/language_posix.cpp +++ b/app/system/language_posix.cpp @@ -117,4 +117,9 @@ char* PosixLanguage::Translate(textdef* def) return (char*)def->text; } +bool PosixLanguage::Validate(char c) +{ + return (c >= 32 && c <= 126); +} + #endif diff --git a/app/system/language_posix.h b/app/system/language_posix.h index a48ab017..a1de6e1e 100644 --- a/app/system/language_posix.h +++ b/app/system/language_posix.h @@ -50,6 +50,7 @@ public: bool CharIsSpace(unsigned long character); bool CharIsCntrl(unsigned long character); bool StrIsEqualLoc(const char *s1, const char *s2); + bool Validate(char c); protected: char* Translate(textdef *def); diff --git a/app/system/language_stdc.cpp b/app/system/language_stdc.cpp index 7bfb6b1d..0a0bdf52 100644 --- a/app/system/language_stdc.cpp +++ b/app/system/language_stdc.cpp @@ -58,7 +58,6 @@ StandardLanguage::~StandardLanguage() if (kwordbase != NOMEM) { delete kwordbase; } - } char* StandardLanguage::Translate(textdef* def) @@ -125,6 +124,10 @@ bool StandardLanguage::StrIsEqualLoc(const char* s1, const char* s2) return StrIsEqual(s1, s2); } +bool StandardLanguage::Validate(char c) +{ + return (c >= 32 && c <= 126); +} void StandardLanguage::LoadCatalogs() { diff --git a/app/system/language_stdc.h b/app/system/language_stdc.h index 3e292ca8..6ec462ab 100644 --- a/app/system/language_stdc.h +++ b/app/system/language_stdc.h @@ -44,6 +44,7 @@ public: bool CharIsSpace(unsigned long character); bool CharIsCntrl(unsigned long character); bool StrIsEqualLoc(const char *s1, const char *s2); + bool Validate(char c); protected: char* Translate(textdef *def); diff --git a/app/system/program_amiga.cpp b/app/system/program_amiga.cpp index 7d5d7cb0..197d88cd 100644 --- a/app/system/program_amiga.cpp +++ b/app/system/program_amiga.cpp @@ -64,7 +64,7 @@ AmigaProgram::~AmigaProgram() void AmigaProgram::Initialize(int argc, char **argv) { if(argc < 2) { - Console = new AmigaWindow(Preferences->GetPrompt()); + Console = new AmigaWindow(Preferences->GetPrompt(), Language); return; } diff --git a/app/system/program_stdc.cpp b/app/system/program_stdc.cpp index f2d75df4..e5175efd 100644 --- a/app/system/program_stdc.cpp +++ b/app/system/program_stdc.cpp @@ -56,7 +56,7 @@ void StandardProgram::Initialize(int argc, char **argv) { if(argc < 2) { // STDC version only has a console - Console = new StandardConsole(Preferences->GetPrompt()); + Console = new StandardConsole(Preferences->GetPrompt(), Language); return; } @@ -76,7 +76,7 @@ void StandardProgram::Initialize(int argc, char **argv) line->DeleteLastChar(); if (line->Is("shell")) { - Console = new StandardConsole(Preferences->GetPrompt()); + Console = new StandardConsole(Preferences->GetPrompt(), Language); } } diff --git a/app/system/window_amiga.cpp b/app/system/window_amiga.cpp index 40db2be1..73f21307 100755 --- a/app/system/window_amiga.cpp +++ b/app/system/window_amiga.cpp @@ -33,10 +33,10 @@ #ifdef AMIGA -AmigaWindow::AmigaWindow(const char *prompt) : +AmigaWindow::AmigaWindow(const char *prompt, CharValidator *validator) : ConsoleBase(prompt) { - proc = new AnsiConoleEngine(prompt); + proc = new AnsiConoleEngine(prompt, validator); window = NULL; //menu = NULL; writereq.st = NULL; diff --git a/app/system/window_amiga.h b/app/system/window_amiga.h index a31c09f7..83ae6f1c 100755 --- a/app/system/window_amiga.h +++ b/app/system/window_amiga.h @@ -77,7 +77,7 @@ typedef union */ class AmigaWindow : public ConsoleBase { public: - AmigaWindow(const char *prompt); + AmigaWindow(const char *prompt, CharValidator *validator); ~AmigaWindow(); int GetStackSize();