67 lines
2.8 KiB
C
67 lines
2.8 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
/// \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
|