Annotation of parser3/src/main/pa_uue.C, revision 1.12
1.1 paf 1: /** @file
2: Parser: uuencoding impl.
3:
1.12 ! misha 4: Copyright(c) 2000-2009 ArtLebedev Group(http://www.artlebedev.com)
1.1 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
6:
7: @todo setrlimit
8: */
1.2 paf 9:
1.12 ! misha 10: static const char * const IDENT_UUE_C="$Date: 2007/10/22 14:34:24 $";
1.1 paf 11:
12: #include "pa_config_includes.h"
13:
14: #include "pa_uue.h"
15:
16: static unsigned char uue_table[64] = {
17: '`', '!', '"', '#', '$', '%', '&', '\'',
18: '(', ')', '*', '+', ',', '-', '.', '/',
19: '0', '1', '2', '3', '4', '5', '6', '7',
20: '8', '9', ':', ';', '<', '=', '>', '?',
21: '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
22: 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
23: 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
24: 'X', 'Y', 'Z', '[', '\\',']', '^', '_'
25: };
26:
1.12 ! misha 27: const char* pa_uuencode(const String& file_name, const VFile& vfile) {
1.1 paf 28: const unsigned char *in=(const unsigned char *)vfile.value_ptr();
29: size_t in_length=vfile.value_size();
30:
1.12 ! misha 31: const char* file_name_cstr = file_name.cstr();
! 32:
! 33: size_t new_size=((in_length / 3 + 1) * 4);
! 34: new_size += 2 * new_size / 60/*chars in line + new lines*/;
! 35: new_size += strlen(file_name_cstr) + 11/*header*/ + 6/*footer*/ + 1/*zero terminator*/;
! 36:
! 37: const char* result=new(PointerFreeGC) char[new_size];
! 38: char* optr=(char*)result;
! 39:
! 40: //header
! 41: optr += sprintf(optr, "begin 644 %s\n", file_name_cstr);
! 42:
! 43: //body
1.1 paf 44: int count=45;
45: for(const unsigned char *itemp=in; itemp<(in+in_length); itemp+=count) {
46: int index;
47:
48: if((itemp+count)>(in+in_length))
49: count=in_length-(itemp-in);
50:
51: /*
52: * for UU and XX, encode the number of bytes as first character
53: */
54: *optr++ = uue_table[count];
55:
56: for (index=0; index<=count-3; index+=3) {
57: *optr++ = uue_table[itemp[index] >> 2];
58: *optr++ = uue_table[((itemp[index ] & 0x03) << 4) | (itemp[index+1] >> 4)];
59: *optr++ = uue_table[((itemp[index+1] & 0x0f) << 2) | (itemp[index+2] >> 6)];
60: *optr++ = uue_table[ itemp[index+2] & 0x3f];
61: }
62:
63: /*
64: * Special handlitempg for itempcomplete litempes
65: */
66: if (index != count) {
67: if (count - index == 2) {
68: *optr++ = uue_table[itemp[index] >> 2];
69: *optr++ = uue_table[((itemp[index ] & 0x03) << 4) |
70: ( itemp[index+1] >> 4)];
71: *optr++ = uue_table[((itemp[index+1] & 0x0f) << 2)];
72: *optr++ = uue_table[0];
73: }
74: else if (count - index == 1) {
75: *optr++ = uue_table[ itemp[index] >> 2];
76: *optr++ = uue_table[(itemp[index] & 0x03) << 4];
77: *optr++ = uue_table[0];
78: *optr++ = uue_table[0];
79: }
80: }
81: /*
82: * end of line
83: */
84: *optr++ = '\n';
85: }
86:
87: //footer
1.12 ! misha 88: optr += sprintf(optr, "`\nend\n");
! 89:
! 90: *optr = 0;
! 91:
! 92: //throw Exception(PARSER_RUNTIME, 0, "%d %d %d", in_length, new_size, (size_t)(optr-result));
! 93: assert((size_t)(optr-result) < new_size);
! 94:
! 95: return result;
! 96: }
E-mail: