General Public License for more details.
*/
-#include "includes.h"
-#include <errno.h>
+#include "config.h"
+
+#include <stdio.h>
#include <ctype.h>
-
+
#include "pkg.h"
#include "opkg_utils.h"
#include "pkg_parse.h"
#include "libbb/libbb.h"
-static int
-is_field(const char *type, const char *line)
-{
- if (!strncmp(line, type, strlen(type)))
- return 1;
- return 0;
-}
-
-static char *
-parse_simple(const char *type, const char *line)
-{
- return trim_xstrdup(line + strlen(type) + 1);
-}
-
-/*
- * Parse a comma separated string into an array.
- */
-static char **
-parse_comma_separated(const char *raw, unsigned int *count)
-{
- char **depends = NULL;
- const char *start, *end;
- int line_count = 0;
-
- /* skip past the "Field:" marker */
- while (*raw && *raw != ':')
- raw++;
- raw++;
-
- if (line_is_blank(raw)) {
- *count = line_count;
- return NULL;
- }
-
- while (*raw) {
- depends = xrealloc(depends, sizeof(char *) * (line_count + 1));
-
- while (isspace(*raw))
- raw++;
-
- start = raw;
- while (*raw != ',' && *raw)
- raw++;
- end = raw;
-
- while (end > start && isspace(*end))
- end--;
-
- depends[line_count] = xstrndup(start, end-start);
-
- line_count++;
- if (*raw == ',')
- raw++;
- }
-
- *count = line_count;
- return depends;
-}
+#include "parse_util.h"
static void
parse_status(pkg_t *pkg, const char *sstr)
pkg->epoch= 0;
}
- pkg->version= xstrdup(vstr);
+ pkg->version = xstrdup(vstr);
pkg->revision = strrchr(pkg->version,'-');
if (pkg->revision)
return 0;
}
+static int
+get_arch_priority(const char *arch)
+{
+ nv_pair_list_elt_t *l;
+
+ list_for_each_entry(l , &conf->arch_list.head, node) {
+ nv_pair_t *nv = (nv_pair_t *)l->data;
+ if (strcmp(nv->name, arch) == 0)
+ return strtol(nv->value, NULL, 0);
+ }
+ return 0;
+}
+
static int
pkg_parse_line(pkg_t *pkg, const char *line, uint mask)
{
switch (*line) {
case 'A':
- if ((mask & PFM_ARCHITECTURE ) && is_field("Architecture", line))
+ if ((mask & PFM_ARCHITECTURE ) && is_field("Architecture", line)) {
pkg->architecture = parse_simple("Architecture", line);
- else if ((mask & PFM_AUTO_INSTALLED) && is_field("Auto-Installed", line)) {
+ pkg->arch_priority = get_arch_priority(pkg->architecture);
+ } else if ((mask & PFM_AUTO_INSTALLED) && is_field("Auto-Installed", line)) {
char *tmp = parse_simple("Auto-Installed", line);
if (strcmp(tmp, "yes") == 0)
pkg->auto_installed = 1;
goto dont_reset_flags;
}
else if ((mask & PFM_CONFLICTS) && is_field("Conflicts", line))
- pkg->conflicts_str = parse_comma_separated(line, &pkg->conflicts_count);
+ pkg->conflicts_str = parse_list(line, &pkg->conflicts_count, ',', 0);
break;
case 'D':
reading_description = 1;
goto dont_reset_flags;
} else if ((mask & PFM_DEPENDS) && is_field("Depends", line))
- pkg->depends_str = parse_comma_separated(line, &pkg->depends_count);
+ pkg->depends_str = parse_list(line, &pkg->depends_count, ',', 0);
break;
case 'E':
break;
case 'I':
- if ((mask && PFM_INSTALLED_SIZE) && is_field("Installed-Size", line)) {
+ if ((mask & PFM_INSTALLED_SIZE) && is_field("Installed-Size", line)) {
char *tmp = parse_simple("Installed-Size", line);
pkg->installed_size = strtoul(tmp, NULL, 0);
free (tmp);
- } else if ((mask && PFM_INSTALLED_TIME) && is_field("Installed-Time", line)) {
+ } else if ((mask & PFM_INSTALLED_TIME) && is_field("Installed-Time", line)) {
char *tmp = parse_simple("Installed-Time", line);
pkg->installed_time = strtoul(tmp, NULL, 0);
free (tmp);
- }
+ }
break;
case 'M':
- if (mask && PFM_MD5SUM) {
- if (is_field("MD5sum:", line))
- pkg->md5sum = parse_simple("MD5sum", line);
+ if ((mask & PFM_MD5SUM) && is_field("MD5sum:", line))
+ pkg->md5sum = parse_simple("MD5sum", line);
/* The old opkg wrote out status files with the wrong
* case for MD5sum, let's parse it either way */
- else if (is_field("MD5Sum:", line))
- pkg->md5sum = parse_simple("MD5Sum", line);
- } else if((mask & PFM_MAINTAINER) && is_field("Maintainer", line))
+ else if ((mask & PFM_MD5SUM) && is_field("MD5Sum:", line))
+ pkg->md5sum = parse_simple("MD5Sum", line);
+ else if((mask & PFM_MAINTAINER) && is_field("Maintainer", line))
pkg->maintainer = parse_simple("Maintainer", line);
break;
case 'P':
- if ((mask & PFM_PACKAGE) && is_field("Package", line))
+ if ((mask & PFM_PACKAGE) && is_field("Package", line))
pkg->name = parse_simple("Package", line);
else if ((mask & PFM_PRIORITY) && is_field("Priority", line))
pkg->priority = parse_simple("Priority", line);
else if ((mask & PFM_PROVIDES) && is_field("Provides", line))
- pkg->provides_str = parse_comma_separated(line, &pkg->provides_count);
+ pkg->provides_str = parse_list(line, &pkg->provides_count, ',', 0);
else if ((mask & PFM_PRE_DEPENDS) && is_field("Pre-Depends", line))
- pkg->pre_depends_str = parse_comma_separated(line, &pkg->pre_depends_count);
+ pkg->pre_depends_str = parse_list(line, &pkg->pre_depends_count, ',', 0);
break;
case 'R':
if ((mask & PFM_RECOMMENDS) && is_field("Recommends", line))
- pkg->recommends_str = parse_comma_separated(line, &pkg->recommends_count);
+ pkg->recommends_str = parse_list(line, &pkg->recommends_count, ',', 0);
else if ((mask & PFM_REPLACES) && is_field("Replaces", line))
- pkg->replaces_str = parse_comma_separated(line, &pkg->replaces_count);
+ pkg->replaces_str = parse_list(line, &pkg->replaces_count, ',', 0);
break;
else if ((mask & PFM_STATUS) && is_field("Status", line))
parse_status(pkg, line);
else if ((mask & PFM_SUGGESTS) && is_field("Suggests", line))
- pkg->suggests_str = parse_comma_separated(line, &pkg->suggests_count);
+ pkg->suggests_str = parse_list(line, &pkg->suggests_count, ',', 0);
break;
case 'T':
strcat(pkg->description, "\n");
strcat(pkg->description, (line));
goto dont_reset_flags;
- } else if ((mask && PFM_CONFFILES) && reading_conffiles) {
+ } else if ((mask & PFM_CONFFILES) && reading_conffiles) {
parse_conffiles(pkg, line);
goto dont_reset_flags;
}
buf = *buf0;
buflen = buf0len;
buf[0] = '\0';
- };
+ }
if (pkg->name == NULL) {
/* probably just a blank line */