#include <stdio.h>
#include <string.h>
-static int robert=14;
+static u64 robert=14;
static int spalek=-3;
static char *heslo="prazdne";
static int nastaveni1=0,nastaveni2=1;
static struct cfitem jmeno[]={
{"jmeno", CT_SECTION, NULL},
- {"robert", CT_INT, &robert},
+ {"robert", CT_U64, &robert},
{"spalek", CT_INT, &spalek},
{"heslo", CT_STRING, &heslo},
{"nastaveni1", CT_FUNCTION, &set_nastaveni},
printf ("\n");
}
- printf("robert=%d, spalek=%d, heslo=%s, nastaveni1/2=%d/%d decker=%f\n",
- robert,spalek,heslo,nastaveni1,nastaveni2,decker);
+ printf("robert=%Ld, spalek=%d, heslo=%s, nastaveni1/2=%d/%d decker=%f\n",
+ (long long)robert,spalek,heslo,nastaveni1,nastaveni2,decker);
printf("vek=%d, vyska=%d, vaha=%d\n",
vek,vyska,vaha);
return msg;
}
+byte *cf_parse_u64(byte *value, u64 *varp)
+{
+ char *msg = NULL;
+ const struct unit *u;
+
+ if (!*value)
+ msg = "Missing number";
+ else {
+ errno = 0;
+ char *end;
+ u64 x = strtoull(value, &end, 0);
+ if (errno == ERANGE)
+ msg = cf_rngerr;
+ else if (u = cf_lookup_unit(value, end, &msg)) {
+ if (x > ~(u64)0 / u->num)
+ msg = "Number out of range";
+ else {
+ x *= u->num;
+ if (x % u->den)
+ msg = "Number is not an integer";
+ else
+ *varp = x / u->den;
+ }
+ } else
+ *varp = x;
+ }
+ return msg;
+}
+
byte *cf_parse_double(byte *value, double *varp)
{
char *msg = NULL;
case CT_DOUBLE:
msg = cf_parse_double(value, (double *) item->var);
break;
+ case CT_U64:
+ msg = cf_parse_u64(value, (u64 *) item->var);
+ break;
default:
msg = "Unknown keyword";
}
* function.
*/
-enum cftype { CT_STOP, CT_SECTION, CT_INCOMPLETE_SECTION, CT_INT, CT_STRING, CT_FUNCTION, CT_DOUBLE };
+enum cftype { CT_STOP, CT_SECTION, CT_INCOMPLETE_SECTION, CT_INT, CT_STRING, CT_FUNCTION, CT_DOUBLE, CT_U64 };
struct cfitem {
byte *name;
*/
byte *cf_parse_int(byte *value, uns *varp);
+byte *cf_parse_u64(byte *value, u64 *varp);
byte *cf_parse_double(byte *value, double *varp);
/*