--- parser3/src/main/pa_common.C 2001/03/24 10:54:46 1.25 +++ parser3/src/main/pa_common.C 2001/03/27 15:37:51 1.32 @@ -1,3 +1,4 @@ + /** @file Parser: commonly functions. @@ -5,7 +6,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: pa_common.C,v 1.25 2001/03/24 10:54:46 paf Exp $ + $Id: pa_common.C,v 1.32 2001/03/27 15:37:51 paf Exp $ */ #include "pa_config_includes.h" @@ -43,75 +44,83 @@ int __snprintf(char *b, size_t s, const #endif -char *file_read_text(Pool& pool, const char *fname, bool fail_on_read_problem) { +char *file_read_text(Pool& pool, const String& file_spec, bool fail_on_read_problem) { int f; struct stat finfo; - if(fname && !stat(fname,&finfo) &&(f=open(fname,O_RDONLY -#ifdef WIN32 - |O_TEXT -#endif - ))>=0) { + char *fname=file_spec.cstr(); + if(!stat(fname,&finfo) &&(f=open(fname,O_RDONLY|_O_TEXT))>=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); - if(read_size>=0 && read_size<=finfo.st_size) - result[read_size]='\0'; /*if(exclusive) flock(f, LOCK_UN);*/ close(f); + + if(read_size>=0 && read_size<=finfo.st_size) + result[read_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); + return result;//prepare_config(result, remove_empty_lines); } if(fail_on_read_problem) - PTHROW(0,0, - 0, - "can not read '%s' file", fname); + PTHROW(0, 0, + &file_spec, + "read failed: %s (#%d)", strerror(errno), errno); return 0; } void file_write(Pool& pool, - const char *fname, + const String& file_spec, const char *data, size_t size, bool as_text/*, bool exclusive*/) { - if(fname) { - int f; - if(access(fname, F_OK)!=0) {/*no*/ - if((f=open(fname,O_WRONLY|O_CREAT|_O_BINARY,0666))>0) - close(f); - } - if(access(fname, R_OK|W_OK)==0) { - int mode=O_RDWR + char *fname=file_spec.cstr(); + int f; + if(access(fname, F_OK)!=0) {/*no*/ + if((f=open(fname,O_WRONLY|O_CREAT|_O_BINARY,0666))>0) + close(f); + } + if(access(fname, R_OK|W_OK)==0) { + int mode=O_RDWR #ifdef WIN32 - |O_TRUNC + |O_TRUNC #endif - ; - mode|=as_text?_O_TEXT:_O_BINARY; - if((f=open(fname,mode,0666))>=0) { - /*if(exclusive) - flock(f, LOCK_EX);*/ - - if(size) write(f,data,size); + ; + mode|=as_text?_O_TEXT:_O_BINARY; + if((f=open(fname,mode,0666))>=0) { + /*if(exclusive) + flock(f, LOCK_EX);*/ + + if(size) write(f,data,size); #ifndef WIN32 - ftruncate(f,size); + ftruncate(f,size); #endif - /*if(exclusive) - flock(f, LOCK_UN);*/ - close(f); - return; - } + /*if(exclusive) + flock(f, LOCK_UN);*/ + close(f); + return; } } - if(fname) - PTHROW(0, 0, - 0, - "file_write('%s'): %s (#%d)", - fname, strerror(errno), errno); - else + PTHROW(0, 0, + &file_spec, + "write failed: %s (#%d)", strerror(errno), errno); +} + +void file_delete(Pool& pool, const String& file_spec) { + if(unlink(file_spec.cstr())!=0) PTHROW(0, 0, - 0, - "file_write: no filename specified"); + &file_spec, + "unlink failed: %s (#%d)", strerror(errno), errno); +} + +bool file_readable(const String& file_spec) { + return access(file_spec.cstr(), R_OK)==0; } char *getrow(char **row_ref, char delim) {