#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <errno.h>
struct Foo
{
int a;
int b;
int c;
int state;
};
void on_number(void *opaque, long value)
{
struct Foo* ctx = (struct Foo*)(opaque);
if (ctx->state == 0)
ctx->a = value;
if (ctx->state == 1)
ctx->b = value;
if (ctx->state == 2)
ctx->c = value;
ctx->state++;
}
void extract_numbers(const char *str, int base, void *opaque, void (*on_number_cb)(void*,long))
{
while (*str)
{
char *enptr = NULL;
long value
= strtol(str
, &enptr
, base
); if (str == enptr)
{
str++;
continue;
}
else
{
str = enptr;
}
if (on_number_cb)
on_number_cb(opaque, value);
}
}
int main(void)
{
const char* str = "5 used hard 4 label 10";
struct Foo ctx = {0};
extract_numbers(str, 10, &ctx, on_number);
printf("ctx.a = %d, ctx.b = %d, ctx.c = %d\n", ctx.
a, ctx.
b, ctx.
c);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCnN0cnVjdCBGb28KewoJaW50IGE7CglpbnQgYjsKCWludCBjOwoJCglpbnQgc3RhdGU7Cn07Cgp2b2lkIG9uX251bWJlcih2b2lkICpvcGFxdWUsIGxvbmcgdmFsdWUpCnsKCWFzc2VydChvcGFxdWUpOwoJc3RydWN0IEZvbyogY3R4ID0gKHN0cnVjdCBGb28qKShvcGFxdWUpOwoJaWYgKGN0eC0+c3RhdGUgPT0gMCkKCQljdHgtPmEgPSB2YWx1ZTsKCWlmIChjdHgtPnN0YXRlID09IDEpCgkJY3R4LT5iID0gdmFsdWU7CglpZiAoY3R4LT5zdGF0ZSA9PSAyKQoJCWN0eC0+YyA9IHZhbHVlOwoJY3R4LT5zdGF0ZSsrOwp9Cgp2b2lkIGV4dHJhY3RfbnVtYmVycyhjb25zdCBjaGFyICpzdHIsIGludCBiYXNlLCB2b2lkICpvcGFxdWUsIHZvaWQgKCpvbl9udW1iZXJfY2IpKHZvaWQqLGxvbmcpKQp7Cgl3aGlsZSAoKnN0cikgCgl7CgkJY2hhciAqZW5wdHIgPSBOVUxMOwoJCWxvbmcgIHZhbHVlID0gc3RydG9sKHN0ciwgJmVucHRyLCBiYXNlKTsKCQlpZiAoc3RyID09IGVucHRyKSAKCQl7CgkJCXN0cisrOwoJCQljb250aW51ZTsKCQl9CgkJZWxzZQoJCXsKCQkJc3RyID0gZW5wdHI7CgkJfQoKCQlpZiAob25fbnVtYmVyX2NiKQoJCQlvbl9udW1iZXJfY2Iob3BhcXVlLCB2YWx1ZSk7Cgl9Cn0KCmludCBtYWluKHZvaWQpIAp7CQoJY29uc3QgY2hhciogc3RyID0gIjUgdXNlZCBoYXJkIDQgbGFiZWwgMTAiOwoJc3RydWN0IEZvbyAgY3R4ID0gezB9OwoJCglleHRyYWN0X251bWJlcnMoc3RyLCAxMCwgJmN0eCwgb25fbnVtYmVyKTsKCQoJcHJpbnRmKCJjdHguYSA9ICVkLCBjdHguYiA9ICVkLCBjdHguYyA9ICVkXG4iLCBjdHguYSwgY3R4LmIsIGN0eC5jKTsKCQoJcmV0dXJuIDA7Cn0K