bool Tpetra::Utils::parseRfmt(Teuchos::ArrayRCP<char> fmt, int &perline, int &width, int &prec, char &valformat) { TEUCHOS_TEST_FOR_EXCEPT(fmt.size() != 0 && fmt[fmt.size()-1] != '\0'); std::transform(fmt.begin(), fmt.end(), fmt, static_cast < int(*)(int) > (std::toupper)); // find the first left paren '(' and the last right paren ')' Teuchos::ArrayRCP<char>::iterator firstLeftParen = std::find( fmt.begin(), fmt.end(), '('); Teuchos::ArrayRCP<char>::iterator lastRightParen = std::find(std::reverse_iterator<Teuchos::ArrayRCP<char>::iterator>(fmt.end()), std::reverse_iterator<Teuchos::ArrayRCP<char>::iterator>(fmt.begin()), ')').base()-1; // select the substring between the parens, including them // if neither was found, set the string to empty if (firstLeftParen == fmt.end() || lastRightParen == fmt.begin()) { fmt.resize(0 + 1); fmt[0] = '\0'; } else { fmt += (firstLeftParen - fmt.begin()); size_t newLen = lastRightParen - firstLeftParen + 1; fmt.resize(newLen + 1); fmt[newLen] = '\0'; } if (std::find(fmt.begin(),fmt.end(),'P') != fmt.end()) { // not supported return true; } bool error = true; if (std::sscanf(fmt.getRawPtr(),"(%d%c%d.%d)",&perline,&valformat,&width,&prec) == 4) { if (valformat == 'E' || valformat == 'D' || valformat == 'F') { error = false; } } return error; }
void Tpetra::Utils::readHBHeader(std::ifstream &fin, Teuchos::ArrayRCP<char> &Title, Teuchos::ArrayRCP<char> &Key, Teuchos::ArrayRCP<char> &Type, int &Nrow, int &Ncol, int &Nnzero, int &Nrhs, Teuchos::ArrayRCP<char> &Ptrfmt, Teuchos::ArrayRCP<char> &Indfmt, Teuchos::ArrayRCP<char> &Valfmt, Teuchos::ArrayRCP<char> &Rhsfmt, int &Ptrcrd, int &Indcrd, int &Valcrd, int &Rhscrd, Teuchos::ArrayRCP<char> &Rhstype) { int Totcrd, Neltvl, Nrhsix; const int MAXLINE = 81; char line[MAXLINE]; // Title.resize(72 + 1); std::fill(Title.begin(), Title.end(), '\0'); Key.resize(8 + 1); std::fill(Key.begin(), Key.end(), '\0'); Type.resize(3 + 1); std::fill(Type.begin(), Type.end(), '\0'); Ptrfmt.resize(16 + 1); std::fill(Ptrfmt.begin(), Ptrfmt.end(), '\0'); Indfmt.resize(16 + 1); std::fill(Indfmt.begin(), Indfmt.end(), '\0'); Valfmt.resize(20 + 1); std::fill(Valfmt.begin(), Valfmt.end(), '\0'); Rhsfmt.resize(20 + 1); std::fill(Rhsfmt.begin(), Rhsfmt.end(), '\0'); // const std::string errStr("Tpetra::Utils::readHBHeader(): Improperly formatted H/B file: "); /* First line: (A72,A8) */ fin.getline(line,MAXLINE); TEUCHOS_TEST_FOR_EXCEPTION( std::sscanf(line,"%*s") < 0, std::runtime_error, errStr << "error buffering line."); (void)std::sscanf(line, "%72c%8[^\n]", Title.getRawPtr(), Key.getRawPtr()); /* Second line: (5I14) or (4I14) */ fin.getline(line,MAXLINE); TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%*s") < 0, std::runtime_error, errStr << "error buffering line."); if ( std::sscanf(line,"%14d%14d%14d%14d%14d",&Totcrd,&Ptrcrd,&Indcrd,&Valcrd,&Rhscrd) != 5 ) { Rhscrd = 0; TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%14d%14d%14d%14d",&Totcrd,&Ptrcrd,&Indcrd,&Valcrd) != 4, std::runtime_error, errStr << "error reading pointers (line 2)"); } /* Third line: (A3, 11X, 4I14) */ fin.getline(line,MAXLINE); TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%*s") < 0, std::runtime_error, errStr << "error buffering line."); TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line, "%3c%14i%14i%14i%14i", Type.getRawPtr(),&Nrow,&Ncol,&Nnzero,&Neltvl) != 5 , std::runtime_error, errStr << "error reading matrix meta-data (line 3)"); std::transform(Type.begin(), Type.end(), Type.begin(), static_cast < int(*)(int) > (std::toupper)); /* Fourth line: */ fin.getline(line,MAXLINE); TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%*s") < 0, std::runtime_error, errStr << "error buffering line."); if (Rhscrd != 0) { TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%16c%16c%20c%20c",Ptrfmt.getRawPtr(),Indfmt.getRawPtr(),Valfmt.getRawPtr(),Rhsfmt.getRawPtr()) != 4, std::runtime_error, errStr << "error reading formats (line 4)"); } else { TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%16c%16c%20c",Ptrfmt.getRawPtr(),Indfmt.getRawPtr(),Valfmt.getRawPtr()) != 3, std::runtime_error, errStr << "error reading formats (line 4)"); } /* (Optional) Fifth line: */ if (Rhscrd != 0 ) { Rhstype.resize(3 + 1,'\0'); fin.getline(line,MAXLINE); TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%*s") < 0, std::runtime_error, errStr << "error buffering line."); TEUCHOS_TEST_FOR_EXCEPTION(std::sscanf(line,"%3c%14d%14d", Rhstype.getRawPtr(), &Nrhs, &Nrhsix) != 3, std::runtime_error, errStr << "error reading right-hand-side meta-data (line 5)"); } }