//-------------------------------------------------------------- void ofShader::checkShaderInfoLog(GLuint shader, GLenum type, ofLogLevel logLevel) { GLsizei infoLength; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLength); if (infoLength > 1) { GLchar* infoBuffer = new GLchar[infoLength]; glGetShaderInfoLog(shader, infoLength, &infoLength, infoBuffer); ofLog(logLevel, "ofShader: %s shader reports:\n%s", nameForType(type).c_str(), infoBuffer); if (shaderSource.find(type) != shaderSource.end()) { // The following regexp should match shader compiler error messages by Nvidia and ATI. // Unfortunately, each vendor's driver formats error messages slightly different. Poco::RegularExpression re("^.*[(:]{1}(\\d+)[:)]{1}.*"); Poco::RegularExpression::MatchVec matches; string infoString = (infoBuffer != NULL) ? string(infoBuffer): ""; re.match(infoString, 0, matches); ofBuffer buf = shaderSource[type]; ofBuffer::Line line = buf.getLines().begin(); if (!matches.empty()){ int offendingLineNumber = ofToInt(infoString.substr(matches[1].offset, matches[1].length)); ostringstream msg; msg << "ofShader: " + nameForType(type) + ", offending line " << offendingLineNumber << " :"<< endl; for(int i=0; line != buf.getLines().end(); line++, i++ ){ string s = *line; if ( i >= offendingLineNumber -3 && i < offendingLineNumber + 2 ){ msg << "\t" << setw(5) << (i+1) << "\t" << s << endl; } } ofLog(logLevel) << msg.str(); } } delete [] infoBuffer; } }
//-------------------------------------------------------------- void ofShader::checkProgramInfoLog(GLuint program) { GLsizei infoLength; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLength); if (infoLength > 1) { GLchar* infoBuffer = new GLchar[infoLength]; glGetProgramInfoLog(program, infoLength, &infoLength, infoBuffer); string msg = "ofShader: program reports:\n"; #ifdef TARGET_RASPBERRYPI if (shaderSource.find(GL_FRAGMENT_SHADER) != shaderSource.end()) { Poco::RegularExpression re(",.line.([^\\)]*)"); Poco::RegularExpression::MatchVec matches; string infoString = (infoBuffer != NULL) ? string(infoBuffer): ""; re.match(infoString, 0, matches); ofBuffer buf = shaderSource[GL_FRAGMENT_SHADER]; ofBuffer::Line line = buf.getLines().begin(); if (!matches.empty()){ int offendingLineNumber = ofToInt(infoString.substr(matches[1].offset, matches[1].length)); ostringstream msg; msg << "ofShader: " + nameForType(GL_FRAGMENT_SHADER) + ", offending line " << offendingLineNumber << " :"<< endl; for(int i=0; line != buf.getLines().end(); line++, i++ ){ string s = *line; if ( i >= offendingLineNumber -3 && i < offendingLineNumber + 2 ){ msg << "\t" << setw(5) << (i+1) << "\t" << s << endl; } } ofLogError("ofShader") << msg.str(); } } #endif ofLogError("ofShader", msg + infoBuffer); delete [] infoBuffer; } }
/// Read rectangular masks from a config file string /// @param line :: line (string) from the config file void EQSANSLoad::readRectangularMasks(const std::string& line) { // Looking for rectangular mask // Rectangular mask = 7, 0; 7, 255 Poco::RegularExpression re_key("rectangular mask", Poco::RegularExpression::RE_CASELESS); Poco::RegularExpression re_key_alt("elliptical mask", Poco::RegularExpression::RE_CASELESS); Poco::RegularExpression::Match match; if (re_key.match(line, 0, match) || re_key_alt.match(line, 0, match)) { Poco::RegularExpression re_sig("=[ ]*([0-9]+)[ ]*[ ,][ ]*([0-9]+)[ ]*[ ;,][ ]*([0-9]+)[ ]*[ ,][ ]*([0-9]+)"); if (re_sig.match(line, 0, match)) { Poco::RegularExpression::MatchVec posVec; re_sig.match(line, 0, posVec); if (posVec.size()==5) { for (int i=0; i<4; i++) { std::string num_str = line.substr(posVec[i+1].offset, posVec[i+1].length); m_mask_as_string = m_mask_as_string + " " + num_str; } m_mask_as_string += ","; } } } }
void WindowFunction::setType(const std::string &type) { //parse the input Poco::RegularExpression::MatchVec matches; Poco::RegularExpression("^\\s*(\\w+)\\s*(\\((.*)\\))?\\s*$").match(type, 0, matches); if (matches.empty()) throw Pothos::InvalidArgumentException("WindowFunction("+type+")", "cant parse window type"); //parse the args Poco::JSON::Array::Ptr args(new Poco::JSON::Array()); if (matches.size() > 3) { auto argsStr = type.substr(matches[3].offset, matches[3].length); Poco::JSON::Parser p; p.parse("["+argsStr+"]"); args = p.getHandler()->asVar().extract<Poco::JSON::Array::Ptr>(); } //check input auto name = Poco::toLower(type.substr(matches[1].offset, matches[1].length)); if (name == "kaiser") { if (args->size() != 1) throw Pothos::InvalidArgumentException("WindowFunction("+type+")", "expects format: kaiser(beta)"); } else if (args->size() != 0) throw Pothos::InvalidArgumentException("WindowFunction("+type+")", name + " takes no arguments"); //bind window function if (name == "rectangular") _calc = &rectangular; else if (name == "hann") _calc = &hann; else if (name == "hamming") _calc = &hamming; else if (name == "blackman") _calc = &blackman; else if (name == "bartlett") _calc = &bartlett; else if (name == "flattop") _calc = &flattop; else if (name == "kaiser") _calc = std::bind(&kaiser, std::placeholders::_1, std::placeholders::_2, args->getElement<double>(0)); else throw Pothos::InvalidArgumentException("WindowFunction::setType("+type+")", "unknown window name"); this->reload(); }
bool singleInfo(const std::string & subject, std::string & info) { Poco::RegularExpression rg1("^([0-9]{5}) ([0-9]{14}) .+^RE .{28} ([0-9/,]{2}) ([0-9/,]{5}) .+^SP ([0-9/,]{4})", Poco::RegularExpression::RE_MULTILINE| Poco::RegularExpression::RE_DOTALL| Poco::RegularExpression::RE_NEWLINE_ANYCRLF); Poco::RegularExpression::MatchVec matchs; int m = rg1.match(subject,0,matchs); if(6 != m) return false; //std::cout<<m<<matchs.size()<<"\n"<<subject<<std::endl; //std::cin>>info; std::vector< std::string > record; std::vector< bool > lossrecord(5, false); for(size_t i=1; i!=matchs.size(); i++) { record.push_back( subject.substr(matchs[i].offset, matchs[i].length) ); lossrecord[i-1] = std::string::npos != record[i-1].find('/'); } if(lossrecord[3] && lossrecord[4] )//ͬʱȱ²â { return false; } for(size_t i=2; i<5; i++) { if(lossrecord[i]) { record[i] = "99999"; } else if( std::string::npos != record[i].find(',') ) { record[i] = "1"; } else if(i>2) { record[i] += '0'; } } for(size_t i=0; i<record.size(); i++) { info += record[i] + ' '; } info[info.size()-1] = '\n'; return true; }
/// Read the moderator position from a config file string /// @param line :: line (string) from the config file void EQSANSLoad::readModeratorPosition(const std::string& line) { Poco::RegularExpression re_key("sample location", Poco::RegularExpression::RE_CASELESS); Poco::RegularExpression::Match match; if (re_key.match(line, 0, match)) { Poco::RegularExpression re_sig("=[ ]*([0-9]+)"); if (re_sig.match(line, 0, match)) { Poco::RegularExpression::MatchVec posVec; re_sig.match(line, 0, posVec); if (posVec.size()==2) { std::string num_str = line.substr(posVec[1].offset, posVec[1].length); Poco::NumberParser::tryParseFloat(num_str, m_moderator_position); m_moderator_position = -m_moderator_position/1000.0; } } } }
/// Read the beam center from a config file string /// @param line :: line (string) from the config file void EQSANSLoad::readBeamCenter(const std::string& line) { Poco::RegularExpression re_key("spectrum center", Poco::RegularExpression::RE_CASELESS); Poco::RegularExpression::Match match; if (re_key.match(line, 0, match)) { Poco::RegularExpression re_sig("=[ ]*([0-9]+.[0-9]*)[ ]*[ ,][ ]*([0-9]+.[0-9]+)"); if (re_sig.match(line, 0, match)) { Poco::RegularExpression::MatchVec posVec; re_sig.match(line, 0, posVec); if (posVec.size()==3) { std::string num_str = line.substr(posVec[1].offset, posVec[1].length); Poco::NumberParser::tryParseFloat(num_str, m_center_x); num_str = line.substr(posVec[2].offset, posVec[2].length); Poco::NumberParser::tryParseFloat(num_str, m_center_y); } } } }
/// Read the TOF cuts from a config file string /// @param line :: line (string) from the config file void EQSANSLoad::readTOFcuts(const std::string& line) { Poco::RegularExpression re_key("tof edge discard", Poco::RegularExpression::RE_CASELESS); Poco::RegularExpression::Match match; if (re_key.match(line, 0, match)) { Poco::RegularExpression re_sig("=[ ]*([0-9]+)[ ]*[ ,][ ]*([0-9]+)"); if (re_sig.match(line, 0, match)) { Poco::RegularExpression::MatchVec posVec; re_sig.match(line, 0, posVec); if (posVec.size()==3) { std::string num_str = line.substr(posVec[1].offset, posVec[1].length); Poco::NumberParser::tryParseFloat(num_str, m_low_TOF_cut); num_str = line.substr(posVec[2].offset, posVec[2].length); Poco::NumberParser::tryParseFloat(num_str, m_high_TOF_cut); } } } }
/// Read the source slit sizes from a config file string /// @param line :: line (string) from the config file void EQSANSLoad::readSourceSlitSize(const std::string& line) { Poco::RegularExpression re_key("wheel", Poco::RegularExpression::RE_CASELESS); Poco::RegularExpression::Match match; if (re_key.match(line, 0, match)) { Poco::RegularExpression re_sig("([1-8]) wheel[ ]*([1-3])[ \\t]*=[ \\t]*(\\w+)"); if (re_sig.match(line, 0, match)) { Poco::RegularExpression::MatchVec posVec; re_sig.match(line, 0, posVec); if (posVec.size()==2) { std::string num_str = line.substr(posVec[1].offset, posVec[1].length); int slit_number = 0; Poco::NumberParser::tryParse(num_str, slit_number); slit_number--; num_str = line.substr(posVec[2].offset, posVec[2].length); int wheel_number = 0; Poco::NumberParser::tryParse(num_str, wheel_number); wheel_number--; num_str = line.substr(posVec[3].offset, posVec[3].length); Poco::RegularExpression re_size("\\w*?([0-9]+)mm"); int slit_size = 0; re_size.match(num_str, 0, posVec); if (posVec.size()==2) { num_str = line.substr(posVec[1].offset, posVec[1].length); Poco::NumberParser::tryParse(num_str, slit_size); } m_slit_positions[wheel_number][slit_number] = slit_size; } } } }
/*********************************************************************** * Parse a single documentation block for markup **********************************************************************/ static Poco::JSON::Object::Ptr parseCommentBlockForMarkup(const CodeBlock &commentBlock) { Poco::JSON::Object::Ptr topObj(new Poco::JSON::Object()); Poco::JSON::Array calls; Poco::JSON::Array keywords; Poco::JSON::Array::Ptr aliases(new Poco::JSON::Array()); Poco::JSON::Array categories; Poco::JSON::Array params; Poco::JSON::Array::Ptr topDocs(new Poco::JSON::Array()); Poco::JSON::Object::Ptr currentParam; std::string state; std::string indent; std::string instruction; std::string payload; //search for the markup begin tag and record the indent for (const auto &codeLine : commentBlock) { std::string line = codeLine.text; Poco::RegularExpression::MatchVec matches; if (not state.empty()) { if (line.size() >= indent.size() and line.substr(0, indent.size()) != indent) { if (codeLine.lineNo == commentBlock.back().lineNo) line = ""; else throw Pothos::SyntaxException("Inconsistent indentation", codeLine.toString()); } if (line.size() >= indent.size()) line = line.substr(indent.size()); else line = ""; Poco::RegularExpression("^\\|(\\w+)\\s+(.*)$").match(line, 0, matches); if (not matches.empty()) { assert(matches.size() == 3); instruction = line.substr(matches[1].offset, matches[1].length); payload = line.substr(matches[2].offset, matches[2].length); } } if (state.empty()) { Poco::RegularExpression("^(.*)\\|PothosDoc\\s+(.*)$").match(line, 0, matches); if (matches.empty()) continue; assert(matches.size() == 3); indent = line.substr(matches[1].offset, matches[1].length); topObj->set("name", Poco::trim(line.substr(matches[2].offset, matches[2].length))); state = "DOC"; } else if (matches.empty() and state == "DOC") { topDocs->add(line); } else if (matches.empty() and state == "PARAM") { auto array = currentParam->getArray("desc"); array->add(line); currentParam->set("desc", stripDocArray(array)); } else if (instruction == "category" and state == "DOC") { categories.add(Poco::trim(payload)); } else if (instruction == "keywords" and state == "DOC") { for (const auto &keyword : Poco::StringTokenizer( payload, " \t", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY)) { keywords.add(Poco::trim(keyword)); } } else if (instruction == "alias" and state == "DOC") { const std::string alias(Poco::trim(payload)); try {Pothos::PluginPath(alias);} catch (const Pothos::PluginPathError &) { throw Pothos::SyntaxException("Invalid alias path", codeLine.toString()); } aliases->add(alias); } else if (instruction == "param" and (state == "DOC" or state == "PARAM")) { payload = bracketEscapeEncode(payload); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)(\\s*\\[(.*)\\]\\s*)?(.*)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |param key[name] description", codeLine.toString()); assert(fields.size() == 5); const std::string key = bracketEscapeDecode(Poco::trim(payload.substr(fields[1].offset, fields[1].length))); std::string name = titleCase(key); if (fields[3].length != 0) name = bracketEscapeDecode(Poco::trim(payload.substr(fields[3].offset, fields[3].length))); const std::string desc = bracketEscapeDecode(Poco::trim(payload.substr(fields[4].offset, fields[4].length))); currentParam = Poco::JSON::Object::Ptr(new Poco::JSON::Object()); params.add(currentParam); currentParam->set("key", key); currentParam->set("name", name); Poco::JSON::Array::Ptr descArr(new Poco::JSON::Array()); descArr->add(desc); currentParam->set("desc", descArr); state = "PARAM"; } else if (instruction == "default" and state == "PARAM") { if (currentParam->has("default")) throw Pothos::SyntaxException( "Multiple occurrence of |default for param", codeLine.toString()); currentParam->set("default", payload); } else if (instruction == "units" and state == "PARAM") { if (currentParam->has("units")) throw Pothos::SyntaxException( "Multiple occurrence of |units for param", codeLine.toString()); currentParam->set("units", payload); } else if (instruction == "widget" and state == "PARAM") { if (currentParam->has("widgetType")) throw Pothos::SyntaxException( "Multiple occurrence of |widget for param", codeLine.toString()); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)\\s*\\((.*)\\)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |widget SpinBox(args...)", codeLine.toString()); assert(fields.size() == 3); const std::string widgetType = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); const std::string argsStr = Poco::trim(payload.substr(fields[2].offset, fields[2].length)); currentParam->set("widgetType", widgetType); loadArgs(codeLine, *currentParam, argsStr, "widgetArgs", "widgetKwargs"); } else if (instruction == "tab" and state == "PARAM") { if (currentParam->has("tab")) throw Pothos::SyntaxException( "Multiple occurrence of |tab for param", codeLine.toString()); currentParam->set("tab", payload); } else if (instruction == "preview" and state == "PARAM") { if (currentParam->has("preview")) throw Pothos::SyntaxException( "Multiple occurrence of preview for param", codeLine.toString()); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)(\\s*\\((.*)\\))?$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |preview previewType(args...)", codeLine.toString()); assert(fields.size() == 2 or fields.size() == 4); const std::string previewType = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); if (previewType != "disable" and previewType != "enable" and previewType != "valid" and previewType != "invalid" and previewType != "when" ) throw Pothos::SyntaxException( "Only supports enable/disable/valid/invalid/when as value for preview option of param", codeLine.toString()); currentParam->set("preview", previewType); if (fields.size() == 4) { const std::string argsStr = Poco::trim(payload.substr(fields[3].offset, fields[3].length)); loadArgs(codeLine, *currentParam, argsStr, "previewArgs", "previewKwargs"); } } else if (instruction == "option" and state == "PARAM") { payload = bracketEscapeEncode(payload); Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^(\\s*\\[(.*)\\]\\s*)?(.*)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |option [name] value", codeLine.toString()); assert(fields.size() == 4); const std::string value = bracketEscapeDecode(Poco::trim(payload.substr(fields[3].offset, fields[3].length))); std::string name = titleCase(value); if (fields[2].length != 0) name = bracketEscapeDecode(Poco::trim(payload.substr(fields[2].offset, fields[2].length))); Poco::JSON::Object option; option.set("value", value); option.set("name", name); if (not currentParam->has("options")) currentParam->set( "options", Poco::JSON::Array::Ptr(new Poco::JSON::Array())); currentParam->getArray("options")->add(option); } else if (instruction == "factory" and (state == "DOC" or state == "PARAM")) { Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(/.*)\\s*\\((.*)\\)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |factory /registry/path(args...)", codeLine.toString()); assert(fields.size() == 3); const std::string path = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); const std::string argsStr = Poco::trim(payload.substr(fields[2].offset, fields[2].length)); //add the path try {Pothos::PluginPath(path);} catch (const Pothos::PluginPathError &) { throw Pothos::SyntaxException("Invalid factory path", codeLine.toString()); } if (topObj->has("path")) throw Pothos::SyntaxException( "Multiple occurrence of |factory", codeLine.toString()); topObj->set("path", path); //split and extract args loadArgs(codeLine, *topObj, argsStr); state = "DOC"; } else if ((instruction == "setter" or instruction == "initializer") and (state == "DOC" or state == "PARAM")) { Poco::RegularExpression::MatchVec fields; Poco::RegularExpression("^\\s*(\\w+)\\s*\\((.*)\\)$").match(payload, 0, fields); if (fields.empty()) throw Pothos::SyntaxException( "Expected |"+instruction+" setFooBar(args...)", codeLine.toString()); assert(fields.size() == 3); const std::string callName = Poco::trim(payload.substr(fields[1].offset, fields[1].length)); const std::string argsStr = Poco::trim(payload.substr(fields[2].offset, fields[2].length)); //add to calls Poco::JSON::Object call; call.set("type", instruction); call.set("name", callName); loadArgs(codeLine, call, argsStr); calls.add(call); state = "DOC"; } else if (instruction == "mode" and (state == "DOC" or state == "PARAM")) { if (topObj->has("mode")) throw Pothos::SyntaxException( "Multiple occurrence of |mode", codeLine.toString()); topObj->set("mode", payload); } } //empty state means this was a regular comment block, return null if (state.empty()) return Poco::JSON::Object::Ptr(); topDocs = stripDocArray(topDocs); if (topDocs->size() > 0) topObj->set("docs", topDocs); if (categories.size() > 0) topObj->set("categories", categories); if (keywords.size() > 0) topObj->set("keywords", keywords); if (aliases->size() > 0) topObj->set("aliases", aliases); if (params.size() > 0) topObj->set("params", params); if (calls.size() > 0) topObj->set("calls", calls); //sanity check for required stuff if (not topObj->has("path")) { throw Pothos::SyntaxException("missing |factory declaration"); } return topObj; }
void ofxTPSpriteData::determineAnimated() { Poco::RegularExpression reg("((?:(?![\\d]*[.].*$)[\\w\\s])+)([\\d]*)([.].*)$"); // int match(const std::string& subject, Match& mtch, int options = 0) const; Poco::RegularExpression::MatchVec matches; int numberOfMatches = reg.match(name, 0, matches); if(!matches.empty()){ if(matches[0].length != 0) { if (matches[2].length > 0) { if (matches[1].length > 0) { animationName = name.substr(matches[1].offset, matches[1].length); if(animationName.substr(animationName.size()-1, animationName.size()) == "_") { animationName = animationName.substr(0, animationName.size()-1); } } bAnimated = true; frame = ofToInt(name.substr(matches[2].offset, matches[2].length)); } else { bAnimated = false; } } else { ofLog(OF_LOG_ERROR, "ERROR: Filename format not recognised for " + name); } } else { // Make sure not to Trim names in Texture Packer! if you debug your way here! bAnimated = false; } //---------- CP-11 version /** if (reg.match(name, matches)) { if (subStrings.length(2) > 0) { if (subStrings.length(1) > 0) { animationName = subStrings[1]; } isAnimated = true; frame = ofToInt(subStrings[2]); } else { isAnimated = false; } } else { ofLog(OF_LOG_ERROR, "ERROR: Filename format not recognised for " + name); } smatch subStrings; regex expression ("((?:(?![\\d]*[.].*$)[\\w\\s])+)([\\d]*)([.].*)$"); if (regex_match(name, subStrings, expression)) { if (subStrings.length(2) > 0) { if (subStrings.length(1) > 0) { animationName = subStrings[1]; } isAnimated = true; frame = ofToInt(subStrings[2]); } else { isAnimated = false; } } else { ofLog(OF_LOG_ERROR, "ERROR: Filename format not recognised for " + name); } */ }