//============================================================================== // incharfile.hpp // Generic input character stream. // // See also // outcharfile.hpp // // Notice // Copyright ©2010 by David R. Tribble, all rights reserved. // Permission is granted to any person or entity except those designated // by the United States Department of State as a terrorist, or terrorist // government or agency, to use and distribute this source code provided // that the original copyright notice remains present and unaltered. //============================================================================== #ifndef drt_lib_incharfile_hpp #define drt_lib_incharfile_hpp 101 // Identification #ifndef NO_H_IDENT static char drt_lib_incharfile_hpp_REV[] = "@(#)drt/src/lib/incharfile.hpp $Revision: 1.1 $$Date: 2011/05/08 02:40:46 $"; #endif // Includes #ifndef sys_stdio_h #include #define sys_stdio_h #endif #ifndef drt_lib_charstream_hpp #include "charstream.hpp" #endif #ifndef drt_lib_incharstream_hpp #include "incharstream.hpp" #endif //------------------------------------------------------------------------------ // class InCharFile // Controls the reading of data for an input text file. // // Handles the following file encodings: // 8-bit (ASCII or ISO 8859-1) // 7-bit ASCII, with none(space)/mark/even/odd parity modes // UTF-8 // UTF-16 (big-endian) // UTF-16 reversed (little-endian) // UTF-32 (big-endian) // UTF-32 reversed (little-endian) // 24-bit (big-endian) (non-standard) // 24-bit reversed (little-endian) (non-standard) // // Handles the following newline sequences: // CR (0D) // LF (0A) // CR LF (0D 0A) // NEL (85) // Any // None //------------------------------------------------------------------------------ #define InCharFile_VS 100 // Class version class InCharFile: public InCharStream { #if InCharStream_VS/100 != 1 #error class InCharStream has changed #endif // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ // Static functions private: static int get_8bit(FILE *in); // Read an 8-bit char static int get_7bit(FILE *out); // Read a 7-bit char static int get_utf8(FILE *in); // Read a UTF-8 char static int get_utf16(FILE *in); // Read a UTF-16BE char static int get_utf16r(FILE *in); // Read a UTF-16LE char static int get_utf32(FILE *in); // Read a UTF-32BE char static int get_utf32r(FILE *in); // Read a UTF-32LE char static int get_24bit(FILE *in); // Read a 24-bit BE char static int get_24bitr(FILE *in); // Read a 24-bit LE char // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ // Functions public: virtual /**/ ~InCharFile(); // Destructor /**/ InCharFile(); // Constructor bool open(const char *fname, enum FileType ftype, enum EolnType eoln); // Open a file stream bool open(FILE *fp, enum FileType ftype, enum EolnType eoln); // Open an I/O stream FILE * getStream() const; // Get I/O stream virtual bool close(); // Close the stream virtual int read(); // Read a Unicode char virtual int read(int buf[], int len); // Read Unicode chars private: /**/ InCharFile(const InCharFile &o); const InCharFile & operator =(const InCharFile &o); bool openPrep(enum FileType ftype, enum EolnType eoln); // Prepare to open a stream // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ // Variables protected: FILE * m_fp; // I/O stream char * m_vbuf; // I/O stream buffer int (*m_get)(FILE *in); // Read a char int m_lastCh; // Previous char }; #endif // drt_lib_incharfile_hpp // End incharfile.hpp