static rpmRC rpmdsParseRichDepCB(void *cbdata, rpmrichParseType type, const char *n, int nl, const char *e, int el, rpmsenseFlags sense, rpmrichOp op, char **emsg) { struct rpmdsParseRichDepData *data = cbdata; rpmds ds = 0; if (type == RPMRICH_PARSE_ENTER) data->depth++; else if (type == RPMRICH_PARSE_LEAVE) { if (--data->depth == 0 && data->dochain && data->rightstart) { /* chain op hack, construct a sub-ds from the right side of the chain */ char *right = xmalloc(n + nl - data->rightstart + 2); right[0] = '('; strncpy(right + 1, data->rightstart, n + nl - data->rightstart); right[n + nl - data->rightstart + 1] = 0; data->rightds = rpmdsFree(data->rightds); ds = singleDS(data->dep->pool, data->dep->tagN, 0, 0, RPMSENSE_RICH | data->depflags, 0, 0, 0); ds->N[0] = rpmstrPoolId(ds->pool, right, 1); ds->EVR[0] = rpmstrPoolId(ds->pool, "", 1); data->rightds = ds; free(right); } } if (data->depth != 1) return RPMRC_OK; /* we're only interested in top-level parsing */ if ((type == RPMRICH_PARSE_SIMPLE || type == RPMRICH_PARSE_LEAVE) && !data->dochain) { if (type == RPMRICH_PARSE_LEAVE) sense = RPMSENSE_RICH; else if (data->dep->tagN == RPMTAG_REQUIRENAME && nl > 7 && rstreqn(n, "rpmlib(", sizeof("rpmlib(")-1)) sense |= RPMSENSE_RPMLIB; ds = singleDS(data->dep->pool, data->dep->tagN, 0, 0, sense | data->depflags, 0, 0, 0); ds->N[0] = rpmstrPoolIdn(ds->pool, n, nl, 1); ds->EVR[0] = rpmstrPoolIdn(ds->pool, e ? e : "", el, 1); if (!data->leftds) data->leftds = ds; else { data->rightds = ds; data->rightstart = n; } } if (type == RPMRICH_PARSE_OP) { if (data->op != RPMRICHOP_SINGLE) data->dochain = 1; /* this is a chained op */ else data->op = op; } return RPMRC_OK; }
rpmds rpmdsThis(Header h, rpmTagVal tagN, rpmsenseFlags Flags) { char *evr = headerGetAsString(h, RPMTAG_EVR); rpmds ds = singleDS(tagN, headerGetString(h, RPMTAG_NAME), evr, Flags, headerGetInstance(h), 0); free(evr); return ds; }
rpmds rpmdsCurrent(rpmds ds) { rpmds cds = NULL; if (ds != NULL && ds->i >= 0 && ds->i < ds->Count) { cds = singleDS(ds->tagN, ds->N[ds->i], ds->EVR[ds->i], ds->Flags[ds->i], ds->instance, rpmdsColor(ds)); } return cds; }
rpmds rpmdsSingle(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags) { return singleDS(tagN, N, EVR, Flags, 0, 0); }
rpmds rpmdsSinglePoolTix(rpmstrPool pool,rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags, int triggerIndex) { return singleDS(pool, tagN, N, EVR, Flags, 0, 0, triggerIndex); }
rpmds rpmdsSinglePool(rpmstrPool pool,rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags) { return singleDS(pool, tagN, N, EVR, Flags, 0, 0, 0); }