aboutsummaryrefslogtreecommitdiffstats
path: root/keyword.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'keyword.cpp')
-rw-r--r--keyword.cpp378
1 files changed, 378 insertions, 0 deletions
diff --git a/keyword.cpp b/keyword.cpp
new file mode 100644
index 0000000..f6971ac
--- /dev/null
+++ b/keyword.cpp
@@ -0,0 +1,378 @@
+// keyword.cpp
+// Revision 7-feb-2005
+
+#include "keyword.h"
+#include "util.h"
+#include "sysvar.h"
+#include "trace.h"
+
+#include <iostream>
+#include <set>
+#include <algorithm>
+#include <iterator>
+#include <functional>
+#include <cctype>
+
+// I don't understand why, but with this using the older version
+// of C++ Builder fails.
+#if __BORLANDC__ >= 0x0560
+using std::toupper;
+#endif
+
+namespace sysvar= blassic::sysvar;
+using util::dim_array;
+
+
+namespace {
+
+struct keycode {
+ std::string key;
+ BlCode code;
+ keycode (const char * str, BlCode c) :
+ key (str), code (c)
+ { }
+};
+
+// Can't declare const on Borland or fail at instantiate find_if,
+// don't know why.
+#ifdef __BORLANDC__
+#define const_keycode keycode
+#else
+#define const_keycode const keycode
+#endif
+
+#define m_keycode(n) keycode (#n, key ## n)
+
+#define m_keycode_s(n) keycode (#n "$", key ## n ## _S)
+
+const_keycode table []= {
+ m_keycode (END),
+ m_keycode (LIST),
+ m_keycode (REM),
+ m_keycode (LOAD),
+ m_keycode (SAVE),
+ m_keycode (EXIT),
+ m_keycode (NEW),
+ m_keycode (RUN),
+ m_keycode (PRINT),
+ m_keycode (FOR),
+ m_keycode (NEXT),
+ m_keycode (TO),
+ m_keycode (STEP),
+ m_keycode (IF),
+ m_keycode (THEN),
+ m_keycode (ELSE),
+ m_keycode (TRON),
+ m_keycode (TROFF),
+ m_keycode (LET),
+ m_keycode (GOTO),
+ m_keycode (STOP),
+ m_keycode (CONT),
+ m_keycode (CLEAR),
+ m_keycode (GOSUB),
+ m_keycode (RETURN),
+ m_keycode (POKE),
+ m_keycode (DATA),
+ m_keycode (READ),
+ m_keycode (RESTORE),
+ m_keycode (INPUT),
+ m_keycode (LINE),
+ m_keycode (RANDOMIZE),
+ m_keycode (PLEASE),
+ m_keycode (AUTO),
+ m_keycode (DIM),
+ m_keycode (SYSTEM),
+ m_keycode (ON),
+ m_keycode (ERROR),
+ m_keycode (OPEN),
+ m_keycode (CLOSE),
+ m_keycode (OUTPUT),
+ m_keycode (AS),
+ m_keycode (LOCATE),
+ m_keycode (CLS),
+ m_keycode (APPEND),
+ m_keycode (WRITE),
+ m_keycode (MODE),
+ m_keycode (MOVE),
+ m_keycode (COLOR),
+ m_keycode (GET),
+ m_keycode (LABEL),
+ m_keycode (DELIMITER),
+ m_keycode (REPEAT),
+ m_keycode (UNTIL),
+ m_keycode (WHILE),
+ m_keycode (WEND),
+ m_keycode (PLOT),
+ m_keycode (POPEN),
+ m_keycode (RESUME),
+ m_keycode (DELETE),
+ m_keycode (LOCAL),
+ m_keycode (RANDOM),
+ m_keycode (PUT),
+ m_keycode (FIELD),
+ m_keycode (LSET),
+ m_keycode (RSET),
+ m_keycode (SOCKET),
+ m_keycode (DRAW),
+ m_keycode (DEF),
+ m_keycode (FN),
+ m_keycode (ERASE),
+ m_keycode (SWAP),
+ m_keycode (SYMBOL),
+ m_keycode (ZONE),
+ m_keycode (POP),
+ m_keycode (NAME),
+ m_keycode (KILL),
+ m_keycode (FILES),
+ m_keycode (PAPER),
+ m_keycode (PEN),
+ m_keycode (SHELL),
+ m_keycode (MERGE),
+ m_keycode (CHDIR),
+ m_keycode (MKDIR),
+ m_keycode (RMDIR),
+ m_keycode (BREAK),
+ m_keycode (SYNCHRONIZE),
+ m_keycode (PAUSE),
+ m_keycode (CHAIN),
+ m_keycode (STR),
+ m_keycode (REAL),
+ m_keycode (ENVIRON),
+ m_keycode (EDIT),
+ m_keycode (DRAWR),
+ m_keycode (PLOTR),
+ m_keycode (MOVER),
+ m_keycode (POKE16),
+ m_keycode (POKE32),
+ m_keycode (RENUM),
+ m_keycode (CIRCLE),
+ m_keycode (MASK),
+ m_keycode (WINDOW),
+ m_keycode (GRAPHICS),
+ m_keycode (AFTER),
+ m_keycode (BEEP),
+ m_keycode (DEFINT),
+ m_keycode (DEFSTR),
+ m_keycode (DEFREAL),
+ m_keycode (DEFSNG),
+ m_keycode (DEFDBL),
+ m_keycode (INK),
+ m_keycode (SET_TITLE),
+ m_keycode (TAG),
+ m_keycode (TAGOFF),
+ m_keycode (ORIGIN),
+ m_keycode (DEG),
+ m_keycode (RAD),
+ m_keycode (INVERSE),
+ m_keycode (IF_DEBUG),
+ m_keycode (LPRINT),
+ m_keycode (LLIST),
+ m_keycode (WIDTH),
+ m_keycode (BRIGHT),
+ m_keycode (BINARY),
+ m_keycode (DRAWARC),
+ m_keycode (PULL),
+ m_keycode (PAINT),
+ m_keycode (FREE_MEMORY),
+ m_keycode (SCROLL),
+ m_keycode (ZX_PLOT),
+ m_keycode (ZX_UNPLOT),
+
+ m_keycode_s (MID),
+ m_keycode_s (LEFT),
+ m_keycode_s (RIGHT),
+ m_keycode_s (CHR),
+ m_keycode_s (ENVIRON),
+ m_keycode_s (STRING),
+ m_keycode_s (OSFAMILY),
+ m_keycode_s (HEX),
+ m_keycode_s (SPACE),
+ m_keycode_s (UPPER),
+ m_keycode_s (LOWER),
+ m_keycode_s (STR),
+ m_keycode_s (OCT),
+ m_keycode_s (BIN),
+ m_keycode_s (INKEY),
+ m_keycode_s (PROGRAMARG),
+ m_keycode_s (DATE),
+ m_keycode_s (TIME),
+ m_keycode_s (INPUT),
+ m_keycode_s (MKI),
+ m_keycode_s (MKS),
+ m_keycode_s (MKD),
+ m_keycode_s (MKL),
+ m_keycode_s (TRIM),
+ m_keycode_s (LTRIM),
+ m_keycode_s (RTRIM),
+ m_keycode_s (OSNAME),
+ m_keycode_s (FINDFIRST),
+ m_keycode_s (FINDNEXT),
+ m_keycode_s (COPYCHR),
+ m_keycode_s (STRERR),
+ m_keycode_s (DEC),
+ m_keycode_s (VAL),
+ m_keycode_s (SCREEN),
+ m_keycode_s (MKSMBF),
+ m_keycode_s (MKDMBF),
+ m_keycode_s (REGEXP_REPLACE),
+ m_keycode_s (UCASE),
+ m_keycode_s (LCASE),
+
+ m_keycode (ASC),
+ m_keycode (LEN),
+ m_keycode (PEEK),
+ m_keycode (PROGRAMPTR),
+ m_keycode (RND),
+ m_keycode (INT),
+ m_keycode (SIN),
+ m_keycode (COS),
+ m_keycode (PI),
+ m_keycode (TAN),
+ m_keycode (SQR),
+ m_keycode (ASIN),
+ m_keycode (ACOS),
+ m_keycode (INSTR),
+ m_keycode (ATAN),
+ m_keycode (ABS),
+ m_keycode (USR),
+ m_keycode (VAL),
+ m_keycode (EOF),
+ m_keycode (VARPTR),
+ m_keycode (SYSVARPTR),
+ m_keycode (SGN),
+ m_keycode (LOG),
+ m_keycode (LOG10),
+ m_keycode (EXP),
+ m_keycode (TIME),
+ m_keycode (ERR),
+ m_keycode (ERL),
+ m_keycode (CVI),
+ m_keycode (CVS),
+ m_keycode (CVD),
+ m_keycode (CVL),
+ m_keycode (MIN),
+ m_keycode (MAX),
+ m_keycode (CINT),
+ m_keycode (FIX),
+ m_keycode (XMOUSE),
+ m_keycode (YMOUSE),
+ m_keycode (XPOS),
+ m_keycode (YPOS),
+ m_keycode (PEEK16),
+ m_keycode (PEEK32),
+ m_keycode (RINSTR),
+ m_keycode (FIND_FIRST_OF),
+ m_keycode (FIND_LAST_OF),
+ m_keycode (FIND_FIRST_NOT_OF),
+ m_keycode (FIND_LAST_NOT_OF),
+ m_keycode (SINH),
+ m_keycode (COSH),
+ m_keycode (TANH),
+ m_keycode (ASINH),
+ m_keycode (ACOSH),
+ m_keycode (ATANH),
+ m_keycode (ATAN2),
+ m_keycode (TEST),
+ m_keycode (TESTR),
+ m_keycode (POS),
+ m_keycode (VPOS),
+ m_keycode (LOF),
+ m_keycode (FREEFILE),
+ m_keycode (INKEY),
+ m_keycode (ROUND),
+ m_keycode (CVSMBF),
+ m_keycode (CVDMBF),
+ m_keycode (REGEXP_INSTR),
+ m_keycode (ALLOC_MEMORY),
+ m_keycode (LOC),
+
+ m_keycode (NOT),
+ m_keycode (OR),
+ m_keycode (AND),
+ m_keycode (TAB),
+ m_keycode (SPC),
+ m_keycode (AT),
+ m_keycode (XOR),
+ m_keycode (MOD),
+ m_keycode (USING),
+
+ keycode ("<>", keyDISTINCT),
+ keycode ("<=", keyMINOREQUAL),
+ keycode (">=", keyGREATEREQUAL),
+ keycode ("=<", keyEQUALMINOR),
+ keycode ("=>", keyEQUALGREATER),
+ keycode ("><", keyGREATERMINOR),
+
+ // table_end points here, then if find_if (table, table_end, ...)
+ // fails the result is:
+ keycode ("???", 0)
+};
+
+const_keycode * table_end= table + dim_array (table) - 1;
+
+class key_is : public std::unary_function <keycode, bool> {
+public:
+ key_is (const std::string & str) : str (str)
+ { }
+ bool operator () (const keycode & k) const
+ { return k.key == str; }
+private:
+ const std::string & str;
+};
+
+class code_is : public std::unary_function <keycode, bool> {
+public:
+ code_is (BlCode code) : code (code)
+ { }
+ bool operator () (const keycode & k) const
+ { return k.code == code; }
+private:
+ BlCode code;
+};
+
+inline std::string stringupper (const std::string & str)
+{
+ std::string u (str.size (), 0);
+ std::transform (str.begin (), str.end (), u.begin (), toupper);
+ return u;
+}
+
+std::set <std::string> exclude;
+
+} // namespace
+
+void excludekeyword (const std::string & str)
+{
+ TRACEFUNC (tr, "excludekeyword");
+
+ std::string stru= stringupper (str);
+ if (find_if (table, table_end, key_is (stru) ) != table_end)
+ {
+ exclude.insert (stru);
+ TRMESSAGE (tr, std::string ("Excluding ") + stru);
+ }
+}
+
+BlCode keyword (const std::string & str)
+{
+ std::string stru= stringupper (str);
+ BlCode code= std::find_if (table, table_end, key_is (stru) )->code;
+ if (code != 0)
+ if (exclude.find (stru) != exclude.end () )
+ return 0;
+ return code;
+}
+
+std::string decodekeyword (BlCode s)
+{
+ if (s == keyGOTO || s == keyGOSUB)
+ {
+ if (sysvar::hasFlags2 (sysvar::SeparatedGoto) )
+ return (s == keyGOTO) ?
+ "GO TO" :
+ "GO SUB";
+ }
+ return std::find_if (table, table_end, code_is (s) )->key;
+}
+
+// Fin de keyword.cpp
Un proyecto texto-plano.xyz