--- parser3/src/include/pa_common.h 2003/09/25 09:15:02 1.94 +++ parser3/src/include/pa_common.h 2007/05/23 08:32:22 1.114 @@ -1,14 +1,14 @@ /** @file Parser: commonly used functions. - Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #ifndef PA_COMMON_H #define PA_COMMON_H -static const char* IDENT_COMMON_H="$Date: 2003/09/25 09:15:02 $"; +static const char * const IDENT_COMMON_H="$Date: 2007/05/23 08:32:22 $"; #include "pa_string.h" #include "pa_hash.h" @@ -56,9 +56,6 @@ inline long lseek( int handle, long offs #endif -/// yields to OS for secs secs and usecs milliseconds -int pa_sleep(unsigned long secs, unsigned long usecs); - /** under WIN32 "t" mode fixes DOS chars OK, can't say that about other systems/ line break styles */ @@ -67,6 +64,13 @@ void fix_line_breaks( size_t& length///< may change! used to speedup next actions ); +int pa_lock_shared_blocking(int fd); +int pa_lock_exclusive_blocking(int fd); +int pa_lock_exclusive_nonblocking(int fd); +int pa_unlock(int fd); + +void create_dir_for_file(const String& file_spec); + typedef void (*File_read_action)( struct stat& finfo, int f, @@ -115,7 +119,8 @@ File_read_result file_read(Request_chars const String& file_spec, bool as_text, HashStringValue* options=0, - bool fail_on_read_problem=true); + bool fail_on_read_problem=true, + char* buf=0, size_t offset=0, size_t size=0); typedef void (*File_write_action)(int f, void *context); @@ -129,7 +134,9 @@ typedef void (*File_write_action)(int f, */ bool file_write_action_under_lock( const String& file_spec, - const char* action_name, File_write_action action, void *context, + const char* action_name, + File_write_action action, + void *context, bool as_text=false, bool do_append=false, bool do_block=true, @@ -149,7 +156,7 @@ void file_write( delete specified file throws an exception in case of problems */ -bool file_delete(const String& file_spec, bool fail_on_read_problem=true); +bool file_delete(const String& file_spec, bool fail_on_problem=true); /** move specified file throws an exception in case of problems @@ -158,9 +165,9 @@ void file_move(const String& old_spec, c bool entry_exists(const char* fname, struct stat *afinfo=0); bool entry_exists(const String& file_spec); -bool file_readable(const String& file_spec); -bool dir_readable(const String& file_spec); -const String* file_readable(const String& path, const String& name); +bool file_exist(const String& file_spec); +bool dir_exists(const String& file_spec); +const String* file_exist(const String& path, const String& name); bool file_executable(const String& file_spec); bool file_stat(const String& file_spec, @@ -207,8 +214,86 @@ void remove_crlf(char *start, char *end) void check_safe_mode(struct stat finfo, const String& file_spec, const char* fname); #endif +void pa_base64_decode(const char *in, size_t in_size, char*& result, size_t& result_size); +char* pa_base64_encode(const char *in, size_t in_size); +struct File_base64_action_info { + unsigned char** base64; +}; +char* pa_base64_encode(const String& file_spec); +static void file_base64_file_action( + struct stat& finfo, + int f, + const String&, const char* /*fname*/, bool, + void *context); + +#define FILE_BUFFER_SIZE 4096 +static unsigned long crc32Table[256]; +static void InitCrc32Table() +{ + if(crc32Table[1] == 0){ + // This is the official polynomial used by CRC32 in PKZip. + // Often times the polynomial shown reversed as 0x04C11DB7. + static const unsigned long dwPolynomial = 0xEDB88320; + + for(int i = 0; i < 256; i++) + { + unsigned long dwCrc = i; + for(int j = 8; j > 0; j--) + { + if(dwCrc & 1) + dwCrc = (dwCrc >> 1) ^ dwPolynomial; + else + dwCrc >>= 1; + } + crc32Table[i] = dwCrc; + } + } +} + +int file_block_read(const int f, unsigned char* buffer, const size_t size); + +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); +const unsigned long pa_crc32(const String& file_spec); +static void file_crc32_file_action( + struct stat& finfo, + int f, + const String&, const char* /*fname*/, bool, + void *context); + +static const char* hex_string(unsigned char* bytes, size_t size, bool upcase) { + char *bytes_hex=new(PointerFreeGC) char [size*2/*byte->hh*/+1/*for zero-teminator*/]; + unsigned char *src=bytes; + unsigned char *end=bytes+size; + char *dest=bytes_hex; + + const char *hex=upcase?"0123456789ABCDEF":"0123456789abcdef"; + + for(; src