static unsigned int makedeps(Repo *repo, char *deps, unsigned int olddeps, Id marker) { Pool *pool = repo->pool; char *p; Id id; while ((p = strchr(deps, ',')) != 0) { *p = 0; olddeps = makedeps(repo, deps, olddeps, marker); *p = ','; deps = p + 1; } id = parseonedep(pool, deps); if (!id) return olddeps; return repo_addid_dep(repo, olddeps, id, marker); }
static Id parseonedep(Pool *pool, char *p) { char *n, *ne, *e, *ee; Id name, evr; int flags; while (*p == ' ' || *p == '\t' || *p == '\n') p++; if (!*p) return 0; if (!strcmp(p, "!true")) return 0; if (!strcmp(p, "!false")) return pool_str2id(pool, p, 1); n = p; /* find end of name */ while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != '|') p++; ne = p; while (*p == ' ' || *p == '\t' || *p == '\n') p++; evr = 0; flags = 0; e = ee = 0; if (*p == '>' || *p == '<' || *p == '=' || *p == '!') { if (*p == '>') flags |= REL_GT; else if (*p == '=') flags |= REL_EQ; else if (*p == '<') flags |= REL_LT; else if (*p == '!') flags |= REL_LT | REL_GT | REL_EQ; p++; if (flags && *p == '=') { if (p[-1] != '=') flags ^= REL_EQ; p++; } while (*p == ' ' || *p == '\t' || *p == '\n') p++; e = p; while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != '|') p++; ee = p; while (*p == ' ' || *p == '\t' || *p == '\n') p++; } name = pool_strn2id(pool, n, ne - n, 1); if (e) { evr = pool_strn2id(pool, e, ee - e, 1); name = pool_rel2id(pool, name, evr, flags, 1); } if (*p == '|') { Id id = parseonedep(pool, p + 1); if (id) name = pool_rel2id(pool, name, id, REL_OR, 1); } return name; }
static Id parseonedep(Pool *pool, char *p) { char *n, *ne, *e, *ee; Id name, evr; int flags; while (*p == ' ' || *p == '\t' || *p == '\n') p++; if (!*p || *p == '(') return 0; n = p; /* find end of name */ while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != '(' && *p != '|') p++; ne = p; while (*p == ' ' || *p == '\t' || *p == '\n') p++; evr = 0; flags = 0; e = ee = 0; if (*p == '(') { p++; while (*p == ' ' || *p == '\t' || *p == '\n') p++; if (*p == '>') flags |= REL_GT; else if (*p == '=') flags |= REL_EQ; else if (*p == '<') flags |= REL_LT; if (flags) { p++; if (*p == '>') flags |= REL_GT; else if (*p == '=') flags |= REL_EQ; else if (*p == '<') flags |= REL_LT; else p--; p++; } while (*p == ' ' || *p == '\t' || *p == '\n') p++; e = p; while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != ')') p++; ee = p; while (*p && *p != ')') p++; if (*p) p++; while (*p == ' ' || *p == '\t' || *p == '\n') p++; } if (ne - n > 4 && ne[-4] == ':' && !strncmp(ne - 4, ":any", 4)) { /* multiarch annotation */ name = pool_strn2id(pool, n, ne - n - 4, 1); name = pool_rel2id(pool, name, ARCH_ANY, REL_MULTIARCH, 1); } else name = pool_strn2id(pool, n, ne - n, 1); if (e) { evr = pool_strn2id(pool, e, ee - e, 1); name = pool_rel2id(pool, name, evr, flags, 1); } if (*p == '|') { Id id = parseonedep(pool, p + 1); if (id) name = pool_rel2id(pool, name, id, REL_OR, 1); } return name; }