|
|
| version 1.5, 2003/07/24 11:31:24 | version 1.12, 2009/09/27 22:07:58 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: uuencoding impl. | Parser: uuencoding impl. |
| Copyright(c) 2000,2001-2003 ArtLebedev Group(http://www.artlebedev.com) | Copyright(c) 2000-2009 ArtLebedev Group(http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| @todo setrlimit | @todo setrlimit |
| */ | */ |
| static const char* IDENT_UUE_C="$Date$"; | static const char * const IDENT_UUE_C="$Date$"; |
| #include "pa_config_includes.h" | #include "pa_config_includes.h" |
| Line 23 static unsigned char uue_table[64] = { | Line 23 static unsigned char uue_table[64] = { |
| 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', |
| 'X', 'Y', 'Z', '[', '\\',']', '^', '_' | 'X', 'Y', 'Z', '[', '\\',']', '^', '_' |
| }; | }; |
| void pa_uuencode(String& result, const String& file_name, const VFile& vfile) { | |
| //header | |
| result << "content-transfer-encoding: x-uuencode\n" << "\n"; | |
| result << "begin 644 " << file_name << "\n"; | |
| //body | const char* pa_uuencode(const String& file_name, const VFile& vfile) { |
| const unsigned char *in=(const unsigned char *)vfile.value_ptr(); | const unsigned char *in=(const unsigned char *)vfile.value_ptr(); |
| size_t in_length=vfile.value_size(); | size_t in_length=vfile.value_size(); |
| const char* file_name_cstr = file_name.cstr(); | |
| size_t new_size=((in_length / 3 + 1) * 4); | |
| new_size += 2 * new_size / 60/*chars in line + new lines*/; | |
| new_size += strlen(file_name_cstr) + 11/*header*/ + 6/*footer*/ + 1/*zero terminator*/; | |
| const char* result=new(PointerFreeGC) char[new_size]; | |
| char* optr=(char*)result; | |
| //header | |
| optr += sprintf(optr, "begin 644 %s\n", file_name_cstr); | |
| //body | |
| int count=45; | int count=45; |
| for(const unsigned char *itemp=in; itemp<(in+in_length); itemp+=count) { | for(const unsigned char *itemp=in; itemp<(in+in_length); itemp+=count) { |
| int index; | int index; |
| Line 39 void pa_uuencode(String& result, const S | Line 48 void pa_uuencode(String& result, const S |
| if((itemp+count)>(in+in_length)) | if((itemp+count)>(in+in_length)) |
| count=in_length-(itemp-in); | count=in_length-(itemp-in); |
| char *buf=new(PointerFreeGC) char[MAX_STRING]; | |
| char *optr=buf; | |
| /* | /* |
| * for UU and XX, encode the number of bytes as first character | * for UU and XX, encode the number of bytes as first character |
| */ | */ |
| Line 76 void pa_uuencode(String& result, const S | Line 82 void pa_uuencode(String& result, const S |
| * end of line | * end of line |
| */ | */ |
| *optr++ = '\n'; | *optr++ = '\n'; |
| *optr = 0; | |
| result << buf; | |
| } | } |
| //footer | //footer |
| result.append_know_length((const char* )uue_table, 1/* one char */, String::L_AS_IS) << "\n" | optr += sprintf(optr, "`\nend\n"); |
| "end\n"; | |
| } | *optr = 0; |
| //throw Exception(PARSER_RUNTIME, 0, "%d %d %d", in_length, new_size, (size_t)(optr-result)); | |
| assert((size_t)(optr-result) < new_size); | |
| return result; | |
| } | |