
REQUIRE [DEFINED] lib/include/tools.f

\ Распечатать список словарей.
: VOCS
        VOC-LIST
        BEGIN @ DUP WHILE
                DUP CELL+ VOC-NAME.
                DUP 3 CELLS + @ \ wid предка
                ?DUP IF ."  defined in "  VOC-NAME.
                     ELSE ."  is the main vocabulary"
                     THEN CR
        REPEAT
        DROP
;

0x200 VALUE MAX-WORD-SIZE

C" NEAR_NFA" FIND NIP 0=
[IF] : NEAR_NFA ( addr -- NFA addr | 0 addr ) DUP  WordByAddr DROP 1- SWAP
        2DUP 1000 - U< IF NIP 0 SWAP THEN ;
[THEN]

\ Opposite to CDR, might be slow!
 \ It does not take wordlists into account.
: NextNFA ( nfa1 -- nfa2 | 0 )
    NEAR_NFA SWAP >R
    BEGIN
      1+ NEAR_NFA ( nfa addr )
      OVER 0 >
      ROT R@ <> AND
      OVER R@ - MAX-WORD-SIZE > OR
    UNTIL

    DUP R> - MAX-WORD-SIZE >
    IF DROP 0
    ELSE  NEAR_NFA DROP
    THEN
;

: NFAInVoc? ( nfa voc -- f )
    @ \ last nfa
    BEGIN  ( nfa 'nfa )
      DUP
    WHILE
      2DUP = IF 2DROP TRUE EXIT THEN
      CDR
    REPEAT 2DROP 0
;

: VocByNFA ( nfa -- wid | 0 )
    VOC-LIST
    BEGIN @ DUP WHILE ( nfa voc )
           2DUP CELL+ NFAInVoc?
           IF
              NIP CELL+ EXIT
           THEN
    REPEAT
    2DROP 0
;
