File indexing completed on 2024-04-28 15:29:53

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 1998, 1999 Torben Weis <weis@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 // TODO: Torben: On error free memory!   (r932881 might serve as inspiration)
0009 
0010 extern "C" {
0011 #include "ktraderparse_p.h"
0012 
0013 void KTraderParse_mainParse(const char *_code);
0014 }
0015 
0016 #include "ktraderparsetree_p.h"
0017 
0018 #include <assert.h>
0019 #include <stdlib.h>
0020 
0021 #include "servicesdebug.h"
0022 #include <QThreadStorage>
0023 
0024 namespace KTraderParse
0025 {
0026 struct ParsingData {
0027     ParseTreeBase::Ptr ptr;
0028     QByteArray buffer;
0029 };
0030 
0031 }
0032 
0033 using namespace KTraderParse;
0034 
0035 Q_GLOBAL_STATIC(QThreadStorage<ParsingData *>, s_parsingData)
0036 
0037 ParseTreeBase::Ptr KTraderParse::parseConstraints(const QString &_constr)
0038 {
0039     ParsingData *data = new ParsingData();
0040     s_parsingData()->setLocalData(data);
0041     data->buffer = _constr.toUtf8();
0042     KTraderParse_mainParse(data->buffer.constData());
0043     ParseTreeBase::Ptr ret = data->ptr;
0044     s_parsingData()->setLocalData(nullptr);
0045     return ret;
0046 }
0047 
0048 void KTraderParse_setParseTree(void *_ptr1)
0049 {
0050     ParsingData *data = s_parsingData()->localData();
0051     data->ptr = static_cast<ParseTreeBase *>(_ptr1);
0052 }
0053 
0054 void KTraderParse_error(const char *err)
0055 {
0056     qCWarning(SERVICES) << "Parsing" << s_parsingData()->localData()->buffer << "gave:" << err;
0057 }
0058 
0059 void *KTraderParse_newOR(void *_ptr1, void *_ptr2)
0060 {
0061     return new ParseTreeOR(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2));
0062 }
0063 
0064 void *KTraderParse_newAND(void *_ptr1, void *_ptr2)
0065 {
0066     return new ParseTreeAND(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2));
0067 }
0068 
0069 void *KTraderParse_newCMP(void *_ptr1, void *_ptr2, int _i)
0070 {
0071     return new ParseTreeCMP(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2), _i);
0072 }
0073 
0074 void *KTraderParse_newIN(void *_ptr1, void *_ptr2, int _cs)
0075 {
0076     return new ParseTreeIN(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2), _cs == 1 ? Qt::CaseSensitive : Qt::CaseInsensitive);
0077 }
0078 
0079 void *KTraderParse_newSubstringIN(void *_ptr1, void *_ptr2, int _cs)
0080 {
0081     return new ParseTreeIN(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2), _cs == 1 ? Qt::CaseSensitive : Qt::CaseInsensitive, true);
0082 }
0083 
0084 void *KTraderParse_newMATCH(void *_ptr1, void *_ptr2, int _cs)
0085 {
0086     return new ParseTreeMATCH(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2), _cs == 1 ? Qt::CaseSensitive : Qt::CaseInsensitive);
0087 }
0088 
0089 void *KTraderParse_newSubsequenceMATCH(void *_ptr1, void *_ptr2, int _cs)
0090 {
0091     return new ParseTreeSubsequenceMATCH(static_cast<ParseTreeBase *>(_ptr1),
0092                                          static_cast<ParseTreeBase *>(_ptr2),
0093                                          _cs == 1 ? Qt::CaseSensitive : Qt::CaseInsensitive);
0094 }
0095 
0096 void *KTraderParse_newCALC(void *_ptr1, void *_ptr2, int _i)
0097 {
0098     return new ParseTreeCALC(static_cast<ParseTreeBase *>(_ptr1), static_cast<ParseTreeBase *>(_ptr2), _i);
0099 }
0100 
0101 void *KTraderParse_newBRACKETS(void *_ptr1)
0102 {
0103     return new ParseTreeBRACKETS(static_cast<ParseTreeBase *>(_ptr1));
0104 }
0105 
0106 void *KTraderParse_newNOT(void *_ptr1)
0107 {
0108     return new ParseTreeNOT(static_cast<ParseTreeBase *>(_ptr1));
0109 }
0110 
0111 void *KTraderParse_newEXIST(char *_ptr1)
0112 {
0113     ParseTreeEXIST *t = new ParseTreeEXIST(_ptr1);
0114     free(_ptr1);
0115     return t;
0116 }
0117 
0118 void *KTraderParse_newID(char *_ptr1)
0119 {
0120     ParseTreeID *t = new ParseTreeID(_ptr1);
0121     free(_ptr1);
0122     return t;
0123 }
0124 
0125 void *KTraderParse_newSTRING(char *_ptr1)
0126 {
0127     ParseTreeSTRING *t = new ParseTreeSTRING(_ptr1);
0128     free(_ptr1);
0129     return t;
0130 }
0131 
0132 void *KTraderParse_newNUM(int _i)
0133 {
0134     return new ParseTreeNUM(_i);
0135 }
0136 
0137 void *KTraderParse_newFLOAT(float _f)
0138 {
0139     return new ParseTreeDOUBLE(_f);
0140 }
0141 
0142 void *KTraderParse_newBOOL(char _b)
0143 {
0144     return new ParseTreeBOOL(_b);
0145 }
0146 
0147 void *KTraderParse_newMAX2(char *_id)
0148 {
0149     ParseTreeMAX2 *t = new ParseTreeMAX2(_id);
0150     free(_id);
0151     return t;
0152 }
0153 
0154 void *KTraderParse_newMIN2(char *_id)
0155 {
0156     ParseTreeMIN2 *t = new ParseTreeMIN2(_id);
0157     free(_id);
0158     return t;
0159 }
0160 
0161 void KTraderParse_destroy(void *node)
0162 {
0163     ParsingData *data = s_parsingData()->localData();
0164     ParseTreeBase *p = reinterpret_cast<ParseTreeBase *>(node);
0165     if (p != data->ptr.data()) {
0166         delete p;
0167     }
0168 }