int input_readData() // // Input: none // Output: returns error code // Purpose: reads input file to determine input parameters for each object. // { char line[MAXLINE+1]; // line from input data file char wLine[MAXLINE+1]; // working copy of input line char* comment; // ptr. to start of comment in input line int sect, newsect; // data sections int inperr, errsum; // error code & total error count int lineLength; // number of characters in input line int i; long lineCount = 0; // --- initialize working item count arrays // (final counts in Mobjects, Mnodes & Mlinks should // match those in Nobjects, Nnodes and Nlinks). if ( ErrorCode ) return ErrorCode; error_setInpError(0, ""); for (i = 0; i < MAX_OBJ_TYPES; i++) Mobjects[i] = 0; for (i = 0; i < MAX_NODE_TYPES; i++) Mnodes[i] = 0; for (i = 0; i < MAX_LINK_TYPES; i++) Mlinks[i] = 0; // --- initialize starting date for all time series for ( i = 0; i < Nobjects[TSERIES]; i++ ) { Tseries[i].lastDate = StartDate + StartTime; } // --- read each line from input file sect = 0; errsum = 0; rewind(Finp.file); while ( fgets(line, MAXLINE, Finp.file) != NULL ) { // --- make copy of line and scan for tokens lineCount++; strcpy(wLine, line); Ntokens = getTokens(wLine); // --- skip blank lines and comments if ( Ntokens == 0 ) continue; if ( *Tok[0] == ';' ) continue; // --- check if max. line length exceeded lineLength = strlen(line); if ( lineLength >= MAXLINE ) { // --- don't count comment if present comment = strchr(line, ';'); if ( comment ) lineLength = comment - line; // Pointer math here if ( lineLength >= MAXLINE ) { inperr = ERR_LINE_LENGTH; report_writeInputErrorMsg(inperr, sect, line, lineCount); errsum++; } } // --- check if at start of a new input section if (*Tok[0] == '[') { // --- match token against list of section keywords newsect = findmatch(Tok[0], SectWords); if (newsect >= 0) { // --- SPECIAL CASE FOR TRANSECTS // finish processing the last set of transect data if ( sect == s_TRANSECT ) transect_validate(Nobjects[TRANSECT]-1); // --- begin a new input section sect = newsect; continue; } else { inperr = error_setInpError(ERR_KEYWORD, Tok[0]); report_writeInputErrorMsg(inperr, sect, line, lineCount); errsum++; break; } } // --- otherwise parse tokens from input line else { inperr = parseLine(sect, line); if ( inperr > 0 ) { errsum++; if ( errsum > MAXERRS ) report_writeLine(FMT19); else report_writeInputErrorMsg(inperr, sect, line, lineCount); } } // --- stop if reach end of file or max. error count if (errsum > MAXERRS) break; } /* End of while */ // --- check for errors if (errsum > 0) ErrorCode = ERR_INPUT; return ErrorCode; }
int transect_readParams(int* count, char* tok[], int ntoks) // // Input: count = transect index // tok[] = array of string tokens // ntoks = number of tokens // Output: updated value of count, // returns an error code // Purpose: read parameters of a transect from a tokenized line of input data. // // Format of transect data follows that used for HEC-2 program: // NC nLeft nRight nChannel // X1 name nSta xLeftBank xRightBank 0 0 0 xFactor yFactor // GR Elevation Station ... // { int i, k; int index = *count; // transect index int errcode; // error code double x[10]; // parameter values char* id; // transect ID name // --- match first token to a transect keyword k = findmatch(tok[0], TransectKeyWords); if ( k < 0 ) return error_setInpError(ERR_KEYWORD, tok[0]); // --- read parameters associated with keyword switch ( k ) { // --- NC line: Manning n values case 0: // --- finish processing the previous transect transect_validate(index - 1); // --- read Manning's n values if ( ntoks < 4 ) return error_setInpError(ERR_ITEMS, ""); for (i = 1; i <= 3; i++) { if ( ! getDouble(tok[i], &x[i]) ) return error_setInpError(ERR_NUMBER, tok[i]); } return setManning(x); // --- X1 line: identifies start of next transect case 1: // --- check that transect was already added to project // (by input_countObjects) if ( ntoks < 10 ) return error_setInpError(ERR_ITEMS, ""); id = project_findID(TRANSECT, tok[1]); if ( id == NULL ) return error_setInpError(ERR_NAME, tok[1]); // --- read in rest of numerical values on data line for ( i = 2; i < 10; i++ ) { if ( ! getDouble(tok[i], &x[i]) ) return error_setInpError(ERR_NUMBER, tok[i]); } // --- update total transect count *count = index + 1; // --- transfer parameter values to transect's properties return setParams(index, id, x); // --- GR line: station elevation & location data case 2: // --- check that line contains pairs of data values if ( (ntoks - 1) % 2 > 0 ) return error_setInpError(ERR_ITEMS, ""); // --- parse each pair of Elevation-Station values i = 1; while ( i < ntoks ) { if ( ! getDouble(tok[i], &x[1]) ) return error_setInpError(ERR_NUMBER, tok[i]); if ( ! getDouble(tok[i+1], &x[2]) ) return error_setInpError(ERR_NUMBER, tok[i+1]); errcode = addStation(x[1], x[2]); if ( errcode ) return errcode; i += 2; } return 0; } return 0; }