jweinst1
2/14/2020 - 7:47 AM

new digit mining approach in C language

new digit mining approach in C language

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TO_DIGIT(d) (((d) >= '0' && (d) <= '9') ? (d) - '0' : -1)

#define TEST_TO_DIGIT(d) printf("digit of %c is %d\n", d, TO_DIGIT(d))


typedef struct {
	unsigned long cur;
	unsigned long max;
} UIntParser;

void UIntParser_init(UIntParser* prs, unsigned long max)
{
	prs->max = max;
	prs->cur = 0;
}

int UIntParser_consume(UIntParser* prs, const char* dat)
{
	long converted = TO_DIGIT(*dat);
	if (converted == -1 || prs->cur > prs->max)
		return 0;
	prs->cur *= 10;
	prs->cur += converted;
	return !(prs->cur > prs->max);
}

int main(int argc, char const *argv[])
{
	TEST_TO_DIGIT('4');
	TEST_TO_DIGIT('2');
	TEST_TO_DIGIT('r');

	UIntParser p;
	UIntParser_init(&p, 500);
	if (!UIntParser_consume(&p, "5")) fprintf(stderr, "%s\n", "FAILED");
	if (!UIntParser_consume(&p, "0")) fprintf(stderr, "%s\n", "FAILED");
	if (!UIntParser_consume(&p, "0")) fprintf(stderr, "%s\n", "FAILED");
	else printf("PASSED\n");
	return 0;
}