| 1 | // This file is part of SmallBASIC |
| 2 | // |
| 3 | // Generic keywords : BC size = 1 byte = 255-2 names |
| 4 | // Buildin functions : BC size = 2 (4 on Unix) bytes = 32K-~1K names |
| 5 | // Buildin procedures: BC size = 2 (4 on Unix) bytes = 32K-~1K names |
| 6 | // I had changed the starting values for debuging purposes |
| 7 | // |
| 8 | // This program is distributed under the terms of the GPL v2.0 or later |
| 9 | // Download the GNU Public License (GPL) from www.gnu.org |
| 10 | // |
| 11 | // Copyright(C) 2000 Nicholas Christopoulos |
| 12 | |
| 13 | #if !defined(_sb_kw_h) |
| 14 | #define _sb_kw_h |
| 15 | |
| 16 | #if defined(__cplusplus) |
| 17 | extern "C" { |
| 18 | #endif |
| 19 | |
| 20 | /* |
| 21 | * operators |
| 22 | */ |
| 23 | #define OPLOG_GT '>' |
| 24 | #define OPLOG_LT '<' |
| 25 | #define OPLOG_EQ '=' |
| 26 | #define OPLOG_GE 11 // >= |
| 27 | #define OPLOG_LE 12 // <= |
| 28 | #define OPLOG_NE 14 // <> |
| 29 | #define OPLOG_AND '&' // AND |
| 30 | #define OPLOG_OR '|' // OR |
| 31 | #define OPLOG_NOT '!' // NOT |
| 32 | #define OPLOG_XOR '~' // XOR |
| 33 | #define OPLOG_BAND 'A' // AND (bit) |
| 34 | #define OPLOG_BOR 'B' // OR (bit) |
| 35 | #define OPLOG_INV 'C' // Invert (bit) |
| 36 | #define OPLOG_EQV 'D' // EQV (bit) |
| 37 | #define OPLOG_IMP 'E' // IMP (bit) |
| 38 | #define OPLOG_NAND 'F' // NAND (bit) |
| 39 | #define OPLOG_NOR 'G' // NOR (bit) |
| 40 | #define OPLOG_XNOR 'H' // XNOR (bit) |
| 41 | #define OPLOG_IN 'I' // IN (list) |
| 42 | #define OPLOG_MOD 'M' // MOD (remain) |
| 43 | #define OPLOG_MDL 'L' // MDL (modulus) |
| 44 | #define OPLOG_LIKE 'W' // LIKE wc |
| 45 | #define OPLOG_LSHIFT 'X' // LSHIFT |
| 46 | #define OPLOG_RSHIFT 'Y' // RSHIFT |
| 47 | |
| 48 | /** |
| 49 | * @ingroup sys |
| 50 | * @enum keyword |
| 51 | * |
| 52 | * Generic keyword codes |
| 53 | * |
| 54 | * special commands like PRINT, INPUT, LINE (ex: LINE INPUT) |
| 55 | * special seperators too like INPUT, APPEND, FORSEP |
| 56 | * and, of course, root commands like REPEAT-UNTIL, IF, etc |
| 57 | */ |
| 58 | enum keyword { |
| 59 | kwTYPE_INT = 0x1, /* 32b Integer */ |
| 60 | kwTYPE_NUM, /* 64b Real */ |
| 61 | kwTYPE_ADDOPR, /* ADD/SUB operator */ |
| 62 | kwTYPE_MULOPR, /* MUL/DIV/IDIV operator */ |
| 63 | kwTYPE_VAR, /* Variable */ |
| 64 | kwTYPE_LEVEL_BEGIN, /* Parenthesis ( */ |
| 65 | kwTYPE_LEVEL_END, /* Parenthesis ) */ |
| 66 | kwTYPE_EVPUSH, /* PUSH R */ |
| 67 | kwTYPE_EVPOP, /* POP L */ |
| 68 | kwTYPE_CALLF, /* Call a build-in function */ |
| 69 | kwTYPE_STR, /* String */ |
| 70 | kwTYPE_LOGOPR, /* Logical operator */ |
| 71 | kwTYPE_CMPOPR, /* Comparation operator */ |
| 72 | kwTYPE_POWOPR, /* POW(x,y) operator */ |
| 73 | kwTYPE_UNROPR, /* Unary operator */ |
| 74 | kwTYPE_EVAL_SC, /* Evalulation short-circuit begin */ |
| 75 | kwTYPE_CALL_UDF, /* Call user defined function */ |
| 76 | kwTYPE_CALLEXTF, /* Call an external function */ |
| 77 | kwTYPE_PTR, /* Address pointer, eg f=@foo */ |
| 78 | kwBYREF, /* end eval switch block */ |
| 79 | kwTYPE_CALL_UDP, /* Call user defined procedure */ |
| 80 | kwTYPE_CALL_PTR, /* Call user defined procedure or function from address pointer */ |
| 81 | kwTYPE_CALL_VFUNC, /* Call virtual function */ |
| 82 | kwTYPE_CALLEXTP, /* Call an external procedure */ |
| 83 | kwTYPE_CRVAR, /* Create dynamic variable (PARAMETERS OR LOCALS) */ |
| 84 | kwTYPE_RET, /* Return from UDF|UDP */ |
| 85 | kwTYPE_PARAM, /* Parameters */ |
| 86 | kwTYPE_CALLP, /* Call a build-in procedure */ |
| 87 | kwTYPE_EOC, /* End-Of-Command mark */ |
| 88 | kwTYPE_UDS_EL, /* Structure element */ |
| 89 | kwTYPE_SEP, /* Separator */ |
| 90 | kwTYPE_LINE, /* Debug info: SOURCE LINE */ |
| 91 | kwLOCAL, /* Create local variables */ |
| 92 | kwFUNC, /* USER DEFINED FUNCTION */ |
| 93 | kwPROC, /* USER DEFINED PROCEDURE */ |
| 94 | kwDECLARE, |
| 95 | kwIMPORT, |
| 96 | kwEXPORT, |
| 97 | kwUNIT, |
| 98 | kwLET, |
| 99 | kwLET_OPT, |
| 100 | kwCONST, |
| 101 | kwPACKED_LET, |
| 102 | kwEND, |
| 103 | kwSTOP, |
| 104 | kwPRINT, |
| 105 | kwUSING, |
| 106 | kwINPUT, |
| 107 | kwSINPUT, |
| 108 | kwINPUTSEP, |
| 109 | kwLOOPSEP, |
| 110 | kwPROCSEP, |
| 111 | kwFUNCSEP, |
| 112 | kwREM, |
| 113 | kwLABEL, |
| 114 | kwGOTO, |
| 115 | kwIF, |
| 116 | kwTHEN, |
| 117 | kwELSE, |
| 118 | kwELIF, |
| 119 | kwENDIF, |
| 120 | kwFOR, |
| 121 | kwTO, |
| 122 | kwSTEP, |
| 123 | kwIN, |
| 124 | kwNEXT, |
| 125 | kwWHILE, |
| 126 | kwWEND, |
| 127 | kwREPEAT, |
| 128 | kwUNTIL, |
| 129 | kwGOSUB, |
| 130 | kwRETURN, |
| 131 | kwEXIT, |
| 132 | kwLOOP, |
| 133 | kwDIM, |
| 134 | kwREDIM, |
| 135 | kwCHAIN, |
| 136 | kwREAD, |
| 137 | kwRESTORE, |
| 138 | kwDATA, |
| 139 | kwCOLOR, |
| 140 | kwFILLED, |
| 141 | kwLINE, |
| 142 | kwON, |
| 143 | kwOFF, |
| 144 | kwTRON, |
| 145 | kwTROFF, |
| 146 | kwONJMP, |
| 147 | kwRUN, |
| 148 | kwEXEC, |
| 149 | kwERASE, |
| 150 | kwUSE, |
| 151 | kwFORSEP, |
| 152 | kwOUTPUTSEP, |
| 153 | kwAPPEND, |
| 154 | kwINSERT, |
| 155 | kwDELETE, |
| 156 | kwAPPENDSEP, |
| 157 | kwOPEN, |
| 158 | kwAS, |
| 159 | kwFILEPRINT, |
| 160 | kwLINEINPUT, |
| 161 | kwFILEINPUT, |
| 162 | kwFILEWRITE, |
| 163 | kwFILEREAD, |
| 164 | kwCLOSE, |
| 165 | kwSEEK, |
| 166 | kwSPRINT, |
| 167 | kwDO, |
| 168 | kwOPTION, |
| 169 | kwBACKG, |
| 170 | kwLOGPRINT, |
| 171 | kwSELECT, |
| 172 | kwCASE, |
| 173 | kwCASE_ELSE, |
| 174 | kwENDSELECT, |
| 175 | kwTRY, |
| 176 | kwCATCH, |
| 177 | kwENDTRY, |
| 178 | kwFUNC_RETURN, |
| 179 | kwNULL |
| 180 | }; |
| 181 | |
| 182 | /** |
| 183 | * @ingroup sys |
| 184 | * @enum proc_keywords |
| 185 | * |
| 186 | * buildin procedures - keyword codes |
| 187 | */ |
| 188 | enum proc_keywords { |
| 189 | kwCLS = 0x100, // 256 (generic keywords) |
| 190 | kwENVIRON, |
| 191 | kwLOCATE, |
| 192 | kwAT, |
| 193 | kwPEN, |
| 194 | kwDATEDMY, |
| 195 | kwBEEP, |
| 196 | kwSOUND, |
| 197 | kwNOSOUND, |
| 198 | kwPSET, |
| 199 | kwRECT, |
| 200 | kwCIRCLE, |
| 201 | kwRANDOMIZE, |
| 202 | kwSPLIT, |
| 203 | kwWJOIN, |
| 204 | kwPAUSE, |
| 205 | kwDELAY, |
| 206 | kwARC, |
| 207 | kwDRAW, |
| 208 | kwPAINT, |
| 209 | kwPLAY, |
| 210 | kwSORT, |
| 211 | kwSEARCH, |
| 212 | kwROOT, |
| 213 | kwDIFFEQ, |
| 214 | kwCHART, |
| 215 | kwWINDOW, |
| 216 | kwVIEW, |
| 217 | kwDRAWPOLY, |
| 218 | kwM3IDENT, |
| 219 | kwM3ROTATE, |
| 220 | kwM3SCALE, |
| 221 | kwM3TRANSLATE, |
| 222 | kwM3APPLY, |
| 223 | kwSEGINTERSECT, |
| 224 | kwPOLYEXT, |
| 225 | kwDERIV, |
| 226 | kwLOADLN, |
| 227 | kwSAVELN, |
| 228 | kwKILL, |
| 229 | kwRENAME, |
| 230 | kwCOPY, |
| 231 | kwCHDIR, |
| 232 | kwMKDIR, |
| 233 | kwRMDIR, |
| 234 | kwFLOCK, |
| 235 | kwCHMOD, |
| 236 | kwPLOT, |
| 237 | kwSTKDUMP, |
| 238 | kwSWAP, |
| 239 | kwDIRWALK, |
| 240 | kwBPUTC, |
| 241 | kwBLOAD, |
| 242 | kwBSAVE, |
| 243 | kwTIMEHMS, |
| 244 | kwEXPRSEQ, |
| 245 | kwCALLCP, |
| 246 | kwDEFINEKEY, |
| 247 | kwSHOWPAGE, |
| 248 | kwTHROW, |
| 249 | kwNULLPROC |
| 250 | }; |
| 251 | |
| 252 | /** |
| 253 | * @ingroup sys |
| 254 | * @enum func_keywords |
| 255 | * |
| 256 | * buildin functions - keyword codes |
| 257 | */ |
| 258 | enum func_keywords { |
| 259 | kwASC = 0x200, |
| 260 | kwVAL, |
| 261 | kwCHR, |
| 262 | kwSTR, |
| 263 | kwOCT, |
| 264 | kwHEX, |
| 265 | kwLCASE, |
| 266 | kwUCASE, |
| 267 | kwLTRIM, |
| 268 | kwRTRIM, |
| 269 | kwSPACE, |
| 270 | kwTAB, |
| 271 | kwCAT, |
| 272 | kwENVIRONF, |
| 273 | kwTRIM, |
| 274 | kwSTRING, |
| 275 | kwSQUEEZE, |
| 276 | kwLEFT, |
| 277 | kwRIGHT, |
| 278 | kwLEFTOF, |
| 279 | kwRIGHTOF, |
| 280 | kwLEFTOFLAST, |
| 281 | kwRIGHTOFLAST, |
| 282 | kwMID, |
| 283 | kwREPLACE, |
| 284 | kwRUNF, |
| 285 | kwINKEY, |
| 286 | kwTIME, |
| 287 | kwDATE, |
| 288 | kwINSTR, |
| 289 | kwRINSTR, |
| 290 | kwLBOUND, |
| 291 | kwUBOUND, |
| 292 | kwLEN, |
| 293 | kwEMPTY, |
| 294 | kwISARRAY, |
| 295 | kwISNUMBER, |
| 296 | kwISSTRING, |
| 297 | kwISMAP, |
| 298 | kwATAN2, |
| 299 | kwPOW, |
| 300 | kwROUND, |
| 301 | kwSIN, |
| 302 | kwASIN, |
| 303 | kwSINH, |
| 304 | kwASINH, |
| 305 | kwCOS, |
| 306 | kwACOS, |
| 307 | kwCOSH, |
| 308 | kwACOSH, |
| 309 | kwTAN, |
| 310 | kwATAN, |
| 311 | kwTANH, |
| 312 | kwATANH, |
| 313 | kwSEC, |
| 314 | kwASEC, |
| 315 | kwSECH, |
| 316 | kwASECH, |
| 317 | kwCSC, |
| 318 | kwACSC, |
| 319 | kwCSCH, |
| 320 | kwACSCH, |
| 321 | kwCOT, |
| 322 | kwACOT, |
| 323 | kwCOTH, |
| 324 | kwACOTH, |
| 325 | kwSQR, |
| 326 | kwABS, |
| 327 | kwEXP, |
| 328 | kwLOG, |
| 329 | kwLOG10, |
| 330 | kwFIX, |
| 331 | kwINT, |
| 332 | kwCDBL, |
| 333 | kwDEG, |
| 334 | kwRAD, |
| 335 | kwPENF, |
| 336 | kwFLOOR, |
| 337 | kwCEIL, |
| 338 | kwFRAC, |
| 339 | kwFRE, |
| 340 | kwSGN, |
| 341 | kwCINT, |
| 342 | kwEOF, |
| 343 | kwSEEKF, |
| 344 | kwLOF, |
| 345 | kwRND, |
| 346 | kwMAX, |
| 347 | kwMIN, |
| 348 | kwABSMAX, |
| 349 | kwABSMIN, |
| 350 | kwSUM, |
| 351 | kwSUMSV, |
| 352 | kwSTATMEAN, |
| 353 | kwSTATMEANDEV, |
| 354 | kwSTATSPREADS, |
| 355 | kwSTATSPREADP, |
| 356 | kwSEGCOS, |
| 357 | kwSEGSIN, |
| 358 | kwSEGLEN, |
| 359 | kwPOLYAREA, |
| 360 | kwPOLYCENT, |
| 361 | kwPTDISTSEG, |
| 362 | kwPTSIGN, |
| 363 | kwPTDISTLN, |
| 364 | kwPOINT, |
| 365 | kwCODEARRAY, |
| 366 | kwGAUSSJORDAN, |
| 367 | kwFILES, |
| 368 | kwINVERSE, |
| 369 | kwDETERM, |
| 370 | kwJULIAN, |
| 371 | kwDATEFMT, |
| 372 | kwWDAY, |
| 373 | kwIFF, |
| 374 | kwFORMAT, |
| 375 | kwFREEFILE, |
| 376 | kwTICKS, |
| 377 | kwTIMER, |
| 378 | kwPROGLINE, |
| 379 | kwINPUTF, |
| 380 | kwTEXTWIDTH, |
| 381 | kwTEXTHEIGHT, |
| 382 | kwEXIST, |
| 383 | kwISFILE, |
| 384 | kwISDIR, |
| 385 | kwISLINK, |
| 386 | kwACCESSF, |
| 387 | kwXPOS, |
| 388 | kwYPOS, |
| 389 | kwRGB, |
| 390 | kwRGBF, |
| 391 | kwBIN, |
| 392 | kwENCLOSE, |
| 393 | kwDISCLOSE, |
| 394 | kwTRANSLATEF, |
| 395 | kwCHOP, |
| 396 | kwBGETC, |
| 397 | kwSEQ, |
| 398 | kwCBS, |
| 399 | kwBCS, |
| 400 | kwCALLCF, |
| 401 | kwARRAY, |
| 402 | kwIMAGE, |
| 403 | kwFORM, |
| 404 | kwTIMESTAMP, |
| 405 | kwNULLFUNC |
| 406 | }; |
| 407 | |
| 408 | /** |
| 409 | * @ingroup sys |
| 410 | * |
| 411 | * checks if the 'code' belongs to the codes that contained in table |
| 412 | * |
| 413 | * @param code the code to search for |
| 414 | * @param table the table of codes to scan |
| 415 | * @return non-zero on success |
| 416 | */ |
| 417 | int kw_check(code_t *table, code_t code); |
| 418 | |
| 419 | /** |
| 420 | * @ingroup sys |
| 421 | * |
| 422 | * returns true if the 'code' is valid code for end-of-expression |
| 423 | * |
| 424 | * @return non-zero if the 'code' is valid code for end-of-expression |
| 425 | */ |
| 426 | int kw_check_evexit(code_t code); |
| 427 | |
| 428 | /** |
| 429 | * @ingroup sys |
| 430 | * |
| 431 | * returns the name which is assigned to code |
| 432 | * |
| 433 | * @param code is the code |
| 434 | * @param dest is the buffer to store the keyword |
| 435 | * @return non-zero on success |
| 436 | */ |
| 437 | int kw_getcmdname(code_t code, char *dest); |
| 438 | |
| 439 | /** |
| 440 | * @ingroup sys |
| 441 | * |
| 442 | * returns the name which is assigned to build-in function code |
| 443 | * |
| 444 | * @param code is the code |
| 445 | * @param dest is the buffer to store the keyword |
| 446 | * @return non-zero on success |
| 447 | */ |
| 448 | int kw_getfuncname(bid_t code, char *dest); |
| 449 | |
| 450 | /** |
| 451 | * @ingroup sys |
| 452 | * |
| 453 | * returns the name which is assigned to build-in procedure code |
| 454 | * |
| 455 | * @param code is the code |
| 456 | * @param dest is the buffer to store the keyword |
| 457 | * @return non-zero on success |
| 458 | */ |
| 459 | int kw_getprocname(bid_t code, char *dest); |
| 460 | |
| 461 | /** |
| 462 | * @ingroup sys |
| 463 | * |
| 464 | * returns true if the code is a function without parameters |
| 465 | * |
| 466 | * @param code is the code |
| 467 | * @return non-zero if 'code' is a function that does not requires parameters |
| 468 | */ |
| 469 | int kw_noarg_func(bid_t code); |
| 470 | |
| 471 | #define OPTION_BASE 1 |
| 472 | #define OPTION_MATCH 4 |
| 473 | |
| 474 | #if defined(__cplusplus) |
| 475 | } |
| 476 | #endif |
| 477 | #endif |
| 478 | |