/** * Takes a data stream compressed with bzip2, and writes it out to disk, uncompresses it, and deletes the * compressed version. */ static bool DecompressBZipToDisk( const char *outFilename, const char *srcFilename, char *data, int bytesTotal ) { if ( g_pFileSystem->FileExists( outFilename ) || !data || bytesTotal < 1 ) { return false; } // Create the subdirs char * tmpDir = CloneString( outFilename ); COM_CreatePath( tmpDir ); delete[] tmpDir; // open the file for writing char fullSrcPath[MAX_PATH]; Q_MakeAbsolutePath( fullSrcPath, sizeof( fullSrcPath ), srcFilename, com_gamedir ); if ( !g_pFileSystem->FileExists( fullSrcPath ) ) { // Write out the .bz2 file, for simplest decompression FileHandle_t ifp = g_pFileSystem->Open( fullSrcPath, "wb" ); if ( !ifp ) { return false; } int bytesWritten = g_pFileSystem->Write( data, bytesTotal, ifp ); g_pFileSystem->Close( ifp ); if ( bytesWritten != bytesTotal ) { // couldn't write out all of the .bz2 file g_pFileSystem->RemoveFile( srcFilename ); return false; } } // Prepare the uncompressed filehandle FileHandle_t ofp = g_pFileSystem->Open( outFilename, "wb" ); if ( !ofp ) { g_pFileSystem->RemoveFile( srcFilename ); return false; } // And decompress! const int OutBufSize = 65536; char buf[ OutBufSize ]; BZFILE *bzfp = BZ2_bzopen( fullSrcPath, "rb" ); while ( 1 ) { int bytesRead = BZ2_bzread( bzfp, buf, OutBufSize ); if ( bytesRead < 0 ) { break; // error out } if ( bytesRead > 0 ) { int bytesWritten = g_pFileSystem->Write( buf, bytesRead, ofp ); if ( bytesWritten != bytesRead ) { break; // error out } } else { g_pFileSystem->Close( ofp ); BZ2_bzclose( bzfp ); g_pFileSystem->RemoveFile( srcFilename ); return true; } } // We failed somewhere, so clean up and exit g_pFileSystem->Close( ofp ); BZ2_bzclose( bzfp ); g_pFileSystem->RemoveFile( srcFilename ); g_pFileSystem->RemoveFile( outFilename ); return false; }
int filter_pe_fastq_bz2(FLT_OPTS *opts){ int left1=0,left2=0; int stat_single1 = 0; int stat_single2 = 0; int stat_paired = 0; int index=1; char fn[128]; char outfile[128]; SEQ_QUAL item1=init_read(); SEQ_QUAL item2=init_read(); BZFILE *fp1=bzopen_report(opts->r1,"r"); BZFILE *fp2=bzopen_report(opts->r2,"r"); file_name(outfile,opt->r1); sprintf(fn,"%s/%s.flt",opts->output,outfile); FILE *fo1=fopen_report(fn,"w+"); if(!fo1) return -1; file_name(outfile,opts->r2); sprintf(fn,"%s/%s.flt",opts->output,outfile); FILE *fo2=fopen_report(fn,"w+"); if(!fo2) return -1; sprintf(fn,"%s/%s.flt.s",opts->output,outfile); FILE *fos=fopen_report(fn,"w+"); if(!fos) return -1; while(read_fastq_bz2(fp1,&item1,index) >= 0 && read_fastq_bz2(fp2,&item2,index) >= 0) { left1=filter_all(&item1, opts); left2=filter_all(&item2, opts); if(left1 == 1 && left2 == 1){ output_fastq(fo1, &item1); output_fastq(fo2, &item2); stat_single1++; stat_single2++; stat_paired++; }else{ if(left1 == 1){ output_fastq(fos, &item1); stat_single1++; } if(left2 == 1){ output_fastq(fos, &item2); stat_single2++; } } index++; } printf("Totally %d reads were processed\n",(index-1)*2); printf(" file [ %s ]: %d reads were left (%.2f%)\n",opts->r1,stat_paired+stat_single1,(float) (stat_paired+stat_single1)*100/(index-1)); printf(" file [ %s ]: %d reads were left (%.2f%)\n",opts->r2,stat_paired+stat_single2,(float) (stat_paired+stat_single2)*100/(index-1)); printf("After filtering %d reads are paired in each file (%.2f%)\n",stat_paired,(float) stat_paired*100/(index-1)); printf(" file [ %s ]: %d reads were left as single end\n",opts->r1,stat_single1); printf(" file [ %s ]: %d reads were left as single end\n",opts->r2,stat_single2); free_read(&item1); free_read(&item2); BZ2_bzclose(fp1); BZ2_bzclose(fp2); fclose(fo1); fclose(fo2); fclose(fos); return 0; }