| /////////////////////////////////////////////////////////////////////////////// |
| // |
| /// \file tuklib_mstr.h |
| /// \brief Utility functions for handling multibyte strings |
| /// |
| /// If not enough multibyte string support is available in the C library, |
| /// these functions keep working with the assumption that all strings |
| /// are in a single-byte character set without combining characters, e.g. |
| /// US-ASCII or ISO-8859-*. |
| // |
| // Author: Lasse Collin |
| // |
| // This file has been put into the public domain. |
| // You can do whatever you want with this file. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef TUKLIB_MBSTR_H |
| #define TUKLIB_MBSTR_H |
| |
| #include "tuklib_common.h" |
| TUKLIB_DECLS_BEGIN |
| |
| #define tuklib_mbstr_width TUKLIB_SYMBOL(tuklib_mbstr_width) |
| extern size_t tuklib_mbstr_width(const char *str, size_t *bytes); |
| ///< |
| /// \brief Get the number of columns needed for the multibyte string |
| /// |
| /// This is somewhat similar to wcswidth() but works on multibyte strings. |
| /// |
| /// \param str String whose width is to be calculated. If the |
| /// current locale uses a multibyte character set |
| /// that has shift states, the string must begin |
| /// and end in the initial shift state. |
| /// \param bytes If this is not NULL, *bytes is set to the |
| /// value returned by strlen(str) (even if an |
| /// error occurs when calculating the width). |
| /// |
| /// \return On success, the number of columns needed to display the |
| /// string e.g. in a terminal emulator is returned. On error, |
| /// (size_t)-1 is returned. Possible errors include invalid, |
| /// partial, or non-printable multibyte character in str, or |
| /// that str doesn't end in the initial shift state. |
| |
| #define tuklib_mbstr_fw TUKLIB_SYMBOL(tuklib_mbstr_fw) |
| extern int tuklib_mbstr_fw(const char *str, int columns_min); |
| ///< |
| /// \brief Get the field width for printf() e.g. to align table columns |
| /// |
| /// Printing simple tables to a terminal can be done using the field field |
| /// feature in the printf() format string, but it works only with single-byte |
| /// character sets. To do the same with multibyte strings, tuklib_mbstr_fw() |
| /// can be used to calculate appropriate field width. |
| /// |
| /// The behavior of this function is undefined, if |
| /// - str is NULL or not terminated with '\0'; |
| /// - columns_min <= 0; or |
| /// - the calculated field width exceeds INT_MAX. |
| /// |
| /// \return If tuklib_mbstr_width(str, NULL) fails, -1 is returned. |
| /// If str needs more columns than columns_min, zero is returned. |
| /// Otherwise a positive integer is returned, which can be |
| /// used as the field width, e.g. printf("%*s", fw, str). |
| |
| TUKLIB_DECLS_END |
| #endif |