File indexing completed on 2024-06-02 04:01:01
0001 /* 0002 SPDX-FileCopyrightText: 2017 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: MIT 0005 */ 0006 0007 #include <config-userfeedback.h> 0008 0009 #include "surveytargetexpressionparser.h" 0010 #include "surveytargetexpression.h" 0011 0012 #ifdef HAVE_SURVEY_TARGET_EXPRESSIONS 0013 #include "surveytargetexpressionparser_p.h" 0014 #include "surveytargetexpressionscanner.h" 0015 #endif 0016 0017 #include <QString> 0018 0019 #include <cstring> 0020 0021 char* unquoteString(const char *str) 0022 { 0023 const auto size = strlen(str) - 2; 0024 if (size <= 0) 0025 return nullptr; 0026 auto out = (char*)malloc(size + 1); 0027 memset(out, 0, size + 1); 0028 auto outIt = out; 0029 for (auto it = str + 1; it < str + size + 1; ++it, ++outIt) { 0030 if (*it == '\\') { 0031 ++it; 0032 switch (*it) { 0033 case '\\': 0034 case '"': 0035 *outIt = *it; break; 0036 case 'n': 0037 *outIt = '\n'; break; 0038 case 't': 0039 *outIt = '\t'; break; 0040 default: 0041 *outIt++ = '\\'; 0042 *outIt = *it; 0043 } 0044 } else { 0045 *outIt = *it; 0046 } 0047 } 0048 return out; 0049 } 0050 0051 using namespace KUserFeedback; 0052 0053 SurveyTargetExpressionParser::SurveyTargetExpressionParser() 0054 : m_expression(nullptr) 0055 { 0056 } 0057 0058 SurveyTargetExpressionParser::~SurveyTargetExpressionParser() 0059 { 0060 delete m_expression; 0061 } 0062 0063 bool SurveyTargetExpressionParser::parse(const QString &s) 0064 { 0065 delete m_expression; 0066 m_expression = nullptr; 0067 0068 #ifdef HAVE_SURVEY_TARGET_EXPRESSIONS 0069 yyscan_t scanner; 0070 YY_BUFFER_STATE state; 0071 if (yylex_init(&scanner)) 0072 return false; 0073 0074 QByteArray b = s.toUtf8(); 0075 state = yy_scan_string(b.constData(), scanner); 0076 if (yyparse(&m_expression, scanner)) { 0077 delete m_expression; 0078 m_expression = nullptr; 0079 } 0080 0081 yy_delete_buffer(state, scanner); 0082 yylex_destroy(scanner); 0083 #endif 0084 return m_expression; 0085 } 0086 0087 SurveyTargetExpression* SurveyTargetExpressionParser::expression() const 0088 { 0089 return m_expression; 0090 }