static int parse_end_sequence(struct TestFile *tf, const char *kind, const char *name, size_t name_len) { char message[32] = "end "; char *tok; size_t len; strncpy(message + 4, kind, sizeof(message) - 4); if (expect_token(tf, "end", message)) return -1; // expect kind tok = next_token(tf, &len); assert(tok != NULL); if (tok == END_OF_LINE) { syntax_error(tf); return -1; } if (!same_token(kind, strlen(kind), tok, len)) { vfail(tf, tf->read_pos, "expected \"end %s\"", kind); return -1; } // check end name if given and present if (name) { tok = next_name(tf, &len); assert(tok != NULL); if (tok != END_OF_LINE && !same_token(name, name_len, tok, len)) { vfail(tf, tf->read_pos, "mismatched %s name", kind); return -1; } } return expect_eol(tf); }
void fail(int status, const char *file, unsigned line, const char *fmt, ...) { va_list ap; va_start(ap,fmt); vfail(status,file,line,fmt,ap); va_end(ap); }
static char *expect_name(struct TestFile *tf, size_t *len, const char *kind) { char *name = next_name(tf, len); if (!name || name == END_OF_LINE) { vfail(tf, tf->read_pos, "expected %s name", kind); return NULL; } return name; }
/*PRINTFLIKE1*/ void fail(const char *format, ...) { va_list alist; va_start(alist, format); vfail(format, alist); va_end(alist); }
static int expect_token(struct TestFile *tf, const char *expected, const char *message) { char *tok; size_t len; tok = next_token(tf, &len); assert(tok != NULL); if (tok == END_OF_LINE || !same_token(expected, strlen(expected),tok, len)) { vfail(tf, tf->read_pos, "\"%s\" expected", message); return -1; } return 0; }