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

⟦8220b37a4⟧ Ada Source

    Length: 30720 (0x7800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package Xlbp_Rm_Name, seg_004f82

Derivation

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

E3 Source Code



with Xlbt_Arithmetic;  
use Xlbt_Arithmetic;  
with Xlbt_Rm;  
use Xlbt_Rm;  
with Xlbt_String;  
use Xlbt_String;

with Xlbp_Rm_Quark;  
use Xlbp_Rm_Quark;

pragma Elaborate (Xlbp_Rm_Quark);

package Xlbp_Rm_Name is
------------------------------------------------------------------------------
-- X Library Resource Manager - Classes, Names, Representations
--
-- Xlbp_Rm_Name - Manager of application/window/object resource names
------------------------------------------------------------------------------
-- Copyright 1989 - 1991 by Rational, Santa Clara, California.
-- Copyright 1987 - 1988 by Digital Equipment Corporation, Maynard, Mass.
-- Copyright 1987 - 1989 by Massachusetts Institute of Technology,
--                          Cambridge, Massachusetts.
--
--                  All Rights Reserved.
--
-- Permission to use, copy, modify, and distribute this software and its
-- documentation for any purpose and without fee is hereby granted,
-- provided that the above copyright notice(s) appear in all copies and that
-- both that copyright notice(s) and this permission notice appear in
-- supporting documentation, and that the names of Digital, MIT, or Rational
-- not be used in advertising or publicity pertaining to distribution of
-- the software without specific, written prior permission.
--
-- Digital, MIT, and Rational disclaim all warranties with regard to this
-- software, including all implied warranties of merchantability and fitness,
-- in no event shall Digital, MIT, or Rational be liable for any special,
-- indirect or consequential damages or any damages whatsoever resulting from
-- loss of use, data or profits, whether in an action of contract, negligence
-- or other tortious action, arising out of or in connection with the use or
-- performance of this software.
------------------------------------------------------------------------------

--\x0c
    ------------------------------------------------------------------------------
-- Resource Manager Classes
------------------------------------------------------------------------------

    function X_Rm_Class_To_String (Class : X_Rm_Class) return X_String;
------------------------------------------------------------------------------
--  Class   - Specifies the Class whose string value is queried.
--
-- Returns the string corresponding to the Class.  Returns "" for Class values
-- obtained from X_Rm_Unique_Class.  Raises Constraint_Error if an
-- uninitialized Class value is passed.
------------------------------------------------------------------------------

    function X_Rm_String_To_Class  
                (Str      : X_String;  
                 Validate : Boolean := True) return X_Rm_Class;
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Class.
--             The string need not be null terminated.
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Class value that has or which will now correspond to the
-- contents of the specified string.  If Validate is True, Constraint_Error
-- will be raised if any characters other than 'a'..'z', 'A'..'Z', '0'..'9',
-- '-', or '_' are present in the Str.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Class (Str      :     X_String;  
                                    Ptr      : out X_String_Pointer;  
                                    Class    : out X_Rm_Class;  
                                    Validate :     Boolean := True);
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Class.
--             The string need not be null terminated.
--  Ptr      - Receives the string pointer stored in the Class map for Str
--  Class    - Receives the Class value representing Str
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Class value that has or which will now correspond to the
-- contents of the specified string.  If Validate is True, Constraint_Error
-- will be raised if any characters other than 'a'..'z', 'A'..'Z', '0'..'9',
-- '-', or '_' are present in the Str.  Note: The Ptr value belongs to the Xlib
-- and it must not be freed by the application.
------------------------------------------------------------------------------

    function X_Rm_Class_To_String_Pointer  
                (Class : X_Rm_Class) return X_String_Pointer;
------------------------------------------------------------------------------
--  Class   - Specifies the Class whose string value is queried.
--
-- Returns the string corresponding to the Class.  Returns "" for Class values
-- obtained from X_Rm_Unique_Class.  Raises Constraint_Error if an
-- uninitialized Class value is passed.  Note: This string belongs to the Xlib
-- and it must not be freed by the application.  Classes generated by
-- X_Rm_Unique_Class were not created with a string value and return
-- None_X_String_Pointer.
------------------------------------------------------------------------------

    procedure X_Rm_String_Pointer_To_Class (Str      : in out X_String_Pointer;  
                                            Class    : out    X_Rm_Class;  
                                            Validate :        Boolean := True);
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Class.
--             The string need not be null terminated.
--  Class    - Receives the new Class
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Class value that has or which will now correspond to the
-- contents of the specified string.  If an some existing Class has the same
-- string value then that Class, and that string pointer, will be returned.  If
-- no existing Class has the same string value then a new Class is created and
-- returned, and the X_String_Pointer Str argument becomes the property of
-- the Xlib and must not be free by the appliation.  If Validate is True then
-- Constraint_Error will be raised if any characters other than 'a'..'z',
-- 'A'..'Z', '0'..'9', '-', or '_' are present in the Str.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Class_List is  
       new X_Rm_String_To_Quark_List (X_Rm_Class,  
                                      None_X_Rm_Class,  
                                      X_Rm_Class_Array,  
                                      X_Rm_String_To_Class);
------------------------------------------------------------------------------
--  Str     - Specifies a series of names separated by '.' or '*'.
--            The string need not be null terminated.  If an Ascii.Nul is
--            found then it is considered to be the "end" of the string.
--  List    - Receives a list of classes; terminated by a None_X_Rm_Class.  The
--            list must be long enough.
--
-- Called with a string of the form ".name1.name2.name3" where the number
-- of names in the string must be at least one less than List'Length.  Any
-- character that is not an Ascii.'.', and Ascii.'*', or an Ascii.Nul is
-- taken to be part of a name.  Illegal characters in component names
-- will cause Constraint_Error to be raised.
--
-- For each name in the list the corresponding Class value is placed into
-- the class list in the same order as the names appear in the Name string.
-- In List, the Class corresponding to the last name will be followed by a
-- None_X_Rm_Class entry.  (That is why List'Length > number of names.)
--
-- Names are separated by one or more dots.  The leading separator is
-- optional.
--
-- Will raise Constraint_Error if the class list is too small.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Binding_Class_List is  
       new X_Rm_String_To_Binding_Quark_List (X_Rm_Class,  
                                              None_X_Rm_Class,  
                                              X_Rm_Class_Array,  
                                              X_Rm_String_To_Class);
------------------------------------------------------------------------------
--  Str     - Specifies a series of names separated by '.' or '*'.
--            The string need not be null terminated.  If an Ascii.Nul is
--            found then it is considered to be the "end" of the string.
--  Bindings- Receives a list of binding values indicating '.' and '*'
--            separators for the class list.
--  List    - Receives a list of classes; terminated by a None_X_Rm_Class.  The
--            list must be long enough.
--
-- Called with a string of the form "name1.name2*name3.name4" where the number
-- of names in the string must be at least one less than Min( List'Length,
-- Bindings'Length+1 ).  The legal separators between the names are Ascii.'.'
-- and Ascii.'*'.  Anything that isn't Ascii.'.', Ascii.'*', or Ascii.Nul is
-- taken to be part of a name.
--
-- For each name in the list the corresponding Class value is placed into
-- the class list in the same order as the names appear in the Name string.
-- In List, the Class corresponding to the last name will be followed by a
-- None_X_Rm_Class entry.  (That is why List'Length > number of names.)
--
-- For each entry in the List list there is a Bindings entry.  The Binding
-- entry indicates that the name was preceded by a '.' (Bind_Tightly), by
-- a '*' (Bind_Loosely), or is the first name in the string (Bind_Tightly).
--
-- Will raise Constraint_Error if the List or Bindings array is too
-- small, or if Name contains illegal characters.
------------------------------------------------------------------------------

    function X_Rm_Unique_Class return X_Rm_Class;
------------------------------------------------------------------------------
-- Returns a unique Class that does not correspond to any particular string
-- value.
------------------------------------------------------------------------------

--\x0c
    ------------------------------------------------------------------------------
-- Resource Manager Names
------------------------------------------------------------------------------

    function X_Rm_Name_To_String (Str : X_Rm_Name) return X_String;
------------------------------------------------------------------------------
--  Str  - Specifies the Name whose string value is queried.
--
-- Returns the string corresponding to the Name.  Returns "" for Name values
-- obtained from X_Rm_Unique_Name.  Raises Constraint_Error if an
-- uninitialized Name value is passed.
------------------------------------------------------------------------------

    function X_Rm_String_To_Name (Str      : X_String;  
                                  Validate : Boolean := True) return X_Rm_Name;
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Name.
--            The string need not be null terminated.
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Name value that has or which will now correspond to the
-- contents of the specified string.  If Validate is True, Constraint_Error
-- will be raised if any characters other than 'a'..'z', 'A'..'Z', '0'..'9',
-- '-', or '_' are present in the Str.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Name (Str      :     X_String;  
                                   Ptr      : out X_String_Pointer;  
                                   Name     : out X_Rm_Name;  
                                   Validate :     Boolean := True);
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Name.
--             The string need not be null terminated.
--  Ptr      - Receives the string pointer stored in the Name map for Str
--  Name    - Receives the Name value representing Str
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Name value that has or which will now correspond to the
-- contents of the specified string.  If Validate is True, Constraint_Error
-- will be raised if any characters other than 'a'..'z', 'A'..'Z', '0'..'9',
-- '-', or '_' are present in the Str.  Note: The Ptr value belongs to the Xlib
-- and it must not be freed by the application.
------------------------------------------------------------------------------

    function X_Rm_Name_To_String_Pointer  
                (Name : X_Rm_Name) return X_String_Pointer;
------------------------------------------------------------------------------
--  Str - Specifies the Name whose string value is queried.
--
-- Returns the string corresponding to the Name.  Returns "" for Name values
-- obtained from X_Rm_Unique_Name.  Raises Constraint_Error if an
-- uninitialized Name value is passed.  Note: This string belongs to the Xlib
-- and it must not be freed by the application.  Names generated by
-- X_Rm_Unique_Name were not created with a string value and return
-- None_X_String_Pointer.
------------------------------------------------------------------------------

    procedure X_Rm_String_Pointer_To_Name (Str      : in out X_String_Pointer;  
                                           Name     : out    X_Rm_Name;  
                                           Validate :        Boolean := True);
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Name.
--             The string need not be null terminated.
--  Name     - Receives the new Name
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Name value that has or which will now correspond to the
-- contents of the specified string.  If an some existing Name has the same
-- string value then that Name, and that string pointer, will be returned.  If
-- no existing Name has the same string value then a new Name is created and
-- returned, and the X_String_Pointer Str argument becomes the property of
-- the Xlib and must not be free by the appliation.  If Validate is True then
-- Constraint_Error will be raised if any characters other than 'a'..'z',
-- 'A'..'Z', '0'..'9', '-', or '_' are present in the Str.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Name_List is  
       new X_Rm_String_To_Quark_List (X_Rm_Name,  
                                      None_X_Rm_Name,  
                                      X_Rm_Name_Array,  
                                      X_Rm_String_To_Name);
------------------------------------------------------------------------------
--  Str     - Specifies a series of names separated by '.' or '*'.
--            The string need not be null terminated.  If an Ascii.Nul is
--            found then it is considered to be the "end" of the string.
--  List    - Receives a list of names; terminated by a None_X_Rm_Name.  The
--            list must be long enough.
--
-- Called with a string of the form ".name1.name2.name3" where the number
-- of names in the string must be at least one less than List'Length.  Any
-- character that is not an Ascii.'.', Ascii.'*', or an Ascii.Nul is
-- taken to be part of a name.  Illegal characters in component names
-- will cause Constraint_Error to be raised.
--
-- For each name in the list the corresponding Name value is placed into
-- the names list in the same order as the names appear in the Name string.
-- In List, the Name corresponding to the last name will be followed by a
-- None_X_Rm_Name entry.  (That is why List'Length > number of names.)
--
-- The leading separator is optional.
--
-- Will raise Constraint_Error if the names list is too small.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Binding_Name_List is  
       new X_Rm_String_To_Binding_Quark_List (X_Rm_Name,  
                                              None_X_Rm_Name,  
                                              X_Rm_Name_Array,  
                                              X_Rm_String_To_Name);
------------------------------------------------------------------------------
--  Str     - Specifies a series of names separated by '.' or '*'.
--            The string need not be null terminated.  If an Ascii.Nul is
--            found then it is considered to be the "end" of the string.
--  Bindings- Receives a list of binding values indicating '.' and '*'
--            separators for the Names list.
--  List    - Receives a list of Names; terminated by a None_X_Rm_Name.  The
--            list must be long enough.
--
-- Called with a string of the form ".name1.name2*name3" where the number
-- of names in the string must be at least one less than Min( List'Length,
-- Bindings'Length+1 ).  The legal separators between the names are Ascii.'.'
-- and Ascii.'*'.  Anything that isn't Ascii.'.', Ascii.'*', or Ascii.Nul is
-- taken to be part of a name.
--
-- For each name in the list the corresponding Name value is placed into
-- the names list in the same order as the names appear in the Name string.
-- In List, the Name corresponding to the last name will be followed by a
-- None_X_Rm_Name entry.  (That is why List'Length > number of names.)
--
-- For each entry in the names list there is a Bindings entry.  The Binding
-- entry indicates that the name was preceded by a '.' (Bind_Tightly), by
-- a '*' (Bind_Loosely), or is the first name in the string (Bind_Tightly).
--
-- Will raise Constraint_Error if the List or Bindings array is too
-- small or if Name contains illegal characters.
------------------------------------------------------------------------------

    function X_Rm_Unique_Name return X_Rm_Name;
------------------------------------------------------------------------------
-- Returns a unique name that does not correspond to any particular string
-- value.
------------------------------------------------------------------------------

--\x0c
    ------------------------------------------------------------------------------
-- Resource Manager Representations
------------------------------------------------------------------------------

    function X_Rm_Representation_To_String (Rep : X_Rm_Representation)  
                                           return X_String;
------------------------------------------------------------------------------
--  Rep     - Specifies the representation whose string value is queried.
--
-- Returns the string corresponding to the Representation.  Returns "" for
-- Representation values obtained from X_Rm_Unique_Representation.  Raises
-- Constraint_Error if an uninitialized Representation value is passed.
------------------------------------------------------------------------------

    function X_Rm_String_To_Representation (Str      : X_String;  
                                            Validate : Boolean := True)  
                                           return X_Rm_Representation;
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Representation.
--            The string need not be null terminated.
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Representation value that has or which will now correspond to the
-- contents of the specified string.  If Validate is True, Constraint_Error
-- will be raised if any characters other than 'a'..'z', 'A'..'Z', '0'..'9',
-- '-', or '_' are present in the Str.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Representation  
                 (Str            :     X_String;  
                  Ptr            : out X_String_Pointer;  
                  Representation : out X_Rm_Representation;  
                  Validate       :     Boolean := True);
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Representation.
--             The string need not be null terminated.
--  Ptr      - Receives the string pointer stored in the Representation map for Str
--  Representation    - Receives the Representation value representing Str
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Representation value that has or which will now correspond to the
-- contents of the specified string.  If Validate is True, Constraint_Error
-- will be raised if any characters other than 'a'..'z', 'A'..'Z', '0'..'9',
-- '-', or '_' are present in the Str.  Note: The Ptr value belongs to the Xlib
-- and it must not be freed by the application.
------------------------------------------------------------------------------

    function X_Rm_Representation_To_String_Pointer  
                (Representation : X_Rm_Representation) return X_String_Pointer;
------------------------------------------------------------------------------
--  Representation   - Specifies the Representation whose string value is
--                      queried.
--
-- Returns the string corresponding to the Representation.  Returns "" for
-- Representation values obtained from X_Rm_Unique_Representation.  Raises
-- Constraint_Error if an uninitialized Representation value is passed.
-- Note: This string belongs to the Xlib and it must not be freed by the
-- application.  Representationes generated by X_Rm_Unique_Representation
-- were not created with a string value and return None_X_String_Pointer.
------------------------------------------------------------------------------

    procedure X_Rm_String_Pointer_To_Representation  
                 (Str            : in out X_String_Pointer;  
                  Representation : out    X_Rm_Representation;  
                  Validate       :        Boolean := True);
------------------------------------------------------------------------------
--  Str      - Specifies the string value being converted to a Representation.
--             The string need not be null terminated.
--  Representation - Receives the Representation value
--  Validate - Specifies whether or not the Str must be a valid
--             Component Name as defined by the Resource Manager.
--
-- Returns the Representation value that has or which will now correspond to
-- the contents of the specified string.  If an some existing Representation
-- has the same string value then that Representation, and that string pointer,
-- will be returned.  If no existing Representation has the same string value
-- then a new Representation is created and returned, and the X_String_Pointer
-- Str argument becomes the property of the Xlib and must not be free by the
-- appliation.  If Validate is True then Constraint_Error will be raised if
-- any characters other than 'a'..'z', 'A'..'Z', '0'..'9', '-', or '_' are
-- present in the Str.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Representation_List is  
       new X_Rm_String_To_Quark_List (X_Rm_Representation,  
                                      None_X_Rm_Representation,  
                                      X_Rm_Representation_Array,  
                                      X_Rm_String_To_Representation);
------------------------------------------------------------------------------
--  Str     - Specifies a series of names separated by '.' or '*'.
--            The string need not be null terminated.  If an Ascii.Nul is
--            found then it is considered to be the "end" of the string.
--  List    - Receives a list of Representations; terminated by a
--            None_X_Rm_Representation.  The list must be long enough.
--
-- Called with a string of the form ".name1.name2.name3" where the number
-- of names in the string must be at least one less than List'Length.  Any
-- character that is not an Ascii.'.', Ascii.'*', or an Ascii.Nul is
-- taken to be part of a name.  Illegal characters in component names
-- will cause Constraint_Error to be raised.
--
-- For each name in the list the corresponding Representation value is placed
-- into the representation list in the same order as the names appear in the
-- Name string.  In List, the Representation corresponding to the last name
-- will be followed by a None_X_Rm_Representation entry.  (That is why
-- List'Length > number of names.)
--
-- The leading separator is optional.
--
-- Will raise Constraint_Error if the List list is too small.
------------------------------------------------------------------------------

    procedure X_Rm_String_To_Binding_Representation_List is  
       new X_Rm_String_To_Binding_Quark_List (X_Rm_Representation,  
                                              None_X_Rm_Representation,  
                                              X_Rm_Representation_Array,  
                                              X_Rm_String_To_Representation);
------------------------------------------------------------------------------
--  Str     - Specifies a series of names separated by '.' or '*'.
--            The string need not be null terminated.  If an Ascii.Nul is
--            found then it is considered to be the "end" of the string.
--  Bindings- Receives a list of binding values indicating '.' and '*'
--            separators for the Reps list.
--  List    - Receives a list of Representations; terminated by a
--            None_X_Rm_Representation.  The list must be long enough.
--
-- Called with a string of the form ".name1.name2*name3" where the number
-- of names in the string must be at least one less than Min( List'Length,
-- Bindings'Length+1 ).  The legal separators between the names are Ascii.'.'
-- and Ascii.'*'.  Anything that isn't Ascii.'.', Ascii.'*', or Ascii.Nul is
-- taken to be part of a name.
--
-- For each name in the list the corresponding Representation value is placed
-- into the representation list in the same order as the names appear in the
-- Name string.  In List, the Representation corresponding to the last name
-- will be followed by a None_X_Rm_Representation entry.  (That is why
-- List'Length > number of names.)
--
-- For each entry in the representation list there is a Bindings entry.  The
-- Binding entry indicates that the name was preceded by a '.' (Bind_Tightly),
-- by a '*' (Bind_Loosely), or is the first name in the string (Bind_Tightly).
-- The leading separator is optional.
--
-- Will raise Constraint_Error if the List or Bindings array is too
-- small, or if Name contains illegal characters.
------------------------------------------------------------------------------

    function X_Rm_Unique_Representation return X_Rm_Representation;
------------------------------------------------------------------------------
-- Returns a unique Representation that does not correspond to any particular
-- string value.
------------------------------------------------------------------------------

--\x0c
end Xlbp_Rm_Name;  

E3 Meta Data

    nblk1=1d
    nid=0
    hdr6=3a
        [0x00] rec0=1d rec1=00 rec2=01 rec3=004
        [0x01] rec0=10 rec1=00 rec2=02 rec3=066
        [0x02] rec0=13 rec1=00 rec2=03 rec3=014
        [0x03] rec0=10 rec1=00 rec2=04 rec3=05c
        [0x04] rec0=11 rec1=00 rec2=05 rec3=09c
        [0x05] rec0=10 rec1=00 rec2=06 rec3=068
        [0x06] rec0=11 rec1=00 rec2=07 rec3=026
        [0x07] rec0=10 rec1=00 rec2=08 rec3=02e
        [0x08] rec0=12 rec1=00 rec2=09 rec3=02e
        [0x09] rec0=11 rec1=00 rec2=0a rec3=05c
        [0x0a] rec0=15 rec1=00 rec2=0b rec3=05a
        [0x0b] rec0=11 rec1=00 rec2=0c rec3=03e
        [0x0c] rec0=10 rec1=00 rec2=0d rec3=07a
        [0x0d] rec0=12 rec1=00 rec2=0e rec3=062
        [0x0e] rec0=0f rec1=00 rec2=0f rec3=066
        [0x0f] rec0=11 rec1=00 rec2=10 rec3=07c
        [0x10] rec0=13 rec1=00 rec2=11 rec3=062
        [0x11] rec0=11 rec1=00 rec2=12 rec3=040
        [0x12] rec0=11 rec1=00 rec2=13 rec3=09c
        [0x13] rec0=13 rec1=00 rec2=14 rec3=05a
        [0x14] rec0=11 rec1=00 rec2=15 rec3=052
        [0x15] rec0=10 rec1=00 rec2=16 rec3=02c
        [0x16] rec0=10 rec1=00 rec2=17 rec3=05c
        [0x17] rec0=0f rec1=00 rec2=18 rec3=04e
        [0x18] rec0=11 rec1=00 rec2=19 rec3=022
        [0x19] rec0=13 rec1=00 rec2=1a rec3=00c
        [0x1a] rec0=0e rec1=00 rec2=1b rec3=08e
        [0x1b] rec0=13 rec1=00 rec2=1c rec3=05e
        [0x1c] rec0=08 rec1=00 rec2=1d rec3=000
    tail 0x2150096388197834a4dd9 0x42a00088462063203