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 }