mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Vendor Update Go Libs (#13166)
* update github.com/alecthomas/chroma v0.8.0 -> v0.8.1 * github.com/blevesearch/bleve v1.0.10 -> v1.0.12 * editorconfig-core-go v2.1.1 -> v2.3.7 * github.com/gliderlabs/ssh v0.2.2 -> v0.3.1 * migrate editorconfig.ParseBytes to Parse * github.com/shurcooL/vfsgen to 0d455de96546 * github.com/go-git/go-git/v5 v5.1.0 -> v5.2.0 * github.com/google/uuid v1.1.1 -> v1.1.2 * github.com/huandu/xstrings v1.3.0 -> v1.3.2 * github.com/klauspost/compress v1.10.11 -> v1.11.1 * github.com/markbates/goth v1.61.2 -> v1.65.0 * github.com/mattn/go-sqlite3 v1.14.0 -> v1.14.4 * github.com/mholt/archiver v3.3.0 -> v3.3.2 * github.com/microcosm-cc/bluemonday 4f7140c49acb -> v1.0.4 * github.com/minio/minio-go v7.0.4 -> v7.0.5 * github.com/olivere/elastic v7.0.9 -> v7.0.20 * github.com/urfave/cli v1.20.0 -> v1.22.4 * github.com/prometheus/client_golang v1.1.0 -> v1.8.0 * github.com/xanzy/go-gitlab v0.37.0 -> v0.38.1 * mvdan.cc/xurls v2.1.0 -> v2.2.0 Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		
							
								
								
									
										2
									
								
								vendor/github.com/andybalholm/brotli/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/andybalholm/brotli/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,3 +3,5 @@ It was translated from the reference implementation (https://github.com/google/b | ||||
| with the `c2go` tool at https://github.com/andybalholm/c2go. | ||||
|  | ||||
| I am using it in production with https://github.com/andybalholm/redwood. | ||||
|  | ||||
| API documentation is found at https://pkg.go.dev/github.com/andybalholm/brotli?tab=doc. | ||||
|   | ||||
							
								
								
									
										36
									
								
								vendor/github.com/andybalholm/brotli/backward_references.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/andybalholm/brotli/backward_references.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,5 +1,9 @@ | ||||
| package brotli | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| /* Copyright 2013 Google Inc. All Rights Reserved. | ||||
|  | ||||
|    Distributed under MIT license. | ||||
| @@ -31,13 +35,10 @@ func computeDistanceCode(distance uint, max_distance uint, dist_cache []int) uin | ||||
| 	return distance + numDistanceShortCodes - 1 | ||||
| } | ||||
|  | ||||
| /* "commands" points to the next output command to write to, "*num_commands" is | ||||
|    initially the total amount of commands output by previous | ||||
|    CreateBackwardReferences calls, and must be incremented by the amount written | ||||
|    by this call. */ | ||||
| func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher hasherHandle, dist_cache []int, last_insert_len *uint, commands []command, num_commands *uint, num_literals *uint) { | ||||
| var hasherSearchResultPool sync.Pool | ||||
|  | ||||
| func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher hasherHandle, dist_cache []int, last_insert_len *uint, commands *[]command, num_literals *uint) { | ||||
| 	var max_backward_limit uint = maxBackwardLimit(params.lgwin) | ||||
| 	var orig_commands []command = commands | ||||
| 	var insert_length uint = *last_insert_len | ||||
| 	var pos_end uint = position + num_bytes | ||||
| 	var store_end uint | ||||
| @@ -57,8 +58,14 @@ func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, | ||||
|  | ||||
| 	/* Minimum score to accept a backward reference. */ | ||||
| 	hasher.PrepareDistanceCache(dist_cache) | ||||
| 	var sr2 hasherSearchResult | ||||
| 	var sr hasherSearchResult | ||||
| 	sr2, _ := hasherSearchResultPool.Get().(*hasherSearchResult) | ||||
| 	if sr2 == nil { | ||||
| 		sr2 = &hasherSearchResult{} | ||||
| 	} | ||||
| 	sr, _ := hasherSearchResultPool.Get().(*hasherSearchResult) | ||||
| 	if sr == nil { | ||||
| 		sr = &hasherSearchResult{} | ||||
| 	} | ||||
|  | ||||
| 	for position+hasher.HashTypeLength() < pos_end { | ||||
| 		var max_length uint = pos_end - position | ||||
| @@ -67,7 +74,7 @@ func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, | ||||
| 		sr.len_code_delta = 0 | ||||
| 		sr.distance = 0 | ||||
| 		sr.score = kMinScore | ||||
| 		hasher.FindLongestMatch(¶ms.dictionary, ringbuffer, ringbuffer_mask, dist_cache, position, max_length, max_distance, gap, params.dist.max_distance, &sr) | ||||
| 		hasher.FindLongestMatch(¶ms.dictionary, ringbuffer, ringbuffer_mask, dist_cache, position, max_length, max_distance, gap, params.dist.max_distance, sr) | ||||
| 		if sr.score > kMinScore { | ||||
| 			/* Found a match. Let's look for something even better ahead. */ | ||||
| 			var delayed_backward_references_in_row int = 0 | ||||
| @@ -83,14 +90,14 @@ func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, | ||||
| 				sr2.distance = 0 | ||||
| 				sr2.score = kMinScore | ||||
| 				max_distance = brotli_min_size_t(position+1, max_backward_limit) | ||||
| 				hasher.FindLongestMatch(¶ms.dictionary, ringbuffer, ringbuffer_mask, dist_cache, position+1, max_length, max_distance, gap, params.dist.max_distance, &sr2) | ||||
| 				hasher.FindLongestMatch(¶ms.dictionary, ringbuffer, ringbuffer_mask, dist_cache, position+1, max_length, max_distance, gap, params.dist.max_distance, sr2) | ||||
| 				if sr2.score >= sr.score+cost_diff_lazy { | ||||
| 					/* Ok, let's just write one byte for now and start a match from the | ||||
| 					   next byte. */ | ||||
| 					position++ | ||||
|  | ||||
| 					insert_length++ | ||||
| 					sr = sr2 | ||||
| 					*sr = *sr2 | ||||
| 					delayed_backward_references_in_row++ | ||||
| 					if delayed_backward_references_in_row < 4 && position+hasher.HashTypeLength() < pos_end { | ||||
| 						continue | ||||
| @@ -114,8 +121,7 @@ func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, | ||||
| 					hasher.PrepareDistanceCache(dist_cache) | ||||
| 				} | ||||
|  | ||||
| 				initCommand(&commands[0], ¶ms.dist, insert_length, sr.len, sr.len_code_delta, distance_code) | ||||
| 				commands = commands[1:] | ||||
| 				*commands = append(*commands, makeCommand(¶ms.dist, insert_length, sr.len, sr.len_code_delta, distance_code)) | ||||
| 			} | ||||
|  | ||||
| 			*num_literals += insert_length | ||||
| @@ -173,5 +179,7 @@ func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, | ||||
|  | ||||
| 	insert_length += pos_end - position | ||||
| 	*last_insert_len = insert_length | ||||
| 	*num_commands += uint(-cap(commands) + cap(orig_commands)) | ||||
|  | ||||
| 	hasherSearchResultPool.Put(sr) | ||||
| 	hasherSearchResultPool.Put(sr2) | ||||
| } | ||||
|   | ||||
							
								
								
									
										37
									
								
								vendor/github.com/andybalholm/brotli/backward_references_hq.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/andybalholm/brotli/backward_references_hq.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -123,14 +123,13 @@ func setCost(histogram []uint32, histogram_size uint, literal_histogram bool, co | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint, commands []command, num_commands uint, last_insert_len uint) { | ||||
| func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint, commands []command, last_insert_len uint) { | ||||
| 	var histogram_literal [numLiteralSymbols]uint32 | ||||
| 	var histogram_cmd [numCommandSymbols]uint32 | ||||
| 	var histogram_dist [maxEffectiveDistanceAlphabetSize]uint32 | ||||
| 	var cost_literal [numLiteralSymbols]float32 | ||||
| 	var pos uint = position - last_insert_len | ||||
| 	var min_cost_cmd float32 = kInfinity | ||||
| 	var i uint | ||||
| 	var cost_cmd []float32 = self.cost_cmd_[:] | ||||
| 	var literal_costs []float32 | ||||
|  | ||||
| @@ -138,7 +137,7 @@ func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbu | ||||
| 	histogram_cmd = [numCommandSymbols]uint32{} | ||||
| 	histogram_dist = [maxEffectiveDistanceAlphabetSize]uint32{} | ||||
|  | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 	for i := range commands { | ||||
| 		var inslength uint = uint(commands[i].insert_len_) | ||||
| 		var copylength uint = uint(commandCopyLen(&commands[i])) | ||||
| 		var distcode uint = uint(commands[i].dist_prefix_) & 0x3FF | ||||
| @@ -161,7 +160,7 @@ func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbu | ||||
| 	setCost(histogram_cmd[:], numCommandSymbols, false, cost_cmd) | ||||
| 	setCost(histogram_dist[:], uint(self.distance_histogram_size), false, self.cost_dist_) | ||||
|  | ||||
| 	for i = 0; i < numCommandSymbols; i++ { | ||||
| 	for i := 0; i < numCommandSymbols; i++ { | ||||
| 		min_cost_cmd = brotli_min_float(min_cost_cmd, cost_cmd[i]) | ||||
| 	} | ||||
|  | ||||
| @@ -169,10 +168,10 @@ func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbu | ||||
| 	{ | ||||
| 		literal_costs = self.literal_costs_ | ||||
| 		var literal_carry float32 = 0.0 | ||||
| 		var num_bytes uint = self.num_bytes_ | ||||
| 		num_bytes := int(self.num_bytes_) | ||||
| 		literal_costs[0] = 0.0 | ||||
| 		for i = 0; i < num_bytes; i++ { | ||||
| 			literal_carry += cost_literal[ringbuffer[(position+i)&ringbuffer_mask]] | ||||
| 		for i := 0; i < num_bytes; i++ { | ||||
| 			literal_carry += cost_literal[ringbuffer[(position+uint(i))&ringbuffer_mask]] | ||||
| 			literal_costs[i+1] = literal_costs[i] + literal_carry | ||||
| 			literal_carry -= literal_costs[i+1] - literal_costs[i] | ||||
| 		} | ||||
| @@ -502,7 +501,9 @@ func updateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte, | ||||
| 					var cost float32 = dist_cost + float32(getCopyExtra(copycode)) + zopfliCostModelGetCommandCost(model, cmdcode) | ||||
| 					if cost < nodes[pos+len].u.cost { | ||||
| 						updateZopfliNode(nodes, pos, start, uint(len), len_code, dist, 0, cost) | ||||
| 						result = brotli_max_size_t(result, uint(len)) | ||||
| 						if len > result { | ||||
| 							result = len | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| @@ -530,7 +531,7 @@ func computeShortestPathFromNodes(num_bytes uint, nodes []zopfliNode) uint { | ||||
| } | ||||
|  | ||||
| /* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */ | ||||
| func zopfliCreateCommands(num_bytes uint, block_start uint, nodes []zopfliNode, dist_cache []int, last_insert_len *uint, params *encoderParams, commands []command, num_literals *uint) { | ||||
| func zopfliCreateCommands(num_bytes uint, block_start uint, nodes []zopfliNode, dist_cache []int, last_insert_len *uint, params *encoderParams, commands *[]command, num_literals *uint) { | ||||
| 	var max_backward_limit uint = maxBackwardLimit(params.lgwin) | ||||
| 	var pos uint = 0 | ||||
| 	var offset uint32 = nodes[0].u.next | ||||
| @@ -552,7 +553,7 @@ func zopfliCreateCommands(num_bytes uint, block_start uint, nodes []zopfliNode, | ||||
| 			var max_distance uint = brotli_min_size_t(block_start+pos, max_backward_limit) | ||||
| 			var is_dictionary bool = (distance > max_distance+gap) | ||||
| 			var dist_code uint = uint(zopfliNodeDistanceCode(next)) | ||||
| 			initCommand(&commands[i], ¶ms.dist, insert_length, copy_length, int(len_code)-int(copy_length), dist_code) | ||||
| 			*commands = append(*commands, makeCommand(¶ms.dist, insert_length, copy_length, int(len_code)-int(copy_length), dist_code)) | ||||
|  | ||||
| 			if !is_dictionary && dist_code > 0 { | ||||
| 				dist_cache[3] = dist_cache[2] | ||||
| @@ -679,16 +680,16 @@ func zopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer []byte, | ||||
| 	return computeShortestPathFromNodes(num_bytes, nodes) | ||||
| } | ||||
|  | ||||
| func createZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher *h10, dist_cache []int, last_insert_len *uint, commands []command, num_commands *uint, num_literals *uint) { | ||||
| func createZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher *h10, dist_cache []int, last_insert_len *uint, commands *[]command, num_literals *uint) { | ||||
| 	var nodes []zopfliNode | ||||
| 	nodes = make([]zopfliNode, (num_bytes + 1)) | ||||
| 	initZopfliNodes(nodes, num_bytes+1) | ||||
| 	*num_commands += zopfliComputeShortestPath(num_bytes, position, ringbuffer, ringbuffer_mask, params, dist_cache, hasher, nodes) | ||||
| 	zopfliComputeShortestPath(num_bytes, position, ringbuffer, ringbuffer_mask, params, dist_cache, hasher, nodes) | ||||
| 	zopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals) | ||||
| 	nodes = nil | ||||
| } | ||||
|  | ||||
| func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher hasherHandle, dist_cache []int, last_insert_len *uint, commands []command, num_commands *uint, num_literals *uint) { | ||||
| func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher hasherHandle, dist_cache []int, last_insert_len *uint, commands *[]command, num_literals *uint) { | ||||
| 	var max_backward_limit uint = maxBackwardLimit(params.lgwin) | ||||
| 	var num_matches []uint32 = make([]uint32, num_bytes) | ||||
| 	var matches_size uint = 4 * num_bytes | ||||
| @@ -703,7 +704,7 @@ func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer | ||||
| 	var orig_num_literals uint | ||||
| 	var orig_last_insert_len uint | ||||
| 	var orig_dist_cache [4]int | ||||
| 	var orig_num_commands uint | ||||
| 	var orig_num_commands int | ||||
| 	var model zopfliCostModel | ||||
| 	var nodes []zopfliNode | ||||
| 	var matches []backwardMatch = make([]backwardMatch, matches_size) | ||||
| @@ -769,7 +770,7 @@ func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer | ||||
| 	orig_num_literals = *num_literals | ||||
| 	orig_last_insert_len = *last_insert_len | ||||
| 	copy(orig_dist_cache[:], dist_cache[:4]) | ||||
| 	orig_num_commands = *num_commands | ||||
| 	orig_num_commands = len(*commands) | ||||
| 	nodes = make([]zopfliNode, (num_bytes + 1)) | ||||
| 	initZopfliCostModel(&model, ¶ms.dist, num_bytes) | ||||
| 	for i = 0; i < 2; i++ { | ||||
| @@ -777,14 +778,14 @@ func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer | ||||
| 		if i == 0 { | ||||
| 			zopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask) | ||||
| 		} else { | ||||
| 			zopfliCostModelSetFromCommands(&model, position, ringbuffer, ringbuffer_mask, commands, *num_commands-orig_num_commands, orig_last_insert_len) | ||||
| 			zopfliCostModelSetFromCommands(&model, position, ringbuffer, ringbuffer_mask, (*commands)[orig_num_commands:], orig_last_insert_len) | ||||
| 		} | ||||
|  | ||||
| 		*num_commands = orig_num_commands | ||||
| 		*commands = (*commands)[:orig_num_commands] | ||||
| 		*num_literals = orig_num_literals | ||||
| 		*last_insert_len = orig_last_insert_len | ||||
| 		copy(dist_cache, orig_dist_cache[:4]) | ||||
| 		*num_commands += zopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches, nodes) | ||||
| 		zopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches, nodes) | ||||
| 		zopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals) | ||||
| 	} | ||||
|  | ||||
|   | ||||
							
								
								
									
										37
									
								
								vendor/github.com/andybalholm/brotli/block_splitter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/andybalholm/brotli/block_splitter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -33,23 +33,21 @@ const ( | ||||
| 	kMinItersForRefining         uint    = 100 | ||||
| ) | ||||
|  | ||||
| func countLiterals(cmds []command, num_commands uint) uint { | ||||
| func countLiterals(cmds []command) uint { | ||||
| 	var total_length uint = 0 | ||||
| 	/* Count how many we have. */ | ||||
|  | ||||
| 	var i uint | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 	for i := range cmds { | ||||
| 		total_length += uint(cmds[i].insert_len_) | ||||
| 	} | ||||
|  | ||||
| 	return total_length | ||||
| } | ||||
|  | ||||
| func copyLiteralsToByteArray(cmds []command, num_commands uint, data []byte, offset uint, mask uint, literals []byte) { | ||||
| func copyLiteralsToByteArray(cmds []command, data []byte, offset uint, mask uint, literals []byte) { | ||||
| 	var pos uint = 0 | ||||
| 	var from_pos uint = offset & mask | ||||
| 	var i uint | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 	for i := range cmds { | ||||
| 		var insert_len uint = uint(cmds[i].insert_len_) | ||||
| 		if from_pos+insert_len > mask { | ||||
| 			var head_size uint = mask + 1 - from_pos | ||||
| @@ -90,24 +88,19 @@ const clustersPerBatch = 16 | ||||
| func initBlockSplit(self *blockSplit) { | ||||
| 	self.num_types = 0 | ||||
| 	self.num_blocks = 0 | ||||
| 	self.types = nil | ||||
| 	self.lengths = nil | ||||
| 	self.types = self.types[:0] | ||||
| 	self.lengths = self.lengths[:0] | ||||
| 	self.types_alloc_size = 0 | ||||
| 	self.lengths_alloc_size = 0 | ||||
| } | ||||
|  | ||||
| func destroyBlockSplit(self *blockSplit) { | ||||
| 	self.types = nil | ||||
| 	self.lengths = nil | ||||
| } | ||||
|  | ||||
| func splitBlock(cmds []command, num_commands uint, data []byte, pos uint, mask uint, params *encoderParams, literal_split *blockSplit, insert_and_copy_split *blockSplit, dist_split *blockSplit) { | ||||
| func splitBlock(cmds []command, data []byte, pos uint, mask uint, params *encoderParams, literal_split *blockSplit, insert_and_copy_split *blockSplit, dist_split *blockSplit) { | ||||
| 	{ | ||||
| 		var literals_count uint = countLiterals(cmds, num_commands) | ||||
| 		var literals_count uint = countLiterals(cmds) | ||||
| 		var literals []byte = make([]byte, literals_count) | ||||
|  | ||||
| 		/* Create a continuous array of literals. */ | ||||
| 		copyLiteralsToByteArray(cmds, num_commands, data, pos, mask, literals) | ||||
| 		copyLiteralsToByteArray(cmds, data, pos, mask, literals) | ||||
|  | ||||
| 		/* Create the block split on the array of literals. | ||||
| 		   Literal histograms have alphabet size 256. */ | ||||
| @@ -116,28 +109,26 @@ func splitBlock(cmds []command, num_commands uint, data []byte, pos uint, mask u | ||||
| 		literals = nil | ||||
| 	} | ||||
| 	{ | ||||
| 		var insert_and_copy_codes []uint16 = make([]uint16, num_commands) | ||||
| 		var insert_and_copy_codes []uint16 = make([]uint16, len(cmds)) | ||||
| 		/* Compute prefix codes for commands. */ | ||||
|  | ||||
| 		var i uint | ||||
| 		for i = 0; i < num_commands; i++ { | ||||
| 		for i := range cmds { | ||||
| 			insert_and_copy_codes[i] = cmds[i].cmd_prefix_ | ||||
| 		} | ||||
|  | ||||
| 		/* Create the block split on the array of command prefixes. */ | ||||
| 		splitByteVectorCommand(insert_and_copy_codes, num_commands, kSymbolsPerCommandHistogram, kMaxCommandHistograms, kCommandStrideLength, kCommandBlockSwitchCost, params, insert_and_copy_split) | ||||
| 		splitByteVectorCommand(insert_and_copy_codes, kSymbolsPerCommandHistogram, kMaxCommandHistograms, kCommandStrideLength, kCommandBlockSwitchCost, params, insert_and_copy_split) | ||||
|  | ||||
| 		/* TODO: reuse for distances? */ | ||||
|  | ||||
| 		insert_and_copy_codes = nil | ||||
| 	} | ||||
| 	{ | ||||
| 		var distance_prefixes []uint16 = make([]uint16, num_commands) | ||||
| 		var distance_prefixes []uint16 = make([]uint16, len(cmds)) | ||||
| 		var j uint = 0 | ||||
| 		/* Create a continuous array of distance prefixes. */ | ||||
|  | ||||
| 		var i uint | ||||
| 		for i = 0; i < num_commands; i++ { | ||||
| 		for i := range cmds { | ||||
| 			var cmd *command = &cmds[i] | ||||
| 			if commandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 { | ||||
| 				distance_prefixes[j] = cmd.dist_prefix_ & 0x3FF | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/andybalholm/brotli/block_splitter_command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/andybalholm/brotli/block_splitter_command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -372,7 +372,8 @@ func clusterBlocksCommand(data []uint16, length uint, num_blocks uint, block_ids | ||||
| 	histogram_symbols = nil | ||||
| } | ||||
|  | ||||
| func splitByteVectorCommand(data []uint16, length uint, literals_per_histogram uint, max_histograms uint, sampling_stride_length uint, block_switch_cost float64, params *encoderParams, split *blockSplit) { | ||||
| func splitByteVectorCommand(data []uint16, literals_per_histogram uint, max_histograms uint, sampling_stride_length uint, block_switch_cost float64, params *encoderParams, split *blockSplit) { | ||||
| 	length := uint(len(data)) | ||||
| 	var data_size uint = histogramDataSizeCommand() | ||||
| 	var num_histograms uint = length/literals_per_histogram + 1 | ||||
| 	var histograms []histogramCommand | ||||
|   | ||||
							
								
								
									
										484
									
								
								vendor/github.com/andybalholm/brotli/brotli_bit_stream.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										484
									
								
								vendor/github.com/andybalholm/brotli/brotli_bit_stream.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								vendor/github.com/andybalholm/brotli/command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/andybalholm/brotli/command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -194,26 +194,28 @@ type command struct { | ||||
| } | ||||
|  | ||||
| /* distance_code is e.g. 0 for same-as-last short code, or 16 for offset 1. */ | ||||
| func initCommand(self *command, dist *distanceParams, insertlen uint, copylen uint, copylen_code_delta int, distance_code uint) { | ||||
| func makeCommand(dist *distanceParams, insertlen uint, copylen uint, copylen_code_delta int, distance_code uint) (cmd command) { | ||||
| 	/* Don't rely on signed int representation, use honest casts. */ | ||||
| 	var delta uint32 = uint32(byte(int8(copylen_code_delta))) | ||||
| 	self.insert_len_ = uint32(insertlen) | ||||
| 	self.copy_len_ = uint32(uint32(copylen) | delta<<25) | ||||
| 	cmd.insert_len_ = uint32(insertlen) | ||||
| 	cmd.copy_len_ = uint32(uint32(copylen) | delta<<25) | ||||
|  | ||||
| 	/* The distance prefix and extra bits are stored in this Command as if | ||||
| 	   npostfix and ndirect were 0, they are only recomputed later after the | ||||
| 	   clustering if needed. */ | ||||
| 	prefixEncodeCopyDistance(distance_code, uint(dist.num_direct_distance_codes), uint(dist.distance_postfix_bits), &self.dist_prefix_, &self.dist_extra_) | ||||
| 	prefixEncodeCopyDistance(distance_code, uint(dist.num_direct_distance_codes), uint(dist.distance_postfix_bits), &cmd.dist_prefix_, &cmd.dist_extra_) | ||||
| 	getLengthCode(insertlen, uint(int(copylen)+copylen_code_delta), (cmd.dist_prefix_&0x3FF == 0), &cmd.cmd_prefix_) | ||||
|  | ||||
| 	getLengthCode(insertlen, uint(int(copylen)+copylen_code_delta), (self.dist_prefix_&0x3FF == 0), &self.cmd_prefix_) | ||||
| 	return cmd | ||||
| } | ||||
|  | ||||
| func initInsertCommand(self *command, insertlen uint) { | ||||
| 	self.insert_len_ = uint32(insertlen) | ||||
| 	self.copy_len_ = 4 << 25 | ||||
| 	self.dist_extra_ = 0 | ||||
| 	self.dist_prefix_ = numDistanceShortCodes | ||||
| 	getLengthCode(insertlen, 4, false, &self.cmd_prefix_) | ||||
| func makeInsertCommand(insertlen uint) (cmd command) { | ||||
| 	cmd.insert_len_ = uint32(insertlen) | ||||
| 	cmd.copy_len_ = 4 << 25 | ||||
| 	cmd.dist_extra_ = 0 | ||||
| 	cmd.dist_prefix_ = numDistanceShortCodes | ||||
| 	getLengthCode(insertlen, 4, false, &cmd.cmd_prefix_) | ||||
| 	return cmd | ||||
| } | ||||
|  | ||||
| func commandRestoreDistanceCode(self *command, dist *distanceParams) uint32 { | ||||
|   | ||||
							
								
								
									
										365
									
								
								vendor/github.com/andybalholm/brotli/compress_fragment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										365
									
								
								vendor/github.com/andybalholm/brotli/compress_fragment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -33,14 +33,8 @@ func hashBytesAtOffset5(v uint64, offset int, shift uint) uint32 { | ||||
| } | ||||
|  | ||||
| func isMatch5(p1 []byte, p2 []byte) bool { | ||||
| 	var i int | ||||
| 	for i = 0; i < 5; i++ { | ||||
| 		if p1[i] != p2[i] { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| 	return binary.LittleEndian.Uint32(p1) == binary.LittleEndian.Uint32(p2) && | ||||
| 		p1[4] == p2[4] | ||||
| } | ||||
|  | ||||
| /* Builds a literal prefix code into "depths" and "bits" based on the statistics | ||||
| @@ -51,7 +45,7 @@ func isMatch5(p1 []byte, p2 []byte) bool { | ||||
|    and thus have to assign a non-zero depth for each literal. | ||||
|    Returns estimated compression ratio millibytes/char for encoding given input | ||||
|    with generated code. */ | ||||
| func buildAndStoreLiteralPrefixCode(input []byte, input_size uint, depths []byte, bits []uint16, storage_ix *uint, storage []byte) uint { | ||||
| func buildAndStoreLiteralPrefixCode(input []byte, input_size uint, depths []byte, bits []uint16, bw *bitWriter) uint { | ||||
| 	var histogram = [256]uint32{0} | ||||
| 	var histogram_total uint | ||||
| 	var i uint | ||||
| @@ -88,7 +82,7 @@ func buildAndStoreLiteralPrefixCode(input []byte, input_size uint, depths []byte | ||||
| 	} | ||||
|  | ||||
| 	buildAndStoreHuffmanTreeFast(histogram[:], histogram_total, /* max_bits = */ | ||||
| 		8, depths, bits, storage_ix, storage) | ||||
| 		8, depths, bits, bw) | ||||
| 	{ | ||||
| 		var literal_ratio uint = 0 | ||||
| 		for i = 0; i < 256; i++ { | ||||
| @@ -104,7 +98,7 @@ func buildAndStoreLiteralPrefixCode(input []byte, input_size uint, depths []byte | ||||
|  | ||||
| /* Builds a command and distance prefix code (each 64 symbols) into "depth" and | ||||
|    "bits" based on "histogram" and stores it into the bit stream. */ | ||||
| func buildAndStoreCommandPrefixCode1(histogram []uint32, depth []byte, bits []uint16, storage_ix *uint, storage []byte) { | ||||
| func buildAndStoreCommandPrefixCode1(histogram []uint32, depth []byte, bits []uint16, bw *bitWriter) { | ||||
| 	var tree [129]huffmanTree | ||||
| 	var cmd_depth = [numCommandSymbols]byte{0} | ||||
| 	/* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */ | ||||
| @@ -151,141 +145,141 @@ func buildAndStoreCommandPrefixCode1(histogram []uint32, depth []byte, bits []ui | ||||
| 			cmd_depth[448+8*i] = depth[56+i] | ||||
| 		} | ||||
|  | ||||
| 		storeHuffmanTree(cmd_depth[:], numCommandSymbols, tree[:], storage_ix, storage) | ||||
| 		storeHuffmanTree(cmd_depth[:], numCommandSymbols, tree[:], bw) | ||||
| 	} | ||||
|  | ||||
| 	storeHuffmanTree(depth[64:], 64, tree[:], storage_ix, storage) | ||||
| 	storeHuffmanTree(depth[64:], 64, tree[:], bw) | ||||
| } | ||||
|  | ||||
| /* REQUIRES: insertlen < 6210 */ | ||||
| func emitInsertLen1(insertlen uint, depth []byte, bits []uint16, histo []uint32, storage_ix *uint, storage []byte) { | ||||
| func emitInsertLen1(insertlen uint, depth []byte, bits []uint16, histo []uint32, bw *bitWriter) { | ||||
| 	if insertlen < 6 { | ||||
| 		var code uint = insertlen + 40 | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		histo[code]++ | ||||
| 	} else if insertlen < 130 { | ||||
| 		var tail uint = insertlen - 2 | ||||
| 		var nbits uint32 = log2FloorNonZero(tail) - 1 | ||||
| 		var prefix uint = tail >> nbits | ||||
| 		var inscode uint = uint((nbits << 1) + uint32(prefix) + 42) | ||||
| 		writeBits(uint(depth[inscode]), uint64(bits[inscode]), storage_ix, storage) | ||||
| 		writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<<nbits), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[inscode]), uint64(bits[inscode])) | ||||
| 		bw.writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<<nbits)) | ||||
| 		histo[inscode]++ | ||||
| 	} else if insertlen < 2114 { | ||||
| 		var tail uint = insertlen - 66 | ||||
| 		var nbits uint32 = log2FloorNonZero(tail) | ||||
| 		var code uint = uint(nbits + 50) | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<<nbits), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		bw.writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<<nbits)) | ||||
| 		histo[code]++ | ||||
| 	} else { | ||||
| 		writeBits(uint(depth[61]), uint64(bits[61]), storage_ix, storage) | ||||
| 		writeBits(12, uint64(insertlen)-2114, storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[61]), uint64(bits[61])) | ||||
| 		bw.writeBits(12, uint64(insertlen)-2114) | ||||
| 		histo[61]++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func emitLongInsertLen(insertlen uint, depth []byte, bits []uint16, histo []uint32, storage_ix *uint, storage []byte) { | ||||
| func emitLongInsertLen(insertlen uint, depth []byte, bits []uint16, histo []uint32, bw *bitWriter) { | ||||
| 	if insertlen < 22594 { | ||||
| 		writeBits(uint(depth[62]), uint64(bits[62]), storage_ix, storage) | ||||
| 		writeBits(14, uint64(insertlen)-6210, storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[62]), uint64(bits[62])) | ||||
| 		bw.writeBits(14, uint64(insertlen)-6210) | ||||
| 		histo[62]++ | ||||
| 	} else { | ||||
| 		writeBits(uint(depth[63]), uint64(bits[63]), storage_ix, storage) | ||||
| 		writeBits(24, uint64(insertlen)-22594, storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[63]), uint64(bits[63])) | ||||
| 		bw.writeBits(24, uint64(insertlen)-22594) | ||||
| 		histo[63]++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func emitCopyLen1(copylen uint, depth []byte, bits []uint16, histo []uint32, storage_ix *uint, storage []byte) { | ||||
| func emitCopyLen1(copylen uint, depth []byte, bits []uint16, histo []uint32, bw *bitWriter) { | ||||
| 	if copylen < 10 { | ||||
| 		writeBits(uint(depth[copylen+14]), uint64(bits[copylen+14]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[copylen+14]), uint64(bits[copylen+14])) | ||||
| 		histo[copylen+14]++ | ||||
| 	} else if copylen < 134 { | ||||
| 		var tail uint = copylen - 6 | ||||
| 		var nbits uint32 = log2FloorNonZero(tail) - 1 | ||||
| 		var prefix uint = tail >> nbits | ||||
| 		var code uint = uint((nbits << 1) + uint32(prefix) + 20) | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<<nbits), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		bw.writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<<nbits)) | ||||
| 		histo[code]++ | ||||
| 	} else if copylen < 2118 { | ||||
| 		var tail uint = copylen - 70 | ||||
| 		var nbits uint32 = log2FloorNonZero(tail) | ||||
| 		var code uint = uint(nbits + 28) | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<<nbits), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		bw.writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<<nbits)) | ||||
| 		histo[code]++ | ||||
| 	} else { | ||||
| 		writeBits(uint(depth[39]), uint64(bits[39]), storage_ix, storage) | ||||
| 		writeBits(24, uint64(copylen)-2118, storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[39]), uint64(bits[39])) | ||||
| 		bw.writeBits(24, uint64(copylen)-2118) | ||||
| 		histo[39]++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func emitCopyLenLastDistance1(copylen uint, depth []byte, bits []uint16, histo []uint32, storage_ix *uint, storage []byte) { | ||||
| func emitCopyLenLastDistance1(copylen uint, depth []byte, bits []uint16, histo []uint32, bw *bitWriter) { | ||||
| 	if copylen < 12 { | ||||
| 		writeBits(uint(depth[copylen-4]), uint64(bits[copylen-4]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[copylen-4]), uint64(bits[copylen-4])) | ||||
| 		histo[copylen-4]++ | ||||
| 	} else if copylen < 72 { | ||||
| 		var tail uint = copylen - 8 | ||||
| 		var nbits uint32 = log2FloorNonZero(tail) - 1 | ||||
| 		var prefix uint = tail >> nbits | ||||
| 		var code uint = uint((nbits << 1) + uint32(prefix) + 4) | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<<nbits), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		bw.writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<<nbits)) | ||||
| 		histo[code]++ | ||||
| 	} else if copylen < 136 { | ||||
| 		var tail uint = copylen - 8 | ||||
| 		var code uint = (tail >> 5) + 30 | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		writeBits(5, uint64(tail)&31, storage_ix, storage) | ||||
| 		writeBits(uint(depth[64]), uint64(bits[64]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		bw.writeBits(5, uint64(tail)&31) | ||||
| 		bw.writeBits(uint(depth[64]), uint64(bits[64])) | ||||
| 		histo[code]++ | ||||
| 		histo[64]++ | ||||
| 	} else if copylen < 2120 { | ||||
| 		var tail uint = copylen - 72 | ||||
| 		var nbits uint32 = log2FloorNonZero(tail) | ||||
| 		var code uint = uint(nbits + 28) | ||||
| 		writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage) | ||||
| 		writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<<nbits), storage_ix, storage) | ||||
| 		writeBits(uint(depth[64]), uint64(bits[64]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[code]), uint64(bits[code])) | ||||
| 		bw.writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<<nbits)) | ||||
| 		bw.writeBits(uint(depth[64]), uint64(bits[64])) | ||||
| 		histo[code]++ | ||||
| 		histo[64]++ | ||||
| 	} else { | ||||
| 		writeBits(uint(depth[39]), uint64(bits[39]), storage_ix, storage) | ||||
| 		writeBits(24, uint64(copylen)-2120, storage_ix, storage) | ||||
| 		writeBits(uint(depth[64]), uint64(bits[64]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[39]), uint64(bits[39])) | ||||
| 		bw.writeBits(24, uint64(copylen)-2120) | ||||
| 		bw.writeBits(uint(depth[64]), uint64(bits[64])) | ||||
| 		histo[39]++ | ||||
| 		histo[64]++ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func emitDistance1(distance uint, depth []byte, bits []uint16, histo []uint32, storage_ix *uint, storage []byte) { | ||||
| func emitDistance1(distance uint, depth []byte, bits []uint16, histo []uint32, bw *bitWriter) { | ||||
| 	var d uint = distance + 3 | ||||
| 	var nbits uint32 = log2FloorNonZero(d) - 1 | ||||
| 	var prefix uint = (d >> nbits) & 1 | ||||
| 	var offset uint = (2 + prefix) << nbits | ||||
| 	var distcode uint = uint(2*(nbits-1) + uint32(prefix) + 80) | ||||
| 	writeBits(uint(depth[distcode]), uint64(bits[distcode]), storage_ix, storage) | ||||
| 	writeBits(uint(nbits), uint64(d)-uint64(offset), storage_ix, storage) | ||||
| 	bw.writeBits(uint(depth[distcode]), uint64(bits[distcode])) | ||||
| 	bw.writeBits(uint(nbits), uint64(d)-uint64(offset)) | ||||
| 	histo[distcode]++ | ||||
| } | ||||
|  | ||||
| func emitLiterals(input []byte, len uint, depth []byte, bits []uint16, storage_ix *uint, storage []byte) { | ||||
| func emitLiterals(input []byte, len uint, depth []byte, bits []uint16, bw *bitWriter) { | ||||
| 	var j uint | ||||
| 	for j = 0; j < len; j++ { | ||||
| 		var lit byte = input[j] | ||||
| 		writeBits(uint(depth[lit]), uint64(bits[lit]), storage_ix, storage) | ||||
| 		bw.writeBits(uint(depth[lit]), uint64(bits[lit])) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* REQUIRES: len <= 1 << 24. */ | ||||
| func storeMetaBlockHeader1(len uint, is_uncompressed bool, storage_ix *uint, storage []byte) { | ||||
| func storeMetaBlockHeader1(len uint, is_uncompressed bool, bw *bitWriter) { | ||||
| 	var nibbles uint = 6 | ||||
|  | ||||
| 	/* ISLAST */ | ||||
| 	writeBits(1, 0, storage_ix, storage) | ||||
| 	bw.writeBits(1, 0) | ||||
|  | ||||
| 	if len <= 1<<16 { | ||||
| 		nibbles = 4 | ||||
| @@ -293,34 +287,11 @@ func storeMetaBlockHeader1(len uint, is_uncompressed bool, storage_ix *uint, sto | ||||
| 		nibbles = 5 | ||||
| 	} | ||||
|  | ||||
| 	writeBits(2, uint64(nibbles)-4, storage_ix, storage) | ||||
| 	writeBits(nibbles*4, uint64(len)-1, storage_ix, storage) | ||||
| 	bw.writeBits(2, uint64(nibbles)-4) | ||||
| 	bw.writeBits(nibbles*4, uint64(len)-1) | ||||
|  | ||||
| 	/* ISUNCOMPRESSED */ | ||||
| 	writeSingleBit(is_uncompressed, storage_ix, storage) | ||||
| } | ||||
|  | ||||
| func updateBits(n_bits uint, bits uint32, pos uint, array []byte) { | ||||
| 	for n_bits > 0 { | ||||
| 		var byte_pos uint = pos >> 3 | ||||
| 		var n_unchanged_bits uint = pos & 7 | ||||
| 		var n_changed_bits uint = brotli_min_size_t(n_bits, 8-n_unchanged_bits) | ||||
| 		var total_bits uint = n_unchanged_bits + n_changed_bits | ||||
| 		var mask uint32 = (^((1 << total_bits) - 1)) | ((1 << n_unchanged_bits) - 1) | ||||
| 		var unchanged_bits uint32 = uint32(array[byte_pos]) & mask | ||||
| 		var changed_bits uint32 = bits & ((1 << n_changed_bits) - 1) | ||||
| 		array[byte_pos] = byte(changed_bits<<n_unchanged_bits | unchanged_bits) | ||||
| 		n_bits -= n_changed_bits | ||||
| 		bits >>= n_changed_bits | ||||
| 		pos += n_changed_bits | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func rewindBitPosition1(new_storage_ix uint, storage_ix *uint, storage []byte) { | ||||
| 	var bitpos uint = new_storage_ix & 7 | ||||
| 	var mask uint = (1 << bitpos) - 1 | ||||
| 	storage[new_storage_ix>>3] &= byte(mask) | ||||
| 	*storage_ix = new_storage_ix | ||||
| 	bw.writeSingleBit(is_uncompressed) | ||||
| } | ||||
|  | ||||
| var shouldMergeBlock_kSampleRate uint = 43 | ||||
| @@ -351,151 +322,26 @@ func shouldUseUncompressedMode(metablock_start []byte, next_emit []byte, insertl | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func emitUncompressedMetaBlock1(begin []byte, end []byte, storage_ix_start uint, storage_ix *uint, storage []byte) { | ||||
| 	var len uint = uint(-cap(end) + cap(begin)) | ||||
| 	rewindBitPosition1(storage_ix_start, storage_ix, storage) | ||||
| 	storeMetaBlockHeader1(uint(len), true, storage_ix, storage) | ||||
| 	*storage_ix = (*storage_ix + 7) &^ 7 | ||||
| 	copy(storage[*storage_ix>>3:], begin[:len]) | ||||
| 	*storage_ix += uint(len << 3) | ||||
| 	storage[*storage_ix>>3] = 0 | ||||
| func emitUncompressedMetaBlock1(data []byte, storage_ix_start uint, bw *bitWriter) { | ||||
| 	bw.rewind(storage_ix_start) | ||||
| 	storeMetaBlockHeader1(uint(len(data)), true, bw) | ||||
| 	bw.jumpToByteBoundary() | ||||
| 	bw.writeBytes(data) | ||||
| } | ||||
|  | ||||
| var kCmdHistoSeed = [128]uint32{ | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	1, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, | ||||
| 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, | ||||
| 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||||
| 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||||
| 	1, 1, 1, 1, 0, 0, 0, 0, | ||||
| } | ||||
|  | ||||
| var compressFragmentFastImpl_kFirstBlockSize uint = 3 << 15 | ||||
| var compressFragmentFastImpl_kMergeBlockSize uint = 1 << 16 | ||||
|  | ||||
| func compressFragmentFastImpl(in []byte, input_size uint, is_last bool, table []int, table_bits uint, cmd_depth []byte, cmd_bits []uint16, cmd_code_numbits *uint, cmd_code []byte, storage_ix *uint, storage []byte) { | ||||
| func compressFragmentFastImpl(in []byte, input_size uint, is_last bool, table []int, table_bits uint, cmd_depth []byte, cmd_bits []uint16, cmd_code_numbits *uint, cmd_code []byte, bw *bitWriter) { | ||||
| 	var cmd_histo [128]uint32 | ||||
| 	var ip_end int | ||||
| 	var next_emit int = 0 | ||||
| @@ -506,7 +352,7 @@ func compressFragmentFastImpl(in []byte, input_size uint, is_last bool, table [] | ||||
| 	var metablock_start int = input | ||||
| 	var block_size uint = brotli_min_size_t(input_size, compressFragmentFastImpl_kFirstBlockSize) | ||||
| 	var total_block_size uint = block_size | ||||
| 	var mlen_storage_ix uint = *storage_ix + 3 | ||||
| 	var mlen_storage_ix uint = bw.getPos() + 3 | ||||
| 	var lit_depth [256]byte | ||||
| 	var lit_bits [256]uint16 | ||||
| 	var literal_ratio uint | ||||
| @@ -523,21 +369,21 @@ func compressFragmentFastImpl(in []byte, input_size uint, is_last bool, table [] | ||||
|  | ||||
| 	/* Save the bit position of the MLEN field of the meta-block header, so that | ||||
| 	   we can update it later if we decide to extend this meta-block. */ | ||||
| 	storeMetaBlockHeader1(block_size, false, storage_ix, storage) | ||||
| 	storeMetaBlockHeader1(block_size, false, bw) | ||||
|  | ||||
| 	/* No block splits, no contexts. */ | ||||
| 	writeBits(13, 0, storage_ix, storage) | ||||
| 	bw.writeBits(13, 0) | ||||
|  | ||||
| 	literal_ratio = buildAndStoreLiteralPrefixCode(in[input:], block_size, lit_depth[:], lit_bits[:], storage_ix, storage) | ||||
| 	literal_ratio = buildAndStoreLiteralPrefixCode(in[input:], block_size, lit_depth[:], lit_bits[:], bw) | ||||
| 	{ | ||||
| 		/* Store the pre-compressed command and distance prefix codes. */ | ||||
| 		var i uint | ||||
| 		for i = 0; i+7 < *cmd_code_numbits; i += 8 { | ||||
| 			writeBits(8, uint64(cmd_code[i>>3]), storage_ix, storage) | ||||
| 			bw.writeBits(8, uint64(cmd_code[i>>3])) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	writeBits(*cmd_code_numbits&7, uint64(cmd_code[*cmd_code_numbits>>3]), storage_ix, storage) | ||||
| 	bw.writeBits(*cmd_code_numbits&7, uint64(cmd_code[*cmd_code_numbits>>3])) | ||||
|  | ||||
| 	/* Initialize the command and distance histograms. We will gather | ||||
| 	   statistics of command and distance codes during the processing | ||||
| @@ -636,27 +482,27 @@ emit_commands: | ||||
| 				var insert uint = uint(base - next_emit) | ||||
| 				ip += int(matched) | ||||
| 				if insert < 6210 { | ||||
| 					emitInsertLen1(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 					emitInsertLen1(insert, cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
| 				} else if shouldUseUncompressedMode(in[metablock_start:], in[next_emit:], insert, literal_ratio) { | ||||
| 					emitUncompressedMetaBlock1(in[metablock_start:], in[base:], mlen_storage_ix-3, storage_ix, storage) | ||||
| 					emitUncompressedMetaBlock1(in[metablock_start:base], mlen_storage_ix-3, bw) | ||||
| 					input_size -= uint(base - input) | ||||
| 					input = base | ||||
| 					next_emit = input | ||||
| 					goto next_block | ||||
| 				} else { | ||||
| 					emitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 					emitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
| 				} | ||||
|  | ||||
| 				emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], storage_ix, storage) | ||||
| 				emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], bw) | ||||
| 				if distance == last_distance { | ||||
| 					writeBits(uint(cmd_depth[64]), uint64(cmd_bits[64]), storage_ix, storage) | ||||
| 					bw.writeBits(uint(cmd_depth[64]), uint64(cmd_bits[64])) | ||||
| 					cmd_histo[64]++ | ||||
| 				} else { | ||||
| 					emitDistance1(uint(distance), cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 					emitDistance1(uint(distance), cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
| 					last_distance = distance | ||||
| 				} | ||||
|  | ||||
| 				emitCopyLenLastDistance1(matched, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 				emitCopyLenLastDistance1(matched, cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
|  | ||||
| 				next_emit = ip | ||||
| 				if ip >= ip_limit { | ||||
| @@ -692,8 +538,8 @@ emit_commands: | ||||
| 				} | ||||
| 				ip += int(matched) | ||||
| 				last_distance = int(base - candidate) /* > 0 */ | ||||
| 				emitCopyLen1(matched, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 				emitDistance1(uint(last_distance), cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 				emitCopyLen1(matched, cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
| 				emitDistance1(uint(last_distance), cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
|  | ||||
| 				next_emit = ip | ||||
| 				if ip >= ip_limit { | ||||
| @@ -739,7 +585,7 @@ emit_remainder: | ||||
| 		   nibbles. */ | ||||
| 		total_block_size += block_size | ||||
|  | ||||
| 		updateBits(20, uint32(total_block_size-1), mlen_storage_ix, storage) | ||||
| 		bw.updateBits(20, uint32(total_block_size-1), mlen_storage_ix) | ||||
| 		goto emit_commands | ||||
| 	} | ||||
|  | ||||
| @@ -747,13 +593,13 @@ emit_remainder: | ||||
| 	if next_emit < ip_end { | ||||
| 		var insert uint = uint(ip_end - next_emit) | ||||
| 		if insert < 6210 { | ||||
| 			emitInsertLen1(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 			emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], storage_ix, storage) | ||||
| 			emitInsertLen1(insert, cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
| 			emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], bw) | ||||
| 		} else if shouldUseUncompressedMode(in[metablock_start:], in[next_emit:], insert, literal_ratio) { | ||||
| 			emitUncompressedMetaBlock1(in[metablock_start:], in[ip_end:], mlen_storage_ix-3, storage_ix, storage) | ||||
| 			emitUncompressedMetaBlock1(in[metablock_start:ip_end], mlen_storage_ix-3, bw) | ||||
| 		} else { | ||||
| 			emitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage) | ||||
| 			emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], storage_ix, storage) | ||||
| 			emitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo[:], bw) | ||||
| 			emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], bw) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -769,30 +615,29 @@ next_block: | ||||
|  | ||||
| 		/* Save the bit position of the MLEN field of the meta-block header, so that | ||||
| 		   we can update it later if we decide to extend this meta-block. */ | ||||
| 		mlen_storage_ix = *storage_ix + 3 | ||||
| 		mlen_storage_ix = bw.getPos() + 3 | ||||
|  | ||||
| 		storeMetaBlockHeader1(block_size, false, storage_ix, storage) | ||||
| 		storeMetaBlockHeader1(block_size, false, bw) | ||||
|  | ||||
| 		/* No block splits, no contexts. */ | ||||
| 		writeBits(13, 0, storage_ix, storage) | ||||
| 		bw.writeBits(13, 0) | ||||
|  | ||||
| 		literal_ratio = buildAndStoreLiteralPrefixCode(in[input:], block_size, lit_depth[:], lit_bits[:], storage_ix, storage) | ||||
| 		buildAndStoreCommandPrefixCode1(cmd_histo[:], cmd_depth, cmd_bits, storage_ix, storage) | ||||
| 		literal_ratio = buildAndStoreLiteralPrefixCode(in[input:], block_size, lit_depth[:], lit_bits[:], bw) | ||||
| 		buildAndStoreCommandPrefixCode1(cmd_histo[:], cmd_depth, cmd_bits, bw) | ||||
| 		goto emit_commands | ||||
| 	} | ||||
|  | ||||
| 	if !is_last { | ||||
| 		/* If this is not the last block, update the command and distance prefix | ||||
| 		   codes for the next block and store the compressed forms. */ | ||||
| 		cmd_code[0] = 0 | ||||
|  | ||||
| 		*cmd_code_numbits = 0 | ||||
| 		buildAndStoreCommandPrefixCode1(cmd_histo[:], cmd_depth, cmd_bits, cmd_code_numbits, cmd_code) | ||||
| 		var bw bitWriter | ||||
| 		bw.dst = cmd_code | ||||
| 		buildAndStoreCommandPrefixCode1(cmd_histo[:], cmd_depth, cmd_bits, &bw) | ||||
| 		*cmd_code_numbits = bw.getPos() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Compresses "input" string to the "*storage" buffer as one or more complete | ||||
|    meta-blocks, and updates the "*storage_ix" bit position. | ||||
| /* Compresses "input" string to bw as one or more complete meta-blocks. | ||||
|  | ||||
|    If "is_last" is 1, emits an additional empty last meta-block. | ||||
|  | ||||
| @@ -813,28 +658,28 @@ next_block: | ||||
|    REQUIRES: "table_size" is an odd (9, 11, 13, 15) power of two | ||||
|    OUTPUT: maximal copy distance <= |input_size| | ||||
|    OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */ | ||||
| func compressFragmentFast(input []byte, input_size uint, is_last bool, table []int, table_size uint, cmd_depth []byte, cmd_bits []uint16, cmd_code_numbits *uint, cmd_code []byte, storage_ix *uint, storage []byte) { | ||||
| 	var initial_storage_ix uint = *storage_ix | ||||
| func compressFragmentFast(input []byte, input_size uint, is_last bool, table []int, table_size uint, cmd_depth []byte, cmd_bits []uint16, cmd_code_numbits *uint, cmd_code []byte, bw *bitWriter) { | ||||
| 	var initial_storage_ix uint = bw.getPos() | ||||
| 	var table_bits uint = uint(log2FloorNonZero(table_size)) | ||||
|  | ||||
| 	if input_size == 0 { | ||||
| 		assert(is_last) | ||||
| 		writeBits(1, 1, storage_ix, storage) /* islast */ | ||||
| 		writeBits(1, 1, storage_ix, storage) /* isempty */ | ||||
| 		*storage_ix = (*storage_ix + 7) &^ 7 | ||||
| 		bw.writeBits(1, 1) /* islast */ | ||||
| 		bw.writeBits(1, 1) /* isempty */ | ||||
| 		bw.jumpToByteBoundary() | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	compressFragmentFastImpl(input, input_size, is_last, table, table_bits, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage) | ||||
| 	compressFragmentFastImpl(input, input_size, is_last, table, table_bits, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, bw) | ||||
|  | ||||
| 	/* If output is larger than single uncompressed block, rewrite it. */ | ||||
| 	if *storage_ix-initial_storage_ix > 31+(input_size<<3) { | ||||
| 		emitUncompressedMetaBlock1(input, input[input_size:], initial_storage_ix, storage_ix, storage) | ||||
| 	if bw.getPos()-initial_storage_ix > 31+(input_size<<3) { | ||||
| 		emitUncompressedMetaBlock1(input[:input_size], initial_storage_ix, bw) | ||||
| 	} | ||||
|  | ||||
| 	if is_last { | ||||
| 		writeBits(1, 1, storage_ix, storage) /* islast */ | ||||
| 		writeBits(1, 1, storage_ix, storage) /* isempty */ | ||||
| 		*storage_ix = (*storage_ix + 7) &^ 7 | ||||
| 		bw.writeBits(1, 1) /* islast */ | ||||
| 		bw.writeBits(1, 1) /* isempty */ | ||||
| 		bw.jumpToByteBoundary() | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										250
									
								
								vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										250
									
								
								vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -30,19 +30,18 @@ func hashBytesAtOffset(v uint64, offset uint, shift uint, length uint) uint32 { | ||||
| } | ||||
|  | ||||
| func isMatch1(p1 []byte, p2 []byte, length uint) bool { | ||||
| 	var i uint | ||||
| 	for i = 0; i < length && i < 6; i++ { | ||||
| 		if p1[i] != p2[i] { | ||||
| 			return false | ||||
| 		} | ||||
| 	if binary.LittleEndian.Uint32(p1) != binary.LittleEndian.Uint32(p2) { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| 	if length == 4 { | ||||
| 		return true | ||||
| 	} | ||||
| 	return p1[4] == p2[4] && p1[5] == p2[5] | ||||
| } | ||||
|  | ||||
| /* Builds a command and distance prefix code (each 64 symbols) into "depth" and | ||||
|    "bits" based on "histogram" and stores it into the bit stream. */ | ||||
| func buildAndStoreCommandPrefixCode(histogram []uint32, depth []byte, bits []uint16, storage_ix *uint, storage []byte) { | ||||
| func buildAndStoreCommandPrefixCode(histogram []uint32, depth []byte, bits []uint16, bw *bitWriter) { | ||||
| 	var tree [129]huffmanTree | ||||
| 	var cmd_depth = [numCommandSymbols]byte{0} | ||||
| 	/* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */ | ||||
| @@ -88,10 +87,10 @@ func buildAndStoreCommandPrefixCode(histogram []uint32, depth []byte, bits []uin | ||||
| 			cmd_depth[448+8*i] = depth[16+i] | ||||
| 		} | ||||
|  | ||||
| 		storeHuffmanTree(cmd_depth[:], numCommandSymbols, tree[:], storage_ix, storage) | ||||
| 		storeHuffmanTree(cmd_depth[:], numCommandSymbols, tree[:], bw) | ||||
| 	} | ||||
|  | ||||
| 	storeHuffmanTree(depth[64:], 64, tree[:], storage_ix, storage) | ||||
| 	storeHuffmanTree(depth[64:], 64, tree[:], bw) | ||||
| } | ||||
|  | ||||
| func emitInsertLen(insertlen uint32, commands *[]uint32) { | ||||
| @@ -198,11 +197,11 @@ func emitDistance(distance uint32, commands *[]uint32) { | ||||
| } | ||||
|  | ||||
| /* REQUIRES: len <= 1 << 24. */ | ||||
| func storeMetaBlockHeader(len uint, is_uncompressed bool, storage_ix *uint, storage []byte) { | ||||
| func storeMetaBlockHeader(len uint, is_uncompressed bool, bw *bitWriter) { | ||||
| 	var nibbles uint = 6 | ||||
|  | ||||
| 	/* ISLAST */ | ||||
| 	writeBits(1, 0, storage_ix, storage) | ||||
| 	bw.writeBits(1, 0) | ||||
|  | ||||
| 	if len <= 1<<16 { | ||||
| 		nibbles = 4 | ||||
| @@ -210,11 +209,11 @@ func storeMetaBlockHeader(len uint, is_uncompressed bool, storage_ix *uint, stor | ||||
| 		nibbles = 5 | ||||
| 	} | ||||
|  | ||||
| 	writeBits(2, uint64(nibbles)-4, storage_ix, storage) | ||||
| 	writeBits(nibbles*4, uint64(len)-1, storage_ix, storage) | ||||
| 	bw.writeBits(2, uint64(nibbles)-4) | ||||
| 	bw.writeBits(nibbles*4, uint64(len)-1) | ||||
|  | ||||
| 	/* ISUNCOMPRESSED */ | ||||
| 	writeSingleBit(is_uncompressed, storage_ix, storage) | ||||
| 	bw.writeSingleBit(is_uncompressed) | ||||
| } | ||||
|  | ||||
| func createCommands(input []byte, block_size uint, input_size uint, base_ip_ptr []byte, table []int, table_bits uint, min_match uint, literals *[]byte, commands *[]uint32) { | ||||
| @@ -441,163 +440,20 @@ emit_remainder: | ||||
| } | ||||
|  | ||||
| var storeCommands_kNumExtraBits = [128]uint32{ | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	2, | ||||
| 	2, | ||||
| 	3, | ||||
| 	3, | ||||
| 	4, | ||||
| 	4, | ||||
| 	5, | ||||
| 	5, | ||||
| 	6, | ||||
| 	7, | ||||
| 	8, | ||||
| 	9, | ||||
| 	10, | ||||
| 	12, | ||||
| 	14, | ||||
| 	24, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	2, | ||||
| 	2, | ||||
| 	3, | ||||
| 	3, | ||||
| 	4, | ||||
| 	4, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	2, | ||||
| 	2, | ||||
| 	3, | ||||
| 	3, | ||||
| 	4, | ||||
| 	4, | ||||
| 	5, | ||||
| 	5, | ||||
| 	6, | ||||
| 	7, | ||||
| 	8, | ||||
| 	9, | ||||
| 	10, | ||||
| 	24, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	0, | ||||
| 	1, | ||||
| 	1, | ||||
| 	2, | ||||
| 	2, | ||||
| 	3, | ||||
| 	3, | ||||
| 	4, | ||||
| 	4, | ||||
| 	5, | ||||
| 	5, | ||||
| 	6, | ||||
| 	6, | ||||
| 	7, | ||||
| 	7, | ||||
| 	8, | ||||
| 	8, | ||||
| 	9, | ||||
| 	9, | ||||
| 	10, | ||||
| 	10, | ||||
| 	11, | ||||
| 	11, | ||||
| 	12, | ||||
| 	12, | ||||
| 	13, | ||||
| 	13, | ||||
| 	14, | ||||
| 	14, | ||||
| 	15, | ||||
| 	15, | ||||
| 	16, | ||||
| 	16, | ||||
| 	17, | ||||
| 	17, | ||||
| 	18, | ||||
| 	18, | ||||
| 	19, | ||||
| 	19, | ||||
| 	20, | ||||
| 	20, | ||||
| 	21, | ||||
| 	21, | ||||
| 	22, | ||||
| 	22, | ||||
| 	23, | ||||
| 	23, | ||||
| 	24, | ||||
| 	24, | ||||
| 	0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24, | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24, | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
| 	1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, | ||||
| 	9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, | ||||
| 	17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, | ||||
| } | ||||
| var storeCommands_kInsertOffset = [24]uint32{ | ||||
| 	0, | ||||
| 	1, | ||||
| 	2, | ||||
| 	3, | ||||
| 	4, | ||||
| 	5, | ||||
| 	6, | ||||
| 	8, | ||||
| 	10, | ||||
| 	14, | ||||
| 	18, | ||||
| 	26, | ||||
| 	34, | ||||
| 	50, | ||||
| 	66, | ||||
| 	98, | ||||
| 	130, | ||||
| 	194, | ||||
| 	322, | ||||
| 	578, | ||||
| 	1090, | ||||
| 	2114, | ||||
| 	6210, | ||||
| 	22594, | ||||
| 	0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578, | ||||
| 	1090, 2114, 6210, 22594, | ||||
| } | ||||
|  | ||||
| func storeCommands(literals []byte, num_literals uint, commands []uint32, num_commands uint, storage_ix *uint, storage []byte) { | ||||
| func storeCommands(literals []byte, num_literals uint, commands []uint32, num_commands uint, bw *bitWriter) { | ||||
| 	var lit_depths [256]byte | ||||
| 	var lit_bits [256]uint16 | ||||
| 	var lit_histo = [256]uint32{0} | ||||
| @@ -610,7 +466,7 @@ func storeCommands(literals []byte, num_literals uint, commands []uint32, num_co | ||||
| 	} | ||||
|  | ||||
| 	buildAndStoreHuffmanTreeFast(lit_histo[:], num_literals, /* max_bits = */ | ||||
| 		8, lit_depths[:], lit_bits[:], storage_ix, storage) | ||||
| 		8, lit_depths[:], lit_bits[:], bw) | ||||
|  | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 		var code uint32 = commands[i] & 0xFF | ||||
| @@ -622,21 +478,21 @@ func storeCommands(literals []byte, num_literals uint, commands []uint32, num_co | ||||
| 	cmd_histo[2] += 1 | ||||
| 	cmd_histo[64] += 1 | ||||
| 	cmd_histo[84] += 1 | ||||
| 	buildAndStoreCommandPrefixCode(cmd_histo[:], cmd_depths[:], cmd_bits[:], storage_ix, storage) | ||||
| 	buildAndStoreCommandPrefixCode(cmd_histo[:], cmd_depths[:], cmd_bits[:], bw) | ||||
|  | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 		var cmd uint32 = commands[i] | ||||
| 		var code uint32 = cmd & 0xFF | ||||
| 		var extra uint32 = cmd >> 8 | ||||
| 		assert(code < 128) | ||||
| 		writeBits(uint(cmd_depths[code]), uint64(cmd_bits[code]), storage_ix, storage) | ||||
| 		writeBits(uint(storeCommands_kNumExtraBits[code]), uint64(extra), storage_ix, storage) | ||||
| 		bw.writeBits(uint(cmd_depths[code]), uint64(cmd_bits[code])) | ||||
| 		bw.writeBits(uint(storeCommands_kNumExtraBits[code]), uint64(extra)) | ||||
| 		if code < 24 { | ||||
| 			var insert uint32 = storeCommands_kInsertOffset[code] + extra | ||||
| 			var j uint32 | ||||
| 			for j = 0; j < insert; j++ { | ||||
| 				var lit byte = literals[0] | ||||
| 				writeBits(uint(lit_depths[lit]), uint64(lit_bits[lit]), storage_ix, storage) | ||||
| 				bw.writeBits(uint(lit_depths[lit]), uint64(lit_bits[lit])) | ||||
| 				literals = literals[1:] | ||||
| 			} | ||||
| 		} | ||||
| @@ -664,22 +520,13 @@ func shouldCompress(input []byte, input_size uint, num_literals uint) bool { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func rewindBitPosition(new_storage_ix uint, storage_ix *uint, storage []byte) { | ||||
| 	var bitpos uint = new_storage_ix & 7 | ||||
| 	var mask uint = (1 << bitpos) - 1 | ||||
| 	storage[new_storage_ix>>3] &= byte(mask) | ||||
| 	*storage_ix = new_storage_ix | ||||
| func emitUncompressedMetaBlock(input []byte, input_size uint, bw *bitWriter) { | ||||
| 	storeMetaBlockHeader(input_size, true, bw) | ||||
| 	bw.jumpToByteBoundary() | ||||
| 	bw.writeBytes(input[:input_size]) | ||||
| } | ||||
|  | ||||
| func emitUncompressedMetaBlock(input []byte, input_size uint, storage_ix *uint, storage []byte) { | ||||
| 	storeMetaBlockHeader(input_size, true, storage_ix, storage) | ||||
| 	*storage_ix = (*storage_ix + 7) &^ 7 | ||||
| 	copy(storage[*storage_ix>>3:], input[:input_size]) | ||||
| 	*storage_ix += input_size << 3 | ||||
| 	storage[*storage_ix>>3] = 0 | ||||
| } | ||||
|  | ||||
| func compressFragmentTwoPassImpl(input []byte, input_size uint, is_last bool, command_buf []uint32, literal_buf []byte, table []int, table_bits uint, min_match uint, storage_ix *uint, storage []byte) { | ||||
| func compressFragmentTwoPassImpl(input []byte, input_size uint, is_last bool, command_buf []uint32, literal_buf []byte, table []int, table_bits uint, min_match uint, bw *bitWriter) { | ||||
| 	/* Save the start of the first block for position and distance computations. | ||||
| 	 */ | ||||
| 	var base_ip []byte = input | ||||
| @@ -693,17 +540,17 @@ func compressFragmentTwoPassImpl(input []byte, input_size uint, is_last bool, co | ||||
| 		num_literals = uint(-cap(literals) + cap(literal_buf)) | ||||
| 		if shouldCompress(input, block_size, num_literals) { | ||||
| 			var num_commands uint = uint(-cap(commands) + cap(command_buf)) | ||||
| 			storeMetaBlockHeader(block_size, false, storage_ix, storage) | ||||
| 			storeMetaBlockHeader(block_size, false, bw) | ||||
|  | ||||
| 			/* No block splits, no contexts. */ | ||||
| 			writeBits(13, 0, storage_ix, storage) | ||||
| 			bw.writeBits(13, 0) | ||||
|  | ||||
| 			storeCommands(literal_buf, num_literals, command_buf, num_commands, storage_ix, storage) | ||||
| 			storeCommands(literal_buf, num_literals, command_buf, num_commands, bw) | ||||
| 		} else { | ||||
| 			/* Since we did not find many backward references and the entropy of | ||||
| 			   the data is close to 8 bits, we can simply emit an uncompressed block. | ||||
| 			   This makes compression speed of uncompressible data about 3x faster. */ | ||||
| 			emitUncompressedMetaBlock(input, block_size, storage_ix, storage) | ||||
| 			emitUncompressedMetaBlock(input, block_size, bw) | ||||
| 		} | ||||
|  | ||||
| 		input = input[block_size:] | ||||
| @@ -711,8 +558,7 @@ func compressFragmentTwoPassImpl(input []byte, input_size uint, is_last bool, co | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Compresses "input" string to the "*storage" buffer as one or more complete | ||||
|    meta-blocks, and updates the "*storage_ix" bit position. | ||||
| /* Compresses "input" string to bw as one or more complete meta-blocks. | ||||
|  | ||||
|    If "is_last" is 1, emits an additional empty last meta-block. | ||||
|  | ||||
| @@ -724,8 +570,8 @@ func compressFragmentTwoPassImpl(input []byte, input_size uint, is_last bool, co | ||||
|    REQUIRES: "table_size" is a power of two | ||||
|    OUTPUT: maximal copy distance <= |input_size| | ||||
|    OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */ | ||||
| func compressFragmentTwoPass(input []byte, input_size uint, is_last bool, command_buf []uint32, literal_buf []byte, table []int, table_size uint, storage_ix *uint, storage []byte) { | ||||
| 	var initial_storage_ix uint = *storage_ix | ||||
| func compressFragmentTwoPass(input []byte, input_size uint, is_last bool, command_buf []uint32, literal_buf []byte, table []int, table_size uint, bw *bitWriter) { | ||||
| 	var initial_storage_ix uint = bw.getPos() | ||||
| 	var table_bits uint = uint(log2FloorNonZero(table_size)) | ||||
| 	var min_match uint | ||||
| 	if table_bits <= 15 { | ||||
| @@ -733,17 +579,17 @@ func compressFragmentTwoPass(input []byte, input_size uint, is_last bool, comman | ||||
| 	} else { | ||||
| 		min_match = 6 | ||||
| 	} | ||||
| 	compressFragmentTwoPassImpl(input, input_size, is_last, command_buf, literal_buf, table, table_bits, min_match, storage_ix, storage) | ||||
| 	compressFragmentTwoPassImpl(input, input_size, is_last, command_buf, literal_buf, table, table_bits, min_match, bw) | ||||
|  | ||||
| 	/* If output is larger than single uncompressed block, rewrite it. */ | ||||
| 	if *storage_ix-initial_storage_ix > 31+(input_size<<3) { | ||||
| 		rewindBitPosition(initial_storage_ix, storage_ix, storage) | ||||
| 		emitUncompressedMetaBlock(input, input_size, storage_ix, storage) | ||||
| 	if bw.getPos()-initial_storage_ix > 31+(input_size<<3) { | ||||
| 		bw.rewind(initial_storage_ix) | ||||
| 		emitUncompressedMetaBlock(input, input_size, bw) | ||||
| 	} | ||||
|  | ||||
| 	if is_last { | ||||
| 		writeBits(1, 1, storage_ix, storage) /* islast */ | ||||
| 		writeBits(1, 1, storage_ix, storage) /* isempty */ | ||||
| 		*storage_ix = (*storage_ix + 7) &^ 7 | ||||
| 		bw.writeBits(1, 1) /* islast */ | ||||
| 		bw.writeBits(1, 1) /* isempty */ | ||||
| 		bw.jumpToByteBoundary() | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										935
									
								
								vendor/github.com/andybalholm/brotli/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										935
									
								
								vendor/github.com/andybalholm/brotli/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								vendor/github.com/andybalholm/brotli/entropy_encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/andybalholm/brotli/entropy_encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -24,7 +24,7 @@ func initHuffmanTree(self *huffmanTree, count uint32, left int16, right int16) { | ||||
| } | ||||
|  | ||||
| /* Input size optimized Shell sort. */ | ||||
| type huffmanTreeComparator func(*huffmanTree, *huffmanTree) bool | ||||
| type huffmanTreeComparator func(huffmanTree, huffmanTree) bool | ||||
|  | ||||
| var sortHuffmanTreeItems_gaps = []uint{132, 57, 23, 10, 4, 1} | ||||
|  | ||||
| @@ -36,14 +36,13 @@ func sortHuffmanTreeItems(items []huffmanTree, n uint, comparator huffmanTreeCom | ||||
| 			var tmp huffmanTree = items[i] | ||||
| 			var k uint = i | ||||
| 			var j uint = i - 1 | ||||
| 			for comparator(&tmp, &items[j]) { | ||||
| 			for comparator(tmp, items[j]) { | ||||
| 				items[k] = items[j] | ||||
| 				k = j | ||||
| 				tmp10 := j | ||||
| 				j-- | ||||
| 				if tmp10 == 0 { | ||||
| 				if j == 0 { | ||||
| 					break | ||||
| 				} | ||||
| 				j-- | ||||
| 			} | ||||
|  | ||||
| 			items[k] = tmp | ||||
| @@ -63,7 +62,7 @@ func sortHuffmanTreeItems(items []huffmanTree, n uint, comparator huffmanTreeCom | ||||
| 			for i = gap; i < n; i++ { | ||||
| 				var j uint = i | ||||
| 				var tmp huffmanTree = items[i] | ||||
| 				for ; j >= gap && comparator(&tmp, &items[j-gap]); j -= gap { | ||||
| 				for ; j >= gap && comparator(tmp, items[j-gap]); j -= gap { | ||||
| 					items[j] = items[j-gap] | ||||
| 				} | ||||
|  | ||||
| @@ -105,7 +104,7 @@ func setDepth(p0 int, pool []huffmanTree, depth []byte, max_depth int) bool { | ||||
| } | ||||
|  | ||||
| /* Sort the root nodes, least popular first. */ | ||||
| func sortHuffmanTree(v0 *huffmanTree, v1 *huffmanTree) bool { | ||||
| func sortHuffmanTree(v0 huffmanTree, v1 huffmanTree) bool { | ||||
| 	if v0.total_count_ != v1.total_count_ { | ||||
| 		return v0.total_count_ < v1.total_count_ | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/github.com/andybalholm/brotli/entropy_encode_static.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/andybalholm/brotli/entropy_encode_static.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -778,8 +778,9 @@ var kStaticDistanceCodeDepth = [64]byte{ | ||||
|  | ||||
| var kCodeLengthBits = [18]uint32{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 15, 31, 0, 11, 7} | ||||
|  | ||||
| func storeStaticCodeLengthCode(storage_ix *uint, storage []byte) { | ||||
| 	writeBits(40, 0x0000FF55555554, storage_ix, storage) | ||||
| func storeStaticCodeLengthCode(bw *bitWriter) { | ||||
| 	bw.writeBits(32, 0x55555554) | ||||
| 	bw.writeBits(8, 0xFF) | ||||
| } | ||||
|  | ||||
| var kZeroRepsBits = [numCommandSymbols]uint64{ | ||||
| @@ -4317,9 +4318,10 @@ var kStaticCommandCodeBits = [numCommandSymbols]uint16{ | ||||
| 	2047, | ||||
| } | ||||
|  | ||||
| func storeStaticCommandHuffmanTree(storage_ix *uint, storage []byte) { | ||||
| 	writeBits(56, 0x92624416307003, storage_ix, storage) | ||||
| 	writeBits(3, 0x00000000, storage_ix, storage) | ||||
| func storeStaticCommandHuffmanTree(bw *bitWriter) { | ||||
| 	bw.writeBits(32, 0x16307003) | ||||
| 	bw.writeBits(24, 0x926244) | ||||
| 	bw.writeBits(3, 0x00000000) | ||||
| } | ||||
|  | ||||
| var kStaticDistanceCodeBits = [64]uint16{ | ||||
| @@ -4389,6 +4391,6 @@ var kStaticDistanceCodeBits = [64]uint16{ | ||||
| 	63, | ||||
| } | ||||
|  | ||||
| func storeStaticDistanceHuffmanTree(storage_ix *uint, storage []byte) { | ||||
| 	writeBits(28, 0x0369DC03, storage_ix, storage) | ||||
| func storeStaticDistanceHuffmanTree(bw *bitWriter) { | ||||
| 	bw.writeBits(28, 0x0369DC03) | ||||
| } | ||||
|   | ||||
							
								
								
									
										29
									
								
								vendor/github.com/andybalholm/brotli/find_match_length.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/andybalholm/brotli/find_match_length.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,5 +1,11 @@ | ||||
| package brotli | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"math/bits" | ||||
| 	"runtime" | ||||
| ) | ||||
|  | ||||
| /* Copyright 2010 Google Inc. All Rights Reserved. | ||||
|  | ||||
|    Distributed under MIT license. | ||||
| @@ -9,6 +15,29 @@ package brotli | ||||
| /* Function to find maximal matching prefixes of strings. */ | ||||
| func findMatchLengthWithLimit(s1 []byte, s2 []byte, limit uint) uint { | ||||
| 	var matched uint = 0 | ||||
| 	_, _ = s1[limit-1], s2[limit-1] // bounds check | ||||
| 	switch runtime.GOARCH { | ||||
| 	case "amd64": | ||||
| 		// Compare 8 bytes at at time. | ||||
| 		for matched+8 <= limit { | ||||
| 			w1 := binary.LittleEndian.Uint64(s1[matched:]) | ||||
| 			w2 := binary.LittleEndian.Uint64(s2[matched:]) | ||||
| 			if w1 != w2 { | ||||
| 				return matched + uint(bits.TrailingZeros64(w1^w2)>>3) | ||||
| 			} | ||||
| 			matched += 8 | ||||
| 		} | ||||
| 	case "386": | ||||
| 		// Compare 4 bytes at at time. | ||||
| 		for matched+4 <= limit { | ||||
| 			w1 := binary.LittleEndian.Uint32(s1[matched:]) | ||||
| 			w2 := binary.LittleEndian.Uint32(s2[matched:]) | ||||
| 			if w1 != w2 { | ||||
| 				return matched + uint(bits.TrailingZeros32(w1^w2)>>3) | ||||
| 			} | ||||
| 			matched += 4 | ||||
| 		} | ||||
| 	} | ||||
| 	for matched < limit && s1[matched] == s2[matched] { | ||||
| 		matched++ | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/andybalholm/brotli/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/andybalholm/brotli/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,5 +1,3 @@ | ||||
| module github.com/andybalholm/brotli | ||||
|  | ||||
| go 1.12 | ||||
|  | ||||
| require github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/andybalholm/brotli/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/andybalholm/brotli/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,2 +0,0 @@ | ||||
| github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 h1:KRMr9A3qfbVM7iV/WcLY/rL5LICqwMHLhwRXKu99fXw= | ||||
| github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= | ||||
|   | ||||
							
								
								
									
										7
									
								
								vendor/github.com/andybalholm/brotli/histogram.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/andybalholm/brotli/histogram.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -163,7 +163,7 @@ func initBlockSplitIterator(self *blockSplitIterator, split *blockSplit) { | ||||
| 	self.split_ = split | ||||
| 	self.idx_ = 0 | ||||
| 	self.type_ = 0 | ||||
| 	if split.lengths != nil { | ||||
| 	if len(split.lengths) > 0 { | ||||
| 		self.length_ = uint(split.lengths[0]) | ||||
| 	} else { | ||||
| 		self.length_ = 0 | ||||
| @@ -180,17 +180,16 @@ func blockSplitIteratorNext(self *blockSplitIterator) { | ||||
| 	self.length_-- | ||||
| } | ||||
|  | ||||
| func buildHistogramsWithContext(cmds []command, num_commands uint, literal_split *blockSplit, insert_and_copy_split *blockSplit, dist_split *blockSplit, ringbuffer []byte, start_pos uint, mask uint, prev_byte byte, prev_byte2 byte, context_modes []int, literal_histograms []histogramLiteral, insert_and_copy_histograms []histogramCommand, copy_dist_histograms []histogramDistance) { | ||||
| func buildHistogramsWithContext(cmds []command, literal_split *blockSplit, insert_and_copy_split *blockSplit, dist_split *blockSplit, ringbuffer []byte, start_pos uint, mask uint, prev_byte byte, prev_byte2 byte, context_modes []int, literal_histograms []histogramLiteral, insert_and_copy_histograms []histogramCommand, copy_dist_histograms []histogramDistance) { | ||||
| 	var pos uint = start_pos | ||||
| 	var literal_it blockSplitIterator | ||||
| 	var insert_and_copy_it blockSplitIterator | ||||
| 	var dist_it blockSplitIterator | ||||
| 	var i uint | ||||
|  | ||||
| 	initBlockSplitIterator(&literal_it, literal_split) | ||||
| 	initBlockSplitIterator(&insert_and_copy_it, insert_and_copy_split) | ||||
| 	initBlockSplitIterator(&dist_it, dist_split) | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 	for i := range cmds { | ||||
| 		var cmd *command = &cmds[i] | ||||
| 		var j uint | ||||
| 		blockSplitIteratorNext(&insert_and_copy_it) | ||||
|   | ||||
							
								
								
									
										192
									
								
								vendor/github.com/andybalholm/brotli/http.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								vendor/github.com/andybalholm/brotli/http.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | ||||
| package brotli | ||||
|  | ||||
| import ( | ||||
| 	"compress/gzip" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // HTTPCompressor chooses a compression method (brotli, gzip, or none) based on | ||||
| // the Accept-Encoding header, sets the Content-Encoding header, and returns a | ||||
| // WriteCloser that implements that compression. The Close method must be called | ||||
| // before the current HTTP handler returns. | ||||
| // | ||||
| // Due to https://github.com/golang/go/issues/31753, the response will not be | ||||
| // compressed unless you set a Content-Type header before you call | ||||
| // HTTPCompressor. | ||||
| func HTTPCompressor(w http.ResponseWriter, r *http.Request) io.WriteCloser { | ||||
| 	if w.Header().Get("Content-Type") == "" { | ||||
| 		return nopCloser{w} | ||||
| 	} | ||||
|  | ||||
| 	if w.Header().Get("Vary") == "" { | ||||
| 		w.Header().Set("Vary", "Accept-Encoding") | ||||
| 	} | ||||
|  | ||||
| 	encoding := negotiateContentEncoding(r, []string{"br", "gzip"}) | ||||
| 	switch encoding { | ||||
| 	case "br": | ||||
| 		w.Header().Set("Content-Encoding", "br") | ||||
| 		return NewWriter(w) | ||||
| 	case "gzip": | ||||
| 		w.Header().Set("Content-Encoding", "gzip") | ||||
| 		return gzip.NewWriter(w) | ||||
| 	} | ||||
| 	return nopCloser{w} | ||||
| } | ||||
|  | ||||
| // negotiateContentEncoding returns the best offered content encoding for the | ||||
| // request's Accept-Encoding header. If two offers match with equal weight and | ||||
| // then the offer earlier in the list is preferred. If no offers are | ||||
| // acceptable, then "" is returned. | ||||
| func negotiateContentEncoding(r *http.Request, offers []string) string { | ||||
| 	bestOffer := "identity" | ||||
| 	bestQ := -1.0 | ||||
| 	specs := parseAccept(r.Header, "Accept-Encoding") | ||||
| 	for _, offer := range offers { | ||||
| 		for _, spec := range specs { | ||||
| 			if spec.Q > bestQ && | ||||
| 				(spec.Value == "*" || spec.Value == offer) { | ||||
| 				bestQ = spec.Q | ||||
| 				bestOffer = offer | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if bestQ == 0 { | ||||
| 		bestOffer = "" | ||||
| 	} | ||||
| 	return bestOffer | ||||
| } | ||||
|  | ||||
| // acceptSpec describes an Accept* header. | ||||
| type acceptSpec struct { | ||||
| 	Value string | ||||
| 	Q     float64 | ||||
| } | ||||
|  | ||||
| // parseAccept parses Accept* headers. | ||||
| func parseAccept(header http.Header, key string) (specs []acceptSpec) { | ||||
| loop: | ||||
| 	for _, s := range header[key] { | ||||
| 		for { | ||||
| 			var spec acceptSpec | ||||
| 			spec.Value, s = expectTokenSlash(s) | ||||
| 			if spec.Value == "" { | ||||
| 				continue loop | ||||
| 			} | ||||
| 			spec.Q = 1.0 | ||||
| 			s = skipSpace(s) | ||||
| 			if strings.HasPrefix(s, ";") { | ||||
| 				s = skipSpace(s[1:]) | ||||
| 				if !strings.HasPrefix(s, "q=") { | ||||
| 					continue loop | ||||
| 				} | ||||
| 				spec.Q, s = expectQuality(s[2:]) | ||||
| 				if spec.Q < 0.0 { | ||||
| 					continue loop | ||||
| 				} | ||||
| 			} | ||||
| 			specs = append(specs, spec) | ||||
| 			s = skipSpace(s) | ||||
| 			if !strings.HasPrefix(s, ",") { | ||||
| 				continue loop | ||||
| 			} | ||||
| 			s = skipSpace(s[1:]) | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func skipSpace(s string) (rest string) { | ||||
| 	i := 0 | ||||
| 	for ; i < len(s); i++ { | ||||
| 		if octetTypes[s[i]]&isSpace == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return s[i:] | ||||
| } | ||||
|  | ||||
| func expectTokenSlash(s string) (token, rest string) { | ||||
| 	i := 0 | ||||
| 	for ; i < len(s); i++ { | ||||
| 		b := s[i] | ||||
| 		if (octetTypes[b]&isToken == 0) && b != '/' { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return s[:i], s[i:] | ||||
| } | ||||
|  | ||||
| func expectQuality(s string) (q float64, rest string) { | ||||
| 	switch { | ||||
| 	case len(s) == 0: | ||||
| 		return -1, "" | ||||
| 	case s[0] == '0': | ||||
| 		q = 0 | ||||
| 	case s[0] == '1': | ||||
| 		q = 1 | ||||
| 	default: | ||||
| 		return -1, "" | ||||
| 	} | ||||
| 	s = s[1:] | ||||
| 	if !strings.HasPrefix(s, ".") { | ||||
| 		return q, s | ||||
| 	} | ||||
| 	s = s[1:] | ||||
| 	i := 0 | ||||
| 	n := 0 | ||||
| 	d := 1 | ||||
| 	for ; i < len(s); i++ { | ||||
| 		b := s[i] | ||||
| 		if b < '0' || b > '9' { | ||||
| 			break | ||||
| 		} | ||||
| 		n = n*10 + int(b) - '0' | ||||
| 		d *= 10 | ||||
| 	} | ||||
| 	return q + float64(n)/float64(d), s[i:] | ||||
| } | ||||
|  | ||||
| // Octet types from RFC 2616. | ||||
| var octetTypes [256]octetType | ||||
|  | ||||
| type octetType byte | ||||
|  | ||||
| const ( | ||||
| 	isToken octetType = 1 << iota | ||||
| 	isSpace | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	// OCTET      = <any 8-bit sequence of data> | ||||
| 	// CHAR       = <any US-ASCII character (octets 0 - 127)> | ||||
| 	// CTL        = <any US-ASCII control character (octets 0 - 31) and DEL (127)> | ||||
| 	// CR         = <US-ASCII CR, carriage return (13)> | ||||
| 	// LF         = <US-ASCII LF, linefeed (10)> | ||||
| 	// SP         = <US-ASCII SP, space (32)> | ||||
| 	// HT         = <US-ASCII HT, horizontal-tab (9)> | ||||
| 	// <">        = <US-ASCII double-quote mark (34)> | ||||
| 	// CRLF       = CR LF | ||||
| 	// LWS        = [CRLF] 1*( SP | HT ) | ||||
| 	// TEXT       = <any OCTET except CTLs, but including LWS> | ||||
| 	// separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | ||||
| 	//              | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT | ||||
| 	// token      = 1*<any CHAR except CTLs or separators> | ||||
| 	// qdtext     = <any TEXT except <">> | ||||
|  | ||||
| 	for c := 0; c < 256; c++ { | ||||
| 		var t octetType | ||||
| 		isCtl := c <= 31 || c == 127 | ||||
| 		isChar := 0 <= c && c <= 127 | ||||
| 		isSeparator := strings.IndexRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) >= 0 | ||||
| 		if strings.IndexRune(" \t\r\n", rune(c)) >= 0 { | ||||
| 			t |= isSpace | ||||
| 		} | ||||
| 		if isChar && !isCtl && !isSeparator { | ||||
| 			t |= isToken | ||||
| 		} | ||||
| 		octetTypes[c] = t | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/github.com/andybalholm/brotli/memory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/andybalholm/brotli/memory.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -23,12 +23,18 @@ func brotli_ensure_capacity_uint8_t(a *[]byte, c *uint, r uint) { | ||||
| 		for new_size < r { | ||||
| 			new_size *= 2 | ||||
| 		} | ||||
| 		var new_array []byte = make([]byte, new_size) | ||||
| 		if *c != 0 { | ||||
| 			copy(new_array, (*a)[:*c]) | ||||
|  | ||||
| 		if cap(*a) < int(new_size) { | ||||
| 			var new_array []byte = make([]byte, new_size) | ||||
| 			if *c != 0 { | ||||
| 				copy(new_array, (*a)[:*c]) | ||||
| 			} | ||||
|  | ||||
| 			*a = new_array | ||||
| 		} else { | ||||
| 			*a = (*a)[:new_size] | ||||
| 		} | ||||
|  | ||||
| 		*a = new_array | ||||
| 		*c = new_size | ||||
| 	} | ||||
| } | ||||
| @@ -45,12 +51,16 @@ func brotli_ensure_capacity_uint32_t(a *[]uint32, c *uint, r uint) { | ||||
| 			new_size *= 2 | ||||
| 		} | ||||
|  | ||||
| 		new_array = make([]uint32, new_size) | ||||
| 		if *c != 0 { | ||||
| 			copy(new_array, (*a)[:*c]) | ||||
| 		} | ||||
| 		if cap(*a) < int(new_size) { | ||||
| 			new_array = make([]uint32, new_size) | ||||
| 			if *c != 0 { | ||||
| 				copy(new_array, (*a)[:*c]) | ||||
| 			} | ||||
|  | ||||
| 		*a = new_array | ||||
| 			*a = new_array | ||||
| 		} else { | ||||
| 			*a = (*a)[:new_size] | ||||
| 		} | ||||
| 		*c = new_size | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										141
									
								
								vendor/github.com/andybalholm/brotli/metablock.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										141
									
								
								vendor/github.com/andybalholm/brotli/metablock.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,5 +1,9 @@ | ||||
| package brotli | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| /* Copyright 2014 Google Inc. All Rights Reserved. | ||||
|  | ||||
|    Distributed under MIT license. | ||||
| @@ -25,31 +29,30 @@ type metaBlockSplit struct { | ||||
| 	distance_histograms_size  uint | ||||
| } | ||||
|  | ||||
| func initMetaBlockSplit(mb *metaBlockSplit) { | ||||
| 	initBlockSplit(&mb.literal_split) | ||||
| 	initBlockSplit(&mb.command_split) | ||||
| 	initBlockSplit(&mb.distance_split) | ||||
| 	mb.literal_context_map = nil | ||||
| 	mb.literal_context_map_size = 0 | ||||
| 	mb.distance_context_map = nil | ||||
| 	mb.distance_context_map_size = 0 | ||||
| 	mb.literal_histograms = nil | ||||
| 	mb.literal_histograms_size = 0 | ||||
| 	mb.command_histograms = nil | ||||
| 	mb.command_histograms_size = 0 | ||||
| 	mb.distance_histograms = nil | ||||
| 	mb.distance_histograms_size = 0 | ||||
| var metaBlockPool sync.Pool | ||||
|  | ||||
| func getMetaBlockSplit() *metaBlockSplit { | ||||
| 	mb, _ := metaBlockPool.Get().(*metaBlockSplit) | ||||
|  | ||||
| 	if mb == nil { | ||||
| 		mb = &metaBlockSplit{} | ||||
| 	} else { | ||||
| 		initBlockSplit(&mb.literal_split) | ||||
| 		initBlockSplit(&mb.command_split) | ||||
| 		initBlockSplit(&mb.distance_split) | ||||
| 		mb.literal_context_map = mb.literal_context_map[:0] | ||||
| 		mb.literal_context_map_size = 0 | ||||
| 		mb.distance_context_map = mb.distance_context_map[:0] | ||||
| 		mb.distance_context_map_size = 0 | ||||
| 		mb.literal_histograms = mb.literal_histograms[:0] | ||||
| 		mb.command_histograms = mb.command_histograms[:0] | ||||
| 		mb.distance_histograms = mb.distance_histograms[:0] | ||||
| 	} | ||||
| 	return mb | ||||
| } | ||||
|  | ||||
| func destroyMetaBlockSplit(mb *metaBlockSplit) { | ||||
| 	destroyBlockSplit(&mb.literal_split) | ||||
| 	destroyBlockSplit(&mb.command_split) | ||||
| 	destroyBlockSplit(&mb.distance_split) | ||||
| 	mb.literal_context_map = nil | ||||
| 	mb.distance_context_map = nil | ||||
| 	mb.literal_histograms = nil | ||||
| 	mb.command_histograms = nil | ||||
| 	mb.distance_histograms = nil | ||||
| func freeMetaBlockSplit(mb *metaBlockSplit) { | ||||
| 	metaBlockPool.Put(mb) | ||||
| } | ||||
|  | ||||
| func initDistanceParams(params *encoderParams, npostfix uint32, ndirect uint32) { | ||||
| @@ -84,14 +87,12 @@ func initDistanceParams(params *encoderParams, npostfix uint32, ndirect uint32) | ||||
| 	dist_params.max_distance = uint(max_distance) | ||||
| } | ||||
|  | ||||
| func recomputeDistancePrefixes(cmds []command, num_commands uint, orig_params *distanceParams, new_params *distanceParams) { | ||||
| 	var i uint | ||||
|  | ||||
| func recomputeDistancePrefixes(cmds []command, orig_params *distanceParams, new_params *distanceParams) { | ||||
| 	if orig_params.distance_postfix_bits == new_params.distance_postfix_bits && orig_params.num_direct_distance_codes == new_params.num_direct_distance_codes { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 	for i := range cmds { | ||||
| 		var cmd *command = &cmds[i] | ||||
| 		if commandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 { | ||||
| 			prefixEncodeCopyDistance(uint(commandRestoreDistanceCode(cmd, orig_params)), uint(new_params.num_direct_distance_codes), uint(new_params.distance_postfix_bits), &cmd.dist_prefix_, &cmd.dist_extra_) | ||||
| @@ -99,8 +100,7 @@ func recomputeDistancePrefixes(cmds []command, num_commands uint, orig_params *d | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func computeDistanceCost(cmds []command, num_commands uint, orig_params *distanceParams, new_params *distanceParams, cost *float64) bool { | ||||
| 	var i uint | ||||
| func computeDistanceCost(cmds []command, orig_params *distanceParams, new_params *distanceParams, cost *float64) bool { | ||||
| 	var equal_params bool = false | ||||
| 	var dist_prefix uint16 | ||||
| 	var dist_extra uint32 | ||||
| @@ -112,8 +112,8 @@ func computeDistanceCost(cmds []command, num_commands uint, orig_params *distanc | ||||
| 		equal_params = true | ||||
| 	} | ||||
|  | ||||
| 	for i = 0; i < num_commands; i++ { | ||||
| 		var cmd *command = &cmds[i] | ||||
| 	for i := range cmds { | ||||
| 		cmd := &cmds[i] | ||||
| 		if commandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 { | ||||
| 			if equal_params { | ||||
| 				dist_prefix = cmd.dist_prefix_ | ||||
| @@ -137,7 +137,7 @@ func computeDistanceCost(cmds []command, num_commands uint, orig_params *distanc | ||||
|  | ||||
| var buildMetaBlock_kMaxNumberOfHistograms uint = 256 | ||||
|  | ||||
| func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParams, prev_byte byte, prev_byte2 byte, cmds []command, num_commands uint, literal_context_mode int, mb *metaBlockSplit) { | ||||
| func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParams, prev_byte byte, prev_byte2 byte, cmds []command, literal_context_mode int, mb *metaBlockSplit) { | ||||
| 	var distance_histograms []histogramDistance | ||||
| 	var literal_histograms []histogramLiteral | ||||
| 	var literal_context_modes []int = nil | ||||
| @@ -164,7 +164,7 @@ func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParam | ||||
| 				check_orig = false | ||||
| 			} | ||||
|  | ||||
| 			skip = !computeDistanceCost(cmds, num_commands, &orig_params.dist, &new_params.dist, &dist_cost) | ||||
| 			skip = !computeDistanceCost(cmds, &orig_params.dist, &new_params.dist, &dist_cost) | ||||
| 			if skip || (dist_cost > best_dist_cost) { | ||||
| 				break | ||||
| 			} | ||||
| @@ -181,7 +181,7 @@ func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParam | ||||
|  | ||||
| 	if check_orig { | ||||
| 		var dist_cost float64 | ||||
| 		computeDistanceCost(cmds, num_commands, &orig_params.dist, &orig_params.dist, &dist_cost) | ||||
| 		computeDistanceCost(cmds, &orig_params.dist, &orig_params.dist, &dist_cost) | ||||
| 		if dist_cost < best_dist_cost { | ||||
| 			/* NB: currently unused; uncomment when more param tuning is added. */ | ||||
| 			/* best_dist_cost = dist_cost; */ | ||||
| @@ -189,9 +189,9 @@ func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParam | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	recomputeDistancePrefixes(cmds, num_commands, &orig_params.dist, ¶ms.dist) | ||||
| 	recomputeDistancePrefixes(cmds, &orig_params.dist, ¶ms.dist) | ||||
|  | ||||
| 	splitBlock(cmds, num_commands, ringbuffer, pos, mask, params, &mb.literal_split, &mb.command_split, &mb.distance_split) | ||||
| 	splitBlock(cmds, ringbuffer, pos, mask, params, &mb.literal_split, &mb.command_split, &mb.distance_split) | ||||
|  | ||||
| 	if !params.disable_literal_context_modeling { | ||||
| 		literal_context_multiplier = 1 << literalContextBits | ||||
| @@ -209,21 +209,30 @@ func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParam | ||||
| 	distance_histograms = make([]histogramDistance, distance_histograms_size) | ||||
| 	clearHistogramsDistance(distance_histograms, distance_histograms_size) | ||||
|  | ||||
| 	assert(mb.command_histograms == nil) | ||||
| 	mb.command_histograms_size = mb.command_split.num_types | ||||
| 	mb.command_histograms = make([]histogramCommand, (mb.command_histograms_size)) | ||||
| 	if cap(mb.command_histograms) < int(mb.command_histograms_size) { | ||||
| 		mb.command_histograms = make([]histogramCommand, (mb.command_histograms_size)) | ||||
| 	} else { | ||||
| 		mb.command_histograms = mb.command_histograms[:mb.command_histograms_size] | ||||
| 	} | ||||
| 	clearHistogramsCommand(mb.command_histograms, mb.command_histograms_size) | ||||
|  | ||||
| 	buildHistogramsWithContext(cmds, num_commands, &mb.literal_split, &mb.command_split, &mb.distance_split, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_modes, literal_histograms, mb.command_histograms, distance_histograms) | ||||
| 	buildHistogramsWithContext(cmds, &mb.literal_split, &mb.command_split, &mb.distance_split, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_modes, literal_histograms, mb.command_histograms, distance_histograms) | ||||
| 	literal_context_modes = nil | ||||
|  | ||||
| 	assert(mb.literal_context_map == nil) | ||||
| 	mb.literal_context_map_size = mb.literal_split.num_types << literalContextBits | ||||
| 	mb.literal_context_map = make([]uint32, (mb.literal_context_map_size)) | ||||
| 	if cap(mb.literal_context_map) < int(mb.literal_context_map_size) { | ||||
| 		mb.literal_context_map = make([]uint32, (mb.literal_context_map_size)) | ||||
| 	} else { | ||||
| 		mb.literal_context_map = mb.literal_context_map[:mb.literal_context_map_size] | ||||
| 	} | ||||
|  | ||||
| 	assert(mb.literal_histograms == nil) | ||||
| 	mb.literal_histograms_size = mb.literal_context_map_size | ||||
| 	mb.literal_histograms = make([]histogramLiteral, (mb.literal_histograms_size)) | ||||
| 	if cap(mb.literal_histograms) < int(mb.literal_histograms_size) { | ||||
| 		mb.literal_histograms = make([]histogramLiteral, (mb.literal_histograms_size)) | ||||
| 	} else { | ||||
| 		mb.literal_histograms = mb.literal_histograms[:mb.literal_histograms_size] | ||||
| 	} | ||||
|  | ||||
| 	clusterHistogramsLiteral(literal_histograms, literal_histograms_size, buildMetaBlock_kMaxNumberOfHistograms, mb.literal_histograms, &mb.literal_histograms_size, mb.literal_context_map) | ||||
| 	literal_histograms = nil | ||||
| @@ -239,13 +248,19 @@ func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParam | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	assert(mb.distance_context_map == nil) | ||||
| 	mb.distance_context_map_size = mb.distance_split.num_types << distanceContextBits | ||||
| 	mb.distance_context_map = make([]uint32, (mb.distance_context_map_size)) | ||||
| 	if cap(mb.distance_context_map) < int(mb.distance_context_map_size) { | ||||
| 		mb.distance_context_map = make([]uint32, (mb.distance_context_map_size)) | ||||
| 	} else { | ||||
| 		mb.distance_context_map = mb.distance_context_map[:mb.distance_context_map_size] | ||||
| 	} | ||||
|  | ||||
| 	assert(mb.distance_histograms == nil) | ||||
| 	mb.distance_histograms_size = mb.distance_context_map_size | ||||
| 	mb.distance_histograms = make([]histogramDistance, (mb.distance_histograms_size)) | ||||
| 	if cap(mb.distance_histograms) < int(mb.distance_histograms_size) { | ||||
| 		mb.distance_histograms = make([]histogramDistance, (mb.distance_histograms_size)) | ||||
| 	} else { | ||||
| 		mb.distance_histograms = mb.distance_histograms[:mb.distance_histograms_size] | ||||
| 	} | ||||
|  | ||||
| 	clusterHistogramsDistance(distance_histograms, mb.distance_context_map_size, buildMetaBlock_kMaxNumberOfHistograms, mb.distance_histograms, &mb.distance_histograms_size, mb.distance_context_map) | ||||
| 	distance_histograms = nil | ||||
| @@ -298,9 +313,12 @@ func initContextBlockSplitter(self *contextBlockSplitter, alphabet_size uint, nu | ||||
| 	brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks) | ||||
| 	brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks) | ||||
| 	split.num_blocks = max_num_blocks | ||||
| 	assert(*histograms == nil) | ||||
| 	*histograms_size = max_num_types * num_contexts | ||||
| 	*histograms = make([]histogramLiteral, (*histograms_size)) | ||||
| 	if histograms == nil || cap(*histograms) < int(*histograms_size) { | ||||
| 		*histograms = make([]histogramLiteral, (*histograms_size)) | ||||
| 	} else { | ||||
| 		*histograms = (*histograms)[:*histograms_size] | ||||
| 	} | ||||
| 	self.histograms_ = *histograms | ||||
|  | ||||
| 	/* Clear only current histogram. */ | ||||
| @@ -453,9 +471,12 @@ func contextBlockSplitterAddSymbol(self *contextBlockSplitter, symbol uint, cont | ||||
|  | ||||
| func mapStaticContexts(num_contexts uint, static_context_map []uint32, mb *metaBlockSplit) { | ||||
| 	var i uint | ||||
| 	assert(mb.literal_context_map == nil) | ||||
| 	mb.literal_context_map_size = mb.literal_split.num_types << literalContextBits | ||||
| 	mb.literal_context_map = make([]uint32, (mb.literal_context_map_size)) | ||||
| 	if cap(mb.literal_context_map) < int(mb.literal_context_map_size) { | ||||
| 		mb.literal_context_map = make([]uint32, (mb.literal_context_map_size)) | ||||
| 	} else { | ||||
| 		mb.literal_context_map = mb.literal_context_map[:mb.literal_context_map_size] | ||||
| 	} | ||||
|  | ||||
| 	for i = 0; i < mb.literal_split.num_types; i++ { | ||||
| 		var offset uint32 = uint32(i * num_contexts) | ||||
| @@ -466,7 +487,7 @@ func mapStaticContexts(num_contexts uint, static_context_map []uint32, mb *metaB | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func buildMetaBlockGreedyInternal(ringbuffer []byte, pos uint, mask uint, prev_byte byte, prev_byte2 byte, literal_context_lut contextLUT, num_contexts uint, static_context_map []uint32, commands []command, n_commands uint, mb *metaBlockSplit) { | ||||
| func buildMetaBlockGreedyInternal(ringbuffer []byte, pos uint, mask uint, prev_byte byte, prev_byte2 byte, literal_context_lut contextLUT, num_contexts uint, static_context_map []uint32, commands []command, mb *metaBlockSplit) { | ||||
| 	var lit_blocks struct { | ||||
| 		plain blockSplitterLiteral | ||||
| 		ctx   contextBlockSplitter | ||||
| @@ -474,8 +495,7 @@ func buildMetaBlockGreedyInternal(ringbuffer []byte, pos uint, mask uint, prev_b | ||||
| 	var cmd_blocks blockSplitterCommand | ||||
| 	var dist_blocks blockSplitterDistance | ||||
| 	var num_literals uint = 0 | ||||
| 	var i uint | ||||
| 	for i = 0; i < n_commands; i++ { | ||||
| 	for i := range commands { | ||||
| 		num_literals += uint(commands[i].insert_len_) | ||||
| 	} | ||||
|  | ||||
| @@ -485,11 +505,10 @@ func buildMetaBlockGreedyInternal(ringbuffer []byte, pos uint, mask uint, prev_b | ||||
| 		initContextBlockSplitter(&lit_blocks.ctx, 256, num_contexts, 512, 400.0, num_literals, &mb.literal_split, &mb.literal_histograms, &mb.literal_histograms_size) | ||||
| 	} | ||||
|  | ||||
| 	initBlockSplitterCommand(&cmd_blocks, numCommandSymbols, 1024, 500.0, n_commands, &mb.command_split, &mb.command_histograms, &mb.command_histograms_size) | ||||
| 	initBlockSplitterDistance(&dist_blocks, 64, 512, 100.0, n_commands, &mb.distance_split, &mb.distance_histograms, &mb.distance_histograms_size) | ||||
| 	initBlockSplitterCommand(&cmd_blocks, numCommandSymbols, 1024, 500.0, uint(len(commands)), &mb.command_split, &mb.command_histograms, &mb.command_histograms_size) | ||||
| 	initBlockSplitterDistance(&dist_blocks, 64, 512, 100.0, uint(len(commands)), &mb.distance_split, &mb.distance_histograms, &mb.distance_histograms_size) | ||||
|  | ||||
| 	for i = 0; i < n_commands; i++ { | ||||
| 		var cmd command = commands[i] | ||||
| 	for _, cmd := range commands { | ||||
| 		var j uint | ||||
| 		blockSplitterAddSymbolCommand(&cmd_blocks, uint(cmd.cmd_prefix_)) | ||||
| 		for j = uint(cmd.insert_len_); j != 0; j-- { | ||||
| @@ -530,11 +549,11 @@ func buildMetaBlockGreedyInternal(ringbuffer []byte, pos uint, mask uint, prev_b | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func buildMetaBlockGreedy(ringbuffer []byte, pos uint, mask uint, prev_byte byte, prev_byte2 byte, literal_context_lut contextLUT, num_contexts uint, static_context_map []uint32, commands []command, n_commands uint, mb *metaBlockSplit) { | ||||
| func buildMetaBlockGreedy(ringbuffer []byte, pos uint, mask uint, prev_byte byte, prev_byte2 byte, literal_context_lut contextLUT, num_contexts uint, static_context_map []uint32, commands []command, mb *metaBlockSplit) { | ||||
| 	if num_contexts == 1 { | ||||
| 		buildMetaBlockGreedyInternal(ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, 1, nil, commands, n_commands, mb) | ||||
| 		buildMetaBlockGreedyInternal(ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, 1, nil, commands, mb) | ||||
| 	} else { | ||||
| 		buildMetaBlockGreedyInternal(ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, num_contexts, static_context_map, commands, n_commands, mb) | ||||
| 		buildMetaBlockGreedyInternal(ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, num_contexts, static_context_map, commands, mb) | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										7
									
								
								vendor/github.com/andybalholm/brotli/metablock_command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/andybalholm/brotli/metablock_command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -43,9 +43,12 @@ func initBlockSplitterCommand(self *blockSplitterCommand, alphabet_size uint, mi | ||||
| 	brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks) | ||||
| 	brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks) | ||||
| 	self.split_.num_blocks = max_num_blocks | ||||
| 	assert(*histograms == nil) | ||||
| 	*histograms_size = max_num_types | ||||
| 	*histograms = make([]histogramCommand, (*histograms_size)) | ||||
| 	if histograms == nil || cap(*histograms) < int(*histograms_size) { | ||||
| 		*histograms = make([]histogramCommand, (*histograms_size)) | ||||
| 	} else { | ||||
| 		*histograms = (*histograms)[:*histograms_size] | ||||
| 	} | ||||
| 	self.histograms_ = *histograms | ||||
|  | ||||
| 	/* Clear only current histogram. */ | ||||
|   | ||||
							
								
								
									
										7
									
								
								vendor/github.com/andybalholm/brotli/metablock_distance.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/andybalholm/brotli/metablock_distance.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -43,9 +43,12 @@ func initBlockSplitterDistance(self *blockSplitterDistance, alphabet_size uint, | ||||
| 	brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks) | ||||
| 	brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks) | ||||
| 	self.split_.num_blocks = max_num_blocks | ||||
| 	assert(*histograms == nil) | ||||
| 	*histograms_size = max_num_types | ||||
| 	*histograms = make([]histogramDistance, (*histograms_size)) | ||||
| 	if histograms == nil || cap(*histograms) < int(*histograms_size) { | ||||
| 		*histograms = make([]histogramDistance, *histograms_size) | ||||
| 	} else { | ||||
| 		*histograms = (*histograms)[:*histograms_size] | ||||
| 	} | ||||
| 	self.histograms_ = *histograms | ||||
|  | ||||
| 	/* Clear only current histogram. */ | ||||
|   | ||||
							
								
								
									
										7
									
								
								vendor/github.com/andybalholm/brotli/metablock_literal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/andybalholm/brotli/metablock_literal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -43,9 +43,12 @@ func initBlockSplitterLiteral(self *blockSplitterLiteral, alphabet_size uint, mi | ||||
| 	brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks) | ||||
| 	brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks) | ||||
| 	self.split_.num_blocks = max_num_blocks | ||||
| 	assert(*histograms == nil) | ||||
| 	*histograms_size = max_num_types | ||||
| 	*histograms = make([]histogramLiteral, (*histograms_size)) | ||||
| 	if histograms == nil || cap(*histograms) < int(*histograms_size) { | ||||
| 		*histograms = make([]histogramLiteral, *histograms_size) | ||||
| 	} else { | ||||
| 		*histograms = (*histograms)[:*histograms_size] | ||||
| 	} | ||||
| 	self.histograms_ = *histograms | ||||
|  | ||||
| 	/* Clear only current histogram. */ | ||||
|   | ||||
							
								
								
									
										12
									
								
								vendor/github.com/andybalholm/brotli/ringbuffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/andybalholm/brotli/ringbuffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -27,10 +27,7 @@ type ringBuffer struct { | ||||
| } | ||||
|  | ||||
| func ringBufferInit(rb *ringBuffer) { | ||||
| 	rb.cur_size_ = 0 | ||||
| 	rb.pos_ = 0 | ||||
| 	rb.data_ = nil | ||||
| 	rb.buffer_ = nil | ||||
| } | ||||
|  | ||||
| func ringBufferSetup(params *encoderParams, rb *ringBuffer) { | ||||
| @@ -47,11 +44,16 @@ const kSlackForEightByteHashingEverywhere uint = 7 | ||||
| /* Allocates or re-allocates data_ to the given length + plus some slack | ||||
|    region before and after. Fills the slack regions with zeros. */ | ||||
| func ringBufferInitBuffer(buflen uint32, rb *ringBuffer) { | ||||
| 	var new_data []byte = make([]byte, (2 + uint(buflen) + kSlackForEightByteHashingEverywhere)) | ||||
| 	var new_data []byte | ||||
| 	var i uint | ||||
| 	size := 2 + int(buflen) + int(kSlackForEightByteHashingEverywhere) | ||||
| 	if cap(rb.data_) < size { | ||||
| 		new_data = make([]byte, size) | ||||
| 	} else { | ||||
| 		new_data = rb.data_[:size] | ||||
| 	} | ||||
| 	if rb.data_ != nil { | ||||
| 		copy(new_data, rb.data_[:2+rb.cur_size_+uint32(kSlackForEightByteHashingEverywhere)]) | ||||
| 		rb.data_ = nil | ||||
| 	} | ||||
|  | ||||
| 	rb.data_ = new_data | ||||
|   | ||||
							
								
								
									
										112
									
								
								vendor/github.com/andybalholm/brotli/write_bits.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								vendor/github.com/andybalholm/brotli/write_bits.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,49 +8,87 @@ package brotli | ||||
|  | ||||
| /* Write bits into a byte array. */ | ||||
|  | ||||
| /* This function writes bits into bytes in increasing addresses, and within | ||||
|    a byte least-significant-bit first. | ||||
| type bitWriter struct { | ||||
| 	dst []byte | ||||
|  | ||||
|    The function can write up to 56 bits in one go with WriteBits | ||||
|    Example: let's assume that 3 bits (Rs below) have been written already: | ||||
|  | ||||
|    BYTE-0     BYTE+1       BYTE+2 | ||||
|  | ||||
|    0000 0RRR    0000 0000    0000 0000 | ||||
|  | ||||
|    Now, we could write 5 or less bits in MSB by just sifting by 3 | ||||
|    and OR'ing to BYTE-0. | ||||
|  | ||||
|    For n bits, we take the last 5 bits, OR that with high bits in BYTE-0, | ||||
|    and locate the rest in BYTE+1, BYTE+2, etc. */ | ||||
| func writeBits(n_bits uint, bits uint64, pos *uint, array []byte) { | ||||
| 	var array_pos []byte = array[*pos>>3:] | ||||
| 	var bits_reserved_in_first_byte uint = (*pos & 7) | ||||
| 	/* implicit & 0xFF is assumed for uint8_t arithmetics */ | ||||
|  | ||||
| 	var bits_left_to_write uint | ||||
| 	bits <<= bits_reserved_in_first_byte | ||||
| 	array_pos[0] |= byte(bits) | ||||
| 	array_pos = array_pos[1:] | ||||
| 	for bits_left_to_write = n_bits + bits_reserved_in_first_byte; bits_left_to_write >= 9; bits_left_to_write -= 8 { | ||||
| 		bits >>= 8 | ||||
| 		array_pos[0] = byte(bits) | ||||
| 		array_pos = array_pos[1:] | ||||
| 	} | ||||
|  | ||||
| 	array_pos[0] = 0 | ||||
| 	*pos += n_bits | ||||
| 	// Data waiting to be written is the low nbits of bits. | ||||
| 	bits  uint64 | ||||
| 	nbits uint | ||||
| } | ||||
|  | ||||
| func writeSingleBit(bit bool, pos *uint, array []byte) { | ||||
| func (w *bitWriter) writeBits(nb uint, b uint64) { | ||||
| 	w.bits |= b << w.nbits | ||||
| 	w.nbits += nb | ||||
| 	if w.nbits >= 32 { | ||||
| 		bits := w.bits | ||||
| 		w.bits >>= 32 | ||||
| 		w.nbits -= 32 | ||||
| 		w.dst = append(w.dst, | ||||
| 			byte(bits), | ||||
| 			byte(bits>>8), | ||||
| 			byte(bits>>16), | ||||
| 			byte(bits>>24), | ||||
| 		) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (w *bitWriter) writeSingleBit(bit bool) { | ||||
| 	if bit { | ||||
| 		writeBits(1, 1, pos, array) | ||||
| 		w.writeBits(1, 1) | ||||
| 	} else { | ||||
| 		writeBits(1, 0, pos, array) | ||||
| 		w.writeBits(1, 0) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func writeBitsPrepareStorage(pos uint, array []byte) { | ||||
| 	assert(pos&7 == 0) | ||||
| 	array[pos>>3] = 0 | ||||
| func (w *bitWriter) jumpToByteBoundary() { | ||||
| 	dst := w.dst | ||||
| 	for w.nbits != 0 { | ||||
| 		dst = append(dst, byte(w.bits)) | ||||
| 		w.bits >>= 8 | ||||
| 		if w.nbits > 8 { // Avoid underflow | ||||
| 			w.nbits -= 8 | ||||
| 		} else { | ||||
| 			w.nbits = 0 | ||||
| 		} | ||||
| 	} | ||||
| 	w.bits = 0 | ||||
| 	w.dst = dst | ||||
| } | ||||
|  | ||||
| func (w *bitWriter) writeBytes(b []byte) { | ||||
| 	if w.nbits&7 != 0 { | ||||
| 		panic("writeBytes with unfinished bits") | ||||
| 	} | ||||
| 	for w.nbits != 0 { | ||||
| 		w.dst = append(w.dst, byte(w.bits)) | ||||
| 		w.bits >>= 8 | ||||
| 		w.nbits -= 8 | ||||
| 	} | ||||
| 	w.dst = append(w.dst, b...) | ||||
| } | ||||
|  | ||||
| func (w *bitWriter) getPos() uint { | ||||
| 	return uint(len(w.dst)<<3) + w.nbits | ||||
| } | ||||
|  | ||||
| func (w *bitWriter) rewind(p uint) { | ||||
| 	w.bits = uint64(w.dst[p>>3] & byte((1<<(p&7))-1)) | ||||
| 	w.nbits = p & 7 | ||||
| 	w.dst = w.dst[:p>>3] | ||||
| } | ||||
|  | ||||
| func (w *bitWriter) updateBits(n_bits uint, bits uint32, pos uint) { | ||||
| 	for n_bits > 0 { | ||||
| 		var byte_pos uint = pos >> 3 | ||||
| 		var n_unchanged_bits uint = pos & 7 | ||||
| 		var n_changed_bits uint = brotli_min_size_t(n_bits, 8-n_unchanged_bits) | ||||
| 		var total_bits uint = n_unchanged_bits + n_changed_bits | ||||
| 		var mask uint32 = (^((1 << total_bits) - 1)) | ((1 << n_unchanged_bits) - 1) | ||||
| 		var unchanged_bits uint32 = uint32(w.dst[byte_pos]) & mask | ||||
| 		var changed_bits uint32 = bits & ((1 << n_changed_bits) - 1) | ||||
| 		w.dst[byte_pos] = byte(changed_bits<<n_unchanged_bits | unchanged_bits) | ||||
| 		n_bits -= n_changed_bits | ||||
| 		bits >>= n_changed_bits | ||||
| 		pos += n_changed_bits | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										57
									
								
								vendor/github.com/andybalholm/brotli/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/andybalholm/brotli/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,12 +1,8 @@ | ||||
| package brotli | ||||
|  | ||||
| import ( | ||||
| 	"compress/gzip" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/golang/gddo/httputil" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| @@ -50,11 +46,8 @@ func NewWriterLevel(dst io.Writer, level int) *Writer { | ||||
| // NewWriterOptions is like NewWriter but specifies WriterOptions | ||||
| func NewWriterOptions(dst io.Writer, options WriterOptions) *Writer { | ||||
| 	w := new(Writer) | ||||
| 	w.options = options | ||||
| 	w.Reset(dst) | ||||
| 	w.params.quality = options.Quality | ||||
| 	if options.LGWin > 0 { | ||||
| 		w.params.lgwin = uint(options.LGWin) | ||||
| 	} | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| @@ -63,6 +56,10 @@ func NewWriterOptions(dst io.Writer, options WriterOptions) *Writer { | ||||
| // instead. This permits reusing a Writer rather than allocating a new one. | ||||
| func (w *Writer) Reset(dst io.Writer) { | ||||
| 	encoderInitState(w) | ||||
| 	w.params.quality = w.options.Quality | ||||
| 	if w.options.LGWin > 0 { | ||||
| 		w.params.lgwin = uint(w.options.LGWin) | ||||
| 	} | ||||
| 	w.dst = dst | ||||
| } | ||||
|  | ||||
| @@ -70,6 +67,9 @@ func (w *Writer) writeChunk(p []byte, op int) (n int, err error) { | ||||
| 	if w.dst == nil { | ||||
| 		return 0, errWriterClosed | ||||
| 	} | ||||
| 	if w.err != nil { | ||||
| 		return 0, w.err | ||||
| 	} | ||||
|  | ||||
| 	for { | ||||
| 		availableIn := uint(len(p)) | ||||
| @@ -82,16 +82,8 @@ func (w *Writer) writeChunk(p []byte, op int) (n int, err error) { | ||||
| 			return n, errEncode | ||||
| 		} | ||||
|  | ||||
| 		outputData := encoderTakeOutput(w) | ||||
|  | ||||
| 		if len(outputData) > 0 { | ||||
| 			_, err = w.dst.Write(outputData) | ||||
| 			if err != nil { | ||||
| 				return n, err | ||||
| 			} | ||||
| 		} | ||||
| 		if len(p) == 0 { | ||||
| 			return n, nil | ||||
| 		if len(p) == 0 || w.err != nil { | ||||
| 			return n, w.err | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -124,32 +116,3 @@ type nopCloser struct { | ||||
| } | ||||
|  | ||||
| func (nopCloser) Close() error { return nil } | ||||
|  | ||||
| // HTTPCompressor chooses a compression method (brotli, gzip, or none) based on | ||||
| // the Accept-Encoding header, sets the Content-Encoding header, and returns a | ||||
| // WriteCloser that implements that compression. The Close method must be called | ||||
| // before the current HTTP handler returns. | ||||
| // | ||||
| // Due to https://github.com/golang/go/issues/31753, the response will not be | ||||
| // compressed unless you set a Content-Type header before you call | ||||
| // HTTPCompressor. | ||||
| func HTTPCompressor(w http.ResponseWriter, r *http.Request) io.WriteCloser { | ||||
| 	if w.Header().Get("Content-Type") == "" { | ||||
| 		return nopCloser{w} | ||||
| 	} | ||||
|  | ||||
| 	if w.Header().Get("Vary") == "" { | ||||
| 		w.Header().Set("Vary", "Accept-Encoding") | ||||
| 	} | ||||
|  | ||||
| 	encoding := httputil.NegotiateContentEncoding(r, []string{"br", "gzip"}) | ||||
| 	switch encoding { | ||||
| 	case "br": | ||||
| 		w.Header().Set("Content-Encoding", "br") | ||||
| 		return NewWriter(w) | ||||
| 	case "gzip": | ||||
| 		w.Header().Set("Content-Encoding", "gzip") | ||||
| 		return gzip.NewWriter(w) | ||||
| 	} | ||||
| 	return nopCloser{w} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user