============== Helper headers ============== ctype helpers ============= Functions from the ```` header, including, but not limited to, ``isalpha``, ``tolower``, and so forth, are defined to take an ``int`` as first argument. C strings consist of ``char``s, which may either be ``signed`` or ``unsigned``. It does not matter for *characters_* but since ``char``s are implicitly convertible to *numbers*, one needs to explicitly cast chars to unsigned before feeding them to ``isalpha``. .. code-block:: c /* “hyvää yötä”, UTF-8 encoded */ const char h[] = {'h', 'y', 'v', 0xc3, 0xa4, 0xc3, 0xa4, ' ', 'y', 0xc3, 0xb6, 't', 0xc3, 0xa4}; libHX's ctype_helper.h therefore provides wrappers with a different function signature that does the intended test. It does so by always taking ``unsigned char``. The implication is that EOF cannot be passed to ``HX_isalpha`` — not that there is a good reason to do so in the first place. .. code-block:: c #include bool HX_isalnum(unsigned char c); bool HX_isalpha(unsigned char c); bool HX_isdigit(unsigned char c); bool HX_islower(unsigned char c); bool HX_isprint(unsigned char c); bool HX_isspace(unsigned char c); bool HX_isupper(unsigned char c); bool HX_isxdigit(unsigned char c); unsigned char HX_tolower(unsigned char c); unsigned char HX_toupper(unsigned char c); The ``HX_is*`` functions also differ from ctype's in that they return ``bool`` instead of ``int``. Not all functions from ``ctype.h`` are present either; ``isascii``, ``isblank``, ``iscntrl``, ``isgraph``, ``ispunct`` and ``isxdigit`` have been omitted as the author has never needed them to this date. libxml2 helpers =============== libxml2 defines a type called ``xmlChar`` for use within its strings. ``xmlChar`` is typedef'ed to ``unsigned char`` by libxml2, causing compiler warnings related to differing signedness whenever interacting with strings from the outside world, which are usually just a pointer to char. Because casting is a real chore, ``libxml_helper.h`` will do it by providing some wrappers with better argument types. .. code-block:: c #include int xml_strcmp(const xmlChar *a, const char *b); int xml_strcasecmp(const xmlChar *a, const char *b); char *xml_getprop(xmlNode *node, const char *attr); char *xml_getnsprop(xmlNode *node, const char *nsprefix, const char *attr); xmlAttr *xml_newprop(xmlNode *node, const char *attr); xmlNode *xml_newnode(xmlNode *parent, const char *name, const char *value); xmlAttr *xml_setprop(xmlNode *node, const char *name, const char *value); The functions map to ``strcmp``, ``strcasecmp``, ``xmlGetProp``, ``xmlNewPropxmlNewProp``, ``xmlNewTextNodexmlNewTextNode`` and ``xmlSetPropxmlSetProp``, respectively. ``xml_getnsprop`` works similar to ``xmlGetNsProp``, but instead of taking a namespace URI, it does a lookup by namespace prefix. The argument order is also different compared to ``xmlGetNsProp``. wxWidgets ========= .. code-block:: c++ #include Shortcut macros --------------- ``wxACV`` Expands to ``wxALIGN_CENTER_VERTICAL``. ``wxCDF`` Expands to a set of common dialog flags for wxDialogs, which includes ``wxDEFAULT_FRAME_STYLE`` and a flag such that the dialog does not create a new window in the task bar (``wxFRAME_NO_TASKBAR``). ``wxDPOS`` Expands to ``wxDefaultPosition``. ``wxDSIZE`` Expands to ``wxDefaultSize``. ``wxDSPAN`` Expands to ``wxDefaultSpan``. String conversion ----------------- .. code-block:: c++ wxString wxfu8(const char *); wxString wxfv8(const char *); const char *wxtu8(const wxString &); ``wxfu8`` Converts a UTF-8 string to a ``wxString`` object. ``wxfv8`` Converts a UTF-8 string to an entity usable by ``wxPrintf``. ``wxtu8`` Converts a wxString to a pointer to char usable by ``printf``. Note that the validity of the pointer is very limited and usually does not extend beyond the statement in which it is used. Hence, storing the pointer in a variable (``const char *p = wxtu8(s);``) will make ``p`` dangling as soon as the assignment has been completed.