33static size_t mb_uuencode_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state);
61#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
63#define UUDEC(c) (char)(((c)-' ') & 077)
64static const char *uuenc_begin_text =
"begin ";
84 if (filter->
cache == 0 && c ==
'b')
95 if (uuenc_begin_text[filter->
cache++] != c) {
100 if (filter->
cache == 5)
120 filter->
cache |= (
n << 16);
126 filter->
cache |= (
n << 8);
139 A = (filter->
cache >> 16) & 0xff;
140 B = (filter->
cache >> 8) & 0xff;
141 C = (filter->
cache) & 0xff;
142 n = (filter->
cache >> 24) & 0xff;
170static size_t mb_uuencode_to_wchar(
unsigned char **in,
size_t *in_len, uint32_t *
buf,
size_t bufsize,
unsigned int *
state)
174 unsigned char *
p = *in, *e =
p + *in_len;
175 uint32_t *
out =
buf, *limit =
buf + bufsize;
177 unsigned int _state = *
state & 0xFF;
180 while (
p < e && (limit -
out) >= 3) {
181 unsigned char c = *
p++;
186 if ((e -
p) >= 5 && memcmp(
p, uuenc_begin_text+1, 5) == 0) {
188 while (
p < e && *
p++ !=
'\n');
206 unsigned int a =
UUDEC(c);
207 unsigned int b =
UUDEC(*
p++);
208 unsigned int c =
UUDEC(*
p++);
209 unsigned int d =
UUDEC(*
p++);
212 *
out++ = ((
a << 2) | (b >> 4)) & 0xFF;
216 *
out++ = ((b << 4) | (c >> 2)) & 0xFF;
220 *
out++ = ((c << 6) | d) & 0xFF;
239static unsigned char uuencode_six_bits(
unsigned int bits)
250 unsigned char *
out, *limit;
259 unsigned int bytes_encoded = (
buf->state >> 1) & 0x7F;
263 unsigned int n_cached_bits = (
buf->state >> 8) & 0xFF;
264 unsigned int cached_bits =
buf->state >> 16;
267 for (
char *
s =
"begin 0644 filename\n"; *
s;
s++) {
268 out = mb_convert_buf_add(
out, *
s);
272 }
else if (!
len &&
end && !bytes_encoded && !n_cached_bits) {
286 unsigned char *len_byte =
out - (bytes_encoded * 4 / 3) - 1;
288 len_byte -= (n_cached_bits == 2) ? 1 : 2;
290 *len_byte =
MIN(bytes_encoded +
len + (n_cached_bits ? (n_cached_bits == 2 ? 1 : 2) : 0), 45) + 32;
294 if (n_cached_bits == 2) {
295 uint32_t w = cached_bits;
296 uint32_t w2 = 0, w3 = 0;
305 out = mb_convert_buf_add3(
out, uuencode_six_bits((w << 4) + ((w2 >> 4) & 0xF)), uuencode_six_bits(((w2 & 0xF) << 2) + ((w3 >> 6) & 0x3)), uuencode_six_bits(w3 & 0x3F));
307 uint32_t w2 = cached_bits;
313 out = mb_convert_buf_add2(
out, uuencode_six_bits((w2 << 2) + ((w3 >> 6) & 0x3)), uuencode_six_bits(w3 & 0x3F));
315 n_cached_bits = cached_bits = 0;
316 goto possible_line_break;
322 uint32_t w2 = 0, w3 = 0;
326 out = mb_convert_buf_add(
out, uuencode_six_bits((w >> 2) & 0x3F));
328 cached_bits = w & 0x3;
339 out = mb_convert_buf_add2(
out, uuencode_six_bits((w >> 2) & 0x3F), uuencode_six_bits(((w & 0x3) << 4) + ((w2 >> 4) & 0xF)));
341 cached_bits = w2 & 0xF;
350 out = mb_convert_buf_add4(
out, uuencode_six_bits((w >> 2) & 0x3F), uuencode_six_bits(((w & 0x3) << 4) + ((w2 >> 4) & 0xF)), uuencode_six_bits(((w2 & 0xF) << 2) + ((w3 >> 6) & 0x3)), uuencode_six_bits(w3 & 0x3F));
355 if (bytes_encoded >= 45) {
356 out = mb_convert_buf_add(
out,
'\n');
364 if (bytes_encoded &&
end) {
365 out = mb_convert_buf_add(
out,
'\n');
368 buf->state = ((cached_bits & 0xFF) << 16) | ((n_cached_bits & 0xFF) << 8) | ((bytes_encoded & 0x7F) << 1) | (
buf->state & 1);
zend_ffi_ctype_name_buf buf
@ uudec_state_until_newline
@ uudec_state_skip_newline
int mbfl_filt_conv_uudec(int c, mbfl_convert_filter *filter)
const mbfl_encoding mbfl_encoding_uuencode
const struct mbfl_convert_vtbl vtbl_uuencode_8bit
#define MBFL_ENCTYPE_SBCS
int mbfl_filt_conv_common_flush(mbfl_convert_filter *filter)
void mbfl_filt_conv_common_ctor(mbfl_convert_filter *filter)
struct _mbfl_convert_filter mbfl_convert_filter
@ mbfl_no_encoding_uuencode
#define MB_CONVERT_BUF_STORE(buf, _out, _limit)
#define MB_CONVERT_BUF_ENSURE(buf, out, limit, needed)
#define MB_CONVERT_BUF_LOAD(buf, _out, _limit)
unsigned const char * end
output_function_t output_function