* @param fl package file tree walk data
* @return RPMRC_OK on success
*/
-static int parseForLang(const char * buf, FileList fl)
+static rpmRC parseForLang(const char * buf, FileList fl)
{
- char *p, *pe, *q;
+ char *p, *pe, *q = NULL;
const char *name;
+ rpmRC rc = RPMRC_FAIL;
while ((p = strstr(buf, (name = "%lang"))) != NULL) {
if (*pe != '(') {
rpmlog(RPMLOG_ERR, _("Missing '(' in %s %s\n"), name, pe);
- fl->processingFailed = 1;
- return RPMRC_FAIL;
+ goto exit;
}
/* Bracket %lang args */
if (*pe == '\0') {
rpmlog(RPMLOG_ERR, _("Missing ')' in %s(%s\n"), name, p);
- fl->processingFailed = 1;
- return RPMRC_FAIL;
+ goto exit;
}
/* Localize. Erase parsed string. */
- q = alloca((pe-p) + 1);
+ q = xmalloc((pe-p) + 1);
rstrlcpy(q, p, (pe-p) + 1);
while (p <= pe)
*p++ = ' ';
rpmlog(RPMLOG_ERR,
_("Unusual locale length: \"%.*s\" in %%lang(%s)\n"),
(int)np, p, q);
- fl->processingFailed = 1;
- return RPMRC_FAIL;
+ goto exit;
}
/* Check for duplicate locales */
continue;
rpmlog(RPMLOG_ERR, _("Duplicate locale %.*s in %%lang(%s)\n"),
(int)np, p, q);
- fl->processingFailed = 1;
- return RPMRC_FAIL;
+ goto exit;
}
/* Add new locale */
/* Insure that locales are sorted. */
if (fl->currentLangs)
qsort(fl->currentLangs, fl->nLangs, sizeof(*fl->currentLangs), langCmp);
+ rc = RPMRC_OK;
+
+exit:
+ free(q);
+ if (rc != RPMRC_OK) {
+ fl->processingFailed = 1;
+ }
- return RPMRC_OK;
+ return rc;
}
/**