Changed read{,_line} to prevent heap allocation of slices.
diff --git a/scannerc.go b/scannerc.go
index 1066c4d..daad349 100644
--- a/scannerc.go
+++ b/scannerc.go
@@ -512,59 +512,59 @@
 }
 
 // Copy a character to a string buffer and advance pointers.
-func read(parser *yaml_parser_t, s *[]byte) bool {
+func read(parser *yaml_parser_t, s []byte) []byte {
 	w := width(parser.buffer[parser.buffer_pos])
 	if w == 0 {
 		panic("invalid character sequence")
 	}
-	if len(*s) == 0 {
-		*s = make([]byte, 0, 32)
+	if len(s) == 0 {
+		s = make([]byte, 0, 32)
 	}
-	if w == 1 && len(*s)+w <= cap(*s) {
-		*s = (*s)[:len(*s)+1]
-		(*s)[len(*s)-1] = parser.buffer[parser.buffer_pos]
+	if w == 1 && len(s)+w <= cap(s) {
+		s = s[:len(s)+1]
+		s[len(s)-1] = parser.buffer[parser.buffer_pos]
 		parser.buffer_pos++
 	} else {
-		*s = append(*s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
+		s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
 		parser.buffer_pos += w
 	}
 	parser.mark.index++
 	parser.mark.column++
 	parser.unread--
-	return true
+	return s
 }
 
 // Copy a line break character to a string buffer and advance pointers.
-func read_line(parser *yaml_parser_t, s *[]byte) bool {
+func read_line(parser *yaml_parser_t, s []byte) []byte {
 	buf := parser.buffer
 	pos := parser.buffer_pos
 	switch {
 	case buf[pos] == '\r' && buf[pos+1] == '\n':
 		// CR LF . LF
-		*s = append(*s, '\n')
+		s = append(s, '\n')
 		parser.buffer_pos += 2
 		parser.mark.index++
 		parser.unread--
 	case buf[pos] == '\r' || buf[pos] == '\n':
 		// CR|LF . LF
-		*s = append(*s, '\n')
+		s = append(s, '\n')
 		parser.buffer_pos += 1
 	case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
 		// NEL . LF
-		*s = append(*s, '\n')
+		s = append(s, '\n')
 		parser.buffer_pos += 2
 	case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
 		// LS|PS . LS|PS
-		*s = append(*s, buf[parser.buffer_pos:pos+3]...)
+		s = append(s, buf[parser.buffer_pos:pos+3]...)
 		parser.buffer_pos += 3
 	default:
-		return true
+		return s
 	}
 	parser.mark.index++
 	parser.mark.column = 0
 	parser.mark.line++
 	parser.unread--
-	return true
+	return s
 }
 
 // Get the next token.
@@ -1605,9 +1605,7 @@
 
 	var s []byte
 	for is_alpha(parser.buffer, parser.buffer_pos) {
-		if !read(parser, &s) {
-			return false
-		}
+		s = read(parser, s)
 		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
@@ -1783,9 +1781,7 @@
 	}
 
 	for is_alpha(parser.buffer, parser.buffer_pos) {
-		if !read(parser, &s) {
-			return false
-		}
+		s = read(parser, s)
 		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
@@ -1929,18 +1925,14 @@
 	var s []byte
 
 	// Copy the '!' character.
-	if !read(parser, &s) {
-		return false
-	}
+	s = read(parser, s)
 
 	// Copy all subsequent alphabetical and numerical characters.
 	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	for is_alpha(parser.buffer, parser.buffer_pos) {
-		if !read(parser, &s) {
-			return false
-		}
+		s = read(parser, s)
 		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
@@ -1948,9 +1940,7 @@
 
 	// Check if the trailing character is '!' and copy it.
 	if parser.buffer[parser.buffer_pos] == '!' {
-		if !read(parser, &s) {
-			return false
-		}
+		s = read(parser, s)
 	} else {
 		// It's either the '!' tag or not really a tag handle.  If it's a %TAG
 		// directive, it's an error.  If it's a tag token, it must be a part of URI.
@@ -2005,9 +1995,7 @@
 				return false
 			}
 		} else {
-			if !read(parser, &s) {
-				return false
-			}
+			s = read(parser, s)
 		}
 		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
@@ -2216,9 +2204,7 @@
 
 		// Consume the current line.
 		for !is_breakz(parser.buffer, parser.buffer_pos) {
-			if !read(parser, &s) {
-				return false
-			}
+			s = read(parser, s)
 			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
@@ -2229,9 +2215,7 @@
 			return false
 		}
 
-		if !read_line(parser, &leading_break) {
-			return false
-		}
+		leading_break = read_line(parser, leading_break)
 
 		// Eat the following intendation spaces and line breaks.
 		if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
@@ -2298,9 +2282,8 @@
 		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 			return false
 		}
-		if !read_line(parser, breaks) {
-			return false
-		}
+		// [Go] Should really be returning breaks instead.
+		*breaks = read_line(parser, *breaks)
 		*end_mark = parser.mark
 	}
 
@@ -2484,9 +2467,7 @@
 				}
 			} else {
 				// It is a non-escaped non-blank character.
-				if !read(parser, &s) {
-					return false
-				}
+				s = read(parser, s)
 			}
 			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 				return false
@@ -2513,9 +2494,7 @@
 			if is_blank(parser.buffer, parser.buffer_pos) {
 				// Consume a space or a tab character.
 				if !leading_blanks {
-					if !read(parser, &whitespaces) {
-						return false
-					}
+					whitespaces = read(parser, whitespaces)
 				} else {
 					skip(parser)
 				}
@@ -2527,14 +2506,10 @@
 				// Check if it is a first line break.
 				if !leading_blanks {
 					whitespaces = whitespaces[:0]
-					if !read_line(parser, &leading_break) {
-						return false
-					}
+					leading_break = read_line(parser, leading_break)
 					leading_blanks = true
 				} else {
-					if !read_line(parser, &trailing_breaks) {
-						return false
-					}
+					trailing_breaks = read_line(parser, trailing_breaks)
 				}
 			}
 			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
@@ -2659,9 +2634,7 @@
 			}
 
 			// Copy the character.
-			if !read(parser, &s) {
-				return false
-			}
+			s = read(parser, s)
 
 			end_mark = parser.mark
 			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
@@ -2691,9 +2664,7 @@
 
 				// Consume a space or a tab character.
 				if !leading_blanks {
-					if !read(parser, &whitespaces) {
-						return false
-					}
+					whitespaces = read(parser, whitespaces)
 				} else {
 					skip(parser)
 				}
@@ -2705,14 +2676,10 @@
 				// Check if it is a first line break.
 				if !leading_blanks {
 					whitespaces = whitespaces[:0]
-					if !read_line(parser, &leading_break) {
-						return false
-					}
+					leading_break = read_line(parser, leading_break)
 					leading_blanks = true
 				} else {
-					if !read_line(parser, &trailing_breaks) {
-						return false
-					}
+					trailing_breaks = read_line(parser, trailing_breaks)
 				}
 			}
 			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {