--- parser3/src/main/pa_common.C 2015/04/21 22:12:27 1.283 +++ parser3/src/main/pa_common.C 2015/10/26 01:21:58 1.288 @@ -1,7 +1,7 @@ /** @file Parser: commonly functions. - Copyright (c) 2000-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2000-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) * BASE64 part @@ -50,7 +50,7 @@ #define pa_mkdir(path, mode) mkdir(path, mode) #endif -volatile const char * IDENT_PA_COMMON_C="$Id: pa_common.C,v 1.283 2015/04/21 22:12:27 moko Exp $" IDENT_PA_COMMON_H IDENT_PA_HASH_H IDENT_PA_ARRAY_H IDENT_PA_STACK_H; +volatile const char * IDENT_PA_COMMON_C="$Id: pa_common.C,v 1.288 2015/10/26 01:21:58 moko Exp $" IDENT_PA_COMMON_H IDENT_PA_HASH_H IDENT_PA_ARRAY_H IDENT_PA_STACK_H; // some maybe-undefined constants @@ -157,17 +157,12 @@ File_read_result file_read(Request_chars if(as_text){ if(result.success){ Charset* asked_charset=0; - if(result.length>=3 && strncmp(result.str, "\xEF\xBB\xBF", 3)==0){ - // skip UTF-8 signature (BOM code) - result.str+=3; - result.length-=3; - asked_charset=&UTF8_charset; - } - if(params) if(Value* vcharset_name=params->get(PA_CHARSET_NAME)) asked_charset=&::charsets.get(vcharset_name->as_string().change_case(charsets.source(), String::CC_UPPER)); + asked_charset=::charsets.checkBOM(result.str, result.length, asked_charset); + if(result.length && transcode_text_result && asked_charset){ // length must be checked because transcode returns CONST string in case length==0, which contradicts hacking few lines below String::C body=String::C(result.str, result.length); body=Charset::transcode(body, *asked_charset, charsets.source()); @@ -787,7 +782,7 @@ char* unescape_chars(const char* cp, int } else { switch(escapeState) { case EscapeRest: - if(!js && c=='+'){ + if(c=='+' && !js){ *dst++=' '; } else { *dst++=c; @@ -926,8 +921,9 @@ int __vsnprintf(char* b, size_t s, const return 0; int r; - // note: on win32& maybe somewhere else + // note: on win32 & maybe somewhere else // vsnprintf do not writes terminating 0 in 'buffer full' case, reducing + // http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 --s; // clients do not check for negative 's', feature: ignore such prints @@ -935,22 +931,16 @@ int __vsnprintf(char* b, size_t s, const return 0; #ifdef _MSC_VER - /* - win32: - mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001APR\1033\vccore.chm::/html/_crt__vsnprintf.2c_._vsnwprintf.htm - - if the number of bytes to write exceeds buffer, then count bytes are written and Ö1 is returned - */ + // win32: if the number of bytes to write exceeds buffer, then count bytes are written and -1 is returned r=_vsnprintf(b, s, f, l); if(r<0) r=s; #else r=vsnprintf(b, s, f, l); /* - solaris: - man vsnprintf + solaris: man vsnprintf - The snprintf() function returns the number of characters + The snprintf() function returns the number of characters formatted, that is, the number of characters that would have been written to the buffer if it were large enough. If the value of n is 0 on a call to snprintf(), an unspecified @@ -1468,43 +1458,3 @@ const char *pa_idna_decode(const char *i return result; } - - -static bool isLeap(int year) { - return !( - (year % 4) || ((year % 400) && !(year % 100)) - ); -} - -int getMonthDays(int year, int month) { - static int monthDays[]={ - 31, - 28, - 31, - 30, - 31, - 30, - 31, - 31, - 30, - 31, - 30, - 31 - }; - return (month == 1 /* january -- 0 */ && isLeap(year)) ? 29 : monthDays[month]; -} - -String::C date_gmt_string(tm* tms) { - /// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 - static const char month_names[12][4]={ - "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; - static const char days[7][4]={ - "Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; - - char *buf=new(PointerFreeGC) char[MAX_STRING]; - return String::C(buf, - snprintf(buf, MAX_STRING, "%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT", - days[tms->tm_wday], - tms->tm_mday,month_names[tms->tm_mon],tms->tm_year+1900, - tms->tm_hour,tms->tm_min,tms->tm_sec)); -}