00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef OFFILE_H
00030 #define OFFILE_H
00031
00032 #include "dcmtk/config/osconfig.h"
00033 #include "dcmtk/ofstd/oftypes.h"
00034 #include "dcmtk/ofstd/ofstring.h"
00035 #include "dcmtk/ofstd/ofstd.h"
00036
00037 #define INCLUDE_UNISTD
00038 #define INCLUDE_CSTDIO
00039 #define INCLUDE_CSTRING
00040 #define INCLUDE_CSTDARG
00041 #define INCLUDE_CERRNO
00042 #define INCLUDE_CWCHAR
00043 #include "dcmtk/ofstd/ofstdinc.h"
00044
00045 BEGIN_EXTERN_C
00046 #ifdef HAVE_SYS_STAT_H
00047 #include <sys/stat.h>
00048 #endif
00049 END_EXTERN_C
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #ifdef _LARGEFILE64_SOURCE
00064
00065 #if !(defined(__MACH__) && defined(__APPLE__))
00066 #define EXPLICIT_LFS_64
00067 #endif
00068 #endif
00069
00070 #if defined(_WIN32) && !defined(__MINGW32__)
00071
00072
00073 typedef __int64 offile_off_t;
00074 typedef fpos_t offile_fpos_t;
00075 #else
00076 #ifdef EXPLICIT_LFS_64
00077
00078 typedef fpos64_t offile_fpos_t;
00079 typedef off64_t offile_off_t;
00080 #else
00081
00082 #ifdef HAVE_FSEEKO
00083 typedef off_t offile_off_t;
00084 #else
00085 typedef long offile_off_t;
00086 #endif
00087 typedef fpos_t offile_fpos_t;
00088 #endif
00089 #endif
00090
00091
00092 typedef int offile_errno_t;
00093
00107 class OFFile
00108 {
00109 public:
00111 OFFile(): file_(NULL), popened_(OFFalse), lasterror_(0) {}
00112
00116 OFFile(FILE *f): file_(f), popened_(OFFalse), lasterror_(0) {}
00117
00119 ~OFFile()
00120 {
00121 if (file_) fclose();
00122 }
00123
00131 OFBool fopen(const char *filename, const char *modes)
00132 {
00133 if (file_) fclose();
00134 #ifdef EXPLICIT_LFS_64
00135 file_ = :: fopen64(filename, modes);
00136 #else
00137 file_ = STDIO_NAMESPACE fopen(filename, modes);
00138 #endif
00139 if (file_) popened_ = OFFalse; else storeLastError();
00140 return (file_ != NULL);
00141 }
00142
00143 #ifdef _WIN32
00144
00150 OFBool wfopen(const wchar_t *filename, const wchar_t *modes)
00151 {
00152 if (file_) fclose();
00153 file_ = _wfopen(filename, modes);
00154 if (file_) popened_ = OFFalse; else storeLastError();
00155 return (file_ != NULL);
00156 }
00157 #endif
00158
00171 OFBool fdopen(int fd, const char *modes)
00172 {
00173 if (file_) fclose();
00174 file_ = :: fdopen(fd, modes);
00175 if (file_) popened_ = OFFalse; else storeLastError();
00176 return (file_ != NULL);
00177 }
00178
00188 OFBool popen(const char *command, const char *modes)
00189 {
00190 if (file_) fclose();
00191 #ifdef _WIN32
00192 file_ = _popen(command, modes);
00193 #else
00194 file_ = :: popen(command, modes);
00195 #endif
00196 if (file_) popened_ = OFTrue; else storeLastError();
00197 return (file_ != NULL);
00198 }
00199
00209 OFBool freopen(const char *filename, const char *modes)
00210 {
00211 #if defined(EXPLICIT_LFS_64) && ! defined(__MINGW32__)
00212
00213 file_ = :: freopen64(filename, modes, file_);
00214 #else
00215 file_ = STDIO_NAMESPACE freopen(filename, modes, file_);
00216 #endif
00217 if (file_) popened_ = OFFalse; else storeLastError();
00218 return (file_ != NULL);
00219 }
00220
00226 OFBool tmpfile()
00227 {
00228 if (file_) fclose();
00229 #if defined(EXPLICIT_LFS_64) && ! defined(__MINGW32__)
00230
00231 file_ = :: tmpfile64();
00232 #else
00233 file_ = STDIO_NAMESPACE tmpfile();
00234 #endif
00235 if (file_) popened_ = OFFalse; else storeLastError();
00236 return (file_ != NULL);
00237 }
00238
00246 int fclose()
00247 {
00248 int result = 0;
00249 if (file_)
00250 {
00251 if (popened_)
00252 {
00253 #ifdef _WIN32
00254 result = _pclose(file_);
00255 #else
00256 result = :: pclose(file_);
00257 #endif
00258 }
00259 else
00260 {
00261 result = STDIO_NAMESPACE fclose(file_);
00262 }
00263
00264 file_ = NULL;
00265 }
00266 if (result) storeLastError();
00267 return result;
00268 }
00269
00275 int pclose() { return fclose(); }
00276
00286 size_t fwrite(const void *ptr, size_t size, size_t n)
00287 {
00288 return STDIO_NAMESPACE fwrite(ptr, size, n, file_);
00289 }
00290
00302 size_t fread(void *ptr, size_t size, size_t n)
00303 {
00304 return STDIO_NAMESPACE fread(ptr, size, n, file_);
00305 }
00306
00312 int fflush()
00313 {
00314 int result = STDIO_NAMESPACE fflush(file_);
00315 if (result) storeLastError();
00316 return result;
00317 }
00318
00323 int fgetc() { return STDIO_NAMESPACE fgetc(file_); }
00324
00338 void setlinebuf()
00339 {
00340 #ifdef _WIN32
00341 this->setvbuf(NULL, _IOLBF, 0);
00342 #else
00343 :: setlinebuf(file_);
00344 #endif
00345 }
00346
00351 void rewind() { STDIO_NAMESPACE rewind(file_); }
00352
00355 void clearerr() { STDIO_NAMESPACE clearerr(file_); }
00356
00363 int eof() const
00364 {
00365 #ifdef _WIN32
00366
00367 return feof(file_);
00368 #else
00369 return STDIO_NAMESPACE feof(file_);
00370 #endif
00371 }
00372
00379 int error()
00380 {
00381 #ifdef _WIN32
00382
00383 return ferror(file_);
00384 #else
00385 return STDIO_NAMESPACE ferror(file_);
00386 #endif
00387 }
00388
00395 #ifdef fileno
00396 int fileNo() { return fileno(file_); }
00397 #else
00398 int fileNo() { return :: fileno(file_); }
00399 #endif
00400
00414 void setbuf(char *buf) { STDIO_NAMESPACE setbuf(file_, buf); }
00415
00431 int setvbuf(char * buf, int modes, size_t n)
00432 {
00433 int result = STDIO_NAMESPACE setvbuf(file_, buf, modes, n);
00434 if (result) storeLastError();
00435 return result;
00436 }
00437
00452 void setbuffer(char *buf, size_t size)
00453 {
00454 #ifdef _WIN32
00455 this->setvbuf(NULL, buf ? _IOFBF : _IONBF, size);
00456 #else
00457 :: setbuffer(file_, buf, size);
00458 #endif
00459 }
00460
00465 int fputc(int c) { return STDIO_NAMESPACE fputc(c, file_); }
00466
00475 char *fgets(char *s, int n) { return STDIO_NAMESPACE fgets(s, n, file_); }
00476
00481 int fputs(const char *s) { return STDIO_NAMESPACE fputs(s, file_); }
00482
00489 int ungetc(int c) { return STDIO_NAMESPACE ungetc(c, file_); }
00490
00502 int fseek(offile_off_t off, int whence)
00503 {
00504 int result;
00505 #ifdef _WIN32
00506
00507
00508
00509 offile_fpos_t off2 = off;
00510 fpos_t pos;
00511 struct _stati64 buf;
00512 switch (whence)
00513 {
00514 case SEEK_END:
00515
00516 STDIO_NAMESPACE fflush(file_);
00517 #if 0
00518
00519
00520 STDIO_NAMESPACE fflush(file_);
00521 #ifdef fileno
00522 if (_lseeki64( fileno(file_), 0, 2) == -1)
00523 #else
00524 if (_lseeki64(:: fileno(file_), 0, 2) == -1)
00525 #endif
00526 {
00527 storeLastError();
00528 return -1;
00529 }
00530
00531 #else
00532
00533 #ifdef fileno
00534 if (_fstati64( fileno(file_), &buf) == -1)
00535 #else
00536 if (_fstati64(:: fileno(file_), &buf) == -1)
00537 #endif
00538 {
00539 storeLastError();
00540 return -1;
00541 }
00542
00543
00544 off2 += buf.st_size;
00545 break;
00546 #endif
00547 case SEEK_CUR:
00548 if (STDIO_NAMESPACE fgetpos(file_, &pos) != 0)
00549 {
00550 storeLastError();
00551 return -1;
00552 }
00553
00554 off2 += pos;
00555 break;
00556 case SEEK_SET:
00557
00558 break;
00559 }
00560 result = this->fsetpos(&off2);
00561 #elif defined(__BEOS__)
00562 result = :: _fseek(fp, offset, whence);
00563 #else
00564 #ifdef HAVE_FSEEKO
00565 #ifdef EXPLICIT_LFS_64
00566 result = :: fseeko64(file_, off, whence);
00567 #else
00568 result = :: fseeko(file_, off, whence);
00569 #endif
00570 #else
00571 result = STDIO_NAMESPACE fseek(file_, off, whence);
00572 #endif
00573 #endif
00574 if (result) storeLastError();
00575 return result;
00576 }
00577
00581 offile_off_t ftell()
00582 {
00583 offile_off_t result;
00584 #ifdef _WIN32
00585
00586
00587
00588
00589 offile_fpos_t pos;
00590 if (this->fgetpos(&pos) != 0)
00591 {
00592 storeLastError();
00593 return -1;
00594 }
00595 return pos;
00596 #else
00597 #ifdef HAVE_FSEEKO
00598 #ifdef EXPLICIT_LFS_64
00599 result = :: ftello64(file_);
00600 #else
00601 result = :: ftello(file_);
00602 #endif
00603 #else
00604 result = STDIO_NAMESPACE ftell(file_);
00605 #endif
00606 #endif
00607 if (result < 0) storeLastError();
00608 return result;
00609 }
00610
00618 int fgetpos(offile_fpos_t *pos)
00619 {
00620 int result;
00621 #if defined(EXPLICIT_LFS_64) && ! defined(__MINGW32__)
00622
00623 result = :: fgetpos64(file_, pos);
00624 #else
00625 result = STDIO_NAMESPACE fgetpos(file_, pos);
00626 #endif
00627 if (result) storeLastError();
00628 return result;
00629 }
00630
00638 int fsetpos(offile_fpos_t *pos)
00639 {
00640 int result;
00641 #if defined(EXPLICIT_LFS_64) && ! defined(__MINGW32__)
00642
00643 result = :: fsetpos64(file_, pos);
00644 #else
00645 result = STDIO_NAMESPACE fsetpos(file_, pos);
00646 #endif
00647 if (result) storeLastError();
00648 return result;
00649 }
00650
00656 int fprintf(const char *format, ...)
00657 {
00658 int result = 0;
00659 va_list ap;
00660 va_start(ap, format);
00661 result = STDIO_NAMESPACE vfprintf(file_, format, ap);
00662 va_end(ap);
00663 return result;
00664 }
00665
00671 int vfprintf(const char *format, va_list arg)
00672 {
00673 return STDIO_NAMESPACE vfprintf(file_, format, arg);
00674 }
00675
00676
00677
00678
00684 FILE *file() { return file_; }
00685
00689 OFBool open() const { return file_ != NULL; }
00690
00694 offile_errno_t getLastError() const { return lasterror_; }
00695
00699 void getLastErrorString(OFString& s) const
00700 {
00701 char buf[1000];
00702 s = OFStandard::strerror(lasterror_, buf, 1000);
00703 }
00704
00705
00706 #ifndef __CYGWIN__
00707
00725 int fwide(int mode)
00726 {
00727 return STDIO_NAMESPACE fwide(file_, mode);
00728 }
00729
00736 wint_t fgetwc()
00737 {
00738 wint_t result = STDIO_NAMESPACE fgetwc(file_);
00739 if (result == WEOF) storeLastError();
00740 return result;
00741 }
00742
00749 wint_t fputwc(wchar_t wc)
00750 {
00751 wint_t result = STDIO_NAMESPACE fputwc(wc, file_);
00752 if (result == WEOF) storeLastError();
00753 return result;
00754 }
00755
00770 wint_t ungetwc(wint_t wc)
00771 {
00772 wint_t result = STDIO_NAMESPACE ungetwc(wc, file_);
00773 if (result == WEOF) storeLastError();
00774 return result;
00775 }
00776
00782 int fwprintf(const wchar_t *format, ...)
00783 {
00784 int result = 0;
00785 va_list ap;
00786 va_start(ap, format);
00787 result = STDIO_NAMESPACE vfwprintf(file_, format, ap);
00788 va_end(ap);
00789 return result;
00790 }
00791
00797 int vfwprintf(const wchar_t *format, va_list arg)
00798 {
00799 return STDIO_NAMESPACE vfwprintf(file_, format, arg);
00800 }
00801
00802
00803
00804
00805 #endif
00806
00807 private:
00808
00809
00810 OFFile(const OFFile &arg);
00811
00812
00813 OFFile &operator=(const OFFile &arg);
00814
00816 FILE *file_;
00817
00819 OFBool popened_;
00820
00822 offile_errno_t lasterror_;
00823
00825 inline void storeLastError()
00826 {
00827 lasterror_ = errno;
00828 }
00829
00830 };
00831
00832
00833 #endif
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886