/* Entered after the "<!DOCTYPE" sequence. Ready to read the rest. */ static char read_doctype(SaxDrive dr) { int line = dr->buf.line; int col = dr->buf.col - 10; char *s; buf_backup(&dr->buf); /* back up to the start in case the cdata is empty */ buf_protect(&dr->buf); read_delimited(dr, '>'); if (dr->options.smart && 0 == dr->hints) { for (s = dr->buf.str; is_white(*s); s++) { } if (0 == strncasecmp("HTML", s, 4)) { dr->hints = ox_hints_html(); } } *(dr->buf.tail - 1) = '\0'; if (dr->has.doctype) { VALUE args[1]; if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } args[0] = rb_str_new2(dr->buf.str); rb_funcall2(dr->handler, ox_doctype_id, 1, args); } dr->buf.str = 0; return buf_get(&dr->buf); }
static char read_delimited(SaxDrive dr, char end) { char c; if ('"' == end || '\'' == end) { while (end != (c = buf_get(&dr->buf))) { if ('\0' == c) { ox_sax_drive_error(dr, NO_TERM "doctype not terminated"); return c; } } } else { while (1) { c = buf_get(&dr->buf); if (end == c) { return c; } switch (c) { case '\0': ox_sax_drive_error(dr, NO_TERM "doctype not terminated"); return c; case '"': c = read_delimited(dr, c); break; case '\'': c = read_delimited(dr, c); break; case '[': c = read_delimited(dr, ']'); break; case '<': c = read_delimited(dr, '>'); break; default: break; } } } return c; }
static clj_Result read_set(clj_Reader *r, wint_t initch) { return read_delimited(CLJ_SET, r, L"#{", L'}'); }
static clj_Result read_map(clj_Reader *r, wint_t initch) { return read_delimited(CLJ_MAP, r, L"{", L'}'); }
static clj_Result read_vector(clj_Reader *r, wint_t initch) { return read_delimited(CLJ_VECTOR, r, L"[", L']'); }
static clj_Result read_list(clj_Reader *r, wint_t initch) { return read_delimited(CLJ_LIST, r, L"(", L')'); }