Inline cache function.
diff --git a/scanner_c.go b/scanner_c.go
index 467a9e3..a7ae55c 100644
--- a/scanner_c.go
+++ b/scanner_c.go
@@ -481,8 +481,9 @@
 //
 
 // Ensure that the buffer contains the required number of characters.
-// Return 1 on success, 0 on failure (reader error or memory error).
+// Return true on success, false on failure (reader error or memory error).
 func cache(parser *yaml_parser_t, length int) bool {
+	// [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
 	return parser.unread >= length || yaml_parser_update_buffer(parser, length)
 }
 
@@ -673,7 +674,7 @@
 // The dispatcher for token fetchers.
 func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
 	// Ensure that the buffer is initialized.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
@@ -699,7 +700,7 @@
 
 	// Ensure that the buffer contains at least 4 characters.  4 is the length
 	// of the longest indicators ('--- ' and '... ').
-	if !cache(parser, 4) {
+	if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
 		return false
 	}
 
@@ -1445,7 +1446,7 @@
 	// Until the next token is not found.
 	for {
 		// Allow the BOM mark to start a line.
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 		if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
@@ -1457,13 +1458,13 @@
 		//  - in the flow context
 		//  - in the block context, but not at the beginning of the line or
 		//  after '-', '?', or ':' (complex value).
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 
 		for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
 			skip(parser)
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}
@@ -1472,7 +1473,7 @@
 		if parser.buffer[parser.buffer_pos] == '#' {
 			for !is_breakz(parser.buffer, parser.buffer_pos) {
 				skip(parser)
-				if !cache(parser, 1) {
+				if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 					return false
 				}
 			}
@@ -1480,7 +1481,7 @@
 
 		// If it is a line break, eat it.
 		if is_break(parser.buffer, parser.buffer_pos) {
-			if !cache(parser, 2) {
+			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 				return false
 			}
 			skip_line(parser)
@@ -1560,13 +1561,13 @@
 	}
 
 	// Eat the rest of the line including any comments.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
 	for is_blank(parser.buffer, parser.buffer_pos) {
 		skip(parser)
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1574,7 +1575,7 @@
 	if parser.buffer[parser.buffer_pos] == '#' {
 		for !is_breakz(parser.buffer, parser.buffer_pos) {
 			skip(parser)
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}
@@ -1589,7 +1590,7 @@
 
 	// Eat a line break.
 	if is_break(parser.buffer, parser.buffer_pos) {
-		if !cache(parser, 2) {
+		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 			return false
 		}
 		skip_line(parser)
@@ -1608,7 +1609,7 @@
 //
 func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
 	// Consume the directive name.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
@@ -1617,7 +1618,7 @@
 		if !read(parser, &s) {
 			return false
 		}
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1646,12 +1647,12 @@
 //           ^^^^^^
 func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
 	// Eat whitespaces.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	for is_blank(parser.buffer, parser.buffer_pos) {
 		skip(parser)
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1688,7 +1689,7 @@
 func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
 
 	// Repeat while the next character is digit.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	var value, length int8
@@ -1701,7 +1702,7 @@
 		}
 		value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
 		skip(parser)
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1725,13 +1726,13 @@
 	var handle_value, prefix_value []byte
 
 	// Eat whitespaces.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
 	for is_blank(parser.buffer, parser.buffer_pos) {
 		skip(parser)
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1742,7 +1743,7 @@
 	}
 
 	// Expect a whitespace.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	if !is_blank(parser.buffer, parser.buffer_pos) {
@@ -1754,7 +1755,7 @@
 	// Eat whitespaces.
 	for is_blank(parser.buffer, parser.buffer_pos) {
 		skip(parser)
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1765,7 +1766,7 @@
 	}
 
 	// Expect a whitespace or line break.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	if !is_blankz(parser.buffer, parser.buffer_pos) {
@@ -1787,7 +1788,7 @@
 	skip(parser)
 
 	// Consume the value.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
@@ -1795,7 +1796,7 @@
 		if !read(parser, &s) {
 			return false
 		}
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1845,7 +1846,7 @@
 	start_mark := parser.mark
 
 	// Check if the tag is in the canonical form.
-	if !cache(parser, 2) {
+	if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 		return false
 	}
 
@@ -1901,7 +1902,7 @@
 	}
 
 	// Check the character which ends the tag.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	if !is_blankz(parser.buffer, parser.buffer_pos) {
@@ -1926,7 +1927,7 @@
 // Scan a tag handle.
 func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
 	// Check the initial '!' character.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	if parser.buffer[parser.buffer_pos] != '!' {
@@ -1943,14 +1944,14 @@
 	}
 
 	// Copy all subsequent alphabetical and numerical characters.
-	if !cache(parser, 1) {
+	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
 		}
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -1987,7 +1988,7 @@
 	}
 
 	// Scan the tag.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
@@ -2018,7 +2019,7 @@
 				return false
 			}
 		}
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
@@ -2040,7 +2041,7 @@
 	w := 1024
 	for w > 0 {
 		// Check for a URI-escaped octet.
-		if !cache(parser, 3) {
+		if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
 			return false
 		}
 
@@ -2086,7 +2087,7 @@
 	skip(parser)
 
 	// Scan the additional block scalar indicators.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 
@@ -2102,7 +2103,7 @@
 		skip(parser)
 
 		// Check for an indentation indicator.
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 		if is_digit(parser.buffer, parser.buffer_pos) {
@@ -2129,7 +2130,7 @@
 		increment = as_digit(parser.buffer, parser.buffer_pos)
 		skip(parser)
 
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 		if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
@@ -2143,19 +2144,19 @@
 	}
 
 	// Eat whitespaces and comments to the end of the line.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	for is_blank(parser.buffer, parser.buffer_pos) {
 		skip(parser)
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 	}
 	if parser.buffer[parser.buffer_pos] == '#' {
 		for !is_breakz(parser.buffer, parser.buffer_pos) {
 			skip(parser)
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}
@@ -2170,7 +2171,7 @@
 
 	// Eat a line break.
 	if is_break(parser.buffer, parser.buffer_pos) {
-		if !cache(parser, 2) {
+		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 			return false
 		}
 		skip_line(parser)
@@ -2195,7 +2196,7 @@
 	}
 
 	// Scan the block scalar content.
-	if !cache(parser, 1) {
+	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 		return false
 	}
 	var leading_blank, trailing_blank bool
@@ -2228,13 +2229,13 @@
 			if !read(parser, &s) {
 				return false
 			}
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}
 
 		// Consume the line break.
-		if !cache(parser, 2) {
+		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 			return false
 		}
 
@@ -2279,12 +2280,12 @@
 	max_indent := 0
 	for {
 		// Eat the intendation spaces.
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 		for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
 			skip(parser)
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}
@@ -2304,7 +2305,7 @@
 		}
 
 		// Consume the line break.
-		if !cache(parser, 2) {
+		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 			return false
 		}
 		if !read_line(parser, breaks) {
@@ -2336,7 +2337,7 @@
 	var s, leading_break, trailing_breaks, whitespaces []byte
 	for {
 		// Check that there are no document indicators at the beginning of the line.
-		if !cache(parser, 7) {
+		if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
 			return false
 		}
 
@@ -2361,9 +2362,6 @@
 		}
 
 		// Consume non-blank characters.
-		//if !cache(parser, 2) {
-		//	return false
-		//}
 		leading_blanks := false
 		for !is_blankz(parser.buffer, parser.buffer_pos) {
 			if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
@@ -2381,7 +2379,7 @@
 
 			} else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
 				// It is an escaped line break.
-				if !cache(parser, 3) {
+				if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
 					return false
 				}
 				skip(parser)
@@ -2455,7 +2453,7 @@
 					var value int
 
 					// Scan the character value.
-					if !cache(parser, code_length) {
+					if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
 						return false
 					}
 					for k := 0; k < code_length; k++ {
@@ -2500,7 +2498,7 @@
 					return false
 				}
 			}
-			if !cache(parser, 2) {
+			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 				return false
 			}
 		}
@@ -2517,7 +2515,7 @@
 		}
 
 		// Consume blank characters.
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 
@@ -2532,7 +2530,7 @@
 					skip(parser)
 				}
 			} else {
-				if !cache(parser, 2) {
+				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 					return false
 				}
 
@@ -2549,7 +2547,7 @@
 					}
 				}
 			}
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}
@@ -2606,7 +2604,7 @@
 	// Consume the content of the plain scalar.
 	for {
 		// Check for a document indicator.
-		if !cache(parser, 4) {
+		if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
 			return false
 		}
 		if parser.mark.column == 0 &&
@@ -2676,7 +2674,7 @@
 			}
 
 			end_mark = parser.mark
-			if !cache(parser, 2) {
+			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 				return false
 			}
 		}
@@ -2687,7 +2685,7 @@
 		}
 
 		// Consume blank characters.
-		if !cache(parser, 1) {
+		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 			return false
 		}
 
@@ -2710,7 +2708,7 @@
 					skip(parser)
 				}
 			} else {
-				if !cache(parser, 2) {
+				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
 					return false
 				}
 
@@ -2727,7 +2725,7 @@
 					}
 				}
 			}
-			if !cache(parser, 1) {
+			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
 				return false
 			}
 		}