Mirai's Miscellaneous Misadventures

M38 / core / text-basic.c

1// copyright 2022 zamfofex
2// license: AGPLv3 or later
3
4#include <mimimi/text.h>
5
6static unsigned char mimimi_contains_code_point(unsigned long int *cps, unsigned long int cp)
7{
8	for (int i = 0 ; cps[i] != 0 ; i++)
9		if (cp == cps[i]) return 1;
10	return 0;
11}
12
13static unsigned char *mimimi_skip_until(unsigned char *text, unsigned long int *cps)
14{
15	for (;;)
16	{
17		unsigned long int cp = mimimi_code_point(text);
18		if (cp == 0) break;
19		if (mimimi_contains_code_point(cps, cp) != 0) break;
20		text = mimimi_skip_code_point(text);
21	}
22	return text;
23}
24
25static unsigned char *mimimi_skip_while(unsigned char *text, unsigned long int *cps)
26{
27	for (;;)
28	{
29		unsigned long int cp = mimimi_code_point(text);
30		if (cp == 0) break;
31		if (mimimi_contains_code_point(cps, cp) == 0) break;
32		text = mimimi_skip_code_point(text);
33	}
34	return text;
35}
36
37static unsigned long int mimimi_whitespace[] = {0x20, 0x09, 0x0A, 0x0D, 0};
38static unsigned long int mimimi_newline[] = {0x0A, 0x0D, 0};
39
40int mimimi_count_grapheme(unsigned char *text)
41{
42	return mimimi_count_code_point(text);
43}
44
45unsigned char *mimimi_skip_grapheme(unsigned char *text)
46{
47	return mimimi_skip_code_point(text);
48}
49
50int mimimi_count_word(unsigned char *text)
51{
52	return mimimi_skip_until(text, mimimi_whitespace) - text;
53}
54
55unsigned char *mimimi_skip_word(unsigned char *text)
56{
57	text = mimimi_skip_until(text, mimimi_whitespace);
58	text = mimimi_skip_while(text, mimimi_whitespace);
59	return text;
60}
61
62int mimimi_count_paragraph(unsigned char *text)
63{
64	return mimimi_skip_until(text, mimimi_newline) - text;
65}
66
67unsigned char *mimimi_skip_paragraph(unsigned char *text)
68{
69	text = mimimi_skip_until(text, mimimi_newline);
70	if (text[0] == 0x0D && text[1] == 0x0A) text++;
71	if (*text != 0) text++;
72	return text;
73}