Merged from tip.
diff --git a/apic.go b/apic.go
index ded1b99..29be91d 100644
--- a/apic.go
+++ b/apic.go
@@ -83,10 +83,10 @@
// Create a new emitter object.
func yaml_emitter_initialize(emitter *yaml_emitter_t) bool {
*emitter = yaml_emitter_t{
- buffer: make([]byte, output_buffer_size),
- raw_buffer: make([]byte, 0, output_raw_buffer_size),
- states: make([]yaml_emitter_state_t, 0, initial_stack_size),
- events: make([]yaml_event_t, 0, initial_queue_size),
+ buffer: make([]byte, output_buffer_size),
+ raw_buffer: make([]byte, 0, output_raw_buffer_size),
+ states: make([]yaml_emitter_state_t, 0, initial_stack_size),
+ events: make([]yaml_event_t, 0, initial_queue_size),
}
return true
}
diff --git a/decode_test.go b/decode_test.go
index 718b679..9b71562 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -300,7 +300,7 @@
&struct{ B []int }{[]int{1, 2}},
},
- // BUG #1133337
+ // Bug #1133337
{
"foo: ''",
map[string]*string{"foo": new(string)},
@@ -318,6 +318,21 @@
}{1, 0},
},
+ // Bug #1191981
+ {
+ "" +
+ "%YAML 1.1\n" +
+ "--- !!str\n" +
+ `"Generic line break (no glyph)\n\` + "\n" +
+ ` Generic line break (glyphed)\n\` + "\n" +
+ ` Line separator\u2028\` + "\n" +
+ ` Paragraph separator\u2029"` + "\n",
+ "" +
+ "Generic line break (no glyph)\n" +
+ "Generic line break (glyphed)\n" +
+ "Line separator\u2028Paragraph separator\u2029",
+ },
+
// Struct inlining
{
"a: 1\nb: 2\nc: 3\n",
@@ -341,16 +356,25 @@
for i, item := range unmarshalTests {
t := reflect.ValueOf(item.value).Type()
var value interface{}
- if t.Kind() == reflect.Map {
+ switch t.Kind() {
+ case reflect.Map:
value = reflect.MakeMap(t).Interface()
- } else {
+ case reflect.String:
+ t := reflect.ValueOf(item.value).Type()
+ v := reflect.New(t)
+ value = v.Interface()
+ default:
pt := reflect.ValueOf(item.value).Type()
pv := reflect.New(pt.Elem())
value = pv.Interface()
}
err := goyaml.Unmarshal([]byte(item.data), value)
c.Assert(err, IsNil, Commentf("Item #%d", i))
- c.Assert(value, DeepEquals, item.value)
+ if t.Kind() == reflect.String {
+ c.Assert(*value.(*string), Equals, item.value, Commentf("Item #%d", i))
+ } else {
+ c.Assert(value, DeepEquals, item.value, Commentf("Item #%d", i))
+ }
}
}
diff --git a/scannerc.go b/scannerc.go
index daad349..943a597 100644
--- a/scannerc.go
+++ b/scannerc.go
@@ -2520,7 +2520,7 @@
// Join the whitespaces or fold line breaks.
if leading_blanks {
// Do we need to fold line breaks?
- if leading_break[0] == '\n' {
+ if len(leading_break) > 0 && leading_break[0] == '\n' {
if len(trailing_breaks) == 0 {
s = append(s, ' ')
} else {
diff --git a/yamlprivateh.go b/yamlprivateh.go
index fd8414b..1c0b23d 100644
--- a/yamlprivateh.go
+++ b/yamlprivateh.go
@@ -114,8 +114,8 @@
// Check if the character is a line break or NUL.
func is_breakz(b []byte, i int) bool {
//return is_break(b, i) || is_z(b, i)
- return (// is_break:
- b[i] == '\r' || // CR (#xD)
+ return ( // is_break:
+ b[i] == '\r' || // CR (#xD)
b[i] == '\n' || // LF (#xA)
b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
@@ -127,8 +127,8 @@
// Check if the character is a line break, space, or NUL.
func is_spacez(b []byte, i int) bool {
//return is_space(b, i) || is_breakz(b, i)
- return (// is_space:
- b[i] == ' ' ||
+ return ( // is_space:
+ b[i] == ' ' ||
// is_breakz:
b[i] == '\r' || // CR (#xD)
b[i] == '\n' || // LF (#xA)
@@ -141,8 +141,8 @@
// Check if the character is a line break, space, tab, or NUL.
func is_blankz(b []byte, i int) bool {
//return is_blank(b, i) || is_breakz(b, i)
- return (// is_blank:
- b[i] == ' ' || b[i] == '\t' ||
+ return ( // is_blank:
+ b[i] == ' ' || b[i] == '\t' ||
// is_breakz:
b[i] == '\r' || // CR (#xD)
b[i] == '\n' || // LF (#xA)