@@ -312,7 +312,6 @@ void set_error(document* d, char* msg)
312312// the name may be empty
313313str static inline parse_name(document* d)
314314{
315− trim(d);
316315 int start = doc_position(d);
317316 if (!is_name1(peek(d)))
318317 return start_length(start, 0);
@@ -325,8 +324,11 @@ str static inline parse_name(document* d)
325324str static inline parse_attrval(document* d)
326325{
327326 trim(d);
328− if (peek(d) != '=') return start_length(0,0);
329− skip(d, 1);
327+ if (get(d) != '=')
328+ {
329+ set_error(d, "Expected = in attribute, but missing");
330+ return start_length(0, 0);
331+ }
330332 trim(d);
331333 char c = peek(d);
332334 if (c == '\"' || c == '\'')
@@ -342,7 +344,10 @@ str static inline parse_attrval(document* d)
342344 return start_end(start, doc_position(d) - 1);
343345 }
344346 else
345− return parse_name(d);
347+ {
348+ set_error(d, "Invalid attribute");
349+ return start_length(0, 0);
350+ }
346351}
347352
348353
@@ -355,6 +360,7 @@ str static inline parse_attributes(document* d)
355360 res.start = d->attrs.used;
356361 for (int i = 0; ; i++)
357362 {
363+ trim(d);
358364 str name = parse_name(d);
359365 if (name.length == 0) break;
360366 attr_alloc(&d->attrs, 1);
@@ -405,7 +411,6 @@ void static inline parse_tag(document* d)
405411 if (peek(d) == '<' && peekAt(d, 1) == '/')
406412 {
407413 skip(d, 2);
408− trim(d);
409414 if (d->end - d->cursor >= d->nodes.nodes[me].name.length &&
410415 memcmp(d->cursor, &d->body[d->nodes.nodes[me].name.start], d->nodes.nodes[me].name.length) == 0)
411416 {