static JSBool rpmhdr_sprintf(JSContext *cx, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(cx , vp); JSObject *obj = JS_NewObjectForConstructor(cx , vp); if(!obj) { JS_ReportError(cx , "Failed to create 'this' object"); return JS_FALSE; } void * ptr = JS_GetInstancePrivate(cx, obj, &rpmhdrClass, NULL); Header h = ptr; char * qfmt = NULL; const char * s = NULL; const char * errstr = NULL; JSBool ok = JS_FALSE; _METHOD_DEBUG_ENTRY(_debug); if (!(ok = JS_ConvertArguments(cx, argc, argv, "s", &qfmt))) goto exit; if ((s = headerSprintf(h, qfmt, NULL, rpmHeaderFormats, &errstr)) == NULL) s = errstr; /* XXX FIXME: returning errstr in-band. */ JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, s))); ok = JS_TRUE; exit: return ok; }
/* --- Object methods */ static VALUE rpmhdr_sprintf(VALUE s, VALUE v) { Header h = rpmhdr_ptr(s); const char *qfmt = StringValueCStr(v); const char *q; const char *errstr = NULL; if (_debug) fprintf(stderr, "==> %s(0x%lx, 0x%lx) h %p\n", __FUNCTION__, s, v, h); if ((q = headerSprintf(h, qfmt, NULL, rpmHeaderFormats, &errstr)) == NULL) q = errstr; return rb_str_new2(q); }
int addReqProv(/*@unused@*/ Spec spec, Header h, /*@unused@*/ rpmTag tagN, const char * N, const char * EVR, rpmsenseFlags Flags, rpmuint32_t index) { HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he)); const char ** names; rpmTag nametag = 0; rpmTag versiontag = 0; rpmTag flagtag = 0; rpmTag indextag = 0; int len; rpmsenseFlags extra = RPMSENSE_ANY; int xx; if (Flags & RPMSENSE_PROVIDES) { nametag = RPMTAG_PROVIDENAME; versiontag = RPMTAG_PROVIDEVERSION; flagtag = RPMTAG_PROVIDEFLAGS; extra = Flags & RPMSENSE_FIND_PROVIDES; } else if (Flags & RPMSENSE_OBSOLETES) { nametag = RPMTAG_OBSOLETENAME; versiontag = RPMTAG_OBSOLETEVERSION; flagtag = RPMTAG_OBSOLETEFLAGS; } else if (Flags & RPMSENSE_CONFLICTS) { nametag = RPMTAG_CONFLICTNAME; versiontag = RPMTAG_CONFLICTVERSION; flagtag = RPMTAG_CONFLICTFLAGS; } else if (Flags & RPMSENSE_TRIGGER) { nametag = RPMTAG_TRIGGERNAME; versiontag = RPMTAG_TRIGGERVERSION; flagtag = RPMTAG_TRIGGERFLAGS; indextag = RPMTAG_TRIGGERINDEX; extra = Flags & RPMSENSE_TRIGGER; } else { nametag = RPMTAG_REQUIRENAME; versiontag = RPMTAG_REQUIREVERSION; flagtag = RPMTAG_REQUIREFLAGS; extra = Flags & _ALL_REQUIRES_MASK; } Flags = (Flags & RPMSENSE_SENSEMASK) | extra; if (EVR == NULL) EVR = ""; #if defined(RPM_VENDOR_MANDRIVA) /* Check that provide isn't duplicate of package */ else if (nametag == RPMTAG_PROVIDENAME) { const char *NEVR; size_t len; int duplicate; len = strlen(N); NEVR = headerSprintf(h, "%{NAME}-%|EPOCH?{%{EPOCH}:}|%{VERSION}-%{RELEASE}", NULL, NULL, NULL); duplicate = !strncmp(NEVR, N, len) && !strcmp(NEVR+len+1, EVR); _free(NEVR); if (duplicate) return 0; } #endif /* Check for duplicate dependencies. */ he->tag = nametag; xx = headerGet(h, he, 0); names = he->p.argv; len = he->c; if (xx) { const char ** versions = NULL; rpmuint32_t * flags = NULL; rpmuint32_t * indexes = NULL; int duplicate = 0; if (flagtag) { he->tag = versiontag; xx = headerGet(h, he, 0); versions = he->p.argv; he->tag = flagtag; xx = headerGet(h, he, 0); flags = he->p.ui32p; } if (indextag) { he->tag = indextag; xx = headerGet(h, he, 0); indexes = he->p.ui32p; } while (len > 0) { len--; if (strcmp(names[len], N)) continue; #if defined(RPM_VENDOR_MANDRIVA) /* filter-overlapping-dependencies */ /* XXX: Potential drawbacks? Need to study & discuess this one a * bit further, leaving under #ifdef for now... * TODO: auto-generated deps too */ if (flagtag && versions != NULL) { int overlap; if(*EVR && !*versions[len]) { overlap = 1; flags[len] = Flags; he->tag = flagtag; he->t = RPM_UINT32_TYPE; he->p.argv = (void *) &Flags; xx = headerMod(h, he, 0); } else { EVR_t lEVR = rpmEVRnew(RPMSENSE_ANY, 0), rEVR = rpmEVRnew(RPMSENSE_ANY, 0); rpmEVRparse(EVR, lEVR); rpmEVRparse(versions[len], rEVR); lEVR->Flags = Flags | RPMSENSE_EQUAL; rEVR->Flags = flags[len] | RPMSENSE_EQUAL; overlap = rpmEVRoverlap(lEVR, rEVR); if (!overlap) if (rpmEVRoverlap(rEVR, lEVR)) duplicate = 1; lEVR = rpmEVRfree(lEVR); rEVR = rpmEVRfree(rEVR); } if (overlap) { versions[len] = EVR; he->tag = versiontag; he->t = RPM_STRING_ARRAY_TYPE; he->p.argv = versions; xx = headerMod(h, he, 0); } else continue; } #else if (flagtag && versions != NULL && (strcmp(versions[len], EVR) || (rpmsenseFlags)flags[len] != Flags)) continue; #endif if (indextag && indexes != NULL && indexes[len] != index) continue; /* This is a duplicate dependency. */ duplicate = 1; break; } /*@-usereleased@*/ names = _free(names); versions = _free(versions); flags = _free(flags); indexes = _free(indexes); /*@=usereleased@*/ if (duplicate) return 0; } /* Add this dependency. */ he->tag = nametag; he->t = RPM_STRING_ARRAY_TYPE; he->p.argv = &N; he->c = 1; he->append = 1; xx = headerPut(h, he, 0); he->append = 0; if (flagtag) { he->tag = versiontag; he->t = RPM_STRING_ARRAY_TYPE; he->p.argv = &EVR; he->c = 1; he->append = 1; xx = headerPut(h, he, 0); he->append = 0; he->tag = flagtag; he->t = RPM_UINT32_TYPE; he->p.ui32p = (void *) &Flags; he->c = 1; he->append = 1; xx = headerPut(h, he, 0); he->append = 0; } if (indextag) { he->tag = indextag; he->t = RPM_UINT32_TYPE; he->p.ui32p = &index; he->c = 1; he->append = 1; xx = headerPut(h, he, 0); he->append = 0; } return 0; }
/** * Print copy of spec file, filling in Group/Description/Summary from specspo. * @param spec spec file control structure */ static void printNewSpecfile(Spec spec) /*@globals fileSystem, internalState @*/ /*@modifies spec->sl->sl_lines[], spec->packages->header, fileSystem, internalState @*/ { HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he)); Header h; speclines sl = spec->sl; spectags st = spec->st; const char * msgstr = NULL; int i, j; int xx; if (sl == NULL || st == NULL) return; for (i = 0; i < st->st_ntags; i++) { spectag t = st->st_t + i; const char * tn = tagName(t->t_tag); const char * errstr; char fmt[1024]; fmt[0] = '\0'; if (t->t_msgid == NULL) h = spec->packages->header; else { Package pkg; char *fe; strncpy(fmt, t->t_msgid, sizeof(fmt)-1); fmt[sizeof(fmt)-1] = '\0'; for (fe = fmt; *fe && *fe != '('; fe++) {} ; if (*fe == '(') *fe = '\0'; h = NULL; for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) { h = pkg->header; he->tag = RPMTAG_NAME; xx = headerGet(h, he, 0); if (!strcmp(he->p.str, fmt)) { he->p.ptr = _free(he->p.ptr); /*@innerbreak@*/ break; } he->p.ptr = _free(he->p.ptr); } if (pkg == NULL || h == NULL) h = spec->packages->header; } if (h == NULL) continue; fmt[0] = '\0'; (void) stpcpy( stpcpy( stpcpy( fmt, "%{"), tn), "}"); msgstr = _free(msgstr); /* XXX this should use queryHeader(), but prints out tn as well. */ msgstr = headerSprintf(h, fmt, NULL, rpmHeaderFormats, &errstr); if (msgstr == NULL) { rpmlog(RPMLOG_ERR, _("can't query %s: %s\n"), tn, errstr); return; } switch(t->t_tag) { case RPMTAG_SUMMARY: case RPMTAG_GROUP: /*@-unqualifiedtrans@*/ sl->sl_lines[t->t_startx] = _free(sl->sl_lines[t->t_startx]); /*@=unqualifiedtrans@*/ if (t->t_lang && strcmp(t->t_lang, RPMBUILD_DEFAULT_LANG)) continue; { char *buf = xmalloc(strlen(tn) + sizeof(": ") + strlen(msgstr)); (void) stpcpy( stpcpy( stpcpy(buf, tn), ": "), msgstr); sl->sl_lines[t->t_startx] = buf; } /*@switchbreak@*/ break; case RPMTAG_DESCRIPTION: for (j = 1; j < t->t_nlines; j++) { if (*sl->sl_lines[t->t_startx + j] == '%') /*@innercontinue@*/ continue; /*@-unqualifiedtrans@*/ sl->sl_lines[t->t_startx + j] = _free(sl->sl_lines[t->t_startx + j]); /*@=unqualifiedtrans@*/ } if (t->t_lang && strcmp(t->t_lang, RPMBUILD_DEFAULT_LANG)) { sl->sl_lines[t->t_startx] = _free(sl->sl_lines[t->t_startx]); continue; } sl->sl_lines[t->t_startx + 1] = xstrdup(msgstr); if (t->t_nlines > 2) sl->sl_lines[t->t_startx + 2] = xstrdup("\n\n"); /*@switchbreak@*/ break; } } msgstr = _free(msgstr); for (i = 0; i < sl->sl_nlines; i++) { const char * s = sl->sl_lines[i]; if (s == NULL) continue; printf("%s", s); if (strchr(s, '\n') == NULL && s[strlen(s)-1] != '\n') printf("\n"); } }