|
Packit Service |
384592 |
#include "libinjection_html5.h"
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
#include <string.h>
|
|
Packit Service |
384592 |
#include <assert.h>
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
#ifdef DEBUG
|
|
Packit Service |
384592 |
#include <stdio.h>
|
|
Packit Service |
384592 |
#define TRACE() printf("%s:%d\n", __FUNCTION__, __LINE__)
|
|
Packit Service |
384592 |
#else
|
|
Packit Service |
384592 |
#define TRACE()
|
|
Packit Service |
384592 |
#endif
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
#define CHAR_EOF -1
|
|
Packit Service |
384592 |
#define CHAR_NULL 0
|
|
Packit Service |
384592 |
#define CHAR_BANG 33
|
|
Packit Service |
384592 |
#define CHAR_DOUBLE 34
|
|
Packit Service |
384592 |
#define CHAR_PERCENT 37
|
|
Packit Service |
384592 |
#define CHAR_SINGLE 39
|
|
Packit Service |
384592 |
#define CHAR_DASH 45
|
|
Packit Service |
384592 |
#define CHAR_SLASH 47
|
|
Packit Service |
384592 |
#define CHAR_LT 60
|
|
Packit Service |
384592 |
#define CHAR_EQUALS 61
|
|
Packit Service |
384592 |
#define CHAR_GT 62
|
|
Packit Service |
384592 |
#define CHAR_QUESTION 63
|
|
Packit Service |
384592 |
#define CHAR_RIGHTB 93
|
|
Packit Service |
384592 |
#define CHAR_TICK 96
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* prototypes */
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_skip_white(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_is_white(char c);
|
|
Packit Service |
384592 |
static int h5_state_eof(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_data(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_tag_open(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_tag_name(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_tag_name_close(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_end_tag_open(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_self_closing_start_tag(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_attribute_name(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_after_attribute_name(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_before_attribute_name(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_before_attribute_value(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_attribute_value_double_quote(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_attribute_value_single_quote(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_attribute_value_back_quote(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_attribute_value_no_quote(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_after_attribute_value_quoted_state(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_comment(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_cdata(h5_state_t* hs);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* 12.2.4.44 */
|
|
Packit Service |
384592 |
static int h5_state_bogus_comment(h5_state_t* hs);
|
|
Packit Service |
384592 |
static int h5_state_bogus_comment2(h5_state_t* hs);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* 12.2.4.45 */
|
|
Packit Service |
384592 |
static int h5_state_markup_declaration_open(h5_state_t* hs);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* 8.2.4.52 */
|
|
Packit Service |
384592 |
static int h5_state_doctype(h5_state_t* hs);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* public function
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
void libinjection_h5_init(h5_state_t* hs, const char* s, size_t len, enum html5_flags flags)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
memset(hs, 0, sizeof(h5_state_t));
|
|
Packit Service |
384592 |
hs->s = s;
|
|
Packit Service |
384592 |
hs->len = len;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
switch (flags) {
|
|
Packit Service |
384592 |
case DATA_STATE:
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
break;
|
|
Packit Service |
384592 |
case VALUE_NO_QUOTE:
|
|
Packit Service |
384592 |
hs->state = h5_state_before_attribute_name;
|
|
Packit Service |
384592 |
break;
|
|
Packit Service |
384592 |
case VALUE_SINGLE_QUOTE:
|
|
Packit Service |
384592 |
hs->state = h5_state_attribute_value_single_quote;
|
|
Packit Service |
384592 |
break;
|
|
Packit Service |
384592 |
case VALUE_DOUBLE_QUOTE:
|
|
Packit Service |
384592 |
hs->state = h5_state_attribute_value_double_quote;
|
|
Packit Service |
384592 |
break;
|
|
Packit Service |
384592 |
case VALUE_BACK_QUOTE:
|
|
Packit Service |
384592 |
hs->state = h5_state_attribute_value_back_quote;
|
|
Packit Service |
384592 |
break;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* public function
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
int libinjection_h5_next(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
assert(hs->state != NULL);
|
|
Packit Service |
384592 |
return (*hs->state)(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* Everything below here is private
|
|
Packit Service |
384592 |
*
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_is_white(char ch)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
/*
|
|
Packit Service |
384592 |
* \t = horizontal tab = 0x09
|
|
Packit Service |
384592 |
* \n = newline = 0x0A
|
|
Packit Service |
384592 |
* \v = vertical tab = 0x0B
|
|
Packit Service |
384592 |
* \f = form feed = 0x0C
|
|
Packit Service |
384592 |
* \r = cr = 0x0D
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
return strchr(" \t\n\v\f\r", ch) != NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_skip_white(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
while (hs->pos < hs->len) {
|
|
Packit Service |
384592 |
ch = hs->s[hs->pos];
|
|
Packit Service |
384592 |
switch (ch) {
|
|
Packit Service |
384592 |
case 0x00: /* IE only */
|
|
Packit Service |
384592 |
case 0x20:
|
|
Packit Service |
384592 |
case 0x09:
|
|
Packit Service |
384592 |
case 0x0A:
|
|
Packit Service |
384592 |
case 0x0B: /* IE only */
|
|
Packit Service |
384592 |
case 0x0C:
|
|
Packit Service |
384592 |
case 0x0D: /* IE only */
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
break;
|
|
Packit Service |
384592 |
default:
|
|
Packit Service |
384592 |
return ch;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
return CHAR_EOF;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_state_eof(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
/* eliminate unused function argument warning */
|
|
Packit Service |
384592 |
(void)hs;
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_state_data(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
assert(hs->len >= hs->pos);
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + hs->pos, CHAR_LT, hs->len - hs->pos);
|
|
Packit Service |
384592 |
if (idx == NULL) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = DATA_TEXT;
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
if (hs->token_len == 0) {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = DATA_TEXT;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
hs->state = h5_state_tag_open;
|
|
Packit Service |
384592 |
if (hs->token_len == 0) {
|
|
Packit Service |
384592 |
return h5_state_tag_open(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12 2.4.8
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_tag_open(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
if (hs->pos >= hs->len) {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
ch = hs->s[hs->pos];
|
|
Packit Service |
384592 |
if (ch == CHAR_BANG) {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_markup_declaration_open(hs);
|
|
Packit Service |
384592 |
} else if (ch == CHAR_SLASH) {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
hs->is_close = 1;
|
|
Packit Service |
384592 |
return h5_state_end_tag_open(hs);
|
|
Packit Service |
384592 |
} else if (ch == CHAR_QUESTION) {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_bogus_comment(hs);
|
|
Packit Service |
384592 |
} else if (ch == CHAR_PERCENT) {
|
|
Packit Service |
384592 |
/* this is not in spec.. alternative comment format used
|
|
Packit Service |
384592 |
by IE <= 9 and Safari < 4.0.3 */
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_bogus_comment2(hs);
|
|
Packit Service |
384592 |
} else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
|
|
Packit Service |
384592 |
return h5_state_tag_name(hs);
|
|
Packit Service |
384592 |
} else if (ch == CHAR_NULL) {
|
|
Packit Service |
384592 |
/* IE-ism NULL characters are ignored */
|
|
Packit Service |
384592 |
return h5_state_tag_name(hs);
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
/* user input mistake in configuring state */
|
|
Packit Service |
384592 |
if (hs->pos == 0) {
|
|
Packit Service |
384592 |
return h5_state_data(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos - 1;
|
|
Packit Service |
384592 |
hs->token_len = 1;
|
|
Packit Service |
384592 |
hs->token_type = DATA_TEXT;
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.9
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_end_tag_open(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (hs->pos >= hs->len) {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
ch = hs->s[hs->pos];
|
|
Packit Service |
384592 |
if (ch == CHAR_GT) {
|
|
Packit Service |
384592 |
return h5_state_data(hs);
|
|
Packit Service |
384592 |
} else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
|
|
Packit Service |
384592 |
return h5_state_tag_name(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hs->is_close = 0;
|
|
Packit Service |
384592 |
return h5_state_bogus_comment(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
/*
|
|
Packit Service |
384592 |
*
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_tag_name_close(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
hs->is_close = 0;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = 1;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_CLOSE;
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
if (hs->pos < hs->len) {
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.10
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_tag_name(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
size_t pos;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
pos = hs->pos;
|
|
Packit Service |
384592 |
while (pos < hs->len) {
|
|
Packit Service |
384592 |
ch = hs->s[pos];
|
|
Packit Service |
384592 |
if (ch == 0) {
|
|
Packit Service |
384592 |
/* special non-standard case */
|
|
Packit Service |
384592 |
/* allow nulls in tag name */
|
|
Packit Service |
384592 |
/* some old browsers apparently allow and ignore them */
|
|
Packit Service |
384592 |
pos += 1;
|
|
Packit Service |
384592 |
} else if (h5_is_white(ch)) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_OPEN;
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
hs->state = h5_state_before_attribute_name;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if (ch == CHAR_SLASH) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_OPEN;
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
hs->state = h5_state_self_closing_start_tag;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if (ch == CHAR_GT) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
if (hs->is_close) {
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
hs->is_close = 0;
|
|
Packit Service |
384592 |
hs->token_type = TAG_CLOSE;
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
hs->pos = pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_OPEN;
|
|
Packit Service |
384592 |
hs->state = h5_state_tag_name_close;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
pos += 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_OPEN;
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.34
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_before_attribute_name(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
int ch;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
ch = h5_skip_white(hs);
|
|
Packit Service |
384592 |
switch (ch) {
|
|
Packit Service |
384592 |
case CHAR_EOF: {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
case CHAR_SLASH: {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_self_closing_start_tag(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
case CHAR_GT: {
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = 1;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_CLOSE;
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
default: {
|
|
Packit Service |
384592 |
return h5_state_attribute_name(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_state_attribute_name(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
size_t pos;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
pos = hs->pos + 1;
|
|
Packit Service |
384592 |
while (pos < hs->len) {
|
|
Packit Service |
384592 |
ch = hs->s[pos];
|
|
Packit Service |
384592 |
if (h5_is_white(ch)) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_NAME;
|
|
Packit Service |
384592 |
hs->state = h5_state_after_attribute_name;
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if (ch == CHAR_SLASH) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_NAME;
|
|
Packit Service |
384592 |
hs->state = h5_state_self_closing_start_tag;
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if (ch == CHAR_EQUALS) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_NAME;
|
|
Packit Service |
384592 |
hs->state = h5_state_before_attribute_value;
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if (ch == CHAR_GT) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_NAME;
|
|
Packit Service |
384592 |
hs->state = h5_state_tag_name_close;
|
|
Packit Service |
384592 |
hs->pos = pos;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
pos += 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
/* EOF */
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_NAME;
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->pos = hs->len;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.36
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_after_attribute_name(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
int c;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
c = h5_skip_white(hs);
|
|
Packit Service |
384592 |
switch (c) {
|
|
Packit Service |
384592 |
case CHAR_EOF: {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
case CHAR_SLASH: {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_self_closing_start_tag(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
case CHAR_EQUALS: {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_before_attribute_value(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
case CHAR_GT: {
|
|
Packit Service |
384592 |
return h5_state_tag_name_close(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
default: {
|
|
Packit Service |
384592 |
return h5_state_attribute_name(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.37
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_before_attribute_value(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
int c;
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
c = h5_skip_white(hs);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (c == CHAR_EOF) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (c == CHAR_DOUBLE) {
|
|
Packit Service |
384592 |
return h5_state_attribute_value_double_quote(hs);
|
|
Packit Service |
384592 |
} else if (c == CHAR_SINGLE) {
|
|
Packit Service |
384592 |
return h5_state_attribute_value_single_quote(hs);
|
|
Packit Service |
384592 |
} else if (c == CHAR_TICK) {
|
|
Packit Service |
384592 |
/* NON STANDARD IE */
|
|
Packit Service |
384592 |
return h5_state_attribute_value_back_quote(hs);
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
return h5_state_attribute_value_no_quote(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_state_attribute_value_quote(h5_state_t* hs, char qchar)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* skip initial quote in normal case.
|
|
Packit Service |
384592 |
* don't do this "if (pos == 0)" since it means we have started
|
|
Packit Service |
384592 |
* in a non-data state. given an input of '>
|
|
Packit Service |
384592 |
* we want to make 0-length attribute name
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
if (hs->pos > 0) {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + hs->pos, qchar, hs->len - hs->pos);
|
|
Packit Service |
384592 |
if (idx == NULL) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_VALUE;
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_VALUE;
|
|
Packit Service |
384592 |
hs->state = h5_state_after_attribute_value_quoted_state;
|
|
Packit Service |
384592 |
hs->pos += hs->token_len + 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static
|
|
Packit Service |
384592 |
int h5_state_attribute_value_double_quote(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
return h5_state_attribute_value_quote(hs, CHAR_DOUBLE);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static
|
|
Packit Service |
384592 |
int h5_state_attribute_value_single_quote(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
return h5_state_attribute_value_quote(hs, CHAR_SINGLE);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static
|
|
Packit Service |
384592 |
int h5_state_attribute_value_back_quote(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
return h5_state_attribute_value_quote(hs, CHAR_TICK);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_state_attribute_value_no_quote(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
size_t pos;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
pos = hs->pos;
|
|
Packit Service |
384592 |
while (pos < hs->len) {
|
|
Packit Service |
384592 |
ch = hs->s[pos];
|
|
Packit Service |
384592 |
if (h5_is_white(ch)) {
|
|
Packit Service |
384592 |
hs->token_type = ATTR_VALUE;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = pos + 1;
|
|
Packit Service |
384592 |
hs->state = h5_state_before_attribute_name;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if (ch == CHAR_GT) {
|
|
Packit Service |
384592 |
hs->token_type = ATTR_VALUE;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = pos - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = pos;
|
|
Packit Service |
384592 |
hs->state = h5_state_tag_name_close;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
pos += 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
/* EOF */
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = ATTR_VALUE;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.41
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_after_attribute_value_quoted_state(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
if (hs->pos >= hs->len) {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
ch = hs->s[hs->pos];
|
|
Packit Service |
384592 |
if (h5_is_white(ch)) {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_before_attribute_name(hs);
|
|
Packit Service |
384592 |
} else if (ch == CHAR_SLASH) {
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return h5_state_self_closing_start_tag(hs);
|
|
Packit Service |
384592 |
} else if (ch == CHAR_GT) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = 1;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_CLOSE;
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
return h5_state_before_attribute_name(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.43
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_self_closing_start_tag(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
if (hs->pos >= hs->len) {
|
|
Packit Service |
384592 |
return 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
ch = hs->s[hs->pos];
|
|
Packit Service |
384592 |
if (ch == CHAR_GT) {
|
|
Packit Service |
384592 |
assert(hs->pos > 0);
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos -1;
|
|
Packit Service |
384592 |
hs->token_len = 2;
|
|
Packit Service |
384592 |
hs->token_type = TAG_NAME_SELFCLOSE;
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
hs->pos += 1;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
return h5_state_before_attribute_name(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.44
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_bogus_comment(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + hs->pos, CHAR_GT, hs->len - hs->pos);
|
|
Packit Service |
384592 |
if (idx == NULL) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = hs->len;
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.44 ALT
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_bogus_comment2(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
size_t pos;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
pos = hs->pos;
|
|
Packit Service |
384592 |
while (1) {
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + pos, CHAR_PERCENT, hs->len - pos);
|
|
Packit Service |
384592 |
if (idx == NULL || (idx + 1 >= hs->s + hs->len)) {
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = hs->len;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (*(idx +1) != CHAR_GT) {
|
|
Packit Service |
384592 |
pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
continue;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* ends in %> */
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = (size_t)(idx - hs->s) + 2;
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 8.2.4.45
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_markup_declaration_open(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
size_t remaining;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
remaining = hs->len - hs->pos;
|
|
Packit Service |
384592 |
if (remaining >= 7 &&
|
|
Packit Service |
384592 |
/* case insensitive */
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 0] == 'D' || hs->s[hs->pos + 0] == 'd') &&
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 1] == 'O' || hs->s[hs->pos + 1] == 'o') &&
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 2] == 'C' || hs->s[hs->pos + 2] == 'c') &&
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 3] == 'T' || hs->s[hs->pos + 3] == 't') &&
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 4] == 'Y' || hs->s[hs->pos + 4] == 'y') &&
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 5] == 'P' || hs->s[hs->pos + 5] == 'p') &&
|
|
Packit Service |
384592 |
(hs->s[hs->pos + 6] == 'E' || hs->s[hs->pos + 6] == 'e')
|
|
Packit Service |
384592 |
) {
|
|
Packit Service |
384592 |
return h5_state_doctype(hs);
|
|
Packit Service |
384592 |
} else if (remaining >= 7 &&
|
|
Packit Service |
384592 |
/* upper case required */
|
|
Packit Service |
384592 |
hs->s[hs->pos + 0] == '[' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 1] == 'C' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 2] == 'D' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 3] == 'A' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 4] == 'T' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 5] == 'A' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 6] == '['
|
|
Packit Service |
384592 |
) {
|
|
Packit Service |
384592 |
hs->pos += 7;
|
|
Packit Service |
384592 |
return h5_state_cdata(hs);
|
|
Packit Service |
384592 |
} else if (remaining >= 2 &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 0] == '-' &&
|
|
Packit Service |
384592 |
hs->s[hs->pos + 1] == '-') {
|
|
Packit Service |
384592 |
hs->pos += 2;
|
|
Packit Service |
384592 |
return h5_state_comment(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return h5_state_bogus_comment(hs);
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 12.2.4.48
|
|
Packit Service |
384592 |
* 12.2.4.49
|
|
Packit Service |
384592 |
* 12.2.4.50
|
|
Packit Service |
384592 |
* 12.2.4.51
|
|
Packit Service |
384592 |
* state machine spec is confusing since it can only look
|
|
Packit Service |
384592 |
* at one character at a time but simply it's comments end by:
|
|
Packit Service |
384592 |
* 1) EOF
|
|
Packit Service |
384592 |
* 2) ending in -->
|
|
Packit Service |
384592 |
* 3) ending in -!>
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_comment(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
char ch;
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
size_t pos;
|
|
Packit Service |
384592 |
size_t offset;
|
|
Packit Service |
384592 |
const char* end = hs->s + hs->len;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
pos = hs->pos;
|
|
Packit Service |
384592 |
while (1) {
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + pos, CHAR_DASH, hs->len - pos);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* did not find anything or has less than 3 chars left */
|
|
Packit Service |
384592 |
if (idx == NULL || idx > hs->s + hs->len - 3) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
offset = 1;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* skip all nulls */
|
|
Packit Service |
384592 |
while (idx + offset < end && *(idx + offset) == 0) {
|
|
Packit Service |
384592 |
offset += 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
if (idx + offset == end) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
ch = *(idx + offset);
|
|
Packit Service |
384592 |
if (ch != CHAR_DASH && ch != CHAR_BANG) {
|
|
Packit Service |
384592 |
pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
continue;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* need to test */
|
|
Packit Service |
384592 |
#if 0
|
|
Packit Service |
384592 |
/* skip all nulls */
|
|
Packit Service |
384592 |
while (idx + offset < end && *(idx + offset) == 0) {
|
|
Packit Service |
384592 |
offset += 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
if (idx + offset == end) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
#endif
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
offset += 1;
|
|
Packit Service |
384592 |
if (idx + offset == end) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
ch = *(idx + offset);
|
|
Packit Service |
384592 |
if (ch != CHAR_GT) {
|
|
Packit Service |
384592 |
pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
continue;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
offset += 1;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* ends in --> or -!> */
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = (size_t)(idx + offset - hs->s);
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
hs->token_type = TAG_COMMENT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
static int h5_state_cdata(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
size_t pos;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
pos = hs->pos;
|
|
Packit Service |
384592 |
while (1) {
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + pos, CHAR_RIGHTB, hs->len - pos);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/* did not find anything or has less than 3 chars left */
|
|
Packit Service |
384592 |
if (idx == NULL || idx > hs->s + hs->len - 3) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = DATA_TEXT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else if ( *(idx+1) == CHAR_RIGHTB && *(idx+2) == CHAR_GT) {
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = (size_t)(idx - hs->s) + 3;
|
|
Packit Service |
384592 |
hs->token_type = DATA_TEXT;
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
/**
|
|
Packit Service |
384592 |
* 8.2.4.52
|
|
Packit Service |
384592 |
* http://www.w3.org/html/wg/drafts/html/master/syntax.html#doctype-state
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
static int h5_state_doctype(h5_state_t* hs)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
const char* idx;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
TRACE();
|
|
Packit Service |
384592 |
hs->token_start = hs->s + hs->pos;
|
|
Packit Service |
384592 |
hs->token_type = DOCTYPE;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
idx = (const char*) memchr(hs->s + hs->pos, CHAR_GT, hs->len - hs->pos);
|
|
Packit Service |
384592 |
if (idx == NULL) {
|
|
Packit Service |
384592 |
hs->state = h5_state_eof;
|
|
Packit Service |
384592 |
hs->token_len = hs->len - hs->pos;
|
|
Packit Service |
384592 |
} else {
|
|
Packit Service |
384592 |
hs->state = h5_state_data;
|
|
Packit Service |
384592 |
hs->token_len = (size_t)(idx - hs->s) - hs->pos;
|
|
Packit Service |
384592 |
hs->pos = (size_t)(idx - hs->s) + 1;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
return 1;
|
|
Packit Service |
384592 |
}
|