table

Помоћни програм из командне линије за форматирање и приказ CSV-а
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 6e8fb424f85cbd8f37aca15f90067dae1abf2f22
родитељ bdf452c128d27253f37fad6d66452615fc6ad53e
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sun, 27 Sep 2020 22:12:31 +0200

Added better UTF-8 substring code based on screen columns

Diffstat:
MTODO | 6++++--
Mtable.c | 48+++++++++++++++++++++++++++++++++---------------
измењених датотека: 2, додавања: 37(+), брисања: 17(-)

diff --git a/TODO b/TODO @@ -1,7 +1,9 @@ Todo ==== -* Read and display columns +* v0.1-alpha -* Better UTF-8 substring code based on screen columns + [ ] Read and display columns + + [x] Better UTF-8 substring code based on screen columns diff --git a/table.c b/table.c @@ -84,23 +84,38 @@ substr(char* src, int start, int finish) } uint8_t* -u8_substr(uint8_t* src, int start, int finish) +u8_substr(uint8_t* src, size_t start, size_t finish) { - int len = u8_strlen(src); - if (finish > len) - finish = len; - int substr_len = finish-start; - if (substr_len < 0) - substr_len = 0; - uint8_t* result = (uint8_t*) malloc(sizeof(uint8_t) * (substr_len+1)); + uint8_t* substr; + size_t substr_len = 0; + uint8_t* psubstr; - for (int i = start; i < finish && *(src+i) != '\0'; i++) - { - *result++ = *(src+i); - } - *result = '\0'; + uint32_t tempbuf[BUFSIZE]; + size_t tempbuf_len = 0; + uint32_t* ptempbuf; - return result-substr_len; + uint32_t* substr_u32; + + ptempbuf = u8_to_u32(src, u8_strlen(src), tempbuf, &tempbuf_len); + + size_t normalized_finish = u8_width(src, BUFSIZE, "utf-8"); + if (finish < normalized_finish) + normalized_finish = finish; + size_t normalized_start = 0; + if (start >= normalized_start) + normalized_start = start; + if (normalized_start > normalized_finish) + normalized_start = normalized_finish; + size_t len = normalized_finish - normalized_start; + substr_u32 = u32_cpy_alloc(ptempbuf + start, len); + if (substr_u32[len-1] & 0x80) + substr_u32[len-1] = (uint32_t)'\0'; + substr = (uint8_t*) malloc(BUFSIZE); + psubstr = u32_to_u8(substr_u32, len, substr, &substr_len); + u8_cpy(substr, psubstr, substr_len); + substr[substr_len] = (uint8_t)'\0'; + + return substr; } int @@ -270,7 +285,10 @@ main(int argc, char** argv) /*uint8_t format[BUFSIZE];*/ /*sprintf(format, "%%%ds", cols-2);*/ uint8_t* cropped_line = u8_substr(line, 0, cols-2); - fprintf(stdout, "%s", cropped_line); + if (cropped_line) + { + fprintf(stdout, "%s", cropped_line); + } /*for (int i = 0; i < cols-2-u8_mblen(cropped_line, BUFSIZE); i++)*/ for (int i = 0; i < cols-2-u8_strwidth(cropped_line, "utf-8"); i++) /*for (int i = 0; i < cols-2-strlen(cropped_line); i++)*/