home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / useful / os-include / utility / pack.h < prev    next >
C/C++ Source or Header  |  1992-09-24  |  7KB  |  172 lines

  1. #ifndef UTILITY_PACK_H
  2. #define UTILITY_PACK_H
  3. /*
  4. **    $VER: pack.h 39.2 (09.04.92)
  5. **    Includes Release 39.108
  6. **
  7. **    Control attributes for Pack/UnpackStructureTags()
  8. **
  9. **    (C) Copyright 1992 Commodore-Amiga Inc.
  10. **    All Rights Reserved
  11. */
  12.  
  13. /*****************************************************************************/
  14.  
  15.  
  16. #ifndef EXEC_TYPES_H
  17. #include <exec/types.h>
  18. #endif
  19.  
  20. #ifndef UTILITY_TAGITEM_H
  21. #include <utility/tagitem.h>
  22. #endif
  23.  
  24.  
  25. /*****************************************************************************/
  26.  
  27.  
  28. /* PackTable definition:
  29.  *
  30.  * The PackTable is a simple array of LONGWORDS that are evaluated by
  31.  * PackStructureTags() and UnpackStructureTags().
  32.  *
  33.  * The table contains compressed information such as the tag offset from
  34.  * the base tag. The tag offset has a limited range so the base tag is
  35.  * defined in the first longword.
  36.  *
  37.  * After the first longword, the fields look as follows:
  38.  *
  39.  *    +--------- 1 = signed, 0 = unsigned (for bits, 1=inverted boolean)
  40.  *    |
  41.  *    |  +------ 00 = Pack/Unpack, 10 = Pack, 01 = Unpack, 11 = special
  42.  *    | / \
  43.  *    | | |  +-- 00 = Byte, 01 = Word, 10 = Long, 11 = Bit
  44.  *    | | | / \
  45.  *    | | | | | /----- For bit operations: 1 = TAG_EXISTS is TRUE
  46.  *    | | | | | |
  47.  *    | | | | | | /-------------------- Tag offset from base tag value
  48.  *    | | | | | | |              \
  49.  *    m n n o o p q q q q q q q q q q r r r s s s s s s s s s s s s s
  50.  *                    \   | |              |
  51.  *    Bit offset (for bit operations) ----/ |              |
  52.  *                          \               |
  53.  *    Offset into data structure -----------------------------------/
  54.  *
  55.  * A -1 longword signifies that the next longword will be a new base tag
  56.  *
  57.  * A 0 longword signifies that it is the end of the pack table.
  58.  *
  59.  * What this implies is that there are only 13-bits of address offset
  60.  * and 10 bits for tag offsets from the base tag.  For most uses this
  61.  * should be enough, but when this is not, either multiple pack tables
  62.  * or a pack table with extra base tags would be able to do the trick.
  63.  * The goal here was to make the tables small and yet flexible enough to
  64.  * handle most cases.
  65.  */
  66.  
  67. #define    PSTB_SIGNED 31
  68. #define PSTB_UNPACK 30      /* Note that these are active low... */
  69. #define PSTB_PACK   29      /* Note that these are active low... */
  70. #define    PSTB_EXISTS 26      /* Tag exists bit true flag hack...  */
  71.  
  72. #define    PSTF_SIGNED (1L << PSTB_SIGNED)
  73. #define PSTF_UNPACK (1L << PSTB_UNPACK)
  74. #define PSTF_PACK   (1L << PSTB_PACK)
  75.  
  76. #define    PSTF_EXISTS (1L << PSTB_EXISTS)
  77.  
  78. /*****************************************************************************/
  79.  
  80.  
  81. #define PKCTRL_PACKUNPACK 0x00000000
  82. #define PKCTRL_PACKONLY   0x40000000
  83. #define PKCTRL_UNPACKONLY 0x20000000
  84.  
  85. #define PKCTRL_BYTE      0x80000000
  86. #define PKCTRL_WORD      0x88000000
  87. #define PKCTRL_LONG      0x90000000
  88.  
  89. #define PKCTRL_UBYTE      0x00000000
  90. #define PKCTRL_UWORD      0x08000000
  91. #define PKCTRL_ULONG      0x10000000
  92.  
  93. #define PKCTRL_BIT      0x18000000
  94. #define PKCTRL_FLIPBIT      0x98000000
  95.  
  96.  
  97. /*****************************************************************************/
  98.  
  99.  
  100. /* Macros used by the next batch of macros below. Normally, you don't use
  101.  * this batch directly. Then again, some folks are wierd
  102.  */
  103.  
  104. #define PK_BITNUM1(flg) ((flg) == 0x01 ? 0 : (flg) == 0x02 ? 1 : (flg) == 0x04 ? 2 : (flg) == 0x08 ? 3 : (flg) == 0x10 ? 4 : (flg) == 0x20 ? 5 : (flg) == 0x40 ? 6 : 7)
  105. #define PK_BITNUM2(flg) ((flg < 0x100 ? PK_BITNUM1(flg) : 8+PK_BITNUM1(flg >> 8)))
  106. #define PK_BITNUM(flg) ((flg < 0x10000 ? PK_BITNUM2(flg) : 16+PK_BITNUM2(flg >> 16)))
  107. #define PK_WORDOFFSET(flg) ((flg) < 0x100 ? 1 : 0)
  108. #define PK_LONGOFFSET(flg) ((flg) < 0x100  ? 3 : (flg) < 0x10000 ? 2 : (flg) < 0x1000000 ? 1 : 0)
  109. #define PK_CALCOFFSET(type,field) ((ULONG)(&((struct type *)0)->field))
  110.  
  111.  
  112. /*****************************************************************************/
  113.  
  114.  
  115. /* Some handy dandy macros to easily create pack tables
  116.  *
  117.  * Use PACK_STARTTABLE() at the start of a pack table. You pass it the
  118.  * base tag value that will be handled in the following chunk of the pack
  119.  * table.
  120.  *
  121.  * PACK_ENDTABLE() is used to mark the end of a pack table.
  122.  *
  123.  * PACK_NEWOFFSET() lets you change the base tag value used for subsequent
  124.  * entries in the table
  125.  *
  126.  * PACK_ENTRY() lets you define an entry in the pack table. You pass it the
  127.  * base tag value, the tag of interest, the type of the structure to use,
  128.  * the field name in the structure to affect and control bits (combinations of
  129.  * the various PKCTRL_XXX bits)
  130.  *
  131.  * PACK_BYTEBIT() lets you define a bit-control entry in the pack table. You
  132.  * pass it the same data as PACK_ENTRY, plus the flag bit pattern this tag
  133.  * affects. This macro should be used when the field being affected is byte
  134.  * sized.
  135.  *
  136.  * PACK_WORDBIT() lets you define a bit-control entry in the pack table. You
  137.  * pass it the same data as PACK_ENTRY, plus the flag bit pattern this tag
  138.  * affects. This macro should be used when the field being affected is word
  139.  * sized.
  140.  *
  141.  * PACK_LONGBIT() lets you define a bit-control entry in the pack table. You
  142.  * pass it the same data as PACK_ENTRY, plus the flag bit pattern this tag
  143.  * affects. This macro should be used when the field being affected is longword
  144.  * sized.
  145.  *
  146.  * EXAMPLE:
  147.  *
  148.  *    ULONG packTable[] =
  149.  *    {
  150.  *       PACK_STARTTABLE(GA_Dummy),
  151.  *       PACK_ENTRY(GA_Dummy,GA_Left,Gadget,LeftEdge,PKCTRL_WORD|PKCTRL_PACKUNPACK),
  152.  *       PACK_ENTRY(GA_Dummy,GA_Top,Gadget,TopEdge,PKCTRL_WORD|PKCTRL_PACKUNPACK),
  153.  *       PACK_ENTRY(GA_Dummy,GA_Width,Gadget,Width,PKCTRL_UWORD|PKCTRL_PACKUNPACK),
  154.  *       PACK_ENTRY(GA_Dummy,GA_Height,Gadget,Height,PKCTRL_UWORD|PKCTRL_PACKUNPACK),
  155.  *       PACK_WORDBIT(GA_Dummy,GA_RelVerify,Gadget,Activation,PKCTRL_BIT|PKCTRL_PACKUNPACK,GACT_RELVERIFY)
  156.  *       PACK_ENDTABLE
  157.  *    };
  158.  */
  159.  
  160. #define PACK_STARTTABLE(tagbase)               (tagbase)
  161. #define PACK_NEWOFFSET(tagbase)               (-1L),(tagbase)
  162. #define PACK_ENDTABLE                       0
  163. #define PACK_ENTRY(tagbase,tag,type,field,control)       (control | ((tag-tagbase) << 16L) | PK_CALCOFFSET(type,field))
  164. #define PACK_BYTEBIT(tagbase,tag,type,field,control,flags) (control | ((tag-tagbase) << 16L) | PK_CALCOFFSET(type,field) | (PK_BITNUM(flags) << 13L))
  165. #define PACK_WORDBIT(tagbase,tag,type,field,control,flags) (control | ((tag-tagbase) << 16L) | (PK_CALCOFFSET(type,field)+PK_WORDOFFSET(flags)) | ((PK_BITNUM(flags)&7) << 13L))
  166. #define PACK_LONGBIT(tagbase,tag,type,field,control,flags) (control | ((tag-tagbase) << 16L) | (PK_CALCOFFSET(type,field)+PK_LONGOFFSET(flags)) | ((PK_BITNUM(flags)&7) << 13L))
  167.  
  168.  
  169. /*****************************************************************************/
  170.  
  171. #endif /* UTILITY_PACK_H */
  172.