+/*
+ * Implement the predef subsystem now. We can do this safely with the
+ * help of lexer contexts.
+ */
+static uint32_t ftepp_predef_countval = 0;
+static uint32_t ftepp_predef_randval = 0;
+
+/* __DATE__ */
+char *ftepp_predef_date(lex_file *context) {
+ struct tm *itime;
+ time_t rtime;
+ char *value = mem_a(82);
+ /* 82 is enough for strftime but we also have " " in our string */
+
+ (void)context;
+
+ /* get time */
+ time (&rtime);
+ itime = localtime(&rtime);
+
+ strftime(value, 82, "\"%b %d %Y\"", itime);
+
+ return value;
+}
+
+/* __TIME__ */
+char *ftepp_predef_time(lex_file *context) {
+ struct tm *itime;
+ time_t rtime;
+ char *value = mem_a(82);
+ /* 82 is enough for strftime but we also have " " in our string */
+
+ (void)context;
+
+ /* get time */
+ time (&rtime);
+ itime = localtime(&rtime);
+
+ strftime(value, 82, "\"%X\"", itime);
+
+ return value;
+}
+
+/* __LINE__ */
+char *ftepp_predef_line(lex_file *context) {
+ char *value;
+ util_asprintf(&value, "%d", (int)context->line);
+ return value;
+}
+/* __FILE__ */
+char *ftepp_predef_file(lex_file *context) {
+ size_t length = strlen(context->name) + 3; /* two quotes and a terminator */
+ char *value = (char*)mem_a(length);
+ memset (value, 0, length);
+ sprintf(value, "\"%s\"", context->name);
+
+ return value;
+}
+/* __COUNTER_LAST__ */
+char *ftepp_predef_counterlast(lex_file *context) {
+ char *value;
+ util_asprintf(&value, "%u", ftepp_predef_countval);
+
+ (void)context;
+ return value;
+}
+/* __COUNTER__ */
+char *ftepp_predef_counter(lex_file *context) {
+ char *value;
+ ftepp_predef_countval ++;
+ util_asprintf(&value, "%u", ftepp_predef_countval);
+ (void)context;
+
+ return value;
+}
+/* __RANDOM__ */
+char *ftepp_predef_random(lex_file *context) {
+ char *value;
+ ftepp_predef_randval = (util_rand() % 0xFF) + 1;
+ util_asprintf(&value, "%u", ftepp_predef_randval);
+
+ (void)context;
+ return value;
+}
+/* __RANDOM_LAST__ */
+char *ftepp_predef_randomlast(lex_file *context) {
+ char *value;
+ util_asprintf(&value, "%u", ftepp_predef_randval);
+
+ (void)context;
+ return value;
+}
+
+const ftepp_predef_t ftepp_predefs[FTEPP_PREDEF_COUNT] = {
+ { "__LINE__", &ftepp_predef_line },
+ { "__FILE__", &ftepp_predef_file },
+ { "__COUNTER__", &ftepp_predef_counter },
+ { "__COUNTER_LAST__", &ftepp_predef_counterlast },
+ { "__RANDOM__", &ftepp_predef_random },
+ { "__RANDOM_LAST__", &ftepp_predef_randomlast },
+ { "__DATE__", &ftepp_predef_date },
+ { "__TIME__", &ftepp_predef_time }
+};
+