static int print_line(FILE * stream, const char *buf, int def_path_no) { const char *tmp; const char *phrase; int i = 0; int retval = 0; #define PHRASE_LEN 1000 char phrase_name[PHRASE_LEN]; while (1) { phrase_name[0] = '\0'; if (!(phrase = find_at_phrases(buf))) { fputs(buf, stream); return retval; } /* write all chars up to the beginning '@' thingie to stream */ for (tmp = buf; tmp < phrase; tmp++) fputc(*tmp, stream); /* copy Phrase to phrase_name */ i = 0; for (tmp = phrase + 1; *tmp != '@' && i < PHRASE_LEN; tmp++) { phrase_name[i++] = *tmp; } phrase_name[i] = '\0'; /* pasrse Phrase */ retval |= parse_phrase(stream, phrase_name, def_path_no); /* re-adjust output buffer */ buf = tmp + 1; } }
int parse(size_t len, char addr[len]) { int err; buffer_t buffer = { addr, len, 0 }; while (nextchar(&buffer)) { -- buffer.addr; ++ buffer.len; err = parse_phrase(&buffer); if (err) goto ONERR; } return 0; ONERR: return err; }