Solid
predicateparse.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 extern "C"
00021 {
00022 #include "predicateparse.h"
00023
00024 void PredicateParse_mainParse(const char *_code);
00025 }
00026
00027 #include "predicate.h"
00028
00029 #include <stdlib.h>
00030
00031 #include <QtCore/QStringList>
00032
00033 static Solid::Predicate *s_result = 0;
00034
00035 Solid::Predicate Solid::Predicate::fromString(const QString &predicate)
00036 {
00037 PredicateParse_mainParse(predicate.toAscii());
00038
00039 if (s_result == 0)
00040 {
00041 return Predicate();
00042 }
00043 else
00044 {
00045 Predicate result(*s_result);
00046 delete s_result;
00047 s_result = 0;
00048 return result;
00049 }
00050 }
00051
00052
00053 void PredicateParse_setResult(void *result)
00054 {
00055 s_result = (Solid::Predicate *) result;
00056 }
00057
00058 void PredicateParse_errorDetected()
00059 {
00060 s_result = 0;
00061 }
00062
00063 void PredicateParse_destroy(void *pred)
00064 {
00065 Solid::Predicate *p = (Solid::Predicate *) pred;
00066 if (p != s_result) {
00067 delete p;
00068 }
00069 }
00070
00071 void *PredicateParse_newAtom(char *interface, char *property, void *value)
00072 {
00073 QString iface(interface);
00074 QString prop(property);
00075 QVariant *val = (QVariant *)value;
00076
00077 Solid::Predicate *result = new Solid::Predicate(iface, prop, *val);
00078
00079 delete val;
00080 free(interface);
00081 free(property);
00082
00083 return result;
00084 }
00085
00086 void *PredicateParse_newMaskAtom(char *interface, char *property, void *value)
00087 {
00088 QString iface(interface);
00089 QString prop(property);
00090 QVariant *val = (QVariant *)value;
00091
00092 Solid::Predicate *result = new Solid::Predicate(iface, prop, *val, Solid::Predicate::Mask);
00093
00094 delete val;
00095 free(interface);
00096 free(property);
00097
00098 return result;
00099 }
00100
00101
00102 void *PredicateParse_newIsAtom(char *interface)
00103 {
00104 QString iface(interface);
00105
00106 Solid::Predicate *result = new Solid::Predicate(iface);
00107
00108 free(interface);
00109
00110 return result;
00111 }
00112
00113
00114 void *PredicateParse_newAnd(void *pred1, void *pred2)
00115 {
00116 Solid::Predicate *result = new Solid::Predicate();
00117
00118 Solid::Predicate *p1 = (Solid::Predicate *)pred1;
00119 Solid::Predicate *p2 = (Solid::Predicate *)pred2;
00120
00121 if (p1==s_result || p2==s_result) {
00122 s_result = 0;
00123 }
00124
00125 *result = *p1 & *p2;
00126
00127 delete p1;
00128 delete p2;
00129
00130 return result;
00131 }
00132
00133
00134 void *PredicateParse_newOr(void *pred1, void *pred2)
00135 {
00136 Solid::Predicate *result = new Solid::Predicate();
00137
00138 Solid::Predicate *p1 = (Solid::Predicate *)pred1;
00139 Solid::Predicate *p2 = (Solid::Predicate *)pred2;
00140
00141 if (p1==s_result || p2==s_result) {
00142 s_result = 0;
00143 }
00144
00145 *result = *p1 | *p2;
00146
00147 delete p1;
00148 delete p2;
00149
00150 return result;
00151 }
00152
00153
00154 void *PredicateParse_newStringValue(char *val)
00155 {
00156 QString s(val);
00157
00158 free(val);
00159
00160 return new QVariant(s);
00161 }
00162
00163
00164 void *PredicateParse_newBoolValue(int val)
00165 {
00166 bool b = (val != 0);
00167 return new QVariant(b);
00168 }
00169
00170
00171 void *PredicateParse_newNumValue(int val)
00172 {
00173 return new QVariant(val);
00174 }
00175
00176
00177 void *PredicateParse_newDoubleValue(double val)
00178 {
00179 return new QVariant(val);
00180 }
00181
00182
00183 void *PredicateParse_newEmptyStringListValue()
00184 {
00185 return new QVariant(QStringList());
00186 }
00187
00188
00189 void *PredicateParse_newStringListValue(char *name)
00190 {
00191 QStringList list;
00192 list << QString(name);
00193
00194 free(name);
00195
00196 return new QVariant(list);
00197 }
00198
00199
00200 void *PredicateParse_appendStringListValue(char *name, void *list)
00201 {
00202 QVariant *variant = (QVariant *)list;
00203
00204 QStringList new_list = variant->toStringList();
00205
00206 new_list << QString(name);
00207
00208 delete variant;
00209 free(name);
00210
00211 return new QVariant(new_list);
00212 }