+ FILE *src;
+ char *line;
+ size_t linelen = 0;
+
+ printf("Mode: progs.src\n");
+ src = util_fopen("progs.src", "rb");
+ if (!src) {
+ printf("failed to open `progs.src` for reading\n");
+ retval = 1;
+ goto cleanup;
+ }
+
+ line = NULL;
+ if (!progs_nextline(&line, &linelen, src) || !line[0]) {
+ printf("illformatted progs.src file: expected output filename in first line\n");
+ retval = 1;
+ goto srcdone;
+ }
+
+ if (!opts_output_wasset) {
+ opts_output = util_strdup(line);
+ opts_output_free = true;
+ }
+
+ if (opts_benchmark)
+ clock_gettime(CLOCK_MONOTONIC, &ta);
+ while (progs_nextline(&line, &linelen, src)) {
+ if (!line[0] || (line[0] == '/' && line[1] == '/'))
+ continue;
+ printf(" src: %s\n", line);
+ if (!parser_compile(line)) {
+ retval = 1;
+ goto srcdone;
+ }
+ }
+
+ if (opts_benchmark)
+ clock_gettime(CLOCK_MONOTONIC, &tb);
+ parser_finish(opts_output);
+ if (opts_benchmark)
+ clock_gettime(CLOCK_MONOTONIC, &tc);
+
+srcdone:
+ fclose(src);
+ mem_d(line);
+ }
+ if (opts_benchmark)
+ {
+ printf("started parsing at: %lu:%09lu\n", (unsigned long)ta.tv_sec, (unsigned long)ta.tv_nsec);
+ printf("started codegen at: %lu:%09lu\n", (unsigned long)tb.tv_sec, (unsigned long)tb.tv_nsec);
+ printf(" finished at: %lu:%09lu\n", (unsigned long)tc.tv_sec, (unsigned long)tc.tv_nsec);
+ {
+ size_t sec = tb.tv_sec - ta.tv_sec;
+ size_t nsec = (tb.tv_nsec + sec * 1000000000L) - ta.tv_nsec;
+ printf("Parsing took %lu\n", (unsigned long)nsec);
+ }
+ {
+ size_t sec = tc.tv_sec - tb.tv_sec;
+ size_t nsec = (tc.tv_nsec + sec * 1000000000L) - tb.tv_nsec;
+ printf("Codegen took %lu\n", (unsigned long)nsec);
+ }