Mirai's Miscellaneous Misadventures
M40 / core / text-basic.c
#include <mimimi/text.h>
static unsigned char mimimi_contains_code_point(unsigned long int *cps, unsigned long int cp)
{
for (int i = 0 ; cps[i] != 0 ; i++)
if (cp == cps[i]) return 1;
return 0;
}
static unsigned char *mimimi_skip_until(unsigned char *text, unsigned long int *cps)
{
for (;;)
{
unsigned long int cp = mimimi_code_point(text);
if (cp == 0) break;
if (mimimi_contains_code_point(cps, cp) != 0) break;
text = mimimi_skip_code_point(text);
}
return text;
}
static unsigned char *mimimi_skip_while(unsigned char *text, unsigned long int *cps)
{
for (;;)
{
unsigned long int cp = mimimi_code_point(text);
if (cp == 0) break;
if (mimimi_contains_code_point(cps, cp) == 0) break;
text = mimimi_skip_code_point(text);
}
return text;
}
static unsigned long int mimimi_whitespace[] = {0x20, 0x09, 0x0A, 0x0D, 0};
static unsigned long int mimimi_newline[] = {0x0A, 0x0D, 0};
int mimimi_count_grapheme(unsigned char *text)
{
return mimimi_count_code_point(text);
}
unsigned char *mimimi_skip_grapheme(unsigned char *text)
{
return mimimi_skip_code_point(text);
}
int mimimi_count_word(unsigned char *text)
{
return mimimi_skip_until(text, mimimi_whitespace) - text;
}
unsigned char *mimimi_skip_word(unsigned char *text)
{
text = mimimi_skip_until(text, mimimi_whitespace);
text = mimimi_skip_while(text, mimimi_whitespace);
return text;
}
int mimimi_count_paragraph(unsigned char *text)
{
return mimimi_skip_until(text, mimimi_newline) - text;
}
unsigned char *mimimi_skip_paragraph(unsigned char *text)
{
text = mimimi_skip_until(text, mimimi_newline);
if (text[0] == 0x0D && text[1] == 0x0A) text++;
if (*text != 0) text++;
return text;
}