diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-01-21 03:03:58 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-01-21 03:03:58 +0100 |
commit | 4f93f935dc7a981ca073a322425c3f5929ffb644 (patch) | |
tree | 4460586408ec7fdfcecf3ba4584f0435067125a6 /vendor/librune/test/gbrk.c | |
parent | 72ea25a4d73e3e026366d4165f5bc4ec9e7418cb (diff) |
Support line- & column-based match locations
Diffstat (limited to 'vendor/librune/test/gbrk.c')
-rw-r--r-- | vendor/librune/test/gbrk.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/vendor/librune/test/gbrk.c b/vendor/librune/test/gbrk.c new file mode 100644 index 0000000..ad32fdd --- /dev/null +++ b/vendor/librune/test/gbrk.c @@ -0,0 +1,85 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> + +#include <gbrk.h> +#include <rune.h> +#include <utf8.h> + +#define die(...) err(EXIT_FAILURE, __VA_ARGS__) + +static void test(char *); + +int +main(int argc, char **argv) +{ + char *line = NULL; + size_t n; + ssize_t nr; + FILE *fp; + + setlocale(LC_ALL, ""); + + if (argc != 2) { + fprintf(stderr, "%s: file\n", *argv); + exit(EXIT_FAILURE); + } + + if (!(fp = fopen(argv[1], "r"))) + die("fopen"); + + while ((nr = getline(&line, &n, fp)) > 0) { + line[nr - 1] = 0; + test(line); + } + + if (nr == -1 && ferror(fp)) + die("getline"); + + fclose(fp); + free(line); + return EXIT_SUCCESS; +} + +void +test(char *raw) +{ + int n; + rune ch; + char8_t *p, *buf; + const char8_t *s; + size_t bufsiz = 4096; + struct grapheme graph; + + if (!(buf = malloc(bufsiz))) + die("malloc"); + + p = buf; + while (sscanf(raw, "%" SCNxRUNE "%n", &ch, &n)) { + rune sep; + p += rtou8(p, ch, bufsiz - (p - buf)); + raw += n; + raw += u8tor(&sep, (char8_t *)raw); + if (!sep) + break; + } + *p = 0; + + s = buf; + while (u8gnext(&graph, &s, &bufsiz) && *graph.p) { + rune ch; + const char8_t *p; + + while (u8next(&ch, &graph.p, &graph.len) && ch) { + printf("%04" PRIXRUNE "%s", ch, graph.len > 0 ? "×" : ""); + p = graph.p; + } + if (bufsiz && *p) + fputs("÷", stdout); + } + + putchar('\n'); + free(buf); +} |