void WriteRegistryInstance::startExecution() { #ifdef Q_OS_WIN bool ok = true; ActionTools::Registry::Key key = evaluateListElement<ActionTools::Registry::Key>(ok, ReadRegistryInstance::keys, "key"); QString subKey = evaluateString(ok, "subKey"); QString value = evaluateString(ok, "value"); QScriptValue data = evaluateValue(ok, "data"); if(!ok) return; switch(ActionTools::Registry::write(data.toVariant(), key, subKey, value)) { case ActionTools::Registry::WriteCannotFindSubKey: setCurrentParameter("subKey"); emit executionException(CannotFindSubKeyException, tr("Cannot find subKey \"%1\"").arg(subKey)); return; case ActionTools::Registry::WriteCannotWriteValue: setCurrentParameter("value"); emit executionException(CannotWriteValueException, tr("Cannot write value \"%1\"").arg(value)); return; default: break; } #endif emit executionEnded(); }
double valueToDouble(Value* v) { double d, n; BoolExpr* be; Value* u; List* node; n = 0.0; if (v->type == 'n') return *(double*)v->data; if (v->type == 's') return atof(((String*)v->data)->val); if (v->type == 'b') { be = evaluateBoolExpr((BoolExpr*)v); if (be == NULL) return NAN; return (double)(be->lasteval); } if (v->type == 'c') { u = (Value*)evaluateFuncVal((FuncVal*)v); if (u == NULL) return NAN; d = valueToDouble(u); freeValue(u); return d; } if (v->type == 'd') return valueToDouble(evaluateStatements(v->data)); if (v->type == 'l') { if (!v->data) return 0.0; for (node = ((List*)v->data)->next;node != NULL;node = node->next) { u = evaluateValue(node->data); d = valueToDouble(u); freeValue(u); if (d < 0) return d; n += d; } return n; } if (v->type == 'v') { u = evaluateValue(v); if (u == NULL) return NAN; n = valueToDouble(u); } return n; }
Value* evaluateFuncVal(FuncVal* fv) { FuncDef* fd; Value* v, *u; v = fv->val; u = NULL; fd = NULL; if (v->type != 'a') { u = v; v = evaluateValue(u); } if (v == NULL || v->type != 'a') { errmsgf("Attempt to use non-function '%s' as a functor", fv->name); v = NULL; } if (v != NULL) { fd = v->data; } if (fd == NULL || (v = (*fd->evaluate)(fd, fv->arglist)) == NULL) { errmsgfd("In %s at line %d", fv->name, fv->lineno); return NULL; } return v; }
char* valueToString(Value* v) { char* s, *t; int i, j, l, freet; double a, b, c; BoolExpr* be; Value* u; List* node; freet = 0; l = 0; t = NULL; if (v->type == 'v') { u = evaluateValue(v); if (u == NULL) return NULL; s = valueToString(u); if (s == NULL) return NULL; return s; } if (v->type == 'i') { u = evaluateValue(v); if (u == NULL) return NULL; s = valueToString(u); return s; } if (v->type == 'n') { l = 32; i = l; s = malloc(l); l = snprintf(s, l, "%g", *(double*)v->data); if (i<l) { s = realloc(s, l); snprintf(s, l, "%g", *(double*)v->data); } return s; } if (v->type == '0' || v->type == 'b') { if (v->type == 'b') { be = evaluateBoolExpr((BoolExpr*)v); if (be == NULL) return NULL; l = be->lasteval; } if (l) { s = malloc(5); s[0] = 't'; s[1] = 'r'; s[2] = 'u'; s[3] = 'e'; s[4] = '\0'; } else { s = malloc(6); s[0] = 'f'; s[1] = 'a'; s[2] = 'l'; s[3] = 's'; s[4] = 'e'; s[5] = '\0'; } return s; } if (v->type == 'r') { a = valueToDouble(((Range*)v)->start); c = valueToDouble(((Range*)v)->end); if (((Range*)v)->increment == falsevalue) { b = 1.0; if (c<a) b = -1.0; } else { b = valueToDouble(((Range*)v)->increment); } s = malloc(1); if ((c-a)/b < 0) { s[0] = '\0'; return s; } l = 1; if (a<c) { for (;a<c;a += b) { l += snprintf(s, 0, "%d, ", (int)a); } } else if (c<a) { for (;c<a;a += b) { l += snprintf(s, 0, "%d, ", (int)a); } } free(s); s = malloc(l); a = valueToDouble(((Range*)v)->start); i = 0; if (a<c) { for (;a<c;a += b) { i += snprintf(s+i, l, "%d, ", (int)a); } } else if (c<a) { for (;c<a;a += b) { i += snprintf(s+i, l-i, "%d, ", (int)a); } } i--; s[--i] = '\0'; return s; } if (v->type == 'l') { s = malloc(4); s[0] = '['; i = 0; node = NULL; if (v->data) node = ((List*)v->data)->next; for (;node != NULL;node = node->next) { if (i) s[i] = ' '; i++; u = evaluateValue(node->data); if (u == NULL) { free(s); return NULL; } t = valueToString(u); freeValue(u); if (t == NULL) { free(s); return NULL; } l = strlen(t); s = realloc(s, i+l+2); for (j=0;j<l;j++) { s[i+j] = t[j]; } s[i+++j] = ','; s[i+j] = '\0'; i += l; free(t); } if (!i) i = 2; s[--i] = ']'; s[++i] = '\0'; return s; } if (v->type == 'c') { u = evaluateFuncVal((FuncVal*)v); if (u == NULL) return NULL; s = valueToString(u); freeValue(u); return s; } if (v->type == 'd') { u = evaluateStatements(v->data); if (u == NULL) return NULL; s = valueToString(u); freeValue(u); return s; } if (v->type == 's' || v->type == 'x') { t = ((String*)v->data)->val; } if (t == NULL) return NULL; l = strlen(t); s = malloc(l+1); for (i=0;i<l;i++) { s[i] = t[i]; } s[i] = '\0'; if (freet) free(t); return s; }
BoolExpr* evaluateBoolExpr(BoolExpr* be) { int m, p, erroff, ovec[PCREOVECCOUNT]; double j, k, **n, *o; char* c, *s, *t; const char* err; List* stack, *prop, *stackiter; Value* v, *u, *w; pcre *re; re = NULL; stack = be->stack; for (m=0;stack->next && stack->next->next;m++) stack = stack->next->next; n = malloc((m+2)*sizeof(double*)); m = -1; stack = newList(); o = NULL; stackiter = be->stack; while (stackiter) { s = NULL; t = NULL; w = NULL; v = NULL; u = stackiter->data; if (u->type == '|' || u->type == '&') { addToListEnd(stack, n[m]); addToListEnd(stack, u); stackiter = stackiter->next; continue; } n[++m] = calloc(1, sizeof(double)); if (u->type != 'b') { v = evaluateValue(u); w = v; if (v == NULL) { freeList(stack); m++; for (p=0;p<m;p++) { free(n[p]); } free(n); return NULL; } if (v->type == 's') { s = v->data; } j = evaluateValueAsBool(v); if (u->type != 'v') freeValue(v); } else { j = evaluateValueAsBool(u); } if (isnan(j)) { m++; for (p=0;p<m;p++) { free(n[p]); } free(n); freeList(stack); return NULL; } stackiter = stackiter->next; if (j) *n[m] = 1; if (!stackiter) { break; } c = (char*)stackiter->data; stackiter = stackiter->next; if (c[0] == '|' || c[0] == '&') { addToListEnd(stack, n[m]); addToListEnd(stack, c); continue; } n[++m] = calloc(1, sizeof(double)); u = stackiter->data; if (u->type != 'b') { v = evaluateValue(u); if (v == NULL) { freeList(stack); m++; for (p=0;p<m;p++) { free(n[p]); } free(n); return NULL; } if (v->type == 's') { t = v->data; } if (u->type != 'v') freeValue(v); } k = evaluateValueAsBool(stackiter->data); if (isnan(k)) { m++; for (p=0;p<m;p++) { free(n[p]); } free(n); freeList(stack); return NULL; } stackiter = stackiter->next; if (c[0] == '~') { if (w == NULL) { continue; } s = valueToString(w); t = valueToString(v); re = pcre_compile(t, 0, &err, &erroff, NULL); if (pcre_exec(re, NULL, s, strlen(s), 0, 0, ovec, PCREOVECCOUNT) > -1) *n[m] = 1; free(s); free(t); if (re) pcre_free(re); continue; } if (c[0] == '?') { if (w == NULL || v == NULL) continue; if (w->type == v->type) { if (v->type != 'l' || ((List*)v->data)->data == NULL) { *n[m] = 1; continue; } prop = ((List*)((List*)v->data)->data)->next; while (prop != NULL) { if (!findInTree(((List*)((List*)w->data)->data)->data, ((Variable*)prop->data)->name)) break; prop = prop->next; } if (prop == NULL) *n[m] = 1; } } if (t != NULL && s != NULL) { if (s == t && c[0] == '=') { *n[m] = 1; continue; } for (p=0;s[p] != '\0' && s[p] == t[p];p++); if ((c[0] == '<' && s[p] < t[p]) || (c[0] == '>' && s[p] > t[p])) *n[m] = 1; continue; } p = 0; if (c[0] == '=') { if (fabs(j) < IOTA) { if (j < 0) j = -0.0; else j = 0.0; } if (fabs(k) < IOTA) { if (k < 0) k = -0.0; else k = 0.0; } } if (j>k) { if (j<=0.0) { if (fabs((j-k)/k)>=EPSILON) p = 1; } else { if (fabs((j-k)/j)>=EPSILON) p = 1; } } else { if (k<=0.0) { if (fabs((k-j)/j)>=EPSILON) p = -1; } else { if (fabs((k-j)/k)>=EPSILON) p = -1; } } if ((c[0] == '<' && p<0) || (c[0] == '>' && p>0) || (c[0] == '=' && !p)) { *n[m] = 1; } } if (m > -1) o = n[m]; if (stack->data && m > -1) { addToListEnd(stack, n[m]); } m++; stackiter = NULL; if (stack->data) stackiter = stack; while (stackiter) { j = *(double*)stackiter->data; if (!(stackiter->next)) { o = (double*)stackiter->data; if (j) *o = 1; else *o = 0; break; } stackiter = stackiter->next; c = stackiter->data; stackiter = stackiter->next; o = (double*)stackiter->data; k = *o; if (((j && k) && c[0] == '&') || ((j || k) && c[0] == '|')) *o = 1; else *o = 0; } if (o == NULL) be->lasteval = 1; else be->lasteval = *o; for (p=0;p<m;p++) { free(n[p]); } free(n); freeList(stack); if (be->neg) be->lasteval = !be->lasteval; return be; }
static ERR_EXISTS evaluateExpression(QueryExpression *qexp, int col, int row, PixImg *target, PixImg *in, PixImg *out, Number *n, PixErr *err) { Number na, nb; if(qexp->a) if(!evaluateExpression(qexp->a,col,row,target,in,out,&na,err)) return ERR; if(qexp->b) if(!evaluateExpression(qexp->b,col,row,target,in,out,&nb,err)) return ERR; switch(qexp->type) { case QUERY_EXPRESSION_TYPE_OR: { if(na.type == NUMBER_TYPE_REAL || nb.type == NUMBER_TYPE_REAL) ERROR("OR of real unsupported (cast to int)"); n->type = NUMBER_TYPE_INT; n->i = na.i || nb.i; } break; case QUERY_EXPRESSION_TYPE_AND: { if(na.type == NUMBER_TYPE_REAL || nb.type == NUMBER_TYPE_REAL) ERROR("AND of real unsupported (cast to int)"); n->type = NUMBER_TYPE_INT; n->i = na.i && nb.i; } break; case QUERY_EXPRESSION_TYPE_NOT: { switch(na.type) { case NUMBER_TYPE_INT: n->type = NUMBER_TYPE_INT; n->i = (na.i == 0); break; case NUMBER_TYPE_REAL: n->type = NUMBER_TYPE_INT; n->i = (na.r == 0.0f); break; default: break; //shouldn't happen } } break; case QUERY_EXPRESSION_TYPE_EQ: { if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i == nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i == nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.r == (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r == nb.r); } } break; case QUERY_EXPRESSION_TYPE_NE: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i != nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i != nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.r != (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r != nb.r); } break; case QUERY_EXPRESSION_TYPE_LT: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i < nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i < nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.r < (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r < nb.r); } break; case QUERY_EXPRESSION_TYPE_LTE: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i <= nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i <= nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.r <= (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r <= nb.r); } break; case QUERY_EXPRESSION_TYPE_GTE: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i >= nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i >= nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.r >= (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r >= nb.r); } break; case QUERY_EXPRESSION_TYPE_GT: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i > nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = ((double)na.i > nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.r > (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_INT; n->i = (na.r > nb.r); } break; case QUERY_EXPRESSION_TYPE_SUB: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i - nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i - nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = (na.r - (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r - nb.r); } break; case QUERY_EXPRESSION_TYPE_ADD: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i + nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i + nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = (na.r + (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r + nb.r); } break; case QUERY_EXPRESSION_TYPE_DIV: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { if((na.i/nb.i)*nb.i == na.i) //aka "if integer division is lossless" { n->type = NUMBER_TYPE_INT; n->i = (na.i / nb.i); } else { n->type = NUMBER_TYPE_REAL; n->r = ((float)na.i / (float)nb.i); } } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i / nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = (na.r / (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r / nb.r); } break; case QUERY_EXPRESSION_TYPE_MUL: if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = (na.i * nb.i); } else if(na.type == NUMBER_TYPE_INT && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = ((double)na.i * nb.r); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = (na.r * (double)nb.i); } else if(na.type == NUMBER_TYPE_REAL && nb.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = (na.r * nb.r); } break; case QUERY_EXPRESSION_TYPE_MOD: if(na.type == NUMBER_TYPE_REAL || nb.type == NUMBER_TYPE_REAL) ERROR("Modulus of real unsupported (cast to int)"); n->type = NUMBER_TYPE_INT; n->i = (na.i % nb.i); break; case QUERY_EXPRESSION_TYPE_SIN: if(na.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = sin((double)na.i); } if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = sin(na.r); } break; case QUERY_EXPRESSION_TYPE_COS: if(na.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = cos((double)na.i); } if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = cos(na.r); } break; case QUERY_EXPRESSION_TYPE_TAN: if(na.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_REAL; n->r = tan((double)na.i); } if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = tan(na.r); } break; case QUERY_EXPRESSION_TYPE_ABS: if(na.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = abs((int)na.i); } if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = fabs(na.r); } break; case QUERY_EXPRESSION_TYPE_NEG: if(na.type == NUMBER_TYPE_INT) { n->type = NUMBER_TYPE_INT; n->i = -1 * na.i; } if(na.type == NUMBER_TYPE_REAL) { n->type = NUMBER_TYPE_REAL; n->r = -1.0f * na.r; } break; case QUERY_EXPRESSION_TYPE_VALUE: if(!evaluateValue(&qexp->v,col,row,target,in,out,n,err)) return ERR; break; case QUERY_EXPRESSION_TYPE_INVALID: default: ERROR("Invalid query expression type"); break; } return NO_ERR; }