From 057cece77442622553c62335272e4b50f8b7ec60 Mon Sep 17 00:00:00 2001 From: sbrandt Date: Thu, 23 Jan 2014 15:31:00 +0000 Subject: Fix for #1525 git-svn-id: http://svn.cactuscode.org/flesh/trunk@5069 17b73243-c579-4c4c-a9d2-2d5706c11dac --- src/piraha/Call.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/src/piraha/Call.cc b/src/piraha/Call.cc index f223bddd..99f8f005 100644 --- a/src/piraha/Call.cc +++ b/src/piraha/Call.cc @@ -41,11 +41,17 @@ std::string get_parfile() { } else { value++; } - int n = strlen(value); - if(n > 4 && strcmp(value+n-4,".par")==0) { - value[n-4] = '\0'; + std::string s(value); + return s; +} +std::string get_parfilename() { + std::string ending = ".par"; + std::string s = get_parfile(); + int ns = s.length(); + int ne = ending.length(); + if(ns > ne && s.substr(ns-ne).compare(ending)==0) { + s = s.substr(0,ns-ne); } - std::string s = value; return s; } @@ -272,7 +278,7 @@ smart_ptr lookup_var(smart_ptr gr) { } else if(gr->group(0)->substring() == "parfile") { ret = new Value(gr); ret->type = PIR_STRING; - ret->sdata = get_parfile(); + ret->sdata = get_parfilename(); } else if(gr->group(0)->substring() == "pi") { ret = new Value(gr); ret->type = PIR_REAL; @@ -424,6 +430,56 @@ smart_ptr meval(smart_ptr gr) { val->ddata = val->idata; return val; } + } else if(val->type == PIR_STRING) { + if(fn == "int") { + val->type = PIR_INT; + std::istringstream buf(val->sdata); + if(!(buf >> val->idata)) { + std::ostringstream msg; + msg << "Invalid numerical value: " << val->sdata << std::endl; + std::string par = get_parfile(); + CCTK_Error(gr->line(),par.c_str(),current_thorn.c_str(),msg.str().c_str()); + } + std::string extra; + if(buf >> extra) { + std::ostringstream msg; + msg << "Trailing input in numerical value: " << val->sdata << std::endl; + std::string par = get_parfile(); + CCTK_Error(gr->line(),par.c_str(),current_thorn.c_str(),msg.str().c_str()); + } + return val; + } else if(fn == "real") { + val->type = PIR_REAL; + std::istringstream buf(val->sdata); + if(!(buf >> val->ddata)) { + std::ostringstream msg; + msg << "Invalid numerical value: " << val->sdata << std::endl; + std::string par = get_parfile(); + CCTK_Error(gr->line(),par.c_str(),current_thorn.c_str(),msg.str().c_str()); + } + std::string extra; + if(buf >> extra) { + std::ostringstream msg; + msg << "Trailing input in numerical value: " << val->sdata << std::endl; + std::string par = get_parfile(); + CCTK_Error(gr->line(),par.c_str(),current_thorn.c_str(),msg.str().c_str()); + } + return val; + } else if(fn == "bool") { + val->type = PIR_BOOL; + std::string s = mklower(val->sdata); + if(s == "no" || s == "false") { + ret->idata = 0; + } else if(s == "yes" || s == "true") { + ret->idata = 1; + } else { + std::ostringstream msg; + msg << "Invalid boolean value: " << val->sdata << std::endl; + std::string par = get_parfile(); + CCTK_Error(gr->line(),par.c_str(),current_thorn.c_str(),msg.str().c_str()); + } + return val; + } } std::ostringstream msg; msg << "Unknown func: " << fn << "(" << val->type << ")" << std::endl; @@ -924,7 +980,6 @@ extern "C" int cctk_PirahaParser(const char *buffer,unsigned long buffersize,int m2->showError(msg); } std::string par = get_parfile(); - par += ".par"; CCTK_Warn(0,m2->line(),par.c_str(),"cactus",msg.str().c_str()); return 1; } -- cgit v1.2.3