- while (amp || (c && c != '>'))
- c = ampr (get_byte, fh, &);
- if (c)
- c = ampr (get_byte, fh, &);
- continue;
+ int c0, amp0;
+
+ wrbuf_rewind(wrbuf);
+
+ c0 = ampr (get_byte, fh, &0);
+ if (amp0 == 0 && c0 == '\0')
+ break;
+ c = ampr (get_byte, fh, &);
+
+ if (amp0 == 0 && c0 == '-' && amp == 0 && c == '-')
+ {
+ /* COMMENT: <!-- ... --> */
+ int no_dash = 0;
+
+ c = ampr (get_byte, fh, &);
+ while (amp || c)
+ {
+ if (amp == 0 && c == '-')
+ no_dash++;
+ else if (amp == 0 && c == '>' && no_dash >= 2)
+ {
+ if (level > 0)
+ d1_stack[level] =
+ data1_mk_comment_n (
+ dh, m,
+ wrbuf_buf(wrbuf), wrbuf_len(wrbuf)-2,
+ d1_stack[level-1]);
+ c = ampr (get_byte, fh, &); /* skip > */
+ break;
+ }
+ else
+ no_dash = 0;
+ wrbuf_putc (wrbuf, c);
+ c = ampr (get_byte, fh, &);
+ }
+ continue;
+ }
+ else
+ { /* DIRECTIVE: <! .. > */
+
+ int blevel = 0;
+ while (amp || c)
+ {
+ if (amp == 0 && c == '>' && blevel == 0)
+ {
+ c = ampr (get_byte, fh, &);
+ break;
+ }
+ if (amp == 0 && c == '[')
+ blevel++;
+ if (amp == 0 && c == ']' && blevel > 0)
+ blevel--;
+ c = ampr (get_byte, fh, &);
+ }
+ continue;
+ }