diff --git a/docs/v4.0.0/POST79.md b/docs/v4.0.0/POST79.md index 5eae5314..59853f05 100644 --- a/docs/v4.0.0/POST79.md +++ b/docs/v4.0.0/POST79.md @@ -1,7 +1,7 @@ # POST for the FORTH-79 Required Word Set: where it departs from v3 Written by `v4/tools/mkpost.py` from `v4/tools/post79_rules.py`; do not edit. -Design: `NUCLEUS.md` section 6. The capsule is `capsules/v4/post79.4th`. +Design: `NUCLEUS.md` section 6. The cases are `v4/system/post_cases.c`. POST runs 538 cases. 431 are v3's, with what the hosted v3 binary did as the expected result. This file lists every other case, and why. @@ -60,11 +60,11 @@ standard's and not v3's. | `CMOVE.basic` | `HERE S" Test" DUP >R HERE 10 + SWAP CMOVE CR` | stack `325`, printed `\n` | `65 PAD C! 66 PAD 1+ C! PAD PAD 10 + 2 CMOVE PAD 10 + C@ . PAD 11 + C@ . CR` | stack `empty`, prints `65 66 \n` | v3's address unit is a byte; a v4 address unit is a cell (D-1); and the v3 case leaves a value on the return stack | | `TYPE.basic_string` | `HERE S" Hello" DUP >R HERE SWAP CMOVE HERE R> TYPE CR` | stack `400`, printed `Hello\n` | `72 PAD C! 105 PAD 1+ C! PAD 2 TYPE CR` | stack `empty`, prints `Hi\n` | v3's address unit is a byte; a v4 address unit is a cell (D-1); and FORTH-79: >R R> R@ are for use inside a definition; v4 refuses them at the prompt | | `TYPE.numbers` | `HERE S" 12345" DUP >R HERE SWAP CMOVE HERE R> TYPE CR` | stack `406`, printed `12345\n` | `49 PAD C! 50 PAD 1+ C! PAD 2 TYPE CR` | stack `empty`, prints `12\n` | v3's address unit is a byte; a v4 address unit is a cell (D-1); and FORTH-79: >R R> R@ are for use inside a definition; v4 refuses them at the prompt | -| `>IN.initial` | `>IN @ . CR` | stack `empty`, printed `1009040112 \n` | unchanged | stack `empty`, prints `9 \n` | FORTH-79: >IN is the offset into the input, 9 here; v3 prints an address | +| `>IN.initial` | `>IN @ . CR` | stack `empty`, printed `860486384 \n` | unchanged | stack `empty`, prints `9 \n` | FORTH-79: >IN is the offset into the input, 9 here; v3 prints an address | | `UPDATE.no_block` | `0 SCR ! UPDATE` | error | unchanged | stack `empty`, prints nothing | v3 raises an error FORTH-79 does not ask for | | `SCR.after_load` | `1 LOAD SCR @ . CR` | stack `empty`, printed `` | unchanged | stack `empty`, prints `1 \n` | v3 prints nothing after 1 LOAD; SCR is still 1 from the LIST before | -| `FIND.existing` | `FIND DUP . CR` | stack `empty`, printed `1009039472 \n` | unchanged | 0 value(s) left; output not compared | FORTH-79: FIND takes the next word, DUP here, and leaves its address, which is printed | -| `FIND.user_word` | `: test5 44 ; FIND test5 . CR` | stack `empty`, printed `1009366512 \n` | unchanged | 0 value(s) left; output not compared | the address FIND leaves is printed | +| `FIND.existing` | `FIND DUP . CR` | stack `empty`, printed `860485744 \n` | unchanged | 0 value(s) left; output not compared | FORTH-79: FIND takes the next word, DUP here, and leaves its address, which is printed | +| `FIND.user_word` | `: test5 44 ; FIND test5 . CR` | stack `empty`, printed `860812560 \n` | unchanged | 0 value(s) left; output not compared | the address FIND leaves is printed | | `FIND.empty` | `FIND` | error | unchanged | stack `0`, prints nothing | FORTH-79: FIND leaves 0 when there is no word; v3 raises an error | | `VOCABULARY.cross_vocab_access` | `VOCABULARY V1 V1 DEFINITIONS : V1WORD 11 ; FORTH V1WORD . CR` | stack `empty`, printed `11 \n` | unchanged | an error | FORTH-79: a word defined in another vocabulary is not found from FORTH; v3 finds it | | `VOCABULARY.duplicate` | `VOCABULARY TESTVOC VOCABULARY TESTVOC` | error | unchanged | stack `empty`, prints nothing | v3 raises an error FORTH-79 does not ask for: defining a name again | @@ -188,8 +188,7 @@ standard's; no v3 run stands behind them. `KEY` `EXPECT` `QUERY` `QUIT`. `KEY`, `EXPECT` and `QUERY` wait for the keyboard, which a boot cannot type -at. `QUIT` returns to the terminal without `ok`, which the capsule loader -takes for a refused line. +at. `QUIT` returns to the terminal without `ok`. ## 6. Where v3 did not do what its own table expects (6) diff --git a/v4/include/v4/post.h b/v4/include/v4/post.h new file mode 100644 index 00000000..bc9e5f62 --- /dev/null +++ b/v4/include/v4/post.h @@ -0,0 +1,32 @@ +/* post.h -- POST, which is the kernel's. docs/v4.0.0/NUCLEUS.md section 6. + * + * As in v3, the kernel holds the cases and runs them on the node: nothing + * of POST is in the node's dictionary. A case is a name, its lines of + * FORTH, and what it must do. The table is generated from v3's own cases + * (v4/tools/mkpost.py -> v4/system/post_cases.c). + */ +#ifndef V4_POST_H +#define V4_POST_H + +#include "v4/node.h" + +#define V4_POST_STACK 0 /* its data stack and what it prints are compared */ +#define V4_POST_DEPTH 1 /* only how many values it leaves; what it prints is not compared */ +#define V4_POST_DEPTH_OUTPUT 2 /* how many values it leaves, and what it prints */ +#define V4_POST_ERROR 3 /* it must end in an error; nothing else is compared */ + +typedef struct { + const char *name; + const char *const *lines; /* line_count of them, sent one at a time */ + unsigned line_count; + int expect; /* V4_POST_* */ + const long long *stack; /* V4_POST_STACK: depth values, the deepest first; else 0 */ + unsigned depth; + const char *output; /* output_len characters */ + unsigned output_len; +} v4_post_case; + +extern const v4_post_case v4_post_cases[]; +extern const unsigned v4_post_case_count; + +#endif /* V4_POST_H */ diff --git a/v4/system/post_cases.c b/v4/system/post_cases.c new file mode 100644 index 00000000..8fd6a58d --- /dev/null +++ b/v4/system/post_cases.c @@ -0,0 +1,1099 @@ +/* post_cases.c -- POST's cases for the FORTH-79 Required Word Set on v4. + * Generated by v4/tools/mkpost.py from v3's POST cases: do not edit. + * docs/v4.0.0/NUCLEUS.md section 6; docs/v4.0.0/POST79.md lists every case + * that is not v3's own with v3's result. + */ +#include "v4/post.h" + +static const char *const l0[] = { "5 DUP . . CR" }; +static const char *const l1[] = { "0 DUP . . CR" }; +static const char *const l2[] = { "-42 DUP . . CR" }; +static const char *const l3[] = { "2147483647 DUP . . CR" }; +static const char *const l4[] = { "-2147483648 DUP . . CR" }; +static const char *const l5[] = { "DUP" }; +static const char *const l6[] = { "5 7 DROP . CR" }; +static const char *const l7[] = { "42 0 DROP . CR" }; +static const char *const l8[] = { "10 -5 DROP . CR" }; +static const char *const l9[] = { "1 2 3 DROP DROP . CR" }; +static const char *const l10[] = { "1 2 3 4 DROP DROP DROP . CR" }; +static const char *const l11[] = { "5 DROP 6 DROP 7 . CR" }; +static const char *const l12[] = { "99 DROP DEPTH . CR" }; +static const char *const l13[] = { "DEPTH 1 2 DROP DEPTH SWAP - . CR" }; +static const long long s13[] = { 0LL }; +static const char *const l14[] = { "DEPTH 5 6 DROP DROP DEPTH = . CR" }; +static const char *const l15[] = { "2147483647 DROP DEPTH . CR" }; +static const char *const l16[] = { "-2147483648 DROP DEPTH . CR" }; +static const char *const l17[] = { "5 DUP DROP . CR" }; +static const char *const l18[] = { "1 2 SWAP DROP . CR" }; +static const char *const l19[] = { "1 2 3 ROT DROP SWAP DROP . CR" }; +static const char *const l20[] = { "DROP" }; +static const char *const l21[] = { "5 7 SWAP . . CR" }; +static const char *const l22[] = { "42 42 SWAP . . CR" }; +static const char *const l23[] = { "0 99 SWAP . . CR" }; +static const char *const l24[] = { "-5 10 SWAP . . CR" }; +static const char *const l25[] = { "42 SWAP" }; +static const char *const l26[] = { "SWAP" }; +static const char *const l27[] = { "5 7 OVER . . . CR" }; +static const char *const l28[] = { "0 0 OVER . . . CR" }; +static const char *const l29[] = { "-1 42 OVER . . . CR" }; +static const char *const l30[] = { "42 OVER" }; +static const char *const l31[] = { "OVER" }; +static const char *const l32[] = { "1 2 3 ROT . . . CR" }; +static const char *const l33[] = { "0 0 0 ROT . . . CR" }; +static const char *const l34[] = { "-1 0 1 ROT . . . CR" }; +static const char *const l35[] = { "1 2 ROT" }; +static const char *const l36[] = { "42 ROT" }; +static const char *const l37[] = { "ROT" }; +static const char *const l38[] = { "DEPTH . CR" }; +static const char *const l39[] = { "42 DEPTH . CR" }; +static const long long s39[] = { 42LL }; +static const char *const l40[] = { "1 2 3 DEPTH . CR" }; +static const long long s40[] = { 1LL, 2LL, 3LL }; +static const char *const l41[] = { "1 2 3 0 PICK . CR" }; +static const char *const l42[] = { "1 2 3 1 PICK . CR" }; +static const long long s42[] = { 1LL, 2LL, 3LL }; +static const char *const l43[] = { "1 2 3 2 PICK . CR" }; +static const long long s43[] = { 1LL, 2LL, 3LL }; +static const char *const l44[] = { "1 2 3 1 ROLL . . . CR" }; +static const char *const l45[] = { "1 2 3 2 ROLL . . . CR" }; +static const char *const l46[] = { "42 \077DUP . . CR" }; +static const char *const l47[] = { "-5 \077DUP . . CR" }; +static const char *const l48[] = { "0 \077DUP DEPTH . CR" }; +static const long long s48[] = { 0LL }; +static const char *const l49[] = { "\077DUP" }; +static const char *const l50[] = { ": RS1 42 >R R@ . R> . CR ; RS1" }; +static const char *const l51[] = { ": RS2 0 >R R@ . R> . CR ; RS2" }; +static const char *const l52[] = { ": RS3 -123 >R R@ . R> . CR ; RS3" }; +static const char *const l53[] = { ": RS4 1 2 >R >R R@ . R> . R@ . R> . CR ; RS4" }; +static const char *const l54[] = { ">R" }; +static const char *const l55[] = { ": RS5 42 >R R> . CR ; RS5" }; +static const char *const l56[] = { ": RS6 1 2 >R >R R> . R> . CR ; RS6" }; +static const char *const l57[] = { "R>" }; +static const char *const l58[] = { ": RS7 42 >R R@ . R> DROP CR ; RS7" }; +static const char *const l59[] = { ": RS8 99 >R R@ R@ = . R> DROP CR ; RS8" }; +static const char *const l60[] = { "R@" }; +static const char *const l61[] = { "42 HERE ! HERE @ . CR" }; +static const char *const l62[] = { "0 HERE ! HERE @ . CR" }; +static const char *const l63[] = { "-999 HERE ! HERE @ . CR" }; +static const char *const l64[] = { "111 HERE ! 222 HERE ! HERE @ . CR" }; +static const char *const l65[] = { "2147483647 HERE ! HERE @ . CR" }; +static const char *const l66[] = { "-2147483648 HERE ! HERE @ . CR" }; +static const char *const l67[] = { "!" }; +static const char *const l68[] = { "42 !" }; +static const char *const l69[] = { "123 HERE ! HERE @ . CR" }; +static const char *const l70[] = { "456 HERE ! HERE @ HERE @ = . CR" }; +static const char *const l71[] = { "@" }; +static const char *const l72[] = { "42 , HERE 1 - @ . CR" }; +static const char *const l73[] = { "-999 , HERE 1 - @ . CR" }; +static const char *const l74[] = { "HERE HERE = . CR" }; +static const char *const l75[] = { "HERE 42 , HERE SWAP - 1 CELLS = 0 SWAP /" }; +static const long long s75[] = { 0LL }; +static const char *const l76[] = { "HERE 10 ALLOT HERE SWAP - . CR" }; +static const char *const l77[] = { "HERE 0 ALLOT HERE SWAP - . CR" }; +static const char *const l78[] = { "HERE -4 ALLOT HERE SWAP - . CR" }; +static const char *const l79[] = { "PAD PAD = . CR" }; +static const char *const l80[] = { "PAD HERE = . CR" }; +static const char *const l81[] = { "10 HERE ! 5 HERE +! HERE @ . CR" }; +static const char *const l82[] = { "42 HERE ! 0 HERE +! HERE @ . CR" }; +static const char *const l83[] = { "10 HERE ! -3 HERE +! HERE @ . CR" }; +static const char *const l84[] = { "0 HERE ! 1 HERE +! 2 HERE +! 3 HERE +! HERE @ . CR" }; +static const char *const l85[] = { "+!" }; +static const char *const l86[] = { "HERE 0 88 FILL" }; +static const char *const l87[] = { "FILL" }; +static const char *const l88[] = { "65 HERE ! 66 HERE 1+ ! HERE HERE 16 + 2 MOVE HERE 16 + @ .", "HERE 17 + @ . CR" }; +static const char *const l89[] = { "HERE HERE 8 + 0 MOVE" }; +static const char *const l90[] = { "MOVE" }; +static const char *const l91[] = { "5 7 + . CR" }; +static const char *const l92[] = { "42 0 + . CR" }; +static const char *const l93[] = { "-5 3 + . CR" }; +static const char *const l94[] = { "-5 -3 + . CR" }; +static const char *const l95[] = { "2147483647 1 + . CR" }; +static const char *const l96[] = { "-2147483648 -1 + . CR" }; +static const char *const l97[] = { "+" }; +static const char *const l98[] = { "42 +" }; +static const char *const l99[] = { "10 3 - . CR" }; +static const char *const l100[] = { "42 0 - . CR" }; +static const char *const l101[] = { "0 5 - . CR" }; +static const char *const l102[] = { "5 -3 - . CR" }; +static const char *const l103[] = { "42 42 - . CR" }; +static const char *const l104[] = { "-2147483648 1 - . CR" }; +static const char *const l105[] = { "2147483647 -1 - . CR" }; +static const char *const l106[] = { "-" }; +static const char *const l107[] = { "42 -" }; +static const char *const l108[] = { "6 7 * . CR" }; +static const char *const l109[] = { "42 0 * . CR" }; +static const char *const l110[] = { "42 1 * . CR" }; +static const char *const l111[] = { "6 -7 * . CR" }; +static const char *const l112[] = { "-6 -7 * . CR" }; +static const char *const l113[] = { "32767 2 * . CR" }; +static const char *const l114[] = { "65536 65536 * . CR" }; +static const char *const l115[] = { "*" }; +static const char *const l116[] = { "42 *" }; +static const char *const l117[] = { "15 3 / . CR" }; +static const char *const l118[] = { "42 1 / . CR" }; +static const char *const l119[] = { "-15 3 / . CR" }; +static const char *const l120[] = { "15 -3 / . CR" }; +static const char *const l121[] = { "-15 -3 / . CR" }; +static const char *const l122[] = { "7 3 / . CR" }; +static const char *const l123[] = { "42 0 /" }; +static const char *const l124[] = { "/" }; +static const char *const l125[] = { "42 /" }; +static const char *const l126[] = { "17 5 MOD . CR" }; +static const char *const l127[] = { "15 3 MOD . CR" }; +static const char *const l128[] = { "42 1 MOD . CR" }; +static const char *const l129[] = { "-17 5 MOD . CR" }; +static const char *const l130[] = { "17 -5 MOD . CR" }; +static const char *const l131[] = { "3 7 MOD . CR" }; +static const char *const l132[] = { "42 0 MOD" }; +static const char *const l133[] = { "MOD" }; +static const char *const l134[] = { "42 MOD" }; +static const char *const l135[] = { "17 5 /MOD . . CR" }; +static const char *const l136[] = { "15 3 /MOD . . CR" }; +static const char *const l137[] = { "-17 5 /MOD . . CR" }; +static const char *const l138[] = { "42 0 /MOD" }; +static const char *const l139[] = { "/MOD" }; +static const char *const l140[] = { "42 /MOD" }; +static const char *const l141[] = { "42 ABS . CR" }; +static const char *const l142[] = { "-42 ABS . CR" }; +static const char *const l143[] = { "0 ABS . CR" }; +static const char *const l144[] = { "-2147483648 ABS . CR" }; +static const char *const l145[] = { "ABS" }; +static const char *const l146[] = { "42 NEGATE . CR" }; +static const char *const l147[] = { "-42 NEGATE . CR" }; +static const char *const l148[] = { "0 NEGATE . CR" }; +static const char *const l149[] = { "-2147483648 NEGATE . CR" }; +static const char *const l150[] = { "NEGATE" }; +static const char *const l151[] = { "5 3 MIN . CR" }; +static const char *const l152[] = { "42 42 MIN . CR" }; +static const char *const l153[] = { "-5 -3 MIN . CR" }; +static const char *const l154[] = { "-1 1 MIN . CR" }; +static const char *const l155[] = { "42 MIN" }; +static const char *const l156[] = { "MIN" }; +static const char *const l157[] = { "5 3 MAX . CR" }; +static const char *const l158[] = { "42 42 MAX . CR" }; +static const char *const l159[] = { "-5 -3 MAX . CR" }; +static const char *const l160[] = { "-1 1 MAX . CR" }; +static const char *const l161[] = { "42 MAX" }; +static const char *const l162[] = { "MAX" }; +static const char *const l163[] = { "5 1+ . CR" }; +static const char *const l164[] = { "0 1+ . CR" }; +static const char *const l165[] = { "-1 1+ . CR" }; +static const char *const l166[] = { "3 1+ 1+ 1+ . CR" }; +static const char *const l167[] = { "2147483647 1+ . CR" }; +static const char *const l168[] = { "1+" }; +static const char *const l169[] = { "5 1- . CR" }; +static const char *const l170[] = { "1 1- . CR" }; +static const char *const l171[] = { "0 1- . CR" }; +static const char *const l172[] = { "6 1- 1- 1- . CR" }; +static const char *const l173[] = { "-2147483648 1- . CR" }; +static const char *const l174[] = { "1-" }; +static const char *const l175[] = { "5 2+ . CR" }; +static const char *const l176[] = { "0 2+ . CR" }; +static const char *const l177[] = { "-3 2+ . CR" }; +static const char *const l178[] = { "2+" }; +static const char *const l179[] = { "7 2- . CR" }; +static const char *const l180[] = { "2 2- . CR" }; +static const char *const l181[] = { "0 2- . CR" }; +static const char *const l182[] = { "2-" }; +static const char *const l183[] = { "-1 -1 AND . CR" }; +static const char *const l184[] = { "0 -1 AND . CR" }; +static const char *const l185[] = { "-1 0 AND . CR" }; +static const char *const l186[] = { "0 0 AND . CR" }; +static const char *const l187[] = { "85 51 AND . CR" }; +static const char *const l188[] = { "AND" }; +static const char *const l189[] = { "42 AND" }; +static const char *const l190[] = { "-1 -1 OR . CR" }; +static const char *const l191[] = { "0 -1 OR . CR" }; +static const char *const l192[] = { "-1 0 OR . CR" }; +static const char *const l193[] = { "0 0 OR . CR" }; +static const char *const l194[] = { "85 51 OR . CR" }; +static const char *const l195[] = { "OR" }; +static const char *const l196[] = { "42 OR" }; +static const char *const l197[] = { "-1 -1 XOR . CR" }; +static const char *const l198[] = { "0 -1 XOR . CR" }; +static const char *const l199[] = { "-1 0 XOR . CR" }; +static const char *const l200[] = { "0 0 XOR . CR" }; +static const char *const l201[] = { "85 51 XOR . CR" }; +static const char *const l202[] = { "XOR" }; +static const char *const l203[] = { "42 XOR" }; +static const char *const l204[] = { "-1 NOT . CR" }; +static const char *const l205[] = { "0 NOT . CR" }; +static const char *const l206[] = { "42 NOT . CR" }; +static const char *const l207[] = { "-42 NOT . CR" }; +static const char *const l208[] = { "NOT" }; +static const char *const l209[] = { "42 42 = . CR" }; +static const char *const l210[] = { "42 43 = . CR" }; +static const char *const l211[] = { "0 0 = . CR" }; +static const char *const l212[] = { "-42 -42 = . CR" }; +static const char *const l213[] = { "-42 42 = . CR" }; +static const char *const l214[] = { "=" }; +static const char *const l215[] = { "42 =" }; +static const char *const l216[] = { "5 7 < . CR" }; +static const char *const l217[] = { "7 5 < . CR" }; +static const char *const l218[] = { "5 5 < . CR" }; +static const char *const l219[] = { "-5 5 < . CR" }; +static const char *const l220[] = { "-7 -5 < . CR" }; +static const char *const l221[] = { "<" }; +static const char *const l222[] = { "42 <" }; +static const char *const l223[] = { "7 5 > . CR" }; +static const char *const l224[] = { "5 7 > . CR" }; +static const char *const l225[] = { "5 5 > . CR" }; +static const char *const l226[] = { "5 -5 > . CR" }; +static const char *const l227[] = { "-5 -7 > . CR" }; +static const char *const l228[] = { ">" }; +static const char *const l229[] = { "42 >" }; +static const char *const l230[] = { "0 0= . CR" }; +static const char *const l231[] = { "42 0= . CR" }; +static const char *const l232[] = { "-42 0= . CR" }; +static const char *const l233[] = { "0=" }; +static const char *const l234[] = { "-42 0< . CR" }; +static const char *const l235[] = { "0 0< . CR" }; +static const char *const l236[] = { "42 0< . CR" }; +static const char *const l237[] = { "0<" }; +static const char *const l238[] = { "42 0> . CR" }; +static const char *const l239[] = { "0 0> . CR" }; +static const char *const l240[] = { "-42 0> . CR" }; +static const char *const l241[] = { "0>" }; +static const char *const l242[] = { "3 5 U< . CR" }; +static const char *const l243[] = { "5 5 U< . CR" }; +static const char *const l244[] = { "7 5 U< . CR" }; +static const char *const l245[] = { "0 1 U< . CR" }; +static const char *const l246[] = { "U<" }; +static const char *const l247[] = { "6 7 4 */ . CR" }; +static const char *const l248[] = { "12 5 3 */ . CR" }; +static const char *const l249[] = { "0 999 123 */ . CR" }; +static const char *const l250[] = { "42 5 1 */ . CR" }; +static const char *const l251[] = { "7 3 2 */ . CR" }; +static const char *const l252[] = { "-6 7 4 */ . CR" }; +static const char *const l253[] = { "6 7 -4 */ . CR" }; +static const char *const l254[] = { "6 7 0 */" }; +static const char *const l255[] = { "*/" }; +static const char *const l256[] = { "1 2 */" }; +static const char *const l257[] = { "17 3 5 */MOD . . CR" }; +static const char *const l258[] = { "15 4 3 */MOD . . CR" }; +static const char *const l259[] = { "0 999 123 */MOD . . CR" }; +static const char *const l260[] = { "42 5 1 */MOD . . CR" }; +static const char *const l261[] = { "7 8 5 */MOD . . CR" }; +static const char *const l262[] = { "-7 3 4 */MOD . . CR" }; +static const char *const l263[] = { "6 7 0 */MOD" }; +static const char *const l264[] = { "*/MOD" }; +static const char *const l265[] = { "100 200 300 400 D+ . . CR" }; +static const char *const l266[] = { "42 99 0 0 D+ . . CR" }; +static const char *const l267[] = { "-100 -200 50 75 D+ . . CR" }; +static const char *const l268[] = { "2147483647 0 1 0 D+ . . CR" }; +static const char *const l269[] = { "-100 -200 -300 -400 D+ . . CR" }; +static const char *const l270[] = { "1 2 3 D+" }; +static const char *const l271[] = { "D+" }; +static const char *const l272[] = { "100 200 DNEGATE . . CR" }; +static const char *const l273[] = { "-100 -200 DNEGATE . . CR" }; +static const char *const l274[] = { "0 0 DNEGATE . . CR" }; +static const char *const l275[] = { "2147483647 0 DNEGATE . . CR" }; +static const char *const l276[] = { "42 DNEGATE" }; +static const char *const l277[] = { "DNEGATE" }; +static const char *const l278[] = { "100 200 300 400 D< . CR" }; +static const char *const l279[] = { "300 400 100 200 D< . CR" }; +static const char *const l280[] = { "100 200 100 200 D< . CR" }; +static const char *const l281[] = { "-100 -1 100 0 D< . CR" }; +static const char *const l282[] = { "-300 -1 -100 -1 D< . CR" }; +static const char *const l283[] = { "100 200 100 300 D< . CR" }; +static const char *const l284[] = { "1 2 3 D<" }; +static const char *const l285[] = { "D<" }; +static const char *const l286[] = { "DECIMAL 42 . CR" }; +static const char *const l287[] = { "HEX FF . CR" }; +static const char *const l288[] = { "OCTAL 52 . CR" }; +static const char *const l289[] = { "16 BASE ! 255 . CR" }; +static const char *const l290[] = { "BASE @ . CR" }; +static const char *const l291[] = { "HEX FF DECIMAL . CR" }; +static const char *const l292[] = { "OCTAL 52 DECIMAL . CR" }; +static const char *const l293[] = { "DECIMAL 42 . CR 42 . CR HEX 42 . CR" }; +static const char *const l294[] = { "DECIMAL 42 S>D <# #S #> TYPE CR" }; +static const char *const l295[] = { "0 0 <# #> TYPE CR" }; +static const char *const l296[] = { "-42 DUP ABS 0 <# #S ROT SIGN #> TYPE CR" }; +static const char *const l297[] = { "15 0 <# # #> TYPE CR" }; +static const char *const l298[] = { "15 0 <# # # #> TYPE CR" }; +static const char *const l299[] = { "5 0 <# # # #> TYPE CR" }; +static const char *const l300[] = { "42 0 <# #S #> TYPE CR" }; +static const char *const l301[] = { "0 0 <# #S #> TYPE CR" }; +static const char *const l302[] = { "1234567890 0 <# #S #> TYPE CR" }; +static const char *const l303[] = { "-42 DUP ABS 0 <# #S ROT SIGN #> TYPE CR" }; +static const char *const l304[] = { "42 DUP ABS 0 <# #S ROT SIGN #> TYPE CR" }; +static const char *const l305[] = { "0 DUP ABS 0 <# #S ROT SIGN #> TYPE CR" }; +static const char *const l306[] = { "42 0 <# #S #> TYPE CR" }; +static const char *const l307[] = { "0 0 <# #> TYPE CR" }; +static const char *const l308[] = { "42 0 <# #S #> SWAP DROP . CR" }; +static const char *const l309[] = { "42 0 <# 46 HOLD #S #> TYPE CR" }; +static const char *const l310[] = { "<# 257 HOLD #>" }; +static const char *const l311[] = { "4 PAD C! PAD COUNT . PAD - . CR" }; +static const char *const l312[] = { "0 PAD C! PAD COUNT . PAD - . CR" }; +static const char *const l313[] = { "255 PAD C! PAD COUNT . PAD - . CR" }; +static const char *const l314[] = { "COUNT" }; +static const char *const l315[] = { "HERE S\042 Test \042 -TRAILING TYPE CR" }; +static const char *const l316[] = { "HERE S\042 \042 -TRAILING TYPE CR" }; +static const char *const l317[] = { "HERE S\042 Test\042 -TRAILING TYPE CR" }; +static const char *const l318[] = { "HERE 0 -TRAILING TYPE CR" }; +static const char *const l319[] = { "65 PAD C! 66 PAD 1+ C! PAD PAD 10 + 2 CMOVE PAD 10 + C@ . PAD", "11 + C@ . CR" }; +static const char *const l320[] = { "HERE HERE 10 + 0 CMOVE" }; +static const char *const l321[] = { ">IN @ . CR" }; +static const char *const l322[] = { ": TWIN >IN @ >IN @ - . CR ; TWIN" }; +static const char *const l323[] = { "42 . CR" }; +static const char *const l324[] = { "-42 . CR" }; +static const char *const l325[] = { "0 . CR" }; +static const char *const l326[] = { "2147483647 . CR" }; +static const char *const l327[] = { "-2147483648 . CR" }; +static const char *const l328[] = { "1 2 3 . . . CR" }; +static const char *const l329[] = { "." }; +static const char *const l330[] = { "42 . CR 43 . CR" }; +static const char *const l331[] = { "CR CR CR" }; +static const char *const l332[] = { "DEPTH CR DEPTH = . CR" }; +static const char *const l333[] = { "1 2 3 . . . CR" }; +static const char *const l334[] = { "42 . SPACE 43 . CR" }; +static const char *const l335[] = { "SPACE SPACE SPACE" }; +static const char *const l336[] = { "DEPTH SPACE DEPTH = . CR" }; +static const char *const l337[] = { "65 EMIT SPACE 66 EMIT CR" }; +static const char *const l338[] = { "0 SPACES" }; +static const char *const l339[] = { "1 SPACES" }; +static const char *const l340[] = { "5 SPACES" }; +static const char *const l341[] = { "20 SPACES" }; +static const char *const l342[] = { "-5 SPACES" }; +static const char *const l343[] = { "42 . 3 SPACES 43 . CR" }; +static const char *const l344[] = { "SPACES" }; +static const char *const l345[] = { "65 EMIT CR" }; +static const char *const l346[] = { "90 EMIT CR" }; +static const char *const l347[] = { "48 EMIT CR" }; +static const char *const l348[] = { "32 EMIT CR" }; +static const char *const l349[] = { "10 EMIT" }; +static const char *const l350[] = { "127 EMIT CR" }; +static const char *const l351[] = { "321 EMIT CR" }; +static const char *const l352[] = { "-1 EMIT CR" }; +static const char *const l353[] = { "72 EMIT 73 EMIT 10 EMIT" }; +static const char *const l354[] = { "EMIT" }; +static const char *const l355[] = { "72 PAD C! 105 PAD 1+ C! PAD 2 TYPE CR" }; +static const char *const l356[] = { "HERE 0 TYPE CR" }; +static const char *const l357[] = { "49 PAD C! 50 PAD 1+ C! PAD 2 TYPE CR" }; +static const char *const l358[] = { "PAD 0 TYPE" }; +static const char *const l359[] = { "PAD TYPE" }; +static const char *const l360[] = { "TYPE" }; +static const char *const l361[] = { "4 PAD C! PAD COUNT . PAD - . CR" }; +static const char *const l362[] = { "0 PAD C! PAD COUNT . PAD - . CR" }; +static const char *const l363[] = { "255 PAD C! PAD COUNT . PAD - . CR" }; +static const char *const l364[] = { "COUNT" }; +static const char *const l365[] = { "WORD" }; +static const char *const l366[] = { "1 BLOCK DUP . CR" }; +static const char *const l367[] = { "0 BLOCK" }; +static const char *const l368[] = { "65536 BLOCK" }; +static const char *const l369[] = { "-1 BLOCK" }; +static const char *const l370[] = { "BLOCK" }; +static const char *const l371[] = { "1 BUFFER DUP . CR" }; +static const char *const l372[] = { "0 BUFFER" }; +static const char *const l373[] = { "2 BLOCK 1+ 2 BUFFER" }; +static const char *const l374[] = { "BUFFER" }; +static const char *const l375[] = { "1 BLOCK UPDATE" }; +static const char *const l376[] = { "1 BLOCK UPDATE UPDATE" }; +static const char *const l377[] = { "0 SCR ! UPDATE" }; +static const char *const l378[] = { "SAVE-BUFFERS" }; +static const char *const l379[] = { "1 BLOCK UPDATE SAVE-BUFFERS" }; +static const char *const l380[] = { "SAVE-BUFFERS" }; +static const char *const l381[] = { "EMPTY-BUFFERS" }; +static const char *const l382[] = { "1 BLOCK EMPTY-BUFFERS" }; +static const char *const l383[] = { "1 BLOCK UPDATE EMPTY-BUFFERS" }; +static const char *const l384[] = { "1 LOAD" }; +static const char *const l385[] = { "0 LOAD" }; +static const char *const l386[] = { "9999 LOAD" }; +static const char *const l387[] = { "LOAD" }; +static const char *const l388[] = { "1 LIST" }; +static const char *const l389[] = { "0 LIST" }; +static const char *const l390[] = { "9999 LIST" }; +static const char *const l391[] = { "LIST" }; +static const char *const l392[] = { "SCR @ . CR" }; +static const char *const l393[] = { "1 LIST SCR @ . CR" }; +static const char *const l394[] = { "1 LOAD SCR @ . CR" }; +static const char *const l395[] = { "HERE HERE = . CR" }; +static const char *const l396[] = { "HERE 42 , HERE SWAP - 1 CELLS = 0 SWAP /" }; +static const long long s396[] = { 0LL }; +static const char *const l397[] = { "HERE 65 C, HERE SWAP - . CR" }; +static const char *const l398[] = { "HERE 10 ALLOT HERE SWAP - . CR" }; +static const char *const l399[] = { "HERE DUP HERE = . CR" }; +static const char *const l400[] = { "HERE 10 ALLOT HERE SWAP - . CR" }; +static const char *const l401[] = { "HERE 0 ALLOT HERE SWAP - . CR" }; +static const char *const l402[] = { "HERE -4 ALLOT HERE SWAP - . CR" }; +static const char *const l403[] = { "HERE 100 ALLOT HERE SWAP - . CR" }; +static const char *const l404[] = { "ALIGN HERE 10 ALLOT 42 OVER ! @ . CR" }; +static const char *const l405[] = { "ALLOT" }; +static const char *const l406[] = { "42 , HERE 1 CELLS - @ . CR" }; +static const char *const l407[] = { "-999 , HERE 1 CELLS - @ . CR" }; +static const char *const l408[] = { "0 , HERE 1 CELLS - @ . CR" }; +static const char *const l409[] = { "2147483647 , HERE 1 CELLS - @ . CR" }; +static const char *const l410[] = { "-2147483648 , HERE 1 CELLS - @ . CR" }; +static const char *const l411[] = { "10 , 20 , HERE 1 CELLS - @ . HERE 1 CELLS - @ . CR" }; +static const char *const l412[] = { "," }; +static const char *const l413[] = { "PAD PAD = . CR" }; +static const char *const l414[] = { "PAD HERE = . CR" }; +static const char *const l415[] = { "PAD DUP PAD = . CR" }; +static const char *const l416[] = { "CREATE test1 42 , test1 @ . CR" }; +static const char *const l417[] = { "CREATE" }; +static const char *const l418[] = { "CREATE T 1 , CREATE T 2 , T @ . CR" }; +static const char *const l419[] = { "CREATE test2 CREATE test2" }; +static const char *const l420[] = { "CREATE abcdefghijklmnopqrstuvwxyz" }; +static const char *const l421[] = { "CREATE temp1 FORGET temp1" }; +static const char *const l422[] = { ": test3 42 ; IMMEDIATE test3 . CR" }; +static const char *const l423[] = { ": test4 43 ; IMMEDIATE IMMEDIATE" }; +static const char *const l424[] = { "FIND DUP . CR" }; +static const char *const l425[] = { ": test5 44 ; FIND test5 . CR" }; +static const char *const l426[] = { "FIND nonexistent . CR" }; +static const char *const l427[] = { "FIND" }; +static const long long s427[] = { 0LL }; +static const char *const l428[] = { "FORTH DEFINITIONS" }; +static const char *const l429[] = { "FORTH DEFINITIONS DEFINITIONS" }; +static const char *const l430[] = { "VOCABULARY TEST-VOC1 TEST-VOC1 DEFINITIONS" }; +static const char *const l431[] = { "VOCABULARY MYVOC MYVOC DEFINITIONS CONTEXT @ . CR" }; +static const char *const l432[] = { "VOCABULARY ISOLATED ISOLATED DEFINITIONS : ISOWORD 99 ; FORTH", "DEFINITIONS" }; +static const char *const l433[] = { "VOCABULARY V1 V1 DEFINITIONS : V1WORD 11 ; FORTH V1WORD . CR" }; +static const char *const l434[] = { "VOCABULARY VA VOCABULARY VB VOCABULARY VC VA DEFINITIONS" }; +static const char *const l435[] = { "VOCABULARY TESTVOC VOCABULARY TESTVOC" }; +static const char *const l436[] = { "VOCABULARY" }; +static const char *const l437[] = { "FORTH DEFINITIONS" }; +static const char *const l438[] = { "FORTH : TEST1 42 ; TEST1 . CR" }; +static const char *const l439[] = { "VOCABULARY OTHER-VOC OTHER-VOC FORTH" }; +static const char *const l440[] = { "FORTH DEFINITIONS" }; +static const char *const l441[] = { "VOCABULARY TEST-VOC6 TEST-VOC6 DEFINITIONS" }; +static const char *const l442[] = { "VOCABULARY TEST-VOC7 TEST-VOC7 DEFINITIONS : TEST2 43 ;" }; +static const char *const l443[] = { "CONTEXT @ . CR" }; +static const char *const l444[] = { "FORTH CONTEXT @ . CR" }; +static const char *const l445[] = { "CURRENT @ . CR" }; +static const char *const l446[] = { "VOCABULARY TEST-VOC8 TEST-VOC8 DEFINITIONS CURRENT @ . CR" }; +static const char *const l447[] = { "ABORT" }; +static const char *const l448[] = { "1 2 3 ABORT DEPTH . CR" }; +static const char *const l449[] = { ": BAD-WORD ABORT ; 123 BAD-WORD DEPTH . CR" }; +static const char *const l450[] = { ": TEST1 42 ; TEST1 . CR" }; +static const char *const l451[] = { ":" }; +static const char *const l452[] = { ";" }; +static const char *const l453[] = { ": TEST4 42 ; IMMEDIATE TEST4 . CR" }; +static const char *const l454[] = { "42 CONSTANT MEANING MEANING . CR" }; +static const char *const l455[] = { "0 CONSTANT ZERO ZERO . CR" }; +static const char *const l456[] = { "-1 CONSTANT MINUS MINUS . CR" }; +static const char *const l457[] = { "CONSTANT" }; +static const char *const l458[] = { "VARIABLE VAR1 42 VAR1 ! VAR1 @ . CR" }; +static const char *const l459[] = { "VARIABLE VAR2 VARIABLE VAR3" }; +static const char *const l460[] = { "VARIABLE VAR4 -99 VAR4 ! VAR4 @ . CR" }; +static const char *const l461[] = { "CREATE OBJ1" }; +static const char *const l462[] = { "CREATE OBJ2 42 , OBJ2 @ . CR" }; +static const char *const l463[] = { "CREATE" }; +static const char *const l464[] = { ": CONST CREATE , DOES> @ ; 42 CONST MEANING MEANING . CR" }; +static const char *const l465[] = { ": ARRAY CREATE DOES> SWAP CELLS + ; CREATE ARR 10 CELLS ALLOT" }; +static const char *const l466[] = { "DOES>" }; +static const char *const l467[] = { ": TEST5 [ 42 ] LITERAL ; TEST5 . CR" }; +static const char *const l468[] = { "[" }; +static const char *const l469[] = { ": TEST6 [ ] 42 ; TEST6 . CR" }; +static const char *const l470[] = { ": TEST1 IF 42 ELSE 24 THEN ; -1 TEST1 . CR" }; +static const char *const l471[] = { ": TEST2 IF 42 ELSE 24 THEN ; 0 TEST2 . CR" }; +static const char *const l472[] = { ": TEST3 IF IF 1 ELSE 2 THEN ELSE 3 THEN ; -1 -1 TEST3 . CR" }; +static const char *const l473[] = { ": TEST4 IF 42 THEN ; -1 TEST4 . CR" }; +static const char *const l474[] = { "IF" }; +static const char *const l475[] = { "ELSE" }; +static const char *const l476[] = { "THEN" }; +static const char *const l477[] = { ": TEST5 0 BEGIN 1+ DUP 5 = UNTIL ; TEST5 . CR" }; +static const char *const l478[] = { ": TEST6 0 BEGIN DUP 5 < WHILE 1+ REPEAT ; TEST6 . CR" }; +static const char *const l479[] = { "BEGIN" }; +static const char *const l480[] = { ": TEST8 BEGIN DUP 1- DUP 0= UNTIL ; 5 TEST8 . CR" }; +static const long long s480[] = { 5LL, 4LL, 3LL, 2LL, 1LL }; +static const char *const l481[] = { ": TEST9 BEGIN 1 UNTIL ; IMMEDIATE" }; +static const char *const l482[] = { "UNTIL" }; +static const char *const l483[] = { ": TEST10 BEGIN DUP 5 < WHILE 1+ REPEAT ; 0 TEST10 . CR" }; +static const char *const l484[] = { ": TEST11 BEGIN DUP 0< WHILE 1+ REPEAT ; 0 TEST11 . CR" }; +static const char *const l485[] = { "WHILE" }; +static const char *const l486[] = { ": TEST12 BEGIN DUP 5 < WHILE 1+ REPEAT ; 0 TEST12 . CR" }; +static const char *const l487[] = { "REPEAT" }; +static const char *const l488[] = { ": TEST13 5 0 DO I . LOOP ; TEST13 CR" }; +static const char *const l489[] = { ": TEST14 -1 -5 DO I . LOOP ; TEST14 CR" }; +static const char *const l490[] = { ": TEST15 0 0 DO LOOP ;" }; +static const char *const l491[] = { ": TEST16 3 0 DO 3 0 DO J I + . LOOP LOOP ; TEST16 CR" }; +static const char *const l492[] = { ": TEST20 5 0 DO I . LOOP ; TEST20 CR" }; +static const char *const l493[] = { "LOOP" }; +static const char *const l494[] = { ": TEST21 10 0 DO I . 2 +LOOP ; TEST21 CR" }; +static const char *const l495[] = { ": TEST22 0 10 DO I . -1 +LOOP ; TEST22 CR" }; +static const char *const l496[] = { ": TEST23 10 0 DO I . DUP +LOOP ; 3 TEST23 CR" }; +static const long long s496[] = { 3LL }; +static const char *const l497[] = { ": TI 4 0 DO I . LOOP CR ; TI" }; +static const char *const l498[] = { ": TI1 1 0 DO I . LOOP CR ; TI1" }; +static const char *const l499[] = { ": TI2 5 3 DO I . LOOP CR ; TI2" }; +static const char *const l500[] = { ": TI3 3 0 DO I 2 * . LOOP CR ; TI3" }; +static const char *const l501[] = { ": TJ 2 0 DO 3 0 DO J . LOOP LOOP CR ; TJ" }; +static const char *const l502[] = { ": TJ2 2 0 DO 2 0 DO J I + . LOOP LOOP CR ; TJ2" }; +static const char *const l503[] = { ": TEX 5 EXIT 99 ; TEX . CR" }; +static const char *const l504[] = { ": TEX2 DUP 0> IF EXIT THEN NEGATE ; 3 TEX2 . CR" }; +static const char *const l505[] = { ": TEX2 DUP 0> IF EXIT THEN NEGATE ; -4 TEX2 . CR" }; +static const char *const l506[] = { ": TEX3 1 2 EXIT 3 ; TEX3 . . CR" }; +static const char *const l507[] = { ": TLV 0 5 0 DO I 3 = IF LEAVE THEN 1+ LOOP ; TLV . CR" }; +static const char *const l508[] = { ": TLV2 0 5 0 DO LEAVE 1+ LOOP ; TLV2 . CR" }; +static const char *const l509[] = { ": TLV3 0 5 0 \077DO I 2 = IF LEAVE THEN 1+ LOOP ; TLV3 . CR" }; +static const char *const l510[] = { "3 4 U* . . CR" }; +static const char *const l511[] = { "0 5 U* . . CR" }; +static const char *const l512[] = { "-1 -1 U* 2+ . 1 = . CR" }; +static const char *const l513[] = { "7 0 2 U/MOD . . CR" }; +static const char *const l514[] = { "12 0 4 U/MOD . . CR" }; +static const char *const l515[] = { "0 1 2 U/MOD 2* . . CR" }; +static const char *const l516[] = { "-1 -1 U* -1 U/MOD 1+ . . CR" }; +static const char *const l517[] = { "-1 -2 -1 U/MOD 1+ . 2+ . CR" }; +static const char *const l518[] = { "1 0 0 U/MOD" }; +static const char *const l519[] = { "VARIABLE Q1 42 Q1 ! Q1 \077 CR" }; +static const char *const l520[] = { ": E1 7 ; FIND E1 EXECUTE . CR" }; +static const char *const l521[] = { "42 U. CR" }; +static const char *const l522[] = { "-1 U. CR" }; +static const char *const l523[] = { ": C1 0 0 BL WORD CONVERT DROP ; C1 123 . . CR" }; +static const char *const l524[] = { "' DUP 0= . CR" }; +static const char *const l525[] = { ": Q3 .\042 hi there\042 ; Q3 CR" }; +static const char *const l526[] = { ": Q4 [ 5 ] LITERAL ; Q4 . CR" }; +static const char *const l527[] = { "STATE @ . CR" }; +static const char *const l528[] = { ": Q5 STATE @ 0= . ; IMMEDIATE : Q6 Q5 ; CR" }; +static const char *const l529[] = { ": Q7 COMPILE DUP ; IMMEDIATE : Q8 Q7 ; 3 Q8 . . CR" }; +static const char *const l530[] = { ": Q9 [COMPILE] IF ; IMMEDIATE : Q10 Q9 1 ELSE 2 THEN ; 0 Q10", ". -1 Q10 . CR" }; +static const char *const l531[] = { "1 ( 2 ) 3 . . CR" }; +static const char *const l532[] = { "BLK @ . CR" }; +static const char *const l533[] = { "79-STANDARD" }; +static const char *const l534[] = { ": W1 BL WORD COUNT TYPE ; W1 HELLO" }; +static const char *const l535[] = { ": W2 44 WORD COUNT TYPE ; W2 A B," }; +static const char *const l536[] = { ": W3 BL WORD C@ . ; W3 ABC" }; +static const char *const l537[] = { ": W4 BL WORD COUNT TYPE ; W4 X" }; + +const v4_post_case v4_post_cases[] = { + { "DUP.basic", l0, 1u, V4_POST_STACK, 0, 0u, "5 5 \012", 5u }, + { "DUP.zero", l1, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "DUP.negative", l2, 1u, V4_POST_STACK, 0, 0u, "-42 -42 \012", 9u }, + { "DUP.max_int", l3, 1u, V4_POST_STACK, 0, 0u, "2147483647 2147483647 \012", 23u }, + { "DUP.min_int", l4, 1u, V4_POST_STACK, 0, 0u, "-2147483648 -2147483648 \012", 25u }, + { "DUP.empty_stack", l5, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "DROP.basic", l6, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "DROP.zero", l7, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "DROP.negative", l8, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "DROP.double_drop", l9, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "DROP.triple_drop", l10, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "DROP.sequential", l11, 1u, V4_POST_STACK, 0, 0u, "7 \012", 3u }, + { "DROP.single_item", l12, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "DROP.depth_change", l13, 1u, V4_POST_STACK, s13, 1u, "1 \012", 3u }, + { "DROP.preserve_depth", l14, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "DROP.max_int", l15, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "DROP.min_int", l16, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "DROP.with_dup", l17, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "DROP.with_swap", l18, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "DROP.complex", l19, 1u, V4_POST_STACK, 0, 0u, "3 \012", 3u }, + { "DROP.empty_stack", l20, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "SWAP.basic", l21, 1u, V4_POST_STACK, 0, 0u, "5 7 \012", 5u }, + { "SWAP.same_values", l22, 1u, V4_POST_STACK, 0, 0u, "42 42 \012", 7u }, + { "SWAP.zero_nonzero", l23, 1u, V4_POST_STACK, 0, 0u, "0 99 \012", 6u }, + { "SWAP.negative", l24, 1u, V4_POST_STACK, 0, 0u, "-5 10 \012", 7u }, + { "SWAP.one_item", l25, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "SWAP.empty_stack", l26, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "OVER.basic", l27, 1u, V4_POST_STACK, 0, 0u, "5 7 5 \012", 7u }, + { "OVER.zeros", l28, 1u, V4_POST_STACK, 0, 0u, "0 0 0 \012", 7u }, + { "OVER.mixed", l29, 1u, V4_POST_STACK, 0, 0u, "-1 42 -1 \012", 10u }, + { "OVER.one_item", l30, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "OVER.empty_stack", l31, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "ROT.basic", l32, 1u, V4_POST_STACK, 0, 0u, "1 3 2 \012", 7u }, + { "ROT.zeros", l33, 1u, V4_POST_STACK, 0, 0u, "0 0 0 \012", 7u }, + { "ROT.mixed", l34, 1u, V4_POST_STACK, 0, 0u, "-1 1 0 \012", 8u }, + { "ROT.two_items", l35, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "ROT.one_item", l36, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "ROT.empty_stack", l37, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "DEPTH.empty", l38, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "DEPTH.one_item", l39, 1u, V4_POST_STACK, s39, 1u, "1 \012", 3u }, + { "DEPTH.multiple", l40, 1u, V4_POST_STACK, s40, 3u, "3 \012", 3u }, + { "PICK.pick_0", l41, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "PICK.pick_1", l42, 1u, V4_POST_STACK, s42, 3u, "3 \012", 3u }, + { "PICK.pick_2", l43, 1u, V4_POST_STACK, s43, 3u, "2 \012", 3u }, + { "ROLL.roll_1", l44, 1u, V4_POST_STACK, 0, 0u, "3 2 1 \012", 7u }, + { "ROLL.roll_2", l45, 1u, V4_POST_STACK, 0, 0u, "2 3 1 \012", 7u }, + { "\077DUP.nonzero", l46, 1u, V4_POST_STACK, 0, 0u, "42 42 \012", 7u }, + { "\077DUP.negative", l47, 1u, V4_POST_STACK, 0, 0u, "-5 -5 \012", 7u }, + { "\077DUP.zero", l48, 1u, V4_POST_STACK, s48, 1u, "1 \012", 3u }, + { "\077DUP.empty_stack", l49, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ">R.basic", l50, 1u, V4_POST_STACK, 0, 0u, "42 42 \012", 7u }, + { ">R.zero", l51, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { ">R.negative", l52, 1u, V4_POST_STACK, 0, 0u, "-123 -123 \012", 11u }, + { ">R.multiple", l53, 1u, V4_POST_STACK, 0, 0u, "1 1 2 2 \012", 9u }, + { ">R.empty_stack", l54, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "R>.basic", l55, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "R>.lifo_order", l56, 1u, V4_POST_STACK, 0, 0u, "1 2 \012", 5u }, + { "R>.empty_rstack", l57, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "R@.basic", l58, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "R@.non_destructive", l59, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "R@.empty_rstack", l60, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "!.basic", l61, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "!.zero", l62, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "!.negative", l63, 1u, V4_POST_STACK, 0, 0u, "-999 \012", 6u }, + { "!.overwrite", l64, 1u, V4_POST_STACK, 0, 0u, "222 \012", 5u }, + { "!.max_int", l65, 1u, V4_POST_STACK, 0, 0u, "2147483647 \012", 12u }, + { "!.min_int", l66, 1u, V4_POST_STACK, 0, 0u, "-2147483648 \012", 13u }, + { "!.empty_stack", l67, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "!.one_item", l68, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "@.after_store", l69, 1u, V4_POST_STACK, 0, 0u, "123 \012", 5u }, + { "@.multiple_reads", l70, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "@.empty_stack", l71, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ",.basic", l72, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { ",.negative", l73, 1u, V4_POST_STACK, 0, 0u, "-999 \012", 6u }, + { "HERE.basic", l74, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "HERE.after_comma", l75, 1u, V4_POST_STACK, s75, 1u, "", 0u }, + { "ALLOT.basic", l76, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "ALLOT.zero", l77, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "ALLOT.negative", l78, 1u, V4_POST_STACK, 0, 0u, "-4 \012", 4u }, + { "PAD.basic", l79, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "PAD.different_from_here", l80, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "+!.basic", l81, 1u, V4_POST_STACK, 0, 0u, "15 \012", 4u }, + { "+!.by_zero", l82, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "+!.negative", l83, 1u, V4_POST_STACK, 0, 0u, "7 \012", 3u }, + { "+!.accumulate", l84, 1u, V4_POST_STACK, 0, 0u, "6 \012", 3u }, + { "+!.empty_stack", l85, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "FILL.zero_n", l86, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "FILL.empty_stack", l87, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MOVE.basic", l88, 2u, V4_POST_STACK, 0, 0u, "65 66 \012", 7u }, + { "MOVE.zero_n", l89, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "MOVE.empty_stack", l90, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "+.basic", l91, 1u, V4_POST_STACK, 0, 0u, "12 \012", 4u }, + { "+.zero_add", l92, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "+.negative", l93, 1u, V4_POST_STACK, 0, 0u, "-2 \012", 4u }, + { "+.both_negative", l94, 1u, V4_POST_STACK, 0, 0u, "-8 \012", 4u }, + { "+.overflow", l95, 1u, V4_POST_STACK, 0, 0u, "2147483648 \012", 12u }, + { "+.underflow", l96, 1u, V4_POST_STACK, 0, 0u, "-2147483649 \012", 13u }, + { "+.empty_stack", l97, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "+.one_item", l98, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "-.basic", l99, 1u, V4_POST_STACK, 0, 0u, "7 \012", 3u }, + { "-.zero_sub", l100, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "-.from_zero", l101, 1u, V4_POST_STACK, 0, 0u, "-5 \012", 4u }, + { "-.negative", l102, 1u, V4_POST_STACK, 0, 0u, "8 \012", 3u }, + { "-.same_values", l103, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "-.overflow", l104, 1u, V4_POST_STACK, 0, 0u, "-2147483649 \012", 13u }, + { "-.underflow", l105, 1u, V4_POST_STACK, 0, 0u, "2147483648 \012", 12u }, + { "-.empty_stack", l106, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "-.one_item", l107, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*.basic", l108, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "*.by_zero", l109, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "*.by_one", l110, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "*.by_negative", l111, 1u, V4_POST_STACK, 0, 0u, "-42 \012", 5u }, + { "*.negative_negative", l112, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "*.large_numbers", l113, 1u, V4_POST_STACK, 0, 0u, "65534 \012", 7u }, + { "*.overflow", l114, 1u, V4_POST_STACK, 0, 0u, "4294967296 \012", 12u }, + { "*.empty_stack", l115, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*.one_item", l116, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "/.basic", l117, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "/.by_one", l118, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "/.negative_dividend", l119, 1u, V4_POST_STACK, 0, 0u, "-5 \012", 4u }, + { "/.negative_divisor", l120, 1u, V4_POST_STACK, 0, 0u, "-5 \012", 4u }, + { "/.both_negative", l121, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "/.truncation", l122, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "/.by_zero", l123, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "/.empty_stack", l124, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "/.one_item", l125, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MOD.basic", l126, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "MOD.exact_division", l127, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "MOD.by_one", l128, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "MOD.negative_dividend", l129, 1u, V4_POST_STACK, 0, 0u, "-2 \012", 4u }, + { "MOD.negative_divisor", l130, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "MOD.small_by_large", l131, 1u, V4_POST_STACK, 0, 0u, "3 \012", 3u }, + { "MOD.by_zero", l132, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MOD.empty_stack", l133, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MOD.one_item", l134, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "/MOD.basic", l135, 1u, V4_POST_STACK, 0, 0u, "3 2 \012", 5u }, + { "/MOD.exact", l136, 1u, V4_POST_STACK, 0, 0u, "5 0 \012", 5u }, + { "/MOD.negative", l137, 1u, V4_POST_STACK, 0, 0u, "-3 -2 \012", 7u }, + { "/MOD.by_zero", l138, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "/MOD.empty_stack", l139, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "/MOD.one_item", l140, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "ABS.positive", l141, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "ABS.negative", l142, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "ABS.zero", l143, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "ABS.min_int", l144, 1u, V4_POST_STACK, 0, 0u, "2147483648 \012", 12u }, + { "ABS.empty_stack", l145, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "NEGATE.positive", l146, 1u, V4_POST_STACK, 0, 0u, "-42 \012", 5u }, + { "NEGATE.negative", l147, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "NEGATE.zero", l148, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "NEGATE.min_int", l149, 1u, V4_POST_STACK, 0, 0u, "2147483648 \012", 12u }, + { "NEGATE.empty_stack", l150, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MIN.basic", l151, 1u, V4_POST_STACK, 0, 0u, "3 \012", 3u }, + { "MIN.equal", l152, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "MIN.negative", l153, 1u, V4_POST_STACK, 0, 0u, "-5 \012", 4u }, + { "MIN.mixed", l154, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "MIN.one_item", l155, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MIN.empty_stack", l156, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MAX.basic", l157, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "MAX.equal", l158, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "MAX.negative", l159, 1u, V4_POST_STACK, 0, 0u, "-3 \012", 4u }, + { "MAX.mixed", l160, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "MAX.one_item", l161, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "MAX.empty_stack", l162, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "1+.basic", l163, 1u, V4_POST_STACK, 0, 0u, "6 \012", 3u }, + { "1+.zero", l164, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "1+.negative", l165, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "1+.chain", l166, 1u, V4_POST_STACK, 0, 0u, "6 \012", 3u }, + { "1+.overflow", l167, 1u, V4_POST_STACK, 0, 0u, "2147483648 \012", 12u }, + { "1+.empty_stack", l168, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "1-.basic", l169, 1u, V4_POST_STACK, 0, 0u, "4 \012", 3u }, + { "1-.to_zero", l170, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "1-.to_negative", l171, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "1-.chain", l172, 1u, V4_POST_STACK, 0, 0u, "3 \012", 3u }, + { "1-.underflow", l173, 1u, V4_POST_STACK, 0, 0u, "-2147483649 \012", 13u }, + { "1-.empty_stack", l174, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "2+.basic", l175, 1u, V4_POST_STACK, 0, 0u, "7 \012", 3u }, + { "2+.zero", l176, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "2+.negative", l177, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "2+.empty_stack", l178, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "2-.basic", l179, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "2-.zero", l180, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "2-.negative", l181, 1u, V4_POST_STACK, 0, 0u, "-2 \012", 4u }, + { "2-.empty_stack", l182, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "AND.both_true", l183, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "AND.first_false", l184, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "AND.second_false", l185, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "AND.both_false", l186, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "AND.bitwise", l187, 1u, V4_POST_STACK, 0, 0u, "17 \012", 4u }, + { "AND.empty_stack", l188, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "AND.one_item", l189, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "OR.both_true", l190, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "OR.first_false", l191, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "OR.second_false", l192, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "OR.both_false", l193, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "OR.bitwise", l194, 1u, V4_POST_STACK, 0, 0u, "119 \012", 5u }, + { "OR.empty_stack", l195, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "OR.one_item", l196, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "XOR.both_true", l197, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "XOR.first_false", l198, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "XOR.second_false", l199, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "XOR.both_false", l200, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "XOR.bitwise", l201, 1u, V4_POST_STACK, 0, 0u, "102 \012", 5u }, + { "XOR.empty_stack", l202, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "XOR.one_item", l203, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "NOT.true", l204, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "NOT.false", l205, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "NOT.positive", l206, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "NOT.negative", l207, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "NOT.empty_stack", l208, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "=.equal", l209, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "=.not_equal", l210, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "=.zero_equal", l211, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "=.negative_equal", l212, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "=.negative_positive", l213, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "=.empty_stack", l214, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "=.one_item", l215, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "<.less_than", l216, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "<.greater_than", l217, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "<.equal", l218, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "<.negative_positive", l219, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "<.negative_negative", l220, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "<.empty_stack", l221, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "<.one_item", l222, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ">.greater_than", l223, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { ">.less_than", l224, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { ">.equal", l225, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { ">.positive_negative", l226, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { ">.negative_negative", l227, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { ">.empty_stack", l228, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ">.one_item", l229, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "0=.zero", l230, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "0=.positive", l231, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "0=.negative", l232, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "0=.empty_stack", l233, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "0<.negative", l234, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "0<.zero", l235, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "0<.positive", l236, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "0<.empty_stack", l237, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "0>.positive", l238, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "0>.zero", l239, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "0>.negative", l240, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "0>.empty_stack", l241, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "U<.less", l242, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "U<.equal", l243, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "U<.greater", l244, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "U<.zero_one", l245, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "U<.empty_stack", l246, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*/.basic", l247, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "*/.exact_division", l248, 1u, V4_POST_STACK, 0, 0u, "20 \012", 4u }, + { "*/.zero_multiply", l249, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "*/.by_one", l250, 1u, V4_POST_STACK, 0, 0u, "210 \012", 5u }, + { "*/.truncation", l251, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "*/.negative_multiply", l252, 1u, V4_POST_STACK, 0, 0u, "-10 \012", 5u }, + { "*/.negative_divisor", l253, 1u, V4_POST_STACK, 0, 0u, "-10 \012", 5u }, + { "*/.div_by_zero", l254, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*/.empty_stack", l255, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*/.two_items", l256, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*/MOD.basic", l257, 1u, V4_POST_STACK, 0, 0u, "10 1 \012", 6u }, + { "*/MOD.exact_division", l258, 1u, V4_POST_STACK, 0, 0u, "20 0 \012", 6u }, + { "*/MOD.zero_multiply", l259, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "*/MOD.by_one", l260, 1u, V4_POST_STACK, 0, 0u, "210 0 \012", 7u }, + { "*/MOD.remainder", l261, 1u, V4_POST_STACK, 0, 0u, "11 1 \012", 6u }, + { "*/MOD.negative", l262, 1u, V4_POST_STACK, 0, 0u, "-5 -1 \012", 7u }, + { "*/MOD.div_by_zero", l263, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "*/MOD.empty_stack", l264, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "D+.basic", l265, 1u, V4_POST_STACK, 0, 0u, "600 400 \012", 9u }, + { "D+.zero_add", l266, 1u, V4_POST_STACK, 0, 0u, "99 42 \012", 7u }, + { "D+.negative", l267, 1u, V4_POST_STACK, 0, 0u, "-125 -50 \012", 10u }, + { "D+.carry", l268, 1u, V4_POST_STACK, 0, 0u, "0 2147483648 \012", 14u }, + { "D+.both_negative", l269, 1u, V4_POST_STACK, 0, 0u, "-599 -400 \012", 11u }, + { "D+.three_items", l270, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "D+.empty_stack", l271, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "DNEGATE.positive", l272, 1u, V4_POST_STACK, 0, 0u, "-201 -100 \012", 11u }, + { "DNEGATE.negative", l273, 1u, V4_POST_STACK, 0, 0u, "199 100 \012", 9u }, + { "DNEGATE.zero", l274, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "DNEGATE.max_positive", l275, 1u, V4_POST_STACK, 0, 0u, "-1 -2147483647 \012", 16u }, + { "DNEGATE.one_item", l276, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "DNEGATE.empty_stack", l277, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "D<.less_than", l278, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "D<.greater_than", l279, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "D<.equal", l280, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "D<.negative_positive", l281, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "D<.negative_negative", l282, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "D<.high_word_diff", l283, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "D<.three_items", l284, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "D<.empty_stack", l285, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BASE.decimal", l286, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "BASE.hex", l287, 1u, V4_POST_STACK, 0, 0u, "FF \012", 4u }, + { "BASE.octal", l288, 1u, V4_POST_STACK, 0, 0u, "52 \012", 4u }, + { "BASE.base_store", l289, 1u, V4_POST_STACK, 0, 0u, "255 \012", 5u }, + { "BASE.base_fetch", l290, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "DECIMAL.from_hex", l291, 1u, V4_POST_STACK, 0, 0u, "255 \012", 5u }, + { "DECIMAL.from_octal", l292, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "DECIMAL.state_persist", l293, 1u, V4_POST_STACK, 0, 0u, "42 \01242 \01242 \012", 12u }, + { "<#.basic", l294, 1u, V4_POST_STACK, 0, 0u, "42\012", 3u }, + { "<#.empty", l295, 1u, V4_POST_STACK, 0, 0u, "\012", 1u }, + { "<#.negative", l296, 1u, V4_POST_STACK, 0, 0u, "-42\012", 4u }, + { "#.single_digit", l297, 1u, V4_POST_STACK, 0, 0u, "5\012", 2u }, + { "#.multiple", l298, 1u, V4_POST_STACK, 0, 0u, "15\012", 3u }, + { "#.zero_pad", l299, 1u, V4_POST_STACK, 0, 0u, "05\012", 3u }, + { "#S.basic", l300, 1u, V4_POST_STACK, 0, 0u, "42\012", 3u }, + { "#S.zero", l301, 1u, V4_POST_STACK, 0, 0u, "0\012", 2u }, + { "#S.large", l302, 1u, V4_POST_STACK, 0, 0u, "1234567890\012", 11u }, + { "SIGN.negative", l303, 1u, V4_POST_STACK, 0, 0u, "-42\012", 4u }, + { "SIGN.positive", l304, 1u, V4_POST_STACK, 0, 0u, "42\012", 3u }, + { "SIGN.zero", l305, 1u, V4_POST_STACK, 0, 0u, "0\012", 2u }, + { "#>.normal", l306, 1u, V4_POST_STACK, 0, 0u, "42\012", 3u }, + { "#>.empty", l307, 1u, V4_POST_STACK, 0, 0u, "\012", 1u }, + { "#>.stack_effect", l308, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "HOLD.basic", l309, 1u, V4_POST_STACK, 0, 0u, "42.\012", 4u }, + { "HOLD.overflow", l310, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "COUNT.basic", l311, 1u, V4_POST_STACK, 0, 0u, "4 1 \012", 5u }, + { "COUNT.empty", l312, 1u, V4_POST_STACK, 0, 0u, "0 1 \012", 5u }, + { "COUNT.max_length", l313, 1u, V4_POST_STACK, 0, 0u, "255 1 \012", 7u }, + { "COUNT.empty_stack", l314, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "-TRAILING.basic", l315, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, " Test\012", 6u }, + { "-TRAILING.all_spaces", l316, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "\012", 1u }, + { "-TRAILING.no_spaces", l317, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "Test\012", 5u }, + { "-TRAILING.empty", l318, 1u, V4_POST_STACK, 0, 0u, "\012", 1u }, + { "CMOVE.basic", l319, 2u, V4_POST_STACK, 0, 0u, "65 66 \012", 7u }, + { "CMOVE.empty", l320, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { ">IN.initial", l321, 1u, V4_POST_STACK, 0, 0u, "9 \012", 3u }, + { ">IN.advances", l322, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "..positive", l323, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "..negative", l324, 1u, V4_POST_STACK, 0, 0u, "-42 \012", 5u }, + { "..zero", l325, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "..max_int", l326, 1u, V4_POST_STACK, 0, 0u, "2147483647 \012", 12u }, + { "..min_int", l327, 1u, V4_POST_STACK, 0, 0u, "-2147483648 \012", 13u }, + { "..multiple", l328, 1u, V4_POST_STACK, 0, 0u, "3 2 1 \012", 7u }, + { "..empty_stack", l329, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "CR.basic", l330, 1u, V4_POST_STACK, 0, 0u, "42 \01243 \012", 8u }, + { "CR.multiple", l331, 1u, V4_POST_STACK, 0, 0u, "\012\012\012", 3u }, + { "CR.no_stack_effect", l332, 1u, V4_POST_STACK, 0, 0u, "\0120 \012", 4u }, + { "CR.after_output", l333, 1u, V4_POST_STACK, 0, 0u, "3 2 1 \012", 7u }, + { "SPACE.basic", l334, 1u, V4_POST_STACK, 0, 0u, "42 43 \012", 8u }, + { "SPACE.multiple", l335, 1u, V4_POST_STACK, 0, 0u, " ", 3u }, + { "SPACE.no_stack_effect", l336, 1u, V4_POST_STACK, 0, 0u, " 0 \012", 4u }, + { "SPACE.with_text", l337, 1u, V4_POST_STACK, 0, 0u, "A B\012", 4u }, + { "SPACES.zero", l338, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "SPACES.one", l339, 1u, V4_POST_STACK, 0, 0u, " ", 1u }, + { "SPACES.multiple", l340, 1u, V4_POST_STACK, 0, 0u, " ", 5u }, + { "SPACES.large", l341, 1u, V4_POST_STACK, 0, 0u, " ", 20u }, + { "SPACES.negative", l342, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "SPACES.with_output", l343, 1u, V4_POST_STACK, 0, 0u, "42 43 \012", 10u }, + { "SPACES.empty_stack", l344, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "EMIT.letter_A", l345, 1u, V4_POST_STACK, 0, 0u, "A\012", 2u }, + { "EMIT.letter_Z", l346, 1u, V4_POST_STACK, 0, 0u, "Z\012", 2u }, + { "EMIT.digit", l347, 1u, V4_POST_STACK, 0, 0u, "0\012", 2u }, + { "EMIT.space_char", l348, 1u, V4_POST_STACK, 0, 0u, " \012", 2u }, + { "EMIT.newline", l349, 1u, V4_POST_STACK, 0, 0u, "\012", 1u }, + { "EMIT.high_ascii", l350, 1u, V4_POST_STACK, 0, 0u, "\177\012", 2u }, + { "EMIT.truncation", l351, 1u, V4_POST_STACK, 0, 0u, "A\012", 2u }, + { "EMIT.negative", l352, 1u, V4_POST_STACK, 0, 0u, "\377\012", 2u }, + { "EMIT.sequence", l353, 1u, V4_POST_STACK, 0, 0u, "HI\012", 3u }, + { "EMIT.empty_stack", l354, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "TYPE.basic_string", l355, 1u, V4_POST_STACK, 0, 0u, "Hi\012", 3u }, + { "TYPE.empty_string", l356, 1u, V4_POST_STACK, 0, 0u, "\012", 1u }, + { "TYPE.numbers", l357, 1u, V4_POST_STACK, 0, 0u, "12\012", 3u }, + { "TYPE.zero_length", l358, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "TYPE.one_item", l359, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "TYPE.empty_stack", l360, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "COUNT.basic~2", l361, 1u, V4_POST_STACK, 0, 0u, "4 1 \012", 5u }, + { "COUNT.empty~2", l362, 1u, V4_POST_STACK, 0, 0u, "0 1 \012", 5u }, + { "COUNT.max_length~2", l363, 1u, V4_POST_STACK, 0, 0u, "255 1 \012", 7u }, + { "COUNT.empty_stack~2", l364, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "WORD.empty_stack", l365, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BLOCK.basic", l366, 1u, V4_POST_DEPTH, 0, 1u, "", 0u }, + { "BLOCK.zero_block", l367, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BLOCK.large_block", l368, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BLOCK.negative", l369, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BLOCK.empty_stack", l370, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BUFFER.basic", l371, 1u, V4_POST_DEPTH, 0, 1u, "", 0u }, + { "BUFFER.zero_block", l372, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BUFFER.flush_dirty", l373, 1u, V4_POST_DEPTH_OUTPUT, 0, 2u, "", 0u }, + { "BUFFER.empty_stack", l374, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "UPDATE.basic", l375, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "", 0u }, + { "UPDATE.multiple", l376, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "", 0u }, + { "UPDATE.no_block", l377, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "SAVE-BUFFERS.basic", l378, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "SAVE-BUFFERS.dirty_blocks", l379, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "", 0u }, + { "SAVE-BUFFERS.no_dirty", l380, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "EMPTY-BUFFERS.basic", l381, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "EMPTY-BUFFERS.after_use", l382, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "", 0u }, + { "EMPTY-BUFFERS.dirty_blocks", l383, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "", 0u }, + { "LOAD.basic", l384, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "LOAD.zero_block", l385, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "LOAD.nonexistent", l386, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "LOAD.empty_stack", l387, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "LIST.basic", l388, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "LIST.zero_block", l389, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "LIST.nonexistent", l390, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "LIST.empty_stack", l391, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "SCR.basic", l392, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "SCR.after_list", l393, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "SCR.after_load", l394, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "HERE.basic~2", l395, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "HERE.after_comma~2", l396, 1u, V4_POST_STACK, s396, 1u, "", 0u }, + { "HERE.after_c_comma", l397, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "HERE.after_allot", l398, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "HERE.stability", l399, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "-1 \012", 4u }, + { "ALLOT.basic~2", l400, 1u, V4_POST_STACK, 0, 0u, "10 \012", 4u }, + { "ALLOT.zero~2", l401, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "ALLOT.negative~2", l402, 1u, V4_POST_STACK, 0, 0u, "-4 \012", 4u }, + { "ALLOT.large", l403, 1u, V4_POST_STACK, 0, 0u, "100 \012", 5u }, + { "ALLOT.after_use", l404, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "ALLOT.empty_stack", l405, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ",.basic~2", l406, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { ",.negative~2", l407, 1u, V4_POST_STACK, 0, 0u, "-999 \012", 6u }, + { ",.zero", l408, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { ",.max_int", l409, 1u, V4_POST_STACK, 0, 0u, "2147483647 \012", 12u }, + { ",.min_int", l410, 1u, V4_POST_STACK, 0, 0u, "-2147483648 \012", 13u }, + { ",.multiple", l411, 1u, V4_POST_STACK, 0, 0u, "20 20 \012", 7u }, + { ",.empty_stack", l412, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "PAD.basic~2", l413, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "PAD.different_from_here~2", l414, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "PAD.stability", l415, 1u, V4_POST_DEPTH_OUTPUT, 0, 1u, "-1 \012", 4u }, + { "CREATE.basic", l416, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "CREATE.empty_name", l417, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "CREATE.redefine_shadows", l418, 1u, V4_POST_STACK, 0, 0u, "2 \012", 3u }, + { "CREATE.duplicate", l419, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "CREATE.long_name", l420, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "FORGET.basic", l421, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "IMMEDIATE.basic", l422, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "IMMEDIATE.already_immediate", l423, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "FIND.existing", l424, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "FIND.user_word", l425, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "FIND.nonexistent", l426, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "FIND.empty", l427, 1u, V4_POST_STACK, s427, 1u, "", 0u }, + { "DEFINITIONS.basic", l428, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "DEFINITIONS.multiple", l429, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "VOCABULARY.basic", l430, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "VOCABULARY.create_and_switch", l431, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "VOCABULARY.word_isolation", l432, 2u, V4_POST_STACK, 0, 0u, "", 0u }, + { "VOCABULARY.cross_vocab_access", l433, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "VOCABULARY.multiple_vocabs", l434, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "VOCABULARY.duplicate", l435, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "VOCABULARY.empty_name", l436, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "FORTH.basic", l437, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "FORTH.persistence", l438, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "FORTH.from_other", l439, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "DEFINITIONS.basic~2", l440, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "DEFINITIONS.new_vocab", l441, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "DEFINITIONS.word_creation", l442, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "CONTEXT.basic", l443, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "CONTEXT.initial", l444, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "CURRENT.basic", l445, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "CURRENT.after_def", l446, 1u, V4_POST_DEPTH, 0, 0u, "", 0u }, + { "ABORT.basic", l447, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "ABORT.with_data", l448, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "ABORT.in_definition_runtime", l449, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { ":.basic", l450, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { ":.empty_name", l451, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ";.alone", l452, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { ";.immediate", l453, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "CONSTANT.basic", l454, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "CONSTANT.zero", l455, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "CONSTANT.negative", l456, 1u, V4_POST_STACK, 0, 0u, "-1 \012", 4u }, + { "CONSTANT.empty_stack", l457, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "VARIABLE.basic", l458, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "VARIABLE.multiple", l459, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "VARIABLE.store_fetch", l460, 1u, V4_POST_STACK, 0, 0u, "-99 \012", 5u }, + { "CREATE.basic~2", l461, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "CREATE.with_data", l462, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "CREATE.empty_name~2", l463, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "DOES>.basic", l464, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "DOES>.multiple", l465, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "DOES>.outside", l466, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "[.basic", l467, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "[.outside", l468, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "].nested", l469, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "IF.true", l470, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "IF.false", l471, 1u, V4_POST_STACK, 0, 0u, "24 \012", 4u }, + { "IF.nested", l472, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "IF.no_else", l473, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "IF.empty_stack", l474, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "ELSE.alone", l475, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "THEN.alone", l476, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "BEGIN.until", l477, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "BEGIN.while", l478, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "BEGIN.alone", l479, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "UNTIL.basic", l480, 1u, V4_POST_STACK, s480, 5u, "0 \012", 3u }, + { "UNTIL.immediate", l481, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "UNTIL.no_begin", l482, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "WHILE.basic", l483, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "WHILE.zero_times", l484, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "WHILE.no_begin", l485, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "REPEAT.basic", l486, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "REPEAT.no_while", l487, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "DO.basic", l488, 1u, V4_POST_STACK, 0, 0u, "0 1 2 3 4 \012", 11u }, + { "DO.negative", l489, 1u, V4_POST_STACK, 0, 0u, "-5 -4 -3 -2 \012", 13u }, + { "DO.empty", l490, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "DO.nested", l491, 1u, V4_POST_STACK, 0, 0u, "0 1 2 1 2 3 2 3 4 \012", 19u }, + { "LOOP.basic", l492, 1u, V4_POST_STACK, 0, 0u, "0 1 2 3 4 \012", 11u }, + { "LOOP.no_do", l493, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "+LOOP.basic", l494, 1u, V4_POST_STACK, 0, 0u, "0 2 4 6 8 \012", 11u }, + { "+LOOP.negative", l495, 1u, V4_POST_STACK, 0, 0u, "10 9 8 7 6 5 4 3 2 1 0 \012", 24u }, + { "+LOOP.variable", l496, 1u, V4_POST_STACK, s496, 1u, "0 3 6 9 \012", 9u }, + { "I.basic", l497, 1u, V4_POST_STACK, 0, 0u, "0 1 2 3 \012", 9u }, + { "I.single", l498, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "I.offset", l499, 1u, V4_POST_STACK, 0, 0u, "3 4 \012", 5u }, + { "I.in_expr", l500, 1u, V4_POST_STACK, 0, 0u, "0 2 4 \012", 7u }, + { "J.basic", l501, 1u, V4_POST_STACK, 0, 0u, "0 0 0 1 1 1 \012", 13u }, + { "J.paired", l502, 1u, V4_POST_STACK, 0, 0u, "0 1 1 2 \012", 9u }, + { "EXIT.early_return", l503, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "EXIT.cond_exit_pos", l504, 1u, V4_POST_STACK, 0, 0u, "3 \012", 3u }, + { "EXIT.cond_exit_neg", l505, 1u, V4_POST_STACK, 0, 0u, "4 \012", 3u }, + { "EXIT.no_skipped", l506, 1u, V4_POST_STACK, 0, 0u, "2 1 \012", 5u }, + { "LEAVE.basic", l507, 1u, V4_POST_STACK, 0, 0u, "4 \012", 3u }, + { "LEAVE.at_start", l508, 1u, V4_POST_STACK, 0, 0u, "1 \012", 3u }, + { "LEAVE.qdloop", l509, 1u, V4_POST_STACK, 0, 0u, "3 \012", 3u }, + { "U*.small", l510, 1u, V4_POST_STACK, 0, 0u, "0 12 \012", 6u }, + { "U*.zero", l511, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "U*.full", l512, 1u, V4_POST_STACK, 0, 0u, "0 -1 \012", 6u }, + { "U/MOD.small", l513, 1u, V4_POST_STACK, 0, 0u, "3 1 \012", 5u }, + { "U/MOD.exact", l514, 1u, V4_POST_STACK, 0, 0u, "3 0 \012", 5u }, + { "U/MOD.double", l515, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "U/MOD.inverse", l516, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "U/MOD.carry", l517, 1u, V4_POST_STACK, 0, 0u, "0 0 \012", 5u }, + { "U/MOD.by_zero", l518, 1u, V4_POST_ERROR, 0, 0u, "", 0u }, + { "\077.basic", l519, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "EXECUTE.found", l520, 1u, V4_POST_STACK, 0, 0u, "7 \012", 3u }, + { "U..small", l521, 1u, V4_POST_STACK, 0, 0u, "42 \012", 4u }, + { "U..unsigned", l522, 1u, V4_POST_STACK, 0, 0u, "18446744073709551615 \012", 22u }, + { "CONVERT.digits", l523, 1u, V4_POST_STACK, 0, 0u, "0 123 \012", 7u }, + { "'.found", l524, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { ".\042.in_definition", l525, 1u, V4_POST_STACK, 0, 0u, "hi there\012", 9u }, + { "LITERAL.basic", l526, 1u, V4_POST_STACK, 0, 0u, "5 \012", 3u }, + { "STATE.interpreting", l527, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "STATE.compiling", l528, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "COMPILE.basic", l529, 1u, V4_POST_STACK, 0, 0u, "3 3 \012", 5u }, + { "[COMPILE].basic", l530, 2u, V4_POST_STACK, 0, 0u, "2 1 \012", 5u }, + { "(.comment", l531, 1u, V4_POST_STACK, 0, 0u, "3 1 \012", 5u }, + { "BLK.terminal", l532, 1u, V4_POST_STACK, 0, 0u, "0 \012", 3u }, + { "79-STANDARD.present", l533, 1u, V4_POST_STACK, 0, 0u, "", 0u }, + { "WORD.next_word", l534, 1u, V4_POST_STACK, 0, 0u, "HELLO", 5u }, + { "WORD.delimiter", l535, 1u, V4_POST_STACK, 0, 0u, "A B", 3u }, + { "WORD.count", l536, 1u, V4_POST_STACK, 0, 0u, "3 ", 2u }, + { "WORD.skips_leading", l537, 1u, V4_POST_STACK, 0, 0u, "X", 1u }, +}; + +const unsigned v4_post_case_count = 538u; diff --git a/v4/tools/mkpost.py b/v4/tools/mkpost.py index cf077ec8..ffd200fb 100755 --- a/v4/tools/mkpost.py +++ b/v4/tools/mkpost.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""mkpost.py -- write capsules/v4/post79.4th from v3's POST cases. +"""mkpost.py -- write v4/system/post_cases.c from v3's POST cases. v4/tools/mkpost.py [--v3 PATH] [--report FILE] @@ -7,7 +7,6 @@ A development tool, run when the cases change; its output is committed and reviewed like any source. docs/v4.0.0/NUCLEUS.md section 6. What it does: - 1. Reads v3's case tables, v3/src/test_runner/modules/*.c, in the order v3's own POST runs them. A case is a word, a name, a line of FORTH and whether an error is expected. @@ -15,20 +14,16 @@ What it does: 3. Runs every kept case, in order, in one session of the hosted v3 binary, and records what v3 did: an error or not, the data stack, and what was printed. v3 is the reference. - 4. Writes the harness and one case after another as a .4th capsule: - - T{ DUP.basic name the case, start clean - T| 5 DUP . . a line of the case, its output captured - -> 5 5 }T 0 0 T= v3's stack; v3's output: length, checksum - - or, for a case v3 ended with an error, ->ERR in place of the last - line. + 4. Writes the cases as a table in C, which the kernel holds and feeds to + the node (v4/system/post.c): for each its name, its lines, and what it + must do -- end in an error, or leave v3's stack and print v3's output. A case is left out, and listed in the report, when: its word reads the keyboard; it forgets a word of the system or damages it on purpose; v3 could -not finish it in one -session; or one of its lines cannot be cut to fit a 64-character block -line. +not finish it in one session; or one of its lines cannot be cut to fit a +64-character line. (The cases were a capsule of 64-character block lines +until MESH.md step 6b; the cutting is kept so that they are the same cases +and the same lines.) """ import argparse import os @@ -41,8 +36,7 @@ import post79_rules as rules # noqa: E402 ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) MODULE_DIR = os.path.join(ROOT, "v3", "src", "test_runner", "modules") -OUTPUT = os.path.join(ROOT, "capsules", "v4", "post79.4th") -FIRST_BLOCK = 7000 +OUTPUT = os.path.join(ROOT, "v4", "system", "post_cases.c") LINE_MAX = 64 # v3's POST order (v3/src/test_runner/test_runner.c, test_modules[]), the @@ -79,77 +73,6 @@ CONTEXT CURRENT FORTH DEFINITIONS ' FIND FORGET # Words whose cases wait for the keyboard, which a boot cannot type at. KEYBOARD = {"KEY", "EXPECT", "QUERY"} -# ---- the harness: blocks FIRST_BLOCK up, FORTH-79 and the two nucleus hooks ---- -HARNESS = r""" -( post79.4th -- POST for the FORTH-79 Required Word Set on v4. ) -( Generated by v4/tools/mkpost.py from v3's POST cases: do not ) -( edit. docs/v4.0.0/NUCLEUS.md section 6. ) -VARIABLE T# VARIABLE TPASS VARIABLE TFAIL VARIABLE TOPEN -VARIABLE TBAD VARIABLE TWANT VARIABLE TLEN VARIABLE TSUM -VARIABLE TDEP -CREATE TBUF 64 ALLOT CREATE TSTK 16 ALLOT CREATE TNAME 8 ALLOT -0 T# ! 0 TPASS ! 0 TFAIL ! 0 TOPEN ! -: TB ( -- baddr ) TBUF 4 * ; -: TN ( -- baddr ) TNAME 4 * ; -( T-EMIT is given every character a case prints: the first 255 ) -( are kept, all are counted and summed. ) -: T-EMIT ( c -- ) - 255 AND DUP TSUM @ 31 * + 16777215 AND TSUM ! - TLEN @ 255 < IF TB TLEN @ + C! ELSE DROP THEN 1 TLEN +! ; -===== -: T-CLEAR ( i*x -- ) BEGIN DEPTH WHILE DROP REPEAT ; -: T. ( n -- ) 0 <# #S #> TYPE ; -( what a failing case printed, and the stack it left ) -: T-SHOW ( -- ) - ." out<" TB TLEN @ 255 MIN TYPE ." > stack<" - TDEP @ BEGIN DUP WHILE 1- DUP TSTK + @ . REPEAT DROP ." >" ; -( the verdict on the case that is open, if one is ) -: T-CLOSE ( -- ) - TOPEN @ IF - (CATCH) @ -1 = TWANT @ = 0= IF 1 TBAD ! THEN - TBAD @ IF 1 TFAIL +! - ." POST FAIL: " TN COUNT TYPE T-SHOW CR - ELSE 1 TPASS +! THEN - 0 TOPEN ! 0 (CATCH) ! - THEN ; -===== -( T{ name begin a case: clean stack, decimal, FORTH ) -: T{ ( i*x -- ) T-CLOSE T-CLEAR - DECIMAL [COMPILE] FORTH DEFINITIONS - BL WORD COUNT 31 MIN DUP TN C! TN 1+ SWAP CMOVE - 1 T# +! 1 TOPEN ! 0 TBAD ! 0 TWANT ! 0 TLEN ! 0 TSUM ! - 0 TDEP ! 1 (CATCH) ! ; -( T| ... a line of the case, what it prints captured ) -: T| ' T-EMIT (EMIT-HOOK) ! ; IMMEDIATE -: T-END ( -- ) 0 (EMIT-HOOK) ! DECIMAL ; -( -> ... the case is over: set its stack aside, top first ) -: -> ( i*x -- ) T-END 0 - BEGIN DEPTH 1 > WHILE - DUP 16 < IF SWAP OVER TSTK + ! ELSE SWAP DROP 1 TBAD ! THEN - 1+ REPEAT - 16 MIN TDEP ! ; -===== -( ->ERR the case is over, and must have ended in an error ) -: ->ERR ( i*x -- ) T-END -1 TWANT ! T-CLEAR ; -( ... }T the stack the case must have left, in order ) -: }T ( i*x -- ) - DEPTH TDEP @ = 0= IF 1 TBAD ! T-CLEAR EXIT THEN - 0 BEGIN DEPTH 1 > WHILE - SWAP OVER TSTK + @ = 0= IF 1 TBAD ! THEN 1+ REPEAT DROP ; -( n }TD only how many values the case must have left ) -: }TD ( n -- ) TDEP @ = 0= IF 1 TBAD ! THEN ; -( len sum T= what the case must have printed ) -: T= ( len sum -- ) TSUM @ = 0= IF 1 TBAD ! THEN - TLEN @ = 0= IF 1 TBAD ! THEN ; -===== -( the tally; a failure is an error, which ends the boot ) -: T-REPORT ( -- ) T-CLOSE 0 (CATCH) ! DECIMAL - ." PARITY:V4_POST tests=" T# @ T. ." pass=" TPASS @ T. - ." fail=" TFAIL @ T. CR - TFAIL @ IF -1 NODE-ERROR ! THEN ; -""" - - # ---- reading v3's case tables ---------------------------------------------- TOKEN = re.compile(r''' @@ -407,34 +330,24 @@ def main(): left_out.append((cases[first]["label"], "v3 did not get through it in one session")) del cases[first] - blocks, current = [], [] - - def flush(): - if current: - blocks.append(list(current)) - del current[:] - - for part in HARNESS.strip("\n").split("=====\n"): - current.extend(part.strip("\n").split("\n")) - flush() + table = [] disagreements, applied = [], {"address": 0, "standard": 0, "extra": 0} def expectation(error, stack, output, mode="full"): - """The lines that end a case.""" + """What a case must do.""" if error: - return ["->ERR"] + return {"expect": "V4_POST_ERROR", "stack": [], "depth": 0, "out": ""} if mode == "depth": - return ["-> %d }TD" % len(stack)] + return {"expect": "V4_POST_DEPTH", "stack": [], "depth": len(stack), "out": ""} if mode == "depth+output": - return pack("", ["->", str(len(stack)), "}TD", str(len(output)), str(checksum(output)), "T="]) - return pack("", ["->"] + [str(v) for v in stack] + ["}T", str(len(output)), str(checksum(output)), "T="]) + return {"expect": "V4_POST_DEPTH_OUTPUT", "stack": [], "depth": len(stack), "out": output} + return {"expect": "V4_POST_STACK", "stack": list(stack), "depth": len(stack), "out": output} def emit(label, lines, ending): - block = ["T{ " + label] + lines + ending - if len(current) + len(block) > 16: - flush() - current.extend(block) + # the lines were cut for a block, each begun "T| ": the same lines, without it + assert all(line.startswith("T| ") for line in lines), lines + table.append((label, [line[3:] for line in lines], ending)) dump = [] for case, (error, stack, output) in zip(cases, results): @@ -454,7 +367,7 @@ def main(): lines = pack("T|", atoms(rule.get("text", case["text"]))) assert lines, label if "depth" in rule: - emit(label, lines, ["-> %d }TD" % rule["depth"]]) + emit(label, lines, {"expect": "V4_POST_DEPTH", "stack": [], "depth": rule["depth"], "out": ""}) else: emit(label, lines, expectation(rule.get("error", False), rule.get("stack", []), rule.get("out", ""))) applied["standard"] += 1 @@ -472,22 +385,14 @@ def main(): assert not unknown, "rules for cases that do not exist: %s" % unknown if args.dump: open(args.dump, "w").write("\n".join(dump)) - flush() - blocks.append(["T-REPORT", "FORGET T# DECIMAL"]) - - with open(OUTPUT, "w", encoding="ascii") as out: - for k, block in enumerate(blocks): - assert len(block) <= 16, block - out.write("Block %d\n" % (FIRST_BLOCK + k)) - for line in block: - assert len(line) <= LINE_MAX, line - out.write(line + "\n") + write_table(table) tested = sorted({c["word"] for c in cases} | {r["label"].rsplit(".", 1)[0] for r in rules.EXTRA}) untested = [w for w in REQUIRED if w not in set(tested)] dropped = sum(1 for v in rules.STANDARD.values() if v is None) total = len(cases) - dropped + len(rules.EXTRA) - report = ["POST cases: %d, in %d blocks (%d to %d)" % (total, len(blocks), FIRST_BLOCK, FIRST_BLOCK + len(blocks) - 1), + assert total == len(table), (total, len(table)) + report = ["POST cases: %d, in %s" % (total, os.path.relpath(OUTPUT, ROOT)), " from v3 unchanged: %d" % (len(cases) - applied["address"] - applied["standard"]), " from v3, address-dependent (post79_rules.ADDRESS): %d" % applied["address"], " rewritten or dropped for FORTH-79 (post79_rules.STANDARD): %d, of which dropped %d" % (applied["standard"], dropped), @@ -505,6 +410,36 @@ def main(): sys.stdout.write(text) +def c_string(text): + """`text` as a C string literal: everything that is not plain is octal.""" + out = [] + for ch in text.encode("latin-1", errors="replace"): + if 32 <= ch < 127 and ch not in (34, 92, 63): # not " \ or ? (no trigraphs) + out.append(chr(ch)) + else: + out.append("\\%03o" % ch) + return '"' + "".join(out) + '"' + + +def write_table(table): + with open(OUTPUT, "w", encoding="ascii") as out: + out.write("/* post_cases.c -- POST's cases for the FORTH-79 Required Word Set on v4.\n" + " * Generated by v4/tools/mkpost.py from v3's POST cases: do not edit.\n" + " * docs/v4.0.0/NUCLEUS.md section 6; docs/v4.0.0/POST79.md lists every case\n" + " * that is not v3's own with v3's result.\n */\n" + '#include "v4/post.h"\n\n') + for k, (label, lines, want) in enumerate(table): + out.write("static const char *const l%d[] = { %s };\n" % (k, ", ".join(c_string(line) for line in lines))) + if want["stack"]: + out.write("static const long long s%d[] = { %s };\n" % (k, ", ".join("%dLL" % v if v != -9223372036854775808 else "(-9223372036854775807LL - 1)" for v in want["stack"]))) + out.write("\nconst v4_post_case v4_post_cases[] = {\n") + for k, (label, lines, want) in enumerate(table): + out.write(" { %s, l%d, %du, %s, %s, %du, %s, %du },\n" + % (c_string(label), k, len(lines), want["expect"], ("s%d" % k) if want["stack"] else "0", want["depth"], + c_string(want["out"]), len(want["out"].encode("latin-1", errors="replace")))) + out.write("};\n\nconst unsigned v4_post_case_count = %du;\n" % len(table)) + + DOC = os.path.join(ROOT, "docs", "v4.0.0", "POST79.md") @@ -525,7 +460,7 @@ def write_doc(cases, results, left_out, disagreements, untested, total, applied, by_label = {c["label"]: (c, r) for c, r in zip(cases, results)} out = ["# POST for the FORTH-79 Required Word Set: where it departs from v3", "", "Written by `v4/tools/mkpost.py` from `v4/tools/post79_rules.py`; do not edit.", - "Design: `NUCLEUS.md` section 6. The capsule is `capsules/v4/post79.4th`.", "", + "Design: `NUCLEUS.md` section 6. The cases are `v4/system/post_cases.c`.", "", "POST runs %d cases. %d are v3's, with what the hosted v3 binary did as the" % (total, len(cases) - applied["address"] - applied["standard"]), "expected result. This file lists every other case, and why.", "", "## 1. Rewritten for FORTH-79 (%d)" % (applied["standard"] - dropped), "", @@ -559,8 +494,7 @@ def write_doc(cases, results, left_out, disagreements, untested, total, applied, out += ["", "## 5. Required words POST does not test", "", " ".join("`%s`" % w for w in untested) + ".", "", "`KEY`, `EXPECT` and `QUERY` wait for the keyboard, which a boot cannot type", - "at. `QUIT` returns to the terminal without `ok`, which the capsule loader", - "takes for a refused line.", "", + "at. `QUIT` returns to the terminal without `ok`.", "", "## 6. Where v3 did not do what its own table expects (%d)" % len(disagreements), "", "POST expects what v3 did, unless section 1 says otherwise.", "", "| Case | |", "|---|---|"] out += ["| `%s` | %s |" % item for item in disagreements]