int GenericFile_stdio::advance(long long offset) { return _fseek64bit(_file, offset, SEEK_CUR); }
const Genome * Genome::loadFromFile(const char *fileName, unsigned i_minOffset, unsigned length) { FILE *loadFile; unsigned nBases,nPieces; if (!openFileAndGetSizes(fileName,&loadFile,&nBases,&nPieces)) { // // It already printed an error. Just fail. // return NULL; } if (0 == length) { length = nBases - i_minOffset; } else { // // Don't let length go beyond nBases. // length = __min(length,nBases - i_minOffset); } Genome *genome = new Genome(nBases,length); genome->nBases = nBases; genome->nPieces = genome->maxPieces = nPieces; genome->pieces = new Piece[nPieces]; genome->minOffset = i_minOffset; if (i_minOffset >= nBases) { fprintf(stderr,"Genome::loadFromFile: specified minOffset %u >= nBases %u\n",i_minOffset,nBases); } genome->maxOffset = i_minOffset + length; static const unsigned pieceNameBufferSize = 512; char pieceNameBuffer[pieceNameBufferSize]; unsigned n; size_t pieceSize; char *curName; for (unsigned i = 0; i < nPieces; i++) { if (NULL == fgets(pieceNameBuffer, pieceNameBufferSize, loadFile)){ fprintf(stderr,"Unable to read piece description\n"); delete genome; return NULL; } for (n = 0; n < pieceNameBufferSize; n++){ if (pieceNameBuffer[n] == ' ') { pieceNameBuffer[n] = '\0'; break; } } genome->pieces[i].beginningOffset = atoi(pieceNameBuffer); pieceNameBuffer[n] = ' '; n++; // increment n so we start copying at the position after the space pieceSize = strlen(pieceNameBuffer + n) - 1; //don't include the final \n genome->pieces[i].name = new char[pieceSize + 1]; curName = genome->pieces[i].name; for (unsigned pos = 0; pos < pieceSize; pos++) { curName[pos] = pieceNameBuffer[pos + n]; } curName[pieceSize] = '\0'; } // // Skip over the miserable \n that gets left in the file. // /* char newline; if (1 != fread(&newline,1,1,loadFile)) { fprintf(stderr,"Genome::loadFromFile: Unable to read expected newline\n"); delete genome; return NULL; } if (newline != 10) { fprintf(stderr,"Genome::loadFromFile: Expected newline to be 0x0a, got 0x%02x\n",newline); delete genome; return NULL; } */ if (0 != _fseek64bit(loadFile,i_minOffset,SEEK_CUR)) { fprintf(stderr,"Genome::loadFromFile: _fseek64bit failed\n"); exit(1); } if (length != fread(genome->bases,1,length,loadFile)) { fprintf(stderr,"Genome::loadFromFile: fread of bases failed\n"); fclose(loadFile); delete genome; return NULL; } fclose(loadFile); return genome; }