[DUG] C code help

Ross Levis ross at stationplaylist.com
Fri Jul 14 10:41:00 NZST 2006


Hi Brian

Thanks for your detailed reply.

I wondered if I should have included the code used to test the value.  Here is one such function

    BOOL GetIsUTF8Text() { return ((m_nFieldFlags & TAG_FIELD_FLAG_DATA_TYPE_MASK) == TAG_FIELD_FLAG_DATA_TYPE_TEXT_UTF8) ? TRUE : FALSE; }

I see that it is ANDing the Mask.  There are no other flags using the same byte of this 4 byte flag.

Does this affect the value that will be found/stored in this flag for a Binary type?

Thanks,
Ross.
  It's a two-bit field by the look of it, using bits 1 and 2 of the word (numbering from bit 0 = least significant to 31 = most significant).
  6 (bit pattern 110) is the mask, ie it's used with a bitwise AND to select just those two bits from the word.
  the four values of the two-bit field are apparently:
  0 = Text UTF8
  1 = binary
  2 = External Info
  3  - reserved

  So not just a simple 1-bit flag like I thought from what you posted in the first message.

  With the various values of that field the whole word might look like:
  0000 0000 = Text UTF8
  0000 0002 = binary
  0000 0004 = External Info
  0000 0006  - reserved

  Except, we don't know what might be in the rest of the word. Probably not zeroes, so the values you are interested in will be combined with other fields. Possibly even, that 3-bit field is repeated several times in the word, with additional masking and shifting being used to pick fields out. In your first message, you also showed:

  #define APE_TAG_FLAG_CONTAINS_FOOTER            (1 << 30)

  which suggests bit 30 is also used as a one-bit flag. But whether this is in the same word or not can't necessarily be determined from the #defines. You'll probably need to find the code that masks, sets and tests these fields to be sure how they're used, for example look for something like:

      value = (word & TAG_FIELD_FLAG_DATA_TYPE_MASK) >> 1;

  to extract the value of the field from the word;

  or, to set the value to, say "External Info":

      word &= ~TAG_FIELD_FLAG_DATA_TYPE_MASK;
      word |= TAG_FIELD_FLAG_DATA_TYPE_EXTERNAL_INFO;

  To achieve the same operations in Delphi, use the bitwise logical operators not, and, or, xor, shl and shr. Snipped from the help screen:


------------------------------------------------------------------------------

  The following logical operators perform bitwise manipulation on integer operands. For example, if the value stored in X (in binary) is 001101 and the value stored in Y is 100001, the statement

  Z := X or Y;

  assigns the value 101101 to Z.

        Operator  Operation  Operand types  Result type  Examples  
        not  bitwise negation  integer  integer  not X  
        and  bitwise and  integer  integer  X and Y  
        or  bitwise or  integer  integer  X or Y  
        xor  bitwise xor  integer  integer  X xor Y  
        shl  bitwise shift left  integer  integer  X shl 2  
        shr  bitwise shift right  integer  integer  Y shl I 

  The following rules apply to bitwise operators.

  The result of a not operation is of the same type as the operand.
   If the operands of an and, or, or xor operation are both integers, the result is of the predefined integer type with the smallest range that includes all possible values of both types.
   The operations x shl y and x shr y shift the value of x to the left or right by y bits, which is equivalent to multiplying or dividing x by 2^y; the result is of the same type as x
  . For example, if N stores the value 01101 (decimal 13), then N shl 1 returns 11010 (decimal 26).

------------------------------------------------------------------------------



  Hope some of this helps clarify things a bit and doesn't just muddy it further,

  Brian



------------------------------------------------------------------------------


  _______________________________________________
  Delphi mailing list
  Delphi at ns3.123.co.nz
  http://ns3.123.co.nz/mailman/listinfo/delphi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ns3.123.co.nz/pipermail/delphi/attachments/20060714/8d443b59/attachment.html


More information about the Delphi mailing list