[HarfBuzz] enum issue

Richard Wordingham richard.wordingham at ntlworld.com
Tue Mar 4 14:29:03 PST 2014


On Tue, 04 Mar 2014 10:47:47 -0800
Behdad Esfahbod <behdad at behdad.org> wrote:

> That negates the reason we added that line to begin with, which was
> to ensure all hb_tag_t's fit in hb_script_t.  How about:
> 
>   _HB_SCRIPT_DUMMY1 = 0x7FFFFFFF,
>   _HB_SCRIPT_DUMMY2
> 
> The idea being that DUMMY2 gets value of 0x80000000, ensuring that
> hb_script_t can represent up to 0xFFFFFFFF.

But the value of DUMMY2 is not a value of (32-bit) int!  We should get
the same compiler warning, and seem to be worse off than having the
original value of HB_TAG_MAX.  C99 does not allow one to force an
enumeration type to be implemented as unsigned int.  With 32-bit int,
there is no guarantee that there is an enumeration type in C that can
hold all values of hb_tag_t.

A possible solution is

#ifdef __cplusplus
  _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX
#else
  HB_SCRIPT_BIG_POS = 0x7FFFFFFF,
  HB_SCRIPT_NEG = -1
#endif

(Any identifier beginning _H is reserved in C99.)

This forces hb_script_t to be at least 32 bits wide.  If int is 32
bits, then the compiler can choose (unsigned int) for C++ and (signed
int) for C, which is the best we can do for consistency.  I have to
confess that I don't know how to make an enumeration type exactly 32
bits wide if the type int is wider.  Making the C and C++
enumeration types as wide as int can be done using UINT_MAX and INT_MAX
rather than HB_TAG_MAX and 0x7FFFFFFF.

Richard.


More information about the HarfBuzz mailing list