LibYAML-FFI
view release on metacpan or search on metacpan
ffi/emitter.c view on Meta::CPAN
switch (event->type)
{
case YAML_ALIAS_EVENT:
if (!yaml_emitter_analyze_anchor(emitter,
event->data.alias.anchor, 1))
return 0;
return 1;
case YAML_SCALAR_EVENT:
if (event->data.scalar.anchor) {
if (!yaml_emitter_analyze_anchor(emitter,
event->data.scalar.anchor, 0))
return 0;
}
if (event->data.scalar.tag && (emitter->canonical ||
(!event->data.scalar.plain_implicit
&& !event->data.scalar.quoted_implicit))) {
if (!yaml_emitter_analyze_tag(emitter, event->data.scalar.tag))
return 0;
}
if (!yaml_emitter_analyze_scalar(emitter,
event->data.scalar.value, event->data.scalar.length))
return 0;
return 1;
case YAML_SEQUENCE_START_EVENT:
if (event->data.sequence_start.anchor) {
if (!yaml_emitter_analyze_anchor(emitter,
event->data.sequence_start.anchor, 0))
return 0;
}
if (event->data.sequence_start.tag && (emitter->canonical ||
!event->data.sequence_start.implicit)) {
if (!yaml_emitter_analyze_tag(emitter,
event->data.sequence_start.tag))
return 0;
}
return 1;
case YAML_MAPPING_START_EVENT:
if (event->data.mapping_start.anchor) {
if (!yaml_emitter_analyze_anchor(emitter,
event->data.mapping_start.anchor, 0))
return 0;
}
if (event->data.mapping_start.tag && (emitter->canonical ||
!event->data.mapping_start.implicit)) {
if (!yaml_emitter_analyze_tag(emitter,
event->data.mapping_start.tag))
return 0;
}
return 1;
default:
return 1;
}
}
/*
* Write the BOM character.
*/
static int
yaml_emitter_write_bom(yaml_emitter_t *emitter)
{
if (!FLUSH(emitter)) return 0;
*(emitter->buffer.pointer++) = (yaml_char_t) '\xEF';
*(emitter->buffer.pointer++) = (yaml_char_t) '\xBB';
*(emitter->buffer.pointer++) = (yaml_char_t) '\xBF';
return 1;
}
static int
yaml_emitter_write_indent(yaml_emitter_t *emitter)
{
int indent = (emitter->indent >= 0) ? emitter->indent : 0;
if (!emitter->indention || emitter->column > indent
|| (emitter->column == indent && !emitter->whitespace)) {
if (!PUT_BREAK(emitter)) return 0;
}
while (emitter->column < indent) {
if (!PUT(emitter, ' ')) return 0;
}
emitter->whitespace = 1;
emitter->indention = 1;
return 1;
}
static int
yaml_emitter_write_indicator(yaml_emitter_t *emitter,
const char *indicator, int need_whitespace,
int is_whitespace, int is_indention)
{
size_t indicator_length;
yaml_string_t string;
indicator_length = strlen(indicator);
STRING_ASSIGN(string, (yaml_char_t *)indicator, indicator_length);
if (need_whitespace && !emitter->whitespace) {
if (!PUT(emitter, ' ')) return 0;
}
while (string.pointer != string.end) {
if (!WRITE(emitter, string)) return 0;
}
emitter->whitespace = is_whitespace;
emitter->indention = (emitter->indention && is_indention);
return 1;
}
static int
ffi/emitter.c view on Meta::CPAN
&& !IS_SPACE_AT(string, 1)) {
if (!yaml_emitter_write_indent(emitter)) return 0;
MOVE(string);
}
else {
if (!WRITE(emitter, string)) return 0;
}
spaces = 1;
}
else if (IS_BREAK(string))
{
if (!breaks && CHECK(string, '\n')) {
if (!PUT_BREAK(emitter)) return 0;
}
if (!WRITE_BREAK(emitter, string)) return 0;
emitter->indention = 1;
breaks = 1;
}
else
{
if (breaks) {
if (!yaml_emitter_write_indent(emitter)) return 0;
}
if (CHECK(string, '\'')) {
if (!PUT(emitter, '\'')) return 0;
}
if (!WRITE(emitter, string)) return 0;
emitter->indention = 0;
spaces = 0;
breaks = 0;
}
}
if (breaks)
if (!yaml_emitter_write_indent(emitter)) return 0;
if (!yaml_emitter_write_indicator(emitter, "'", 0, 0, 0))
return 0;
emitter->whitespace = 0;
emitter->indention = 0;
return 1;
}
static int
yaml_emitter_write_double_quoted_scalar(yaml_emitter_t *emitter,
yaml_char_t *value, size_t length, int allow_breaks)
{
yaml_string_t string;
int spaces = 0;
STRING_ASSIGN(string, value, length);
if (!yaml_emitter_write_indicator(emitter, "\"", 1, 0, 0))
return 0;
while (string.pointer != string.end)
{
if (!IS_PRINTABLE(string) || (!emitter->unicode && !IS_ASCII(string))
|| IS_BOM(string) || IS_BREAK(string)
|| CHECK(string, '"') || CHECK(string, '\\'))
{
unsigned char octet;
unsigned int width;
unsigned int value;
int k;
octet = string.pointer[0];
width = (octet & 0x80) == 0x00 ? 1 :
(octet & 0xE0) == 0xC0 ? 2 :
(octet & 0xF0) == 0xE0 ? 3 :
(octet & 0xF8) == 0xF0 ? 4 : 0;
value = (octet & 0x80) == 0x00 ? octet & 0x7F :
(octet & 0xE0) == 0xC0 ? octet & 0x1F :
(octet & 0xF0) == 0xE0 ? octet & 0x0F :
(octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
for (k = 1; k < (int)width; k ++) {
octet = string.pointer[k];
value = (value << 6) + (octet & 0x3F);
}
string.pointer += width;
if (!PUT(emitter, '\\')) return 0;
switch (value)
{
case 0x00:
if (!PUT(emitter, '0')) return 0;
break;
case 0x07:
if (!PUT(emitter, 'a')) return 0;
break;
case 0x08:
if (!PUT(emitter, 'b')) return 0;
break;
case 0x09:
if (!PUT(emitter, 't')) return 0;
break;
case 0x0A:
if (!PUT(emitter, 'n')) return 0;
break;
case 0x0B:
if (!PUT(emitter, 'v')) return 0;
break;
case 0x0C:
if (!PUT(emitter, 'f')) return 0;
break;
case 0x0D:
if (!PUT(emitter, 'r')) return 0;
break;
case 0x1B:
if (!PUT(emitter, 'e')) return 0;
( run in 2.466 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )