home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / c / djgpp / include / _file.h next >
C/C++ Source or Header  |  1991-03-03  |  7KB  |  323 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. /* 
  3. Copyright (C) 1988 Free Software Foundation
  4.     written by Doug Lea (dl@rocky.oswego.edu)
  5.  
  6. This file is part of GNU CC.
  7.  
  8. GNU CC is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY.  No author or distributor
  10. accepts responsibility to anyone for the consequences of using it
  11. or for whether it serves any particular purpose or works at all,
  12. unless he says so in writing.  Refer to the GNU CC General Public
  13. License for full details.
  14.  
  15. Everyone is granted permission to copy, modify and redistribute
  16. GNU CC, but only under the conditions described in the
  17. GNU CC General Public License.   A copy of this license is
  18. supposed to have been given to you along with GNU CC so you
  19. can know your rights and responsibilities.  It should be in a
  20. file named COPYING.  Among other things, the copyright notice
  21. and this notice must be preserved on all copies.  
  22. */
  23.  
  24. #ifndef _File_h 
  25. #ifdef __GNUG__
  26. #pragma once
  27. #pragma interface
  28. #endif
  29. #define _File_h 1
  30.  
  31. #include <builtin.h>
  32. #include <stdio.h>
  33. #include <stddef.h>
  34.  
  35. #include <Fmodes.h>
  36.  
  37. class Filebuf;
  38.  
  39. class File
  40. {
  41.   friend class  Filebuf;
  42. protected:
  43.   FILE*         fp;              // _iobuf file pointer
  44.   char*         nm;              // file name (dynamically allocated)
  45.   char          rw;              //  1 = read; 2 = write; 3 = readwrite
  46.                                  //  bit 2 (4) means read/write into string
  47.   state_value   state;           // _good/_eof/_fail/_bad
  48.   long          stat;            // last read/write/... return value
  49.  
  50.   void          initialize();
  51.   void          reinitialize(const char*);
  52.   char         *readline (int chunk_number, char terminator);
  53.  
  54. public:
  55.                 File();
  56.                 File(const char* filename, io_mode m, access_mode a);
  57.                 File(const char* filename, const char* m);   
  58.                 File(int filedesc, io_mode m);
  59.                 File(FILE* fileptr);
  60.                 File(int sz, char* buf, io_mode m);
  61.  
  62.                 ~File();
  63.  
  64. // binding, rebinding, unbinding to physical files
  65.  
  66.   File&         open(const char* filename, io_mode m, access_mode a);
  67.   File&         open(const char* filename, const char* m);
  68.   File&         open(int  filedesc, io_mode m);
  69.   File&         open(FILE* fileptr);
  70.  
  71.   File&         close();
  72.   File&         remove();
  73.  
  74. // class variable access
  75.  
  76.   int           filedesc();
  77.   const char*   name();
  78.   void          setname(const char* newname);
  79.   int           iocount();
  80.  
  81.   int           rdstate();
  82.   int           eof();
  83.   int           fail();
  84.   int           bad();
  85.   int           good();
  86.  
  87. // other status queries
  88.  
  89.   int           readable();
  90.   int           writable();
  91.   int           is_open();
  92.  
  93.                 operator void*();
  94.  
  95. // error handling
  96.  
  97.   void          error();
  98.   void          clear(state_value f = _good); // poorly named
  99.   void          set(state_value f); // set corresponding but
  100.   void          unset(state_value f); // clear corresponding bit
  101.   File&         failif(int cond);
  102.   void          check_state();
  103.  
  104. // character IO
  105.  
  106.   File&         get(char& c);
  107.   File&         put(char  c);
  108.   File&         unget(char c);
  109.   File&         putback(char c); // a synonym for unget
  110.  
  111. // char* IO
  112.  
  113.   File&         put(const char* s);
  114.   File&         get    (char* s, int n, char terminator = '\n');
  115.   File&         getline(char* s, int n, char terminator = '\n');
  116.   File&         gets   (char **s, char terminator = '\n');
  117.  
  118. // binary IO
  119.  
  120.   File&         read(void* x, int sz, int n);
  121.   File&         write(void* x, int sz, int n);
  122.  
  123. // formatted IO
  124.  
  125.   File&         form(const char* ...);
  126.   File&         scan(const char* ...);
  127.  
  128. // buffer IO
  129.  
  130.   File&         flush();
  131.   File&         flush(char ch); // call stdio _flsbuf
  132.   int           fill();         // call stdio _filbuf
  133.  
  134. // position control
  135.  
  136.   File&         seek(long pos, int seek_mode=0); // default seek mode=absolute
  137.   long          tell();
  138.  
  139. // buffer control
  140.  
  141.   File&         setbuf(int buffer_kind); // legal vals: _IONBF, _IOFBF, _IOLBF
  142.   File&         setbuf(int size, char* buf);
  143.   File&         raw();
  144. };
  145.  
  146.  
  147. // error handlers
  148.  
  149. extern void  verbose_File_error_handler(const char*);
  150. extern void  quiet_File_error_handler(const char*);
  151. extern void  fatal_File_error_handler(const char*);
  152. extern one_arg_error_handler_t File_error_handler;
  153. extern one_arg_error_handler_t set_File_error_handler(one_arg_error_handler_t);
  154.  
  155. #if defined(__OPTIMIZE__) || defined(USE_LIBGXX_INLINES)
  156.  
  157.  
  158.  
  159. inline int File::filedesc()
  160.   return fileno(fp);
  161. }
  162.  
  163. inline const char* File::name()
  164.   return nm; 
  165. }
  166.  
  167. inline int File::iocount()
  168.   return stat; 
  169. }
  170.  
  171. inline void File::clear(state_value flag)
  172.   state = flag;
  173. }
  174.  
  175. inline void File::set(state_value flag)
  176.   state = state_value(int(state) | int(flag));
  177. }
  178.  
  179. inline void File::unset(state_value flag)
  180.   state = state_value(int(state) & ~int(flag));
  181. }
  182.  
  183. inline int File::readable()
  184.   if (fp != 0) { if (feof(fp)) set(_eof); if (ferror(fp)) set(_bad);}
  185.   return (state == _good && (rw & 01));
  186. }
  187.  
  188. inline int File::writable()
  189.   if (fp != 0 && ferror(fp)) set(_bad);
  190.   return ((int(state) & (int(_fail)|int(_bad))) == 0 && (rw & 02));
  191. }
  192.  
  193. inline int File::is_open()
  194.   return (fp != 0);
  195. }
  196.  
  197.  
  198. inline File& File::raw()
  199.   return this->File::setbuf(_IONBF); 
  200. }
  201.  
  202.  
  203. inline File& File::failif(int cond)
  204.   if (cond) set(_fail);  return *this; 
  205. }
  206.  
  207. inline File& File::get(char& c)
  208.   if (readable())
  209.   {
  210.     int ch = getc(fp);
  211.     c = ch;
  212.     failif (ch == EOF);
  213.   }
  214.   return *this;
  215. }
  216.  
  217. inline File& File::put(char  c) 
  218.   return failif (!writable() ||  putc(c, fp) == EOF);
  219. }
  220.  
  221. inline File& File::unget(char c)
  222.   return failif(!is_open() || !(rw & 01) || ungetc(c, fp) == EOF);
  223.  
  224. inline File& File::putback(char c)
  225.   return failif (!is_open() || !(rw & 01) || ungetc(c, fp) == EOF);
  226. }
  227.  
  228. inline File& File::read(void* x, int sz, int n)
  229.   return failif (!readable() || (stat = fread(x, sz, n, fp)) != n);
  230.  
  231. inline File& File::write(void* x, int sz, int n) 
  232.   return failif (!writable() || (stat = fwrite(x, sz, n, fp)) != n);
  233. }
  234.  
  235. inline File& File::flush()
  236.   return failif(!is_open() || fflush(fp) == EOF);
  237. }
  238.  
  239. inline File& File::flush(char ch)
  240. #ifdef VMS
  241.   return failif(!is_open() || c$$flsbuf(ch, fp) == EOF);
  242. #else
  243.   return failif(!is_open() || _flsbuf(ch, fp) == EOF);
  244. #endif
  245. }
  246.  
  247. inline int File::fill()
  248. #ifdef VMS
  249.   failif(!is_open() || (stat = c$$filbuf(fp)) == EOF);
  250. #else
  251.   failif(!is_open() || (stat = _filbuf(fp)) == EOF);
  252. #endif
  253.   return stat;
  254. }
  255.  
  256. inline File& File::seek(long pos, int seek_mode)
  257.   return failif (!is_open() || fseek(fp, pos, seek_mode) < 0); 
  258. }
  259.  
  260. inline long File::tell()
  261.   failif (!is_open() || ((stat = ftell(fp)) < 0));
  262.   return stat;
  263. }
  264.  
  265. inline int File::rdstate()
  266.   check_state();  return state; // check_state is necessary in rare but
  267. }                               // possible circumstances
  268.  
  269. inline File::operator void*()
  270.   check_state();  return (int(state) & (int(_bad)|int(_fail)))? 0 : this ; 
  271. }
  272.  
  273. inline int File::eof()
  274.   check_state(); return state & _eof; 
  275. }
  276.  
  277. inline int File::fail()
  278.   check_state(); return state & _fail; 
  279. }
  280.  
  281. inline int File::bad()
  282.   check_state(); return state & _bad; 
  283. }
  284.  
  285. inline int File::good()
  286.   check_state(); return rdstate() == _good; 
  287. }
  288.  
  289.  
  290. #endif
  291.  
  292. #endif
  293.