File indexing completed on 2023-09-24 04:11:10
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 }