--- parser3/src/main/pa_common.C 2013/07/23 12:10:56 1.276 +++ parser3/src/main/pa_common.C 2015/01/12 12:22:02 1.280 @@ -41,7 +41,13 @@ #include #endif -volatile const char * IDENT_PA_COMMON_C="$Id: pa_common.C,v 1.276 2013/07/23 12:10:56 moko Exp $" IDENT_PA_COMMON_H IDENT_PA_HASH_H IDENT_PA_ARRAY_H IDENT_PA_STACK_H; +#ifdef _MSC_VER +#define pa_mkdir(path, mode) _mkdir(path) +#else +#define pa_mkdir(path, mode) mkdir(path, mode) +#endif + +volatile const char * IDENT_PA_COMMON_C="$Id: pa_common.C,v 1.280 2015/01/12 12:22:02 misha Exp $" IDENT_PA_COMMON_H IDENT_PA_HASH_H IDENT_PA_ARRAY_H IDENT_PA_STACK_H; // some maybe-undefined constants @@ -72,57 +78,6 @@ const String file_status_name(FILE_STATU // functions -bool capitalized(const char* s){ - bool upper=true; - for(const char* c=s; *c; c++){ - if(*c != (upper ? toupper((unsigned char)*c) : tolower((unsigned char)*c))) - return false; - upper=strchr("-_ ", *c) != 0; - } - return true; -} - -const char* capitalize(const char* s){ - if(!s || capitalized(s)) - return s; - - char* result=pa_strdup(s); - if(result){ - bool upper=true; - for(char* c=result; *c; c++){ - *c=upper ? (char)toupper((unsigned char)*c) : (char)tolower((unsigned char)*c); - upper=strchr("-_ ", *c) != 0; - } - } - return (const char*)result; -} - -void fix_line_breaks(char *str, size_t& length) { - //_asm int 3; - const char* const eob=str+length; - char* dest=str; - // fix DOS: \r\n -> \n - // fix Macintosh: \r -> \n - char* bol=str; - while(char* eol=(char*)memchr(bol, '\r', eob -bol)) { - size_t len=eol-bol; - if(dest!=bol) - memmove(dest, bol, len); - dest+=len; - *dest++='\n'; - - if(&eol[1] pos_after) ){ @@ -588,6 +543,68 @@ bool file_stat(const String& file_spec, return true; } +/** + String related functions +*/ + +bool capitalized(const char* s){ + bool upper=true; + for(const char* c=s; *c; c++){ + if(*c != (upper ? toupper((unsigned char)*c) : tolower((unsigned char)*c))) + return false; + upper=strchr("-_ ", *c) != 0; + } + return true; +} + +const char* capitalize(const char* s){ + if(!s || capitalized(s)) + return s; + + char* result=pa_strdup(s); + if(result){ + bool upper=true; + for(char* c=result; *c; c++){ + *c=upper ? (char)toupper((unsigned char)*c) : (char)tolower((unsigned char)*c); + upper=strchr("-_ ", *c) != 0; + } + } + return (const char*)result; +} + +void fix_line_breaks(char *str, size_t& length) { + //_asm int 3; + const char* const eob=str+length; + char* dest=str; + // fix DOS: \r\n -> \n + // fix Macintosh: \r -> \n + char* bol=str; + while(char* eol=(char*)memchr(bol, '\r', eob -bol)) { + size_t len=eol-bol; + if(dest!=bol) + memmove(dest, bol, len); + dest+=len; + *dest++='\n'; + + if(&eol[1]hh*/+1/*for zero-teminator*/]; + unsigned char *src=bytes; + unsigned char *end=bytes+size; + char *dest=bytes_hex; + + const char *hex=upcase? hex_digits : "0123456789abcdef"; + + for(; src 0; j--) + { + if(dwCrc & 1) + dwCrc = (dwCrc >> 1) ^ dwPolynomial; + else + dwCrc >>= 1; + } + crc32Table[i] = dwCrc; + } + } +} + +inline void CalcCrc32(const unsigned char byte, unsigned long &crc32) +{ + crc32 = ((crc32) >> 8) ^ crc32Table[(byte) ^ ((crc32) & 0x000000FF)]; +} + + const unsigned long pa_crc32(const char *in, size_t in_size){ unsigned long crc32=0xFFFFFFFF; @@ -1353,12 +1361,6 @@ const unsigned long pa_crc32(const char return ~crc32; } -const unsigned long pa_crc32(const String& file_spec){ - unsigned long crc32=0xFFFFFFFF; - file_read_action_under_lock(file_spec, "crc32", file_crc32_file_action, &crc32); - return ~crc32; -} - static void file_crc32_file_action( struct stat& finfo, int f, @@ -1376,3 +1378,78 @@ static void file_crc32_file_action( } } +const unsigned long pa_crc32(const String& file_spec){ + unsigned long crc32=0xFFFFFFFF; + file_read_action_under_lock(file_spec, "crc32", file_crc32_file_action, &crc32); + return ~crc32; +} + +// content-type: xxx; charset=WE-NEED-THIS +// content-type: xxx; charset="WE-NEED-THIS" +// content-type: xxx; charset="WE-NEED-THIS"; +Charset* detect_charset(const char* content_type){ + if(content_type){ + char* CONTENT_TYPE=pa_strdup(content_type); + + for(char *p=CONTENT_TYPE; *p; p++) + *p=(char)toupper((unsigned char)*p); + + if(const char* begin=strstr(CONTENT_TYPE, "CHARSET=")){ + begin+=8; // skip "CHARSET=" + char* end=0; + if(*begin && (*begin=='"' || *begin =='\'')){ + char quote=*begin; + begin++; + end=(char*)strchr(begin, quote); + } + if(!end) + end=(char*)strchr(begin, ';'); + + if(end) + *end=0; // terminator + + return *begin?&charsets.get(begin):0; + } + } + return 0; +} + + +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)); +}