Diff for /parser3/src/include/pa_common.h between versions 1.71 and 1.97

version 1.71, 2002/01/25 12:09:04 version 1.97, 2003/11/20 16:34:24
Line 1 Line 1
 /** @file  /** @file
         Parser: commonly used functions.          Parser: commonly used functions.
   
         Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
   
         $Id$  
 */  */
   
 #ifndef PA_COMMON_H  #ifndef PA_COMMON_H
 #define PA_COMMON_H  #define PA_COMMON_H
   
 #include "pa_pool.h"  static const char * const IDENT_COMMON_H="$Date$";
   
 #include "pa_string.h"  #include "pa_string.h"
   #include "pa_hash.h"
   
 class Value;  class Value;
   typedef Hash<const String::Body , Value*> HashStringValue;
   
 // replace system s*nprintf with our versions  // replace system s*nprintf with our versions
 #undef vsnprintf   #undef vsnprintf 
 int __vsnprintf(char *, size_t, const char *, va_list);  int __vsnprintf(char *, size_t, const char* , va_list);
 #define vsnprintf __vsnprintf   #define vsnprintf __vsnprintf 
 #undef snprintf  #undef snprintf
 int __snprintf(char *, size_t, const char *, ...);  int __snprintf(char *, size_t, const char* , ...);
 #define snprintf __snprintf  #define snprintf __snprintf
   
 #if _MSC_VER  #if _MSC_VER
 /*  /*
 inline int open( const char *filename, int oflag ) { return _open(filename, oflag); }  inline int open( const char* filename, int oflag ) { return _open(filename, oflag); }
 inline int close( int handle ) { return _close(handle); }  inline int close( int handle ) { return _close(handle); }
 inline int read( int handle, void *buffer, unsigned int count ) { return _read(handle,buffer,count); }  inline int read( int handle, void *buffer, unsigned int count ) { return _read(handle,buffer,count); }
 inline int write( int handle, const void *buffer, unsigned int count ) { return _write(handle,buffer,count); }  inline int write( int handle, const void *buffer, unsigned int count ) { return _write(handle,buffer,count); }
 inline int stat( const char *path, struct _stat *buffer ) { return _stat(path, buffer); }  inline int stat( const char* path, struct _stat *buffer ) { return _stat(path, buffer); }
 inline long lseek( int handle, long offset, int origin ) { return _lseek(handle, offset, origin); }  inline long lseek( int handle, long offset, int origin ) { return _lseek(handle, offset, origin); }
 */  */
   
Line 55  inline long lseek( int handle, long offs Line 56  inline long lseek( int handle, long offs
   
 #endif  #endif
   
 #ifdef HAVE_TRUNC  
 #       ifndef trunc  
 extern "C" double trunc(double);  
 #       endif  
 #else  
 inline double trunc(double param) { return param > 0? floor(param) : ceil(param); }  
 #endif  
   
 #ifdef HAVE_ROUND  
 #       ifndef round  
 extern "C" double round(double);  
 #       endif  
 #else  
 inline double round(double param) { return floor(param+0.5); }  
 #endif  
 #ifdef HAVE_SIGN  
 #       ifndef sign  
 extern "C" double sign(double);  
 #       endif  
 #else  
 inline double sign(double param) { return param > 0 ? 1 : ( param < 0 ? -1 : 0 ); }  
 #endif  
   
   
 /** under WIN32 "t" mode fixes DOS chars OK,   /** under WIN32 "t" mode fixes DOS chars OK, 
         can't say that about other systems/ line break styles          can't say that about other systems/ line break styles
 */  */
 void fix_line_breaks(  void fix_line_breaks(
                                          char *buf,                       char *str,
                                          size_t& size ///< may change! used to speedup next actions                       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);
   
   typedef void (*File_read_action)(
                                    struct stat& finfo,
                                    int f, 
                                    const String& file_spec, const char* fname, bool as_text,
                                    void *context);
   
 /**  /**
         read specified text file using pool,           shared-lock specified file, 
           do actions under lock.
         if fail_on_read_problem is true[default] throws an exception          if fail_on_read_problem is true[default] throws an exception
           
           @returns true if read OK
 */  */
 char *file_read_text(Pool& pool,   bool file_read_action_under_lock(const String& file_spec, 
                                   const char* action_name, File_read_action action, void *context,
                                   bool as_text=false,
                                   bool fail_on_read_problem=true);
   /**
           read specified text file using 
           if fail_on_read_problem is true[default] throws an exception
   
           WARNING: charset is used for http header case conversion, it's not a charset of input file!
   
           @returns true if read OK
   */
   char *file_read_text(Request_charsets& charsets, 
                                          const String& file_spec,                                            const String& file_spec, 
                                          bool fail_on_read_problem=true);                                           bool fail_on_read_problem=true,
                                            HashStringValue* options=0/*, HashStringValue* * out_fields=0*/);
   
   struct File_read_result {
           bool success;
           char* str; size_t length;
           HashStringValue* headers;
   };
   
 /**  /**
         read specified file using pool,           read specified file using 
         if fail_on_read_problem is true[default] throws an exception          if fail_on_read_problem is true[default] throws an exception
   
           WARNING: charset is used for http header case conversion, it's not a charset of input file!
   
           @returns true if read OK
 */  */
 bool file_read(Pool& pool, const String& file_spec,   File_read_result file_read(Request_charsets& charsets, 
                            void*& data, size_t& size,                              const String& file_spec, 
                            bool as_text,                             bool as_text,
                            bool fail_on_read_problem=true,                             HashStringValue* options=0,
                            size_t offset=0, size_t limit=0);                             bool fail_on_read_problem=true);
   
   typedef void (*File_write_action)(int f, void *context);
   
 /**  /**
         lock specified file exclusively,           lock specified file exclusively, 
         do actions under lock.          do actions under lock.
         throws an exception in case of problems          throws an exception in case of problems
           
           if block=false does non-blocking lock
           @returns true if locked OK, or false if non-blocking locking failed
 */  */
 void file_action_under_lock(  bool file_write_action_under_lock(
                                 const String& file_spec,                                   const String& file_spec, 
                                 const char *action_name, void (*action)(int, void *), void *context=0,                                  const char* action_name, File_write_action action, void *context,
                                 bool as_text=false,                                  bool as_text=false,
                                 bool do_append=false);                                  bool do_append=false,
                                   bool do_block=true,
                                   bool fail_on_lock_problem=true);
   
 /**  /**
         write data to specified file,           write data to specified file, 
Line 122  void file_action_under_lock( Line 143  void file_action_under_lock(
 */  */
 void file_write(  void file_write(
                                 const String& file_spec,                                  const String& file_spec,
                                 const void *data, size_t size,                                   const char* data, size_t size, 
                                 bool as_text,                                  bool as_text,
                                 bool do_append=false);                                  bool do_append=false);
   
Line 130  void file_write( Line 151  void file_write(
         delete specified file           delete specified file 
         throws an exception in case of problems          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           move specified file 
         throws an exception in case of problems          throws an exception in case of problems
 */  */
 void file_move(const String& old_spec, const String& new_spec);  void file_move(const String& old_spec, const String& new_spec);
   
   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 file_readable(const String& file_spec);
 bool dir_readable(const String& file_spec);  bool dir_readable(const String& file_spec);
 String *file_readable(const String& path, const String& name);  const String* file_readable(const String& path, const String& name);
 bool file_executable(const String& file_spec);  bool file_executable(const String& file_spec);
   
 bool file_stat(const String& file_spec,   bool file_stat(const String& file_spec, 
Line 156  bool file_stat(const String& file_spec, Line 179  bool file_stat(const String& file_spec,
         or to zero if no @a delim were found.          or to zero if no @a delim were found.
 */  */
 char *getrow(char **row_ref,char delim='\n');  char *getrow(char **row_ref,char delim='\n');
 //char *lsplit(char *string, char delim);  char *lsplit(char *string, char delim);
 char *lsplit(char **string_ref,char delim);  char *lsplit(char **string_ref,char delim);
 char *rsplit(char *string, char delim);  char *rsplit(char *string, char delim);
 char *format(Pool& pool, double value, char *fmt);  const char* format(double value, char *fmt);
   
 #ifndef max  
 inline int max(int a,int b) { return a>b?a:b; }  
 inline int min(int a,int b){ return a<b?a:b; }  
 #endif  
   
 size_t stdout_write(const void *buf, size_t size);  size_t stdout_write(const void *buf, size_t size);
   
 char *unescape_chars(Pool& pool, const char *cp, int len);  char *unescape_chars(const char* cp, int len);
   
 /**  
         $content-type[text/html] ->   
                 content-type: text/html  
         $content-type[$value[text/html] charset[windows-1251]] ->   
                 content-type: text/html; charset=windows-1251  
 */  
 const String& attributed_meaning_to_string(Value& meaning, String::Untaint_lang lang);  
   
 #ifdef WIN32  #ifdef WIN32
 void back_slashes_to_slashes(char *s);  void back_slashes_to_slashes(char *s);
Line 188  void back_slashes_to_slashes(char *s); Line 198  void back_slashes_to_slashes(char *s);
                 qsort(names,cnt,sizeof_names,func_addr)                  qsort(names,cnt,sizeof_names,func_addr)
 #endif  #endif
   
 bool StrEqNc(const char *s1, const char *s2, bool strict=true);  bool StrEqNc(const char* s1, const char* s2, bool strict=true);
   
 #define SECS_PER_DAY (60*60*24)  #define SECS_PER_DAY (60*60*24)
 int getMonthDays(int year, int month);  int getMonthDays(int year, int month);
   
 void remove_crlf(char *start, char *end);  void remove_crlf(char *start, char *end);
   
   #ifdef PA_SAFE_MODE 
   void check_safe_mode(struct stat finfo, const String& file_spec, const char* fname); 
   #endif 
   
   // globals
   
   extern const String file_status_name;
   
 #endif  #endif

Removed from v.1.71  
changed lines
  Added in v.1.97


E-mail: