InputFile.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "InputFile.h"
00019 #include "StringBasics.h"
00020 #include "GzipHeader.h"
00021 #include "BgzfFileType.h"
00022 #include "GzipFileType.h"
00023 #include "UncompressedFileType.h"
00024
00025 #include <stdarg.h>
00026
00027 InputFile::InputFile(const char * filename, const char * mode,
00028 InputFile::ifileCompression compressionMode)
00029 {
00030 myFileTypePtr = NULL;
00031 myBufferIndex = 0;
00032 myCurrentBufferSize = 0;
00033
00034 openFile(filename, mode, compressionMode);
00035 }
00036
00037
00038 #ifdef __ZLIB_AVAILABLE__
00039
00040
00041
00042 bool InputFile::openFile(const char * filename, const char * mode,
00043 InputFile::ifileCompression compressionMode)
00044 {
00045
00046 if (mode[0] == 'w' || mode[0] == 'W')
00047 {
00048 openFileUsingMode(filename, mode, compressionMode);
00049 }
00050 else
00051 {
00052
00053 if(strcmp(filename, "-") == 0)
00054 {
00055
00056
00057 openFileUsingMode(filename, mode, compressionMode);
00058 }
00059 else
00060 {
00061
00062
00063
00064 FILE* filePtr = fopen(filename, "r");
00065
00066
00067
00068 if (filePtr == NULL)
00069 {
00070
00071
00072 if (mode[0] == 'r' || mode[0] == 'R')
00073 {
00074
00075 if (myFileTypePtr != NULL)
00076 {
00077 delete myFileTypePtr;
00078 myFileTypePtr = NULL;
00079 }
00080
00081 return false;
00082 }
00083 else
00084 {
00085 openFileUsingMode(filename, mode, compressionMode);
00086 }
00087 }
00088 else
00089 {
00090
00091
00092
00093 GzipHeader gzipHeader;
00094 bool isGzip = gzipHeader.readHeader(filePtr);
00095
00096
00097
00098 fclose(filePtr);
00099
00100 if (isGzip)
00101 {
00102
00103
00104 if (gzipHeader.isBgzfFile())
00105 {
00106
00107
00108 myFileTypePtr = new BgzfFileType(filename, mode);
00109 }
00110 else
00111 {
00112
00113 myFileTypePtr = new GzipFileType(filename, mode);
00114 }
00115 }
00116 else
00117 {
00118
00119
00120 myFileTypePtr = new UncompressedFileType(filename, mode);
00121 }
00122 }
00123 }
00124 }
00125
00126 if (!myFileTypePtr->isOpen())
00127 {
00128
00129 delete myFileTypePtr;
00130 myFileTypePtr = NULL;
00131 return false;
00132 }
00133 return true;
00134 }
00135
00136
00137
00138
00139 void InputFile::openFileUsingMode(const char * filename, const char * mode,
00140 ifileCompression compressionMode)
00141 {
00142 switch (compressionMode)
00143 {
00144 case GZIP:
00145
00146 myFileTypePtr = new GzipFileType(filename, mode);
00147 break;
00148 case BGZF:
00149
00150 myFileTypePtr = new BgzfFileType(filename, mode);
00151 break;
00152 case UNCOMPRESSED:
00153 myFileTypePtr = new UncompressedFileType(filename, mode);
00154 break;
00155 case InputFile::DEFAULT:
00156 default:
00157
00158
00159 int lastchar = 0;
00160 while (filename[lastchar] != 0) lastchar++;
00161 if ((lastchar >= 3 &&
00162 filename[lastchar - 3] == '.' &&
00163 filename[lastchar - 2] == 'g' &&
00164 filename[lastchar - 1] == 'z'))
00165 {
00166
00167 myFileTypePtr = new GzipFileType(filename, mode);
00168 }
00169 else
00170 {
00171
00172 myFileTypePtr = new UncompressedFileType(filename, mode);
00173 }
00174 break;
00175 }
00176 }
00177
00178 #else
00179
00180
00181
00182
00183 bool InputFile::openFile(const char * filename, const char * mode)
00184 {
00185
00186 myFileTypePtr = new UncompressedFileType(filename, mode);
00187
00188 if (!myFileTypePtr->isOpen())
00189 {
00190
00191 delete myFileTypePtr;
00192 myFileTypePtr = NULL;
00193 return false;
00194 }
00195 return true;
00196 }
00197
00198 #endif
00199
00200
00201 InputFile::~InputFile()
00202 {
00203 delete myFileTypePtr;
00204 myFileTypePtr = NULL;
00205 }
00206
00207
00208 int ifprintf(IFILE output, char * format, ...)
00209 {
00210 String buffer;
00211
00212 va_list ap;
00213 va_start(ap, format);
00214
00215 buffer.vprintf(format, ap);
00216
00217 va_end(ap);
00218
00219 return ::ifwrite(output, (const char *) buffer, buffer.Length());
00220 }
00221
00222