Determine the number of bytes read and written

The ifx_gl_tomupper() and ifx_gl_tomlower() functions return an unsigned short integer that encodes the information about the number of bytes that the function has read.

The library provides the following macros to obtain this information from the return value.
IFX_GL_CASE_CONV_SRC_BYTES()
The number of bytes read from the source string
IFX_GL_CASE_CONV_DST_BYTES()
The number of bytes written to the destination buffer
The following code fragment uses the ifx_gl_tomlower() function to convert a multibyte character to its lowercase equivalent. It uses the case-conversion macros to obtain the number of bytes read and written during the case-conversion operation:
/* Initialize source pointer, 'src_mb', to beginning of the
 * multibyte string. Initialize destination pointer to
 * beginning of destination buffer */
src_mb = src_mbs;
dst_mb = dst_mbs;

/* Traverse source string until the null terminator is
* reached */
while ( *src_mb != '\0' )
    {
/* Convert source multibyte character, 'src_mb', to lowercase
 * and put in the destination buffer */
    unsigned short retval =
        ifx_gl_tomlower(dst_mb, src_mb, src_mbs_bytes);
...
/* Increment the source pointer by the number of bytes that
 * have been read and the destination pointer by the number
 * of bytes that have been written */
    src_mb += IFX_GL_CASE_CONV_SRC_BYTES(retval);
    dst_mb += IFX_GL_CASE_CONV_DST_BYTES(retval);
    src_mbs_bytes -= IFX_GL_CASE_CONV_SRC_BYTES(retval);
    }
The memory-management rules for case conversion of a single multibyte character also apply to converting a string of one or more multibyte characters. For example, the following code fragment converts a multibyte-character string to its uppercase equivalent:
/* Assume src_mbs is null terminated */
src_mbs_bytes = strlen(src_mbs);
dst_mbs_bytes = ifx_gl_case_conv_outbuflen(src_mbs_bytes);

if ( dst_mbs_bytes == src_mbs_bytes )
    {
    /* If two strings have the same size, overwrite each
     * multibyte character in the 'src_mbs' multibyte string
     * with its uppercase equivalent */
    src_mb = src_mbs;
    while ( *src_mb != '\0' )
        {
        retval =
           ifx_gl_tomupper(src_mb,src_mb,IFX_GL_NO_LIMIT);
        src_mb += IFX_GL_CASE_CONV_SRC_BYTES(retval);
        }
    }
else
    {
    /* Two strings are not the same size, so must allocate a
     * destination buffer whose size is determined by the
     * ifx_gl_case_conv_outbuflen() function */
    dst_mbs = (gl_mchar_t *) malloc(dst_mbs_bytes + 1);

    src_mb = src_mbs;
    dst_mb = dst_mbs;

    while ( *src_mb != '\0' )
        {
        retval =
            ifx_gl_tomupper(dst_mb,src_mb,IFX_GL_NO_LIMIT);
        src_mb += IFX_GL_CASE_CONV_SRC_BYTES(retval);
        dst_mb += IFX_GL_CASE_CONV_DST_BYTES(retval);
        }

    *dst_mb = '\0';
    }