rc_t CC FastqReaderFileMake( const ReaderFile **reader, const KDirectory* dir, const char* file, enum FASTQQualityFormat qualityFormat, int8_t defaultReadNumber, bool ignoreSpotGroups) { rc_t rc; FastqReaderFile* self = (FastqReaderFile*) malloc ( sizeof * self ); if ( self == NULL ) { rc = RC ( RC_MODULE, rcFileFormat, rcAllocating, rcMemory, rcExhausted ); } else { memset(self, 0, sizeof(*self)); rc = ReaderFileInit ( self ); self->dad.vt.v1 = & FastqReaderFile_vt; self->dad.pathname = string_dup(file, strlen(file)+1); if ( self->dad.pathname == NULL ) { rc = RC ( RC_MODULE, rcFileFormat, rcAllocating, rcMemory, rcExhausted ); } else { rc = KLoaderFile_Make( & self->reader, dir, file, 0, true ); } if (rc == 0) { self->pb.self = self; self->pb.input = FASTQ_input; self->pb.qualityFormat = qualityFormat; self->pb.defaultReadNumber = defaultReadNumber; self->pb.secondaryReadNumber = 0; self->pb.ignoreSpotGroups = ignoreSpotGroups; rc = FASTQScan_yylex_init(& self->pb, false); if (rc == 0) { *reader = (const ReaderFile *) self; } else { KLoaderFile_Release( self->reader, true ); ReaderFileRelease( & self->dad ); *reader = 0; } } else { ReaderFileRelease( & self->dad ); *reader = 0; } } return rc; }
rc_t FastqReaderFileWhack( FastqReaderFile* f ) { FastqReaderFile* self = (FastqReaderFile*) f; FASTQScan_yylex_destroy(& self->pb); if (self->reader) KLoaderFile_Release ( self->reader, true ); ReaderFileWhack( &self->dad ); free ( self ); return 0; }
LIB_EXPORT rc_t CC KLoaderFile_Make(const KLoaderFile **file, const KDirectory* dir, const char* filename, const uint8_t* md5_digest, bool read_ahead) { rc_t rc = 0; KLoaderFile* obj = NULL; if( file == NULL || dir == NULL || filename == NULL ) { rc = RC(rcApp, rcFile, rcConstructing, rcParam, rcNull); } else { *file = NULL; if( (obj = calloc(1, sizeof(*obj))) == NULL || (obj->filename = strdup(filename)) == NULL ) { rc = RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted); } else { if( (rc = KDirectoryAddRef(dir)) == 0 ) { obj->dir = dir; if( md5_digest != NULL ) { obj->has_md5 = true; memcpy(obj->md5_digest, md5_digest, sizeof(obj->md5_digest)); } if( (rc = KLoaderFile_AllocateBuffer(obj)) == 0 ) { char resolved[4096]; char* ext = NULL; strcpy(resolved, filename); ext = strrchr(resolved, '.'); DBG(("%s adding %s\n", __func__, resolved)); rc = KLoadProgressbar_File(&obj->job, resolved, obj->dir); if( ext != NULL && strcmp(ext, ".gz") == 0 ) { obj->compress_type = compress_gzip; } else if( ext != NULL && strcmp(ext, ".bz2") == 0 ) { obj->compress_type = compress_bzip2; } if( rc != 0 && obj->compress_type != compress_none ) { *ext = '\0'; DBG(("%s retry adding as %s\n", __func__, resolved)); if( (rc = KLoadProgressbar_File(&obj->job, resolved, obj->dir)) == 0 ) { obj->has_md5 = false; obj->compress_type = compress_none; } } if( rc == 0 && (rc = KFileInit(&obj->dad, (const KFile_vt*)&KLoaderFile_vtbl, "KLoaderFile", filename, true, false)) == 0 ) { obj->file = &obj->dad; #if WINDOWS obj->ahead = false; #else obj->ahead = read_ahead; #endif obj->realname = strdup(resolved); if( obj->realname == NULL ) { rc = RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted); } } } } } } if( rc == 0 ) { *file = obj; } else { *file = NULL; KLoaderFile_Release(obj, false); } return rc; }