X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothurout.cpp;h=67c62c1bed469a387462f5decac8252971dda43e;hb=f663afa231c9bc1b5e18e0ea3bdd2b2ee784f5b2;hp=88a18ed452314c38c5d2cf6909ea44db465d61af;hpb=afcbef163b4f32d0ff25a834cb9af8eef8d06ffa;p=mothur.git diff --git a/mothurout.cpp b/mothurout.cpp index 88a18ed..67c62c1 100644 --- a/mothurout.cpp +++ b/mothurout.cpp @@ -276,8 +276,9 @@ int MothurOut::openOutputFileAppend(string fileName, ofstream& fileHandle){ /***********************************************************************/ void MothurOut::gobble(istream& f){ try { + char d; - while(isspace(d=f.get())) {;} + while(isspace(d=f.get())) { ;} f.putback(d); } catch(exception& e) { @@ -348,14 +349,29 @@ string MothurOut::getline(ifstream& fileHandle) { } /***********************************************************************/ +#ifdef USE_COMPRESSION +inline bool endsWith(string s, const char * suffix){ + size_t suffixLength = strlen(suffix); + return s.size() >= suffixLength && s.substr(s.size() - suffixLength, suffixLength).compare(suffix) == 0; +} +#endif + string MothurOut::getRootName(string longName){ try { string rootName = longName; - - if(longName.find_last_of(".") != longName.npos){ - int pos = longName.find_last_of('.')+1; - rootName = longName.substr(0, pos); + +#ifdef USE_COMPRESSION + if (endsWith(rootName, ".gz") || endsWith(rootName, ".bz2")) { + int pos = rootName.find_last_of('.'); + rootName = rootName.substr(0, pos); + cerr << "shortening " << longName << " to " << rootName << "\n"; + } +#endif + + if(rootName.find_last_of(".") != rootName.npos){ + int pos = rootName.find_last_of('.')+1; + rootName = rootName.substr(0, pos); } return rootName; @@ -486,19 +502,29 @@ string MothurOut::getFullPathName(string fileName){ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) if (path.find("~") != -1) { //go to home directory - string homeDir = getenv ("HOME"); + string homeDir; + + char *homepath = NULL; + homepath = getenv ("HOME"); + if ( homepath != NULL) { homeDir = homepath; } + else { homeDir = ""; } + newFileName = homeDir + fileName.substr(fileName.find("~")+1); return newFileName; }else { //find path if (path.rfind("./") == -1) { return fileName; } //already complete name else { newFileName = fileName.substr(fileName.rfind("./")+2); } //save the complete part of the name - char* cwdpath = new char[1024]; + //char* cwdpath = new char[1024]; + //size_t size; + //cwdpath=getcwd(cwdpath,size); + //cwd = cwdpath; + + char *cwdpath = NULL; + cwdpath = getcwd(NULL, 0); // or _getcwd + if ( cwdpath != NULL) { cwd = cwdpath; } + else { cwd = ""; } - size_t size; - cwdpath=getcwd(cwdpath,size); - - cwd = cwdpath; //rip off first '/' string simpleCWD; @@ -597,6 +623,29 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ //get full path name string completeFileName = getFullPathName(fileName); +#ifdef USE_COMPRESSION + // check for gzipped or bzipped file + if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { + string tempName = string(tmpnam(0)); + mkfifo(tempName.c_str(), 0666); + int fork_result = fork(); + if (fork_result < 0) { + cerr << "Error forking.\n"; + exit(1); + } else if (fork_result == 0) { + string command = (endsWith(completeFileName, ".gz") ? "zcat " : "bzcat ") + completeFileName + string(" > ") + tempName; + cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; + system(command.c_str()); + cerr << "Done decompressing " << completeFileName << "\n"; + remove(tempName.c_str()); + exit(EXIT_SUCCESS); + } else { + cerr << "waiting on child process " << fork_result << "\n"; + completeFileName = tempName; + } + } +#endif + fileHandle.open(completeFileName.c_str()); if(!fileHandle) { return 1; @@ -615,9 +664,34 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){ try { + //get full path name string completeFileName = getFullPathName(fileName); +#ifdef USE_COMPRESSION + // check for gzipped or bzipped file + if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { + string tempName = string(tmpnam(0)); + mkfifo(tempName.c_str(), 0666); + int fork_result = fork(); + if (fork_result < 0) { + cerr << "Error forking.\n"; + exit(1); + } else if (fork_result == 0) { + string command = (endsWith(completeFileName, ".gz") ? "zcat " : "bzcat ") + completeFileName + string(" > ") + tempName; + cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; + system(command.c_str()); + cerr << "Done decompressing " << completeFileName << "\n"; + remove(tempName.c_str()); + exit(EXIT_SUCCESS); + } else { + cerr << "waiting on child process " << fork_result << "\n"; + completeFileName = tempName; + } + } +#endif + + fileHandle.open(completeFileName.c_str()); if(!fileHandle) { mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine(); @@ -671,7 +745,27 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ try { string completeFileName = getFullPathName(fileName); - + +#ifdef USE_COMPRESSION + // check for gzipped file + if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { + string tempName = string(tmpnam(0)); + mkfifo(tempName.c_str(), 0666); + cerr << "Compressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; + int fork_result = fork(); + if (fork_result < 0) { + cerr << "Error forking.\n"; + exit(1); + } else if (fork_result == 0) { + string command = string(endsWith(completeFileName, ".gz") ? "gzip" : "bzip2") + " -v > " + completeFileName + string(" < ") + tempName; + system(command.c_str()); + exit(0); + } else { + completeFileName = tempName; + } + } +#endif + fileHandle.open(completeFileName.c_str(), ios::trunc); if(!fileHandle) { mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine(); @@ -901,7 +995,7 @@ vector MothurOut::divideFile(string filename, int& proc) { //estimate file breaks unsigned long int chunkSize = 0; chunkSize = size / proc; - + //file to small to divide by processors if (chunkSize == 0) { proc = 1; filePos.push_back(size); return filePos; } @@ -919,7 +1013,7 @@ vector MothurOut::divideFile(string filename, int& proc) { char c = in.get(); if (c == '>') { in.putback(c); newSpot = in.tellg(); break; } } - + //there was not another sequence before the end of the file unsigned long int sanityPos = in.tellg(); @@ -934,7 +1028,7 @@ vector MothurOut::divideFile(string filename, int& proc) { //sanity check filePos for (int i = 0; i < (filePos.size()-1); i++) { - if (filePos[(i+1)] <= filePos[i]) { filePos.erase(filePos.begin()+(i+1)); i--; } + if (filePos[(i+1)] <= filePos[i]) { cout << "erasing " << (i+1) << endl; filePos.erase(filePos.begin()+(i+1)); i--; } } proc = (filePos.size() - 1); @@ -1098,7 +1192,20 @@ void MothurOut::getNumSeqs(ifstream& file, int& numSeqs){ //This function parses the estimator options and puts them in a vector void MothurOut::splitAtChar(string& estim, vector& container, char symbol) { try { - string individual; + string individual = ""; + int estimLength = estim.size(); + for(int i=0;i& container, char symbo } } //get last one - container.push_back(estim); + container.push_back(estim); */ } catch(exception& e) { errorOut(e, "MothurOut", "splitAtChar");