Mirai's Miscellaneous Misadventures
M38 / core / text-basic.c
1
2
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}