From 5f7fd55a36e6924e95a6ec9e2bf327decb3a8935 Mon Sep 17 00:00:00 2001 From: Sam Hatchett Date: Wed, 9 Oct 2019 10:47:45 -0400 Subject: [PATCH] Return error if node/link name is too long (#535) * co-authored with @ehsan-shafiee * removes errant slashes * Throws correct error for ID name too long * Revert "Throws correct error for ID name too long" This reverts commit 57b4873f5882cb9fd983f7e1e5a703b9e442cd74. * fixes #534 by bubbling error codes up from add node/link internal functions * fixes tests on Mac at least * fixes improper success code * Error 252 (not 250) returned for ID name too long. From errors.dat: DAT(252,"invalid ID name") --- src/input2.c | 22 +++++++++----- src/input3.c | 57 +++++++++++++++++++++++++----------- tests/outfile/CMakeLists.txt | 4 ++- tests/util/CMakeLists.txt | 5 ++-- 4 files changed, 60 insertions(+), 28 deletions(-) diff --git a/src/input2.c b/src/input2.c index 1028e77..6b89bfb 100644 --- a/src/input2.c +++ b/src/input2.c @@ -173,12 +173,12 @@ int readdata(Project *pr) net->Ncontrols = 0; net->Nrules = 0; - // Patterns & Curves were created previously in netsize() + // Patterns & Curves were created previously in netsize() parser->MaxPats = net->Npats; parser->MaxCurves = net->Ncurves; parser->PrevPat = NULL; parser->PrevCurve = NULL; - + // Initialize full line comment, input data section and error count parser->LineComment[0] = '\0'; sect = -1; @@ -472,10 +472,13 @@ int addnodeID(Network *net, int n, char *id) **-------------------------------------------------------------- */ { - if (findnode(net,id)) return 0; + if (findnode(net,id)) + return 215; // duplicate id + if (strlen(id) > MAXID) + return 252; // invalid format (too long) strncpy(net->Node[n].ID, id, MAXID); hashtable_insert(net->NodeHashTable, net->Node[n].ID, n); - return 1; + return 0; } int addlinkID(Network *net, int n, char *id) @@ -488,10 +491,13 @@ int addlinkID(Network *net, int n, char *id) **-------------------------------------------------------------- */ { - if (findlink(net,id)) return 0; + if (findlink(net,id)) + return 215; // duplicate id + if (strlen(id) > MAXID) + return 252; // invalid formt (too long); strncpy(net->Link[n].ID, id, MAXID); hashtable_insert(net->LinkHashTable, net->Link[n].ID, n); - return 1; + return 0; } int addpattern(Network *network, char *id) @@ -512,7 +518,7 @@ int addpattern(Network *network, char *id) if (strcmp(id, network->Pattern[n].ID) == 0) return 0; if (findpattern(network, id) > 0) return 0; } - if (strlen(id) > MAXID) return 250; + if (strlen(id) > MAXID) return 252; // Update pattern count & add a new pattern to the database n = n + 2; @@ -547,7 +553,7 @@ int addcurve(Network *network, char *id) if (strcmp(id, network->Curve[n].ID) == 0) return 0; if (findcurve(network, id) > 0) return 0; } - if (strlen(id) > MAXID) return 250; + if (strlen(id) > MAXID) return 252; n = n + 2; network->Curve = (Scurve *)realloc(network->Curve, n * sizeof(Scurve)); diff --git a/src/input3.c b/src/input3.c index 940e572..48635b7 100644 --- a/src/input3.c +++ b/src/input3.c @@ -79,6 +79,7 @@ int juncdata(Project *pr) double el, // elevation y = 0.0; // base demand Snode *node; + int err = 0; // Add new junction to data base n = parser->Ntokens; @@ -86,7 +87,8 @@ int juncdata(Project *pr) net->Njuncs++; net->Nnodes++; njuncs = net->Njuncs; - if (!addnodeID(net, net->Njuncs, parser->Tok[0])) return setError(parser, 0, 215); + err = addnodeID(net, net->Njuncs, parser->Tok[0]); + if (err) return setError(parser, 0, err); // Check for valid data if (n < 2) return 201; @@ -139,7 +141,8 @@ int tankdata(Project *pr) n, // # data items pattern = 0, // Time pattern index curve = 0, // Curve index - overflow = FALSE;// Overflow indicator + overflow = FALSE;// Overflow indicator + double el = 0.0, // Elevation initlevel = 0.0, // Initial level minlevel = 0.0, // Minimum level @@ -150,6 +153,8 @@ int tankdata(Project *pr) Snode *node; Stank *tank; + int err = 0; + // Add new tank to data base n = parser->Ntokens; if (net->Ntanks == parser->MaxTanks || @@ -158,7 +163,8 @@ int tankdata(Project *pr) net->Nnodes++; i = parser->MaxJuncs + net->Ntanks; - if (!addnodeID(net, i, parser->Tok[0])) return setError(parser, 0, 215); + err = addnodeID(net, i, parser->Tok[0]); + if (err) return setError(parser, 0, err); // Check for valid data if (n < 2) return 201; @@ -273,13 +279,15 @@ int pipedata(Project *pr) LinkType type = PIPE; // Link type StatusType status = OPEN; // Link status Slink *link; + int err = 0; // Add new pipe to data base n = parser->Ntokens; if (net->Nlinks == parser->MaxLinks) return 200; net->Npipes++; net->Nlinks++; - if (!addlinkID(net, net->Nlinks, parser->Tok[0])) return setError(parser, 0, 215); + err = addlinkID(net, net->Nlinks, parser->Tok[0]); + if (err) return setError(parser, 0, err); // Check for valid data if (n < 6) return 201; @@ -360,6 +368,7 @@ int pumpdata(Project *pr) double y; Slink *link; Spump *pump; + int err = 0; /* Add new pump to data base */ n = parser->Ntokens; @@ -367,7 +376,8 @@ int pumpdata(Project *pr) net->Npumps == parser->MaxPumps) return 200; net->Nlinks++; net->Npumps++; - if (!addlinkID(net, net->Nlinks, parser->Tok[0])) return setError(parser, 0, 215); + err = addlinkID(net, net->Nlinks, parser->Tok[0]); + if (err) return setError(parser, 0, err); // Check for valid data if (n < 3) return 201; @@ -474,6 +484,7 @@ int valvedata(Project *pr) setting, // Valve setting lcoeff = 0.0; // Minor loss coeff. Slink *link; + int err = 0; // Add new valve to data base n = parser->Ntokens; @@ -481,21 +492,33 @@ int valvedata(Project *pr) net->Nvalves == parser->MaxValves) return 200; net->Nvalves++; net->Nlinks++; - if (!addlinkID(net, net->Nlinks, parser->Tok[0])) return setError(parser, 0, 215); + err = addlinkID(net, net->Nlinks, parser->Tok[0]); + if (err) return setError(parser, 0, err); // Check for valid data - if (n < 6) return 201; - if ((j1 = findnode(net, parser->Tok[1])) == 0) return setError(parser, 1, 203); - if ((j2 = findnode(net, parser->Tok[2])) == 0) return setError(parser, 2, 203); - if (j1 == j2) return setError(parser, 0, 222); + if (n < 6) + return 201; + if ((j1 = findnode(net, parser->Tok[1])) == 0) + return setError(parser, 1, 203); + if ((j2 = findnode(net, parser->Tok[2])) == 0) + return setError(parser, 2, 203); + if (j1 == j2) + return setError(parser, 0, 222); - if (match(parser->Tok[4], w_PRV)) type = PRV; - else if (match(parser->Tok[4], w_PSV)) type = PSV; - else if (match(parser->Tok[4], w_PBV)) type = PBV; - else if (match(parser->Tok[4], w_FCV)) type = FCV; - else if (match(parser->Tok[4], w_TCV)) type = TCV; - else if (match(parser->Tok[4], w_GPV)) type = GPV; - else return setError(parser, 4, 213); + if (match(parser->Tok[4], w_PRV)) + type = PRV; + else if (match(parser->Tok[4], w_PSV)) + type = PSV; + else if (match(parser->Tok[4], w_PBV)) + type = PBV; + else if (match(parser->Tok[4], w_FCV)) + type = FCV; + else if (match(parser->Tok[4], w_TCV)) + type = TCV; + else if (match(parser->Tok[4], w_GPV)) + type = GPV; + else + return setError(parser, 4, 213); if (!getfloat(parser->Tok[3], &diam)) return setError(parser, 3, 202); if (diam <= 0.0) return setError(parser, 3, 211); diff --git a/tests/outfile/CMakeLists.txt b/tests/outfile/CMakeLists.txt index 162a2ee..6d0b730 100644 --- a/tests/outfile/CMakeLists.txt +++ b/tests/outfile/CMakeLists.txt @@ -1,5 +1,7 @@ - +if(UNIX) + set(CMAKE_CXX_FLAGS "-std=c++11") +endif(UNIX) # Sets for output directory for executables and libraries set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) diff --git a/tests/util/CMakeLists.txt b/tests/util/CMakeLists.txt index a612fc7..7072f35 100644 --- a/tests/util/CMakeLists.txt +++ b/tests/util/CMakeLists.txt @@ -1,5 +1,7 @@ - +if(UNIX) + set(CMAKE_CXX_FLAGS "-std=c++11") +endif(UNIX) # Sets for output directory for executables and libraries set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) @@ -24,4 +26,3 @@ add_executable(test_filemanager ./test_filemanager.cpp ../../src/util/cstr_helper.c) target_include_directories(test_filemanager PUBLIC ../../src/) target_link_libraries(test_filemanager ${Boost_LIBRARIES}) -