DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦dec89b2f6⟧ Ada Source

    Length: 26624 (0x6800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package Misc_Defs, seg_030aa5

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io, Tstring;
use Text_Io, Tstring;

package Misc_Defs is

    -- various definitions that were in parse.y
    Pat, Scnum, Eps, Headcnt, Trailcnt, Anyccl, Lastchar, Actvp, Rulelen :
       Integer;
    Trlcontxt, Xcluflg, Cclsorted, Varlength, Variable_Trail_Rule : Boolean;

    Madeany : Boolean := False;  -- whether we've made the '.' character class
    Previous_Continued_Action :
       Boolean; -- whether the previous rule's action wa
                -- s '|'

    -- maximum line length we'll have to deal with
    Maxline : constant Integer := 1024;

    -- These typees are needed for the various allocators.
    type Unbounded_Int_Array is array (Integer range <>) of Integer;
    type Int_Ptr is access Unbounded_Int_Array;
    type Int_Star is access Integer;
    type Unbounded_Int_Star_Array is array (Integer range <>) of Int_Ptr;
    type Int_Star_Ptr is access Unbounded_Int_Star_Array;
    type Unbounded_Vstring_Array is array (Integer range <>) of Vstring;
    type Vstring_Ptr is access Unbounded_Vstring_Array;
    type Boolean_Array is array (Integer range <>) of Boolean;
    type Boolean_Ptr is access Boolean_Array;
    type Char_Array is array (Integer range <>) of Character;
    type Char_Ptr is access Char_Array;

    -- different types of states; values are useful as masks, as well, for
    -- routines like check_trailing_context()

    type State_Enum is (State_Normal, State_Trailing_Context);

    type Unbounded_State_Enum_Array is array (Integer range <>) of State_Enum;
    type State_Enum_Ptr is access Unbounded_State_Enum_Array;

    -- different types of rules
    type Rule_Enum is (Rule_Normal, Rule_Variable);

    type Unbounded_Rule_Enum_Array is array (Integer range <>) of Rule_Enum;
    type Rule_Enum_Ptr is access Unbounded_Rule_Enum_Array;

    type Dfaacc_Type is
        record
            Dfaacc_Set : Int_Ptr;
            Dfaacc_State : Integer;
        end record;

    type Unbounded_Dfaacc_Array is array (Integer range <>) of Dfaacc_Type;
    type Dfaacc_Ptr is access Unbounded_Dfaacc_Array;

    -- maximum size of file name

    Filenamesize : constant Integer := 1024;

    function Min (X, Y : in Integer) return Integer;
    function Max (X, Y : in Integer) return Integer;

    -- special chk[] values marking the slots taking by end-of-buffer and action
    -- numbers

    Eob_Position : constant Integer := -1;
    Action_Position : constant Integer := -2;

    -- number of data items per line for -f output
    Numdataitems : constant Integer := 10;

    -- number of lines of data in -f output before inserting a blank line for
    -- readability.

    Numdatalines : constant Integer := 10;

    -- transition_struct_out() definitions
    Trans_Struct_Print_Length : constant Integer := 15;

    -- returns true if an nfa state has an epsilon out-transition slot
    -- that can be used.  This definition is currently not used.

    function Free_Epsilon (State : in Integer) return Boolean;

    -- returns true if an nfa state has an epsilon out-transition character
    -- and both slots are free

    function Super_Free_Epsilon (State : in Integer) return Boolean;

    -- maximum number of NFA states that can comprise a DFA state.  It's real
    -- big because if there's a lot of rules, the initial state will have a
    -- huge epsilon closure.

    Initial_Max_Dfa_Size : constant Integer := 750;
    Max_Dfa_Size_Increment : constant Integer := 750;

    -- a note on the following masks.  They are used to mark accepting numbers
    -- as being special.  As such, they implicitly limit the number of accepting
    -- numbers (i.e., rules) because if there are too many rules the rule numbers
    -- will overload the mask bits.  Fortunately, this limit is \large/ (0x2000 ==
    -- 8192) so unlikely to actually cause any problems.  A check is made in
    -- new_rule() to ensure that this limit is not reached.

    -- mask to mark a trailing context accepting number
    -- #define YY_TRAILING_MASK 0x2000
    Yy_Trailing_Mask : constant Integer := 16#2000#;


    -- mask to mark the accepting number of the "head" of a trailing context rule
    -- #define YY_TRAILING_HEAD_MASK 0x4000
    Yy_Trailing_Head_Mask : constant Integer := 16#4000#;

    -- maximum number of rules, as outlined in the above note
    Max_Rule : constant Integer := Yy_Trailing_Mask - 1;


    -- NIL must be 0.  If not, its special meaning when making equivalence classes
    -- (it marks the representative of a given e.c.) will be unidentifiable

    Nil : constant Integer := 0;

    Jam : constant Integer := -1; -- to mark a missing DFA transition
    No_Transition : constant Integer := Nil;
    Unique : constant Integer := -1; -- marks a symbol as an e.c. representative
    Infinity : constant Integer := -1; -- for x{5,} constructions

    -- size of input alphabet - should be size of ASCII set
    Csize : constant Integer := 127;

    Initial_Max_Ccls : constant Integer :=
       100; -- max number of unique character
            --  classes
    Max_Ccls_Increment : constant Integer := 100;

    -- size of table holding members of character classes
    Initial_Max_Ccl_Tbl_Size : constant Integer := 500;
    Max_Ccl_Tbl_Size_Increment : constant Integer := 250;
    Initial_Max_Rules : constant Integer := 100;
    -- default maximum number of rules
    Max_Rules_Increment : constant Integer := 100;

    Initial_Mns : constant Integer :=
       2000; -- default maximum number of nfa stat
             -- es
    Mns_Increment : constant Integer := 1000; -- amount to bump above by if it's
                                              -- not enough

    Initial_Max_Dfas : constant Integer :=
       1000; -- default maximum number of dfa
             --  states
    Max_Dfas_Increment : constant Integer := 1000;

    Jamstate_Const : constant Integer := -32766; -- marks a reference to the sta
                                                 -- te that always jams

    -- enough so that if it's subtracted from an NFA state number, the result
    -- is guaranteed to be negative

    Marker_Difference : constant Integer := 32000;
    Maximum_Mns : constant Integer := 31999;

    -- maximum number of nxt/chk pairs for non-templates
    Initial_Max_Xpairs : constant Integer := 2000;
    Max_Xpairs_Increment : constant Integer := 2000;

    -- maximum number of nxt/chk pairs needed for templates
    Initial_Max_Template_Xpairs : constant Integer := 2500;
    Max_Template_Xpairs_Increment : constant Integer := 2500;

    Sym_Epsilon : constant Integer :=
       0; -- to mark transitions on the symbol eps
          -- ilon

    Initial_Max_Scs : constant Integer :=
       40; -- maximum number of start conditio
           -- ns
    Max_Scs_Increment : constant Integer := 40; -- amount to bump by if it's not
                                                -- enough

    One_Stack_Size : constant Integer :=
       500; -- stack of states with only one ou
            -- t-transition
    Same_Trans : constant Integer := -1; -- transition is the same as "default"
                                         -- entry for state

    -- the following percentages are used to tune table compression:
    --
    -- the percentage the number of out-transitions a state must be of the
    -- number of equivalence classes in order to be considered for table
    -- compaction by using protos

    Proto_Size_Percentage : constant Integer := 15;

    -- the percentage the number of homogeneous out-transitions of a state
    -- must be of the number of total out-transitions of the state in order
    -- that the state's transition table is first compared with a potential
    -- template of the most common out-transition instead of with the first
    --proto in the proto queue

    Check_Com_Percentage : constant Integer := 50;

    -- the percentage the number of differences between a state's transition
    -- table and the proto it was first compared with must be of the total
    -- number of out-transitions of the state in order to keep the first
    -- proto as a good match and not search any further

    First_Match_Diff_Percentage : constant Integer := 10;

    -- the percentage the number of differences between a state's transition
    -- table and the most similar proto must be of the state's total number
    -- of out-transitions to use the proto as an acceptable close match

    Acceptable_Diff_Percentage : constant Integer := 50;

    -- the percentage the number of homogeneous out-transitions of a state
    -- must be of the number of total out-transitions of the state in order
    -- to consider making a template from the state

    Template_Same_Percentage : constant Integer := 60;

    -- the percentage the number of differences between a state's transition
    -- table and the most similar proto must be of the state's total number
    -- of out-transitions to create a new proto from the state

    New_Proto_Diff_Percentage : constant Integer := 20;

    -- the percentage the total number of out-transitions of a state must be
    -- of the number of equivalence classes in order to consider trying to
    -- fit the transition table into "holes" inside the nxt/chk table.

    Interior_Fit_Percentage : constant Integer := 15;

    -- size of region set aside to cache the complete transition table of
    -- protos on the proto queue to enable quick comparisons

    Prot_Save_Size : constant Integer := 2000;

    Msp : constant Integer :=
       50; -- maximum number of saved protos (protos on th
           -- e proto queue)

    -- maximum number of out-transitions a state can have that we'll rummage
    -- around through the interior of the internal fast table looking for a
    -- spot for it

    Max_Xtions_Full_Interior_Fit : constant Integer := 4;

    -- maximum number of rules which will be reported as being associated
    -- with a DFA state

    Max_Assoc_Rules : constant Integer := 100;

    -- number that, if used to subscript an array, has a good chance of producing
    -- an error; should be small enough to fit into a short

    Bad_Subscript : constant Integer := -32767;

    -- Declarations for global variables.

    -- variables for symbol tables:
    -- sctbl - start-condition symbol table
    -- ndtbl - name-definition symbol table
    -- ccltab - character class text symbol table

    type Hash_Entry;
    type Hash_Link is access Hash_Entry;
    type Hash_Entry is
        record
            Prev, Next : Hash_Link;
            Name, Str_Val : Vstring;
            Int_Val : Integer;
        end record;

    type Hash_Table is array (Integer range <>) of Hash_Link;

    Name_Table_Hash_Size : constant Integer := 101;
    Start_Cond_Hash_Size : constant Integer := 101;
    Ccl_Hash_Size : constant Integer := 101;

    subtype Ndtbl_Type is Hash_Table (0 .. Name_Table_Hash_Size - 1);
    Ndtbl : Ndtbl_Type;
    subtype Sctbl_Type is Hash_Table (0 .. Start_Cond_Hash_Size - 1);
    Sctbl : Sctbl_Type;
    subtype Ccltab_Type is Hash_Table (0 .. Ccl_Hash_Size);
    Ccltab : Ccltab_Type;

    -- variables for flags:
    -- printstats - if true (-v), dump statistics
    -- syntaxerror - true if a syntax error has been found
    -- eofseen - true if we've seen an eof in the input file
    -- ddebug - if true (-d), make a "debug" scanner
    -- trace - if true (-T), trace processing
    -- spprdflt - if true (-s), suppress the default rule
    -- interactive - if true (-I), generate an interactive scanner
    -- caseins - if true (-i), generate a case-insensitive scanner
    -- useecs - if true (-ce flag), use equivalence classes
    -- fulltbl - if true (-cf flag), don't compress the DFA state table
    -- usemecs - if true (-cm flag), use meta-equivalence classes
    -- gen_line_dirs - if true (i.e., no -L flag), generate #line directives
    -- performance_report - if true (i.e., -p flag), generate a report relating
    --   to scanner performance
    -- backtrack_report - if true (i.e., -b flag), generate "lex.backtrack" file
    --   listing backtracking states
    -- continued_action - true if this rule's action is to "fall through" to
    --                    the next rule's action (i.e., the '|' action)

    Printstats, Ddebug, Spprdflt, Interactive, Caseins, Useecs,
    Fulltbl, Usemecs, Gen_Line_Dirs, Performance_Report,
    Backtrack_Report, Trace, Eofseen, Continued_Action : Boolean;

    Syntaxerror : Boolean;

    -- variables used in the aflex input routines:
    -- datapos - characters on current output line
    -- dataline - number of contiguous lines of data in current data
    --    statement.  Used to generate readable -f output
    -- skelfile - the skeleton file
    -- yyin - input file
    -- temp_action_file - temporary file to hold actions
    -- backtrack_file - file to summarize backtracking states to
    -- infilename - name of input file
    -- linenum - current input line number

    Datapos, Dataline, Linenum : Integer;

    Skelfile, Yyin, Temp_Action_File, Backtrack_File, Def_File : File_Type;
    Infilename : Vstring;

    -- variables for stack of states having only one out-transition:
    -- onestate - state number
    -- onesym - transition symbol
    -- onenext - target state
    -- onedef - default base entry
    -- onesp - stack pointer

    Onestate, Onesym, Onenext, Onedef :
       array (0 .. One_Stack_Size - 1) of Integer;
    Onesp : Integer;


    -- variables for nfa machine data:
    -- current_mns - current maximum on number of NFA states
    -- num_rules - number of the last accepting state; also is number of
    --             rules created so far
    -- current_max_rules - current maximum number of rules
    -- lastnfa - last nfa state number created
    -- firstst - physically the first state of a fragment
    -- lastst - last physical state of fragment
    -- finalst - last logical state of fragment
    -- transchar - transition character
    -- trans1 - transition state
    -- trans2 - 2nd transition state for epsilons
    -- accptnum - accepting number
    -- assoc_rule - rule associated with this NFA state (or 0 if none)
    -- state_type - a STATE_xxx type identifying whether the state is part
    --              of a normal rule, the leading state in a trailing context
    --              rule (i.e., the state which marks the transition from
    --              recognizing the text-to-be-matched to the beginning of
    --              the trailing context), or a subsequent state in a trailing
    --              context rule
    -- rule_type - a RULE_xxx type identifying whether this a a ho-hum
    --             normal rule or one which has variable head & trailing
    --             context
    -- rule_linenum - line number associated with rule

    Current_Mns, Num_Rules, Current_Max_Rules, Lastnfa : Integer;
    Firstst, Lastst, Finalst, Transchar, Trans1, Trans2 : Int_Ptr;
    Accptnum, Assoc_Rule, Rule_Linenum : Int_Ptr;
    Rule_Type : Rule_Enum_Ptr;
    State_Type : State_Enum_Ptr;

    -- global holding current type of state we're making

    Current_State_Enum : State_Enum;

    -- true if the input rules include a rule with both variable-length head
    -- and trailing context, false otherwise

    Variable_Trailing_Context_Rules : Boolean;


    -- variables for protos:
    -- numtemps - number of templates created
    -- numprots - number of protos created
    -- protprev - backlink to a more-recently used proto
    -- protnext - forward link to a less-recently used proto
    -- prottbl - base/def table entry for proto
    -- protcomst - common state of proto
    -- firstprot - number of the most recently used proto
    -- lastprot - number of the least recently used proto
    -- protsave contains the entire state array for protos

    Numtemps, Numprots, Firstprot, Lastprot : Integer;
    Protprev, Protnext, Prottbl, Protcomst : array (0 .. Msp - 1) of Integer;
    Protsave : array (0 .. Prot_Save_Size - 1) of Integer;


    -- variables for managing equivalence classes:
    -- numecs - number of equivalence classes
    -- nextecm - forward link of Equivalence Class members
    -- ecgroup - class number or backward link of EC members
    -- nummecs - number of meta-equivalence classes (used to compress
    --   templates)
    -- tecfwd - forward link of meta-equivalence classes members
    -- * tecbck - backward link of MEC's

    Numecs, Nummecs : Integer;
    subtype C_Size_Array is Unbounded_Int_Array (0 .. Csize);
    type C_Size_Bool_Array is array (0 .. Csize) of Boolean;
    Nextecm, Ecgroup, Tecfwd, Tecbck : C_Size_Array;


    -- variables for start conditions:
    -- lastsc - last start condition created
    -- current_max_scs - current limit on number of start conditions
    -- scset - set of rules active in start condition
    -- scbol - set of rules active only at the beginning of line in a s.c.
    -- scxclu - true if start condition is exclusive
    -- sceof - true if start condition has EOF rule
    -- scname - start condition name
    -- actvsc - stack of active start conditions for the current rule

    Lastsc, Current_Max_Scs : Integer;
    Scset, Scbol : Int_Ptr;
    Scxclu, Sceof : Boolean_Ptr;
    Actvsc : Int_Ptr;
    Scname : Vstring_Ptr;


    -- variables for dfa machine data:
    -- current_max_dfa_size - current maximum number of NFA states in DFA
    -- current_max_xpairs - current maximum number of non-template xtion pairs
    -- current_max_template_xpairs - current maximum number of template pairs
    -- current_max_dfas - current maximum number DFA states
    -- lastdfa - last dfa state number created
    -- nxt - state to enter upon reading character
    -- chk - check value to see if "nxt" applies
    -- tnxt - internal nxt table for templates
    -- base - offset into "nxt" for given state
    -- def - where to go if "chk" disallows "nxt" entry
    -- tblend - last "nxt/chk" table entry being used
    -- firstfree - first empty entry in "nxt/chk" table
    -- dss - nfa state set for each dfa
    -- dfasiz - size of nfa state set for each dfa
    -- dfaacc - accepting set for each dfa state (or accepting number, if
    --    -r is not given)
    -- accsiz - size of accepting set for each dfa state
    -- dhash - dfa state hash value
    -- numas - number of DFA accepting states created; note that this
    --    is not necessarily the same value as num_rules, which is the analogous   --    value for the NFA
    -- numsnpairs - number of state/nextstate transition pairs
    -- jambase - position in base/def where the default jam table starts
    -- jamstate - state number corresponding to "jam" state
    -- end_of_buffer_state - end-of-buffer dfa state number

    Current_Max_Dfa_Size, Current_Max_Xpairs : Integer;
    Current_Max_Template_Xpairs, Current_Max_Dfas : Integer;
    Lastdfa, Lasttemp : Integer;
    Nxt, Chk, Tnxt : Int_Ptr;
    Base, Def, Dfasiz : Int_Ptr;
    Tblend, Firstfree : Integer;
    Dss : Int_Star_Ptr;
    Dfaacc : Dfaacc_Ptr;

    -- type declaration for dfaacc_type moved above

    Accsiz, Dhash : Int_Ptr;
    End_Of_Buffer_State, Numsnpairs, Jambase, Jamstate, Numas : Integer;

    -- variables for ccl information:
    -- lastccl - ccl index of the last created ccl
    -- current_maxccls - current limit on the maximum number of unique ccl's
    -- cclmap - maps a ccl index to its set pointer
    -- ccllen - gives the length of a ccl
    -- cclng - true for a given ccl if the ccl is negated
    -- cclreuse - counts how many times a ccl is re-used
    -- current_max_ccl_tbl_size - current limit on number of characters needed
    --\x09to represent the unique ccl's
    -- ccltbl - holds the characters in each ccl - indexed by cclmap

    Current_Max_Ccl_Tbl_Size, Lastccl, Current_Maxccls, Cclreuse : Integer;
    Cclmap, Ccllen, Cclng : Int_Ptr;

    Ccltbl : Char_Ptr;


    -- variables for miscellaneous information:
    -- starttime - real-time when we started
    -- endtime - real-time when we ended
    -- nmstr - last NAME scanned by the scanner
    -- sectnum - section number currently being parsed
    -- nummt - number of empty nxt/chk table entries
    -- hshcol - number of hash collisions detected by snstods
    -- dfaeql - number of times a newly created dfa was equal to an old one
    -- numeps - number of epsilon NFA states created
    -- eps2 - number of epsilon states which have 2 out-transitions
    -- num_reallocs - number of times it was necessary to realloc() a group
    --\x09\x09  of arrays
    -- tmpuses - number of DFA states that chain to templates
    -- totnst - total number of NFA states used to make DFA states
    -- peakpairs - peak number of transition pairs we had to store internally
    -- numuniq - number of unique transitions
    -- numdup - number of duplicate transitions
    -- hshsave - number of hash collisions saved by checking number of states
    -- num_backtracking - number of DFA states requiring back-tracking
    -- bol_needed - whether scanner needs beginning-of-line recognition

    Nmstr : Vstring;
    Sectnum, Nummt, Hshcol, Dfaeql, Numeps, Eps2, Num_Reallocs : Integer;
    Tmpuses, Totnst, Peakpairs, Numuniq, Numdup, Hshsave : Integer;
    Num_Backtracking : Integer;
    Bol_Needed : Boolean;

    function Allocate_Integer_Array (Size : in Integer) return Int_Ptr;

    function Allocate_Int_Ptr_Array (Size : in Integer) return Int_Star_Ptr;



    function Allocate_Vstring_Array (Size : in Integer) return Vstring_Ptr;

    function Allocate_Dfaacc_Union (Size : in Integer) return Dfaacc_Ptr;

    function Allocate_Character_Array (Size : in Integer) return Char_Ptr;

    function Allocate_Rule_Enum_Array (Size : in Integer) return Rule_Enum_Ptr;

    function Allocate_State_Enum_Array
                (Size : in Integer) return State_Enum_Ptr;

    function Allocate_Boolean_Array (Size : in Integer) return Boolean_Ptr;

    procedure Reallocate_Integer_Array
                 (Arr : in out Int_Ptr; Size : in Integer);

    procedure Reallocate_Int_Ptr_Array
                 (Arr : in out Int_Star_Ptr; Size : in Integer);

    procedure Reallocate_Vstring_Array
                 (Arr : in out Vstring_Ptr; Size : in Integer);

    procedure Reallocate_Dfaacc_Union
                 (Arr : in out Dfaacc_Ptr; Size : in Integer);

    procedure Reallocate_Character_Array
                 (Arr : in out Char_Ptr; Size : in Integer);

    procedure Reallocate_Rule_Enum_Array
                 (Arr : in out Rule_Enum_Ptr; Size : in Integer);

    procedure Reallocate_State_Enum_Array
                 (Arr : in out State_Enum_Ptr; Size : in Integer);

    procedure Reallocate_Boolean_Array
                 (Arr : in out Boolean_Ptr; Size : in Integer);

end Misc_Defs;
-- Copyright (c) 1990 Regents of the University of California.
-- All rights reserved.
--
-- This software was developed by John Self of the Arcadia project
-- at the University of California, Irvine.
--
-- Redistribution and use in source and binary forms are permitted
-- provided that the above copyright notice and this paragraph are
-- duplicated in all such forms and that any documentation,
-- advertising materials, and other materials related to such
-- distribution and use acknowledge that the software was developed
-- by the University of California, Irvine.  The name of the
-- University may not be used to endorse or promote products derived
-- from this software without specific prior written permission.
-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
-- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

-- TITLE NFA construction routines
-- AUTHOR: John Self (UCI)
-- DESCRIPTION builds the NFA.
-- NOTES this file mirrors flex as closely as possible.
-- $Header: /co/ua/self/arcadia/aflex/ada/src/RCS/nfaB.a,v 1.6 90/01/12 15:20:27 self Exp Locker: self $

E3 Meta Data

    nblk1=19
    nid=0
    hdr6=32
        [0x00] rec0=1a rec1=00 rec2=01 rec3=064
        [0x01] rec0=19 rec1=00 rec2=02 rec3=020
        [0x02] rec0=1e rec1=00 rec2=03 rec3=04c
        [0x03] rec0=15 rec1=00 rec2=04 rec3=018
        [0x04] rec0=19 rec1=00 rec2=05 rec3=00a
        [0x05] rec0=18 rec1=00 rec2=06 rec3=04a
        [0x06] rec0=1a rec1=00 rec2=07 rec3=032
        [0x07] rec0=14 rec1=00 rec2=08 rec3=082
        [0x08] rec0=16 rec1=00 rec2=09 rec3=062
        [0x09] rec0=18 rec1=00 rec2=0a rec3=03a
        [0x0a] rec0=1f rec1=00 rec2=0b rec3=05e
        [0x0b] rec0=16 rec1=00 rec2=0c rec3=056
        [0x0c] rec0=13 rec1=00 rec2=0d rec3=062
        [0x0d] rec0=1c rec1=00 rec2=0e rec3=038
        [0x0e] rec0=11 rec1=00 rec2=0f rec3=038
        [0x0f] rec0=1a rec1=00 rec2=10 rec3=054
        [0x10] rec0=16 rec1=00 rec2=11 rec3=064
        [0x11] rec0=19 rec1=00 rec2=12 rec3=004
        [0x12] rec0=12 rec1=00 rec2=13 rec3=002
        [0x13] rec0=18 rec1=00 rec2=14 rec3=01e
        [0x14] rec0=16 rec1=00 rec2=15 rec3=032
        [0x15] rec0=14 rec1=00 rec2=16 rec3=028
        [0x16] rec0=1d rec1=00 rec2=17 rec3=006
        [0x17] rec0=18 rec1=00 rec2=18 rec3=008
        [0x18] rec0=0d rec1=00 rec2=19 rec3=000
    tail 0x2172a401e84a64e918732 0x42a00088462060003