--- parser3/src/main/pa_common.C 2001/03/27 18:24:38 1.33 +++ parser3/src/main/pa_common.C 2001/03/28 13:21:30 1.35 @@ -6,7 +6,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: pa_common.C,v 1.33 2001/03/27 18:24:38 paf Exp $ + $Id: pa_common.C,v 1.35 2001/03/28 13:21:30 paf Exp $ */ #include "pa_config_includes.h" @@ -45,6 +45,14 @@ int __snprintf(char *b, size_t s, const char *file_read_text(Pool& pool, const String& file_spec, bool fail_on_read_problem) { + void *result; + size_t size; + return file_read(pool, file_spec, result, size, true, + fail_on_read_problem)?(char *)result:0; +} +bool file_read(Pool& pool, const String& file_spec, + void*& data, size_t& size, bool as_text, + bool fail_on_read_problem) { char *fname=file_spec.cstr(); int f; struct stat finfo; @@ -55,36 +63,40 @@ char *file_read_text(Pool& pool, const S // a.html:^test[] and b.html hardlink to a.html // user inserts ! before ^test in a.html // directory entry of b.html in NTFS not updated at once, - // they delay update till open, so we must not do stat before that - if((f=open(fname, O_RDONLY|_O_TEXT))>=0 && stat(fname, &finfo)==0) { + // they delay update till open, so we would receive "!^test[" string + // if would do stat, next open. + if( + (f=open(fname, O_RDONLY|(as_text?_O_TEXT:_O_BINARY)))>=0 && + stat(fname, &finfo)==0) { /*if(exclusive) flock(f, LOCK_EX);*/ - char *result=(char *)pool.malloc(finfo.st_size+1); - int read_size=read(f, result, finfo.st_size); + data=pool.malloc(finfo.st_size+(as_text?1:0)); + size=read(f, data, finfo.st_size); /*if(exclusive) flock(f, LOCK_UN);*/ close(f); - if(read_size>=0 && read_size<=finfo.st_size) - result[read_size]=0; - else + if(size>=0 && size<=(size_t)finfo.st_size) { + if(as_text) + ((char *)data)[size]=0; + } else PTHROW(0, 0, &file_spec, "read failed: actually read %d bytes count not in [0..%ul] valid range", - read_size, (unsigned long)finfo.st_size); + size, (unsigned long)finfo.st_size); //never - return result;//prepare_config(result, remove_empty_lines); + return true;//prepare_config(result, remove_empty_lines); } if(fail_on_read_problem) PTHROW(0, 0, &file_spec, "read failed: %s (#%d)", strerror(errno), errno); - return 0; + return false; } void file_write(Pool& pool, const String& file_spec, - const char *data, size_t size, + const void *data, size_t size, bool as_text/*, bool exclusive*/) { char *fname=file_spec.cstr(); @@ -94,12 +106,11 @@ void file_write(Pool& pool, close(f); } if(access(fname, R_OK|W_OK)==0) { - int mode=O_RDWR + int mode=O_RDWR|(as_text?_O_TEXT:_O_BINARY) #ifdef WIN32 |O_TRUNC #endif ; - mode|=as_text?_O_TEXT:_O_BINARY; if((f=open(fname, mode, 0666))>=0) { /*if(exclusive) flock(f, LOCK_EX);*/