std::ostream& AssignInsn::printTo(std::ostream& stream) const { getLhs()->printTo(stream); stream << " = "; if (isAssign()) { getRhs1()->printTo(stream); } else if (isUnary()) { stream << op; getRhs1()->printTo(stream); } else { getRhs1()->printTo(stream); stream << op; getRhs2()->printTo(stream); } return stream; }
static CondResult parseConditionString (const Key * meta, const Key * suffixList, Key * parentKey, Key * key, KeySet * ks, Operation op) { const char * conditionString = keyString (meta); const char * regexString1 = "(\\(((.*)?)\\))[[:space:]]*\\?"; const char * regexString2 = "\\?[[:space:]]*(\\(((.*)?)\\))"; const char * regexString3 = "[[:space:]]*:[[:space:]]*(\\(((.*)?)\\))"; regex_t regex1, regex2, regex3; CondResult ret; if ((ret = regcomp (®ex1, regexString1, REGEX_FLAGS_CONDITION))) { ELEKTRA_SET_ERROR (87, parentKey, "Couldn't compile regex: most likely out of memory"); // the regex compiles so the only // possible error would be out of // memory ksDel (ks); return ERROR; } if ((ret = regcomp (®ex2, regexString2, REGEX_FLAGS_CONDITION))) { ELEKTRA_SET_ERROR (87, parentKey, "Couldn't compile regex: most likely out of memory"); // the regex compiles so the only // possible error would be out of // memory regfree (®ex1); ksDel (ks); return ERROR; } if ((ret = regcomp (®ex3, regexString3, REGEX_FLAGS_CONDITION))) { ELEKTRA_SET_ERROR (87, parentKey, "Couldn't compile regex: most likely out of memory"); // the regex compiles so the only // possible error would be out of // memory regfree (®ex1); regfree (®ex2); ksDel (ks); return ERROR; } int subMatches = 6; regmatch_t m[subMatches]; int nomatch = regexec (®ex1, conditionString, subMatches, m, 0); if (nomatch) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", conditionString); regfree (®ex1); regfree (®ex2); regfree (®ex3); ksDel (ks); return ERROR; } if (m[1].rm_so == -1) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", conditionString); regfree (®ex1); regfree (®ex2); regfree (®ex3); ksDel (ks); return ERROR; } int startPos = m[1].rm_so; int endPos = m[1].rm_eo; char * condition = elektraMalloc (endPos - startPos + 1); char * thenexpr = NULL; char * elseexpr = NULL; strncpy (condition, conditionString + startPos, endPos - startPos); condition[endPos - startPos] = '\0'; nomatch = regexec (®ex2, conditionString, subMatches, m, 0); if (nomatch) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", conditionString); regfree (®ex1); regfree (®ex2); regfree (®ex3); ksDel (ks); return ERROR; } if (m[1].rm_so == -1) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", conditionString); regfree (®ex1); regfree (®ex2); regfree (®ex3); ksDel (ks); return ERROR; } startPos = m[1].rm_so; endPos = m[1].rm_eo; thenexpr = elektraMalloc (endPos - startPos + 1); strncpy (thenexpr, conditionString + startPos, endPos - startPos); thenexpr[endPos - startPos] = '\0'; nomatch = regexec (®ex3, conditionString, subMatches, m, 0); if (!nomatch) { if (m[1].rm_so == -1) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", conditionString); regfree (®ex1); regfree (®ex2); regfree (®ex3); ksDel (ks); return ERROR; } thenexpr[strlen (thenexpr) - ((m[0].rm_eo - m[0].rm_so))] = '\0'; startPos = m[1].rm_so; endPos = m[1].rm_eo; elseexpr = elektraMalloc (endPos - startPos + 1); strncpy (elseexpr, conditionString + startPos, endPos - startPos); elseexpr[endPos - startPos] = '\0'; } ret = parseCondition (key, condition, suffixList, ks, parentKey); if (ret == TRUE) { if (op == ASSIGN) { const char * assign = isAssign (key, thenexpr, parentKey, ks); if (assign != NULL) { keySetString (key, assign); ret = TRUE; goto CleanUp; } else { ret = ERROR; goto CleanUp; } } else { ret = parseCondition (key, thenexpr, suffixList, ks, parentKey); if (ret == FALSE) { ELEKTRA_SET_ERRORF (135, parentKey, "Validation of Key %s: %s failed. (%s failed)", keyName (key) + strlen (keyName (parentKey)) + 1, conditionString, thenexpr); } else if (ret == ERROR) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", thenexpr); } } } else if (ret == FALSE) { if (elseexpr) { if (op == ASSIGN) { const char * assign = isAssign (key, elseexpr, parentKey, ks); if (assign != NULL) { keySetString (key, assign); ret = TRUE; goto CleanUp; } else { ret = ERROR; goto CleanUp; } } else { ret = parseCondition (key, elseexpr, suffixList, ks, parentKey); if (ret == FALSE) { ELEKTRA_SET_ERRORF (135, parentKey, "Validation of Key %s: %s failed. (%s failed)", keyName (key) + strlen (keyName (parentKey)) + 1, conditionString, elseexpr); } else if (ret == ERROR) { ELEKTRA_SET_ERRORF ( 134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", elseexpr); } } } else { ret = NOEXPR; } } else if (ret == ERROR) { ELEKTRA_SET_ERRORF (134, parentKey, "Invalid syntax: \"%s\". Check kdb info conditionals for additional information", condition); } CleanUp: elektraFree (condition); elektraFree (thenexpr); if (elseexpr) elektraFree (elseexpr); regfree (®ex1); regfree (®ex2); regfree (®ex3); ksDel (ks); return ret; }