Diff for /parser3/src/main/pa_common.C between versions 1.107 and 1.116

version 1.107, 2002/03/28 11:50:14 version 1.116, 2002/08/05 13:58:45
Line 3 Line 3
   
         Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)          Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
   
         $Id$  
 */  */
   
   static const char* IDENT_COMMON_C="$Date$";
   
 #include "pa_common.h"  #include "pa_common.h"
 #include "pa_types.h"  #include "pa_types.h"
 #include "pa_exception.h"  #include "pa_exception.h"
Line 137  bool file_read(Pool& pool, const String& Line 137  bool file_read(Pool& pool, const String&
         //   they delay update till open, so we would receive "!^test[" string          //   they delay update till open, so we would receive "!^test[" string
         //   if would do stat, next open.          //   if would do stat, next open.
     if((f=open(fname, O_RDONLY|(as_text?_O_TEXT:_O_BINARY)))>=0) {      if((f=open(fname, O_RDONLY|(as_text?_O_TEXT:_O_BINARY)))>=0) {
                 lock_shared_blocking(f);                                  if(lock_shared_blocking(f)!=0) {
                           Exception e("file.lock",
                                           &file_spec, 
                                           "shared lock failed: %s (%d), actual filename '%s'", 
                                                   strerror(errno), errno, fname);
                           unlock(f);
                           close(f);
                           if(fail_on_read_problem)
                                   throw e;
                           return false;
                   }
                 if(stat(fname, &finfo)!=0) {                  if(stat(fname, &finfo)!=0) {
                         Exception e("file.missing",                          Exception e("file.missing",
                                         &file_spec,                                           &file_spec, 
Line 216  bool file_write_action_under_lock( Line 226  bool file_write_action_under_lock(
                                 const char *action_name, void (*action)(int, void *), void *context,                                  const char *action_name, void (*action)(int, void *), void *context,
                                 bool as_text,                                  bool as_text,
                                 bool do_append,                                  bool do_append,
                                 bool do_block) {                                  bool do_block,
                                   bool fail_on_lock_problem) {
         const char *fname=file_spec.cstr(String::UL_FILE_SPEC);          const char *fname=file_spec.cstr(String::UL_FILE_SPEC);
         int f;          int f;
         if(access(fname, W_OK)!=0) // no          if(access(fname, W_OK)!=0) // no
Line 227  bool file_write_action_under_lock( Line 238  bool file_write_action_under_lock(
                 |(as_text?_O_TEXT:_O_BINARY)                  |(as_text?_O_TEXT:_O_BINARY)
                 |(do_append?O_APPEND:O_TRUNC), 0664))>=0) {                  |(do_append?O_APPEND:O_TRUNC), 0664))>=0) {
                 if((do_block?lock_exclusive_blocking(f):lock_exclusive_nonblocking(f))!=0) {                  if((do_block?lock_exclusive_blocking(f):lock_exclusive_nonblocking(f))!=0) {
                           Exception e("file.lock",
                                   &file_spec, 
                                   "shared lock failed: %s (%d), actual filename '%s'", 
                                   strerror(errno), errno, fname);
                         close(f);                          close(f);
                           if(fail_on_lock_problem)
                                   throw e;
                         return false;                          return false;
                 }                  }
   
Line 265  struct File_write_action_info { Line 282  struct File_write_action_info {
 #endif  #endif
 static void file_write_action(int f, void *context) {  static void file_write_action(int f, void *context) {
         File_write_action_info& info=*static_cast<File_write_action_info *>(context);          File_write_action_info& info=*static_cast<File_write_action_info *>(context);
         if(info.size)           if(info.size) {
                 write(f, info.data, info.size);                  int written=write(f, info.data, info.size);
                   if(written<0)
                           throw Exception(0,
                                   0,
                                   "write failed: %s (%d)",  strerror(errno), errno);
           }
 }  }
 void file_write(  void file_write(
                                 const String& file_spec,                                   const String& file_spec, 
Line 323  static bool entry_readable(const String& Line 345  static bool entry_readable(const String&
     const char *fname=file_spec.cstr(String::UL_FILE_SPEC);      const char *fname=file_spec.cstr(String::UL_FILE_SPEC);
         struct stat finfo;          struct stat finfo;
         if(access(fname, R_OK)==0 && stat(fname, &finfo)==0) {          if(access(fname, R_OK)==0 && stat(fname, &finfo)==0) {
                 bool is_dir=finfo.st_mode&S_IFDIR != 0;                  bool is_dir=(finfo.st_mode&S_IFDIR) != 0;
                 return is_dir==need_dir;                  return is_dir==need_dir;
         }          }
         return false;          return false;
Line 411  char *rsplit(char *string, char delim) { Line 433  char *rsplit(char *string, char delim) {
   
 /// @todo less stupid type detection  /// @todo less stupid type detection
 char *format(Pool& pool, double value, char *fmt) {  char *format(Pool& pool, double value, char *fmt) {
         char *result=(char *)pool.malloc(MAX_NUMBER, 4);          char local_buf[MAX_NUMBER];
           size_t size;
           
         if(fmt)          if(fmt)
                 if(strpbrk(fmt, "diouxX"))                  if(strpbrk(fmt, "diouxX"))
                         if(strpbrk(fmt, "ouxX"))                          if(strpbrk(fmt, "ouxX"))
                                 snprintf(result, MAX_NUMBER, fmt, (uint)value );                                  size=snprintf(local_buf, sizeof(local_buf), fmt, (uint)value);
                         else                          else
                                 snprintf(result, MAX_NUMBER, fmt, (int)value );                                  size=snprintf(local_buf, sizeof(local_buf), fmt, (int)value);
                 else                  else
                         snprintf(result, MAX_NUMBER, fmt, value);                          size=snprintf(local_buf, sizeof(local_buf), fmt, value);
         else          else
                 snprintf(result, MAX_NUMBER, "%d", (int)value);                  size=snprintf(local_buf, sizeof(local_buf), "%d", (int)value);
                   
         return result;          char *pool_buf=(char *)pool.malloc(size+1, 4);
           memcpy(pool_buf, local_buf, size+1);
           return pool_buf;
 }  }
   
 size_t stdout_write(const void *buf, size_t size) {  size_t stdout_write(const void *buf, size_t size) {

Removed from v.1.107  
changed lines
  Added in v.1.116


E-mail: