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