|
|
| version 1.5, 2003/07/24 11:31:24 | version 1.18, 2017/02/07 22:00:44 |
|---|---|
| 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) 2001-2017 Art. Lebedev Studio (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$"; | |
| #include "pa_config_includes.h" | #include "pa_config_includes.h" |
| #include "pa_uue.h" | #include "pa_uue.h" |
| #include "pa_memory.h" | |
| volatile const char * IDENT_PA_UUE_C="$Id$" IDENT_PA_UUE_H; | |
| static unsigned char uue_table[64] = { | static unsigned char uue_table[64] = { |
| '`', '!', '"', '#', '$', '%', '&', '\'', | '`', '!', '"', '#', '$', '%', '&', '\'', |
| Line 23 static unsigned char uue_table[64] = { | Line 24 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) { | |
| const char* pa_uuencode(const unsigned char* in, size_t in_size, const char* file_name) { | |
| int count=45; | |
| size_t new_size = ((in_size / 3 + 1) * 4); | |
| new_size += 2 * new_size / (count / 3 * 4) /*chars in line + new lines*/ + 2; | |
| new_size += strlen(file_name) + 11/*header*/ + 6/*footer*/ + 1/*zero terminator*/; | |
| const char* result=new(PointerFreeGC) char[new_size]; | |
| char* optr=(char*)result; | |
| //header | //header |
| result << "content-transfer-encoding: x-uuencode\n" << "\n"; | optr += sprintf(optr, "begin 644 %s\n", file_name); |
| result << "begin 644 " << file_name << "\n"; | |
| //body | //body |
| const unsigned char *in=(const unsigned char *)vfile.value_ptr(); | for(const unsigned char *itemp=in; itemp<(in+in_size); itemp+=count) { |
| size_t in_length=vfile.value_size(); | |
| int count=45; | |
| for(const unsigned char *itemp=in; itemp<(in+in_length); itemp+=count) { | |
| int index; | int index; |
| if((itemp+count)>(in+in_length)) | if((itemp+count)>(in+in_size)) |
| count=in_length-(itemp-in); | count=in_size-(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 75 void pa_uuencode(String& result, const S | Line 78 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"; | |
| //throw Exception(PARSER_RUNTIME, 0, "%d %d %d", in_size, new_size, (size_t)(optr-result)); | |
| assert((size_t)(optr-result) < new_size); | |
| return result; | |
| } | } |