@@ -312,7 +312,6 @@ void set_error(document* d, char* msg)
312// the name may be empty
312// the name may be empty
313str static inline parse_name(document* d)
313str static inline parse_name(document* d)
316 int start = doc_position(d);
315 int start = doc_position(d);
317 if (!is_name1(peek(d)))
316 if (!is_name1(peek(d)))
318 return start_length(start, 0);
317 return start_length(start, 0);
@@ -325,8 +324,11 @@ str static inline parse_name(document* d)
325str static inline parse_attrval(document* d)
324str static inline parse_attrval(document* d)
329+ set_error(d, "Expected = in attribute, but missing");
328− if (peek(d) != '=') return start_length(0,0);
330+ return start_length(0, 0);
331 char c = peek(d);
333 char c = peek(d);
332 if (c == '\"' || c == '\'')
334 if (c == '\"' || c == '\'')
@@ -342,7 +344,10 @@ str static inline parse_attrval(document* d)
342 return start_end(start, doc_position(d) - 1);
344 return start_end(start, doc_position(d) - 1);
345− return parse_name(d);
347+ {
348+ set_error(d, "Invalid attribute");
349+ return start_length(0, 0);
@@ -355,6 +360,7 @@ str static inline parse_attributes(document* d)
355 res.start = d->attrs.used;
360 res.start = d->attrs.used;
356 for (int i = 0; ; i++)
361 for (int i = 0; ; i++)
358 str name = parse_name(d);
364 str name = parse_name(d);
359 if (name.length == 0) break;
365 if (name.length == 0) break;
360 attr_alloc(&d->attrs, 1);
366 attr_alloc(&d->attrs, 1);
@@ -405,7 +411,6 @@ void static inline parse_tag(document* d)
405 if (peek(d) == '<' && peekAt(d, 1) == '/')
411 if (peek(d) == '<' && peekAt(d, 1) == '/')
407 skip(d, 2);
413 skip(d, 2);
409 if (d->end - d->cursor >= d->nodes.nodes[me].name.length &&
414 if (d->end - d->cursor >= d->nodes.nodes[me].name.length &&
410 memcmp(d->cursor, &d->body[d->nodes.nodes[me].name.start], d->nodes.nodes[me].name.length) == 0)
415 memcmp(d->cursor, &d->body[d->nodes.nodes[me].name.start], d->nodes.nodes[me].name.length) == 0)