%% Copyright (c) 2015-2020, Loïc Hoguin %% %% Permission to use, copy, modify, and/or distribute this software for any %% purpose with or without fee is hereby granted, provided that the above %% copyright notice and this permission notice appear in all copies. %% %% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES %% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF %% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR %% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES %% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN %% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF %% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. %% The prefixed integer and the string formats are common %% to both HPACK and QPACK. They are included directly in %% each module in order to avoid fully-qualified calls and %% slightly improve performance. %% %% Some functions are only used in one or the other even %% though the format is the same. In that case the functions %% can be found in the relevant module. %% %% Any tests relevant to these functions should be added to %% cow_hpack since HPACK is where these originate from. %% Prefix decoding. %% %% The HPACK format has 4 different integer prefixes length (from 4 to 7) %% and each can be used to create an indefinite length integer if all bits %% of the prefix are set to 1. dec_int5(<<2#11111:5, Rest/bits>>) -> dec_big_int(Rest, 31, 0); dec_int5(<>) -> {Int, Rest}. dec_big_int(<<0:1, Value:7, Rest/bits>>, Int, M) -> {Int + (Value bsl M), Rest}; dec_big_int(<<1:1, Value:7, Rest/bits>>, Int, M) -> dec_big_int(Rest, Int + (Value bsl M), M + 7). %% Prefix encoding. enc_int5(Int, Prefix) when Int < 31 -> <>; enc_int5(Int, Prefix) -> enc_big_int(Int - 31, <>). enc_int6(Int, Prefix) when Int < 63 -> <>; enc_int6(Int, Prefix) -> enc_big_int(Int - 63, <>). enc_int7(Int, Prefix) when Int < 127 -> <>; enc_int7(Int, Prefix) -> enc_big_int(Int - 127, <>). enc_big_int(Int, Acc) when Int < 128 -> <>; enc_big_int(Int, Acc) -> enc_big_int(Int bsr 7, <>). %% String decoding. %% %% We use a lookup table that allows us to benefit from %% the binary match context optimization. A more naive %% implementation using bit pattern matching cannot reuse %% a match context because it wouldn't always match on %% byte boundaries. %% %% See cow_hpack_dec_huffman_lookup.hrl for more details. dec_huffman(<>, Len, Huff0, Acc) when Len > 1 -> {_, CharA, Huff1} = dec_huffman_lookup(Huff0, A), {_, CharB, Huff} = dec_huffman_lookup(Huff1, B), case {CharA, CharB} of {undefined, undefined} -> dec_huffman(R, Len - 1, Huff, Acc); {CharA, undefined} -> dec_huffman(R, Len - 1, Huff, <>); {undefined, CharB} -> dec_huffman(R, Len - 1, Huff, <>); {CharA, CharB} -> dec_huffman(R, Len - 1, Huff, <>) end; dec_huffman(<>, 1, Huff0, Acc) -> {_, CharA, Huff} = dec_huffman_lookup(Huff0, A), {ok, CharB, _} = dec_huffman_lookup(Huff, B), case {CharA, CharB} of %% {undefined, undefined} (> 7-bit final padding) is rejected with a crash. {CharA, undefined} -> {<>, Rest}; {undefined, CharB} -> {<>, Rest}; _ -> {<>, Rest} end; %% Can only be reached when the string length to decode is 0. dec_huffman(Rest, 0, _, <<>>) -> {<<>>, Rest}. -include("cow_hpack_dec_huffman_lookup.hrl"). %% String encoding. enc_str(Str, huffman) -> Str2 = enc_huffman(Str, <<>>), [enc_int7(byte_size(Str2), 2#1)|Str2]; enc_str(Str, no_huffman) -> [enc_int7(byte_size(Str), 2#0)|Str]. enc_huffman(<<>>, Acc) -> case bit_size(Acc) rem 8 of 1 -> <>; 2 -> <>; 3 -> <>; 4 -> <>; 5 -> <>; 6 -> <>; 7 -> <>; 0 -> Acc end; enc_huffman(<<0, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<1, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<2, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<3, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<4, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<5, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<6, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<7, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<8, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<9, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<10, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<11, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<12, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<13, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<14, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<15, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<16, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<17, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<18, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<19, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<20, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<21, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<22, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<23, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<24, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<25, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<26, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<27, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<28, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<29, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<30, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<31, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<32, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<33, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<34, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<35, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<36, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<37, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<38, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<39, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<40, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<41, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<42, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<43, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<44, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<45, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<46, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<47, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<48, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<49, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<50, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<51, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<52, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<53, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<54, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<55, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<56, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<57, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<58, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<59, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<60, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<61, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<62, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<63, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<64, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<65, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<66, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<67, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<68, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<69, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<70, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<71, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<72, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<73, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<74, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<75, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<76, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<77, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<78, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<79, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<80, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<81, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<82, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<83, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<84, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<85, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<86, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<87, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<88, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<89, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<90, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<91, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<92, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<93, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<94, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<95, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<96, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<97, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<98, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<99, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<100, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<101, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<102, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<103, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<104, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<105, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<106, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<107, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<108, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<109, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<110, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<111, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<112, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<113, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<114, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<115, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<116, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<117, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<118, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<119, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<120, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<121, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<122, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<123, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<124, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<125, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<126, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<127, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<128, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<129, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<130, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<131, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<132, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<133, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<134, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<135, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<136, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<137, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<138, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<139, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<140, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<141, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<142, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<143, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<144, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<145, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<146, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<147, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<148, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<149, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<150, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<151, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<152, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<153, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<154, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<155, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<156, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<157, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<158, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<159, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<160, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<161, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<162, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<163, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<164, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<165, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<166, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<167, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<168, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<169, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<170, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<171, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<172, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<173, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<174, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<175, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<176, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<177, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<178, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<179, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<180, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<181, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<182, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<183, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<184, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<185, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<186, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<187, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<188, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<189, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<190, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<191, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<192, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<193, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<194, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<195, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<196, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<197, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<198, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<199, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<200, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<201, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<202, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<203, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<204, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<205, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<206, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<207, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<208, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<209, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<210, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<211, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<212, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<213, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<214, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<215, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<216, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<217, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<218, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<219, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<220, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<221, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<222, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<223, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<224, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<225, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<226, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<227, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<228, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<229, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<230, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<231, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<232, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<233, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<234, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<235, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<236, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<237, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<238, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<239, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<240, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<241, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<242, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<243, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<244, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<245, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<246, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<247, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<248, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<249, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<250, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<251, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<252, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<253, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<254, R/bits>>, A) -> enc_huffman(R, <>); enc_huffman(<<255, R/bits>>, A) -> enc_huffman(R, <>).