Mirai's Miscellaneous Misadventures

M37 / core / text-basic.c

// copyright 2022 zamfofex
// license: AGPLv3 or later

#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;
}