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")
This commit is contained in:
Sam Hatchett
2019-10-09 10:47:45 -04:00
committed by GitHub
parent 5601973d67
commit 5f7fd55a36
4 changed files with 60 additions and 28 deletions

View File

@@ -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));

View File

@@ -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;
@@ -140,6 +142,7 @@ int tankdata(Project *pr)
pattern = 0, // Time pattern index
curve = 0, // Curve index
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);

View File

@@ -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)

View File

@@ -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})