[C] Added utf-8 example to README

This commit is contained in:
seleznevae 2019-10-06 10:02:41 +03:00
parent 587f0a1314
commit 5435b5750b
3 changed files with 83 additions and 13 deletions

View File

@ -83,7 +83,7 @@ int main(void)
#include "fort.hpp" #include "fort.hpp"
int main(void) int main(void)
{ {
fort::table table; fort::char_table table;
table << fort::header table << fort::header
<< "N" << "Driver" << "Time" << "Avg Speed" << fort::endr << "N" << "Driver" << "Time" << "Avg Speed" << fort::endr
<< "1" << "Ricciardo" << "1:25.945" << "47.362" << fort::endr << "1" << "Ricciardo" << "1:25.945" << "47.362" << fort::endr
@ -140,7 +140,7 @@ int main(void)
#include "fort.hpp" #include "fort.hpp"
int main(void) int main(void)
{ {
fort::table table; fort::char_table table;
/* Change border style */ /* Change border style */
table.set_border_style(FT_DOUBLE2_STYLE); table.set_border_style(FT_DOUBLE2_STYLE);
@ -205,7 +205,7 @@ int main(void)
#include "fort.hpp" #include "fort.hpp"
int main(void) int main(void)
{ {
fort::table table; fort::char_table table;
table << fort::header; table << fort::header;
/* Fill each cell with operator[] */ /* Fill each cell with operator[] */
table [0][0] = "N"; table [0][0] = "N";
@ -239,6 +239,76 @@ Output:
+---+---------+-------------+----------------+ +---+---------+-------------+----------------+
``` ```
### Working with multibyte-character-strings
`libfort` supports `wchar_t` and utf-8 strings. Here are simple examples of working with utf-8 strings:
```C
/* C API */
#include <stdio.h>
#include "fort.h"
int main(void)
{
ft_table_t *table = ft_create_table();
ft_set_border_style(table, FT_NICE_STYLE);
ft_set_cell_prop(table, FT_ANY_ROW, 0, FT_CPROP_TEXT_ALIGN, FT_ALIGNED_CENTER);
ft_set_cell_prop(table, FT_ANY_ROW, 1, FT_CPROP_TEXT_ALIGN, FT_ALIGNED_LEFT);
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
ft_u8write_ln(table, "Ранг", "Название", "Год", "Рейтинг");
ft_u8write_ln(table, "1", "Побег из Шоушенка", "1994", "9.5");
ft_u8write_ln(table, "2", "12 разгневанных мужчин", "1957", "8.8");
ft_u8write_ln(table, "3", "Космическая одиссея 2001 года", "1968", "8.5");
ft_u8write_ln(table, "4", "Бегущий по лезвию", "1982", "8.1");
printf("%s\n", (const char *)ft_to_u8string(table));
ft_destroy_table(table);
}
```
```C++
/* C++ API */
#include <iostream>
#include "fort.hpp"
int main(void)
{
fort::utf8_table table;
table.set_border_style(FT_NICE_STYLE);
table.column(0).set_cell_text_align(fort::text_align::center);
table.column(1).set_cell_text_align(fort::text_align::center);
table << fort::header
<< "Ранг" << "Название" << "Год" << "Рейтинг" << fort::endr
<< "1" << "Побег из Шоушенка" << "1994" << "9.5"<< fort::endr
<< "2" << "12 разгневанных мужчин" << "1957" << "8.8" << fort::endr
<< "3" << "Космическая одиссея 2001 года" << "1968" << "8.5" << fort::endr
<< "4" << "Бегущий по лезвию" << "1982" << "8.1" << fort::endr;
std::cout << table.to_string() << std::endl;
}
```
Output:
```text
╔══════╦═══════════════════════════════╦══════╦═════════╗
║ Ранг ║ Название ║ Год ║ Рейтинг ║
╠══════╬═══════════════════════════════╬══════╬═════════╣
║ 1 ║ Побег из Шоушенка ║ 1994 ║ 9.5 ║
║ 2 ║ 12 разгневанных мужчин ║ 1957 ║ 8.8 ║
║ 3 ║ Космическая одиссея 2001 года ║ 1968 ║ 8.5 ║
║ 4 ║ Бегущий по лезвию ║ 1982 ║ 8.1 ║
╚══════╩═══════════════════════════════╩══════╩═════════╝
```
Please note:
- `libfort` internally has a very simple logic to compute visible width of utf-8
strings. It considers that each codepoint will occupy one position on the
terminal in case of monowidth font (some east asians wide and fullwidth
characters (see http://www.unicode.org/reports/tr11/tr11-33.html) will occupy
2 positions). This logic is very simple and covers wide range of cases. But
obviously there a lot of cases when it is not sufficient. In such cases user
should use some external libraries and provide an appropriate function to
`libfort` via `ft_set_u8strwid_func` function.
## Supported platforms and compilers ## Supported platforms and compilers
The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/seleznevae/libfort), [AppVeyor](https://ci.appveyor.com/project/seleznevae/libfort) and [Cirrus](https://cirrus-ci.com/github/seleznevae/libfort): The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/seleznevae/libfort), [AppVeyor](https://ci.appveyor.com/project/seleznevae/libfort) and [Cirrus](https://cirrus-ci.com/github/seleznevae/libfort):

View File

@ -56,7 +56,7 @@ SOFTWARE.
/** /**
* libfort configuration macros * libfort configuration macros
* (to disable wchar_t/utf-8 support this macros should be defined) * (to disable wchar_t/UTF-8 support this macros should be defined)
*/ */
/** #define FT_CONGIG_DISABLE_WCHAR */ /** #define FT_CONGIG_DISABLE_WCHAR */
/** #define FT_CONGIG_DISABLE_UTF8 */ /** #define FT_CONGIG_DISABLE_UTF8 */
@ -916,9 +916,9 @@ int ft_u8printf_ln(ft_table_t *table, const char *fmt, ...) FT_PRINTF_ATTRIBUTE_
const void *ft_to_u8string(const ft_table_t *table); const void *ft_to_u8string(const ft_table_t *table);
/** /**
* Set custom function to compute visible width of utf8 string. * Set custom function to compute visible width of UTF-8 string.
* *
* libfort internally has a very simple logic to compute visible width of utf8 * libfort internally has a very simple logic to compute visible width of UTF-8
* strings. It considers that each codepoint will occupy one position on the * strings. It considers that each codepoint will occupy one position on the
* terminal in case of monowidth font (some east asians wide and fullwidth * terminal in case of monowidth font (some east asians wide and fullwidth
* characters (see http://www.unicode.org/reports/tr11/tr11-33.html) will occupy * characters (see http://www.unicode.org/reports/tr11/tr11-33.html) will occupy
@ -928,8 +928,8 @@ const void *ft_to_u8string(const ft_table_t *table);
* libfort. * libfort.
* *
* @param u8strwid * @param u8strwid
* User provided function to evaluate width of utf8 string ( beg - start of * User provided function to evaluate width of UTF-8 string ( beg - start of
* utf8 string, end - end of utf8 string (not included), width - pointer to * UTF-8 string, end - end of UTF-8 string (not included), width - pointer to
* the result). If function succeed it should return 0, otherwise some non- * the result). If function succeed it should return 0, otherwise some non-
* zero value. If function returns nonzero value libfort fallbacks to default * zero value. If function returns nonzero value libfort fallbacks to default
* internal algorithm. * internal algorithm.

View File

@ -56,7 +56,7 @@ SOFTWARE.
/** /**
* libfort configuration macros * libfort configuration macros
* (to disable wchar_t/utf-8 support this macros should be defined) * (to disable wchar_t/UTF-8 support this macros should be defined)
*/ */
/** #define FT_CONGIG_DISABLE_WCHAR */ /** #define FT_CONGIG_DISABLE_WCHAR */
/** #define FT_CONGIG_DISABLE_UTF8 */ /** #define FT_CONGIG_DISABLE_UTF8 */
@ -916,9 +916,9 @@ int ft_u8printf_ln(ft_table_t *table, const char *fmt, ...) FT_PRINTF_ATTRIBUTE_
const void *ft_to_u8string(const ft_table_t *table); const void *ft_to_u8string(const ft_table_t *table);
/** /**
* Set custom function to compute visible width of utf8 string. * Set custom function to compute visible width of UTF-8 string.
* *
* libfort internally has a very simple logic to compute visible width of utf8 * libfort internally has a very simple logic to compute visible width of UTF-8
* strings. It considers that each codepoint will occupy one position on the * strings. It considers that each codepoint will occupy one position on the
* terminal in case of monowidth font (some east asians wide and fullwidth * terminal in case of monowidth font (some east asians wide and fullwidth
* characters (see http://www.unicode.org/reports/tr11/tr11-33.html) will occupy * characters (see http://www.unicode.org/reports/tr11/tr11-33.html) will occupy
@ -928,8 +928,8 @@ const void *ft_to_u8string(const ft_table_t *table);
* libfort. * libfort.
* *
* @param u8strwid * @param u8strwid
* User provided function to evaluate width of utf8 string ( beg - start of * User provided function to evaluate width of UTF-8 string ( beg - start of
* utf8 string, end - end of utf8 string (not included), width - pointer to * UTF-8 string, end - end of UTF-8 string (not included), width - pointer to
* the result). If function succeed it should return 0, otherwise some non- * the result). If function succeed it should return 0, otherwise some non-
* zero value. If function returns nonzero value libfort fallbacks to default * zero value. If function returns nonzero value libfort fallbacks to default
* internal algorithm. * internal algorithm.