📄 pkg_depends.c
字号:
if (!pkg->conflicts_count) return 0; conflicts = pkg->conflicts = malloc(sizeof(compound_depend_t) * pkg->conflicts_count); if (conflicts == NULL) { fprintf(stderr, "%s: out of memory\n", __FUNCTION__); return -1; } for (i = 0; i < pkg->conflicts_count; i++) { conflicts->type = CONFLICTS; parseDepends(conflicts, hash, pkg->conflicts_str[i]);#if 0 for (j = 0; j < conflicts->possibility_count; j++) { depend_t *possibility = conflicts->possibilities[j]; abstract_pkg_t *conflicting_apkg = possibility->pkg; pkg_add_conflict_pair(ab_pkg, conflicting_apkg); }#endif conflicts++; } return 0;}int buildReplaces(hash_table_t * hash, abstract_pkg_t * ab_pkg, pkg_t * pkg){ register int i, j; if (!pkg->replaces_count) return 0; pkg->replaces = (abstract_pkg_t **)malloc(sizeof(abstract_pkg_t *) * pkg->replaces_count); if (pkg->replaces == NULL) { fprintf(stderr, "%s: out of memory\n", __FUNCTION__); return -1; } // if (strcmp(ab_pkg->name, pkg->name)) // fprintf(stderr, __FUNCTION__ ": ab_pkg=%s pkg=%s\n", ab_pkg->name, pkg->name); for(i = 0; i < pkg->replaces_count; i++){ abstract_pkg_t *old_abpkg = ensure_abstract_pkg_by_name(hash, pkg->replaces_str[i]); pkg->replaces[i] = old_abpkg; j = 0; if (!old_abpkg->replaced_by) old_abpkg->replaced_by = abstract_pkg_vec_alloc(); if ( old_abpkg->replaced_by == NULL ){ return -1; } /* if a package pkg both replaces and conflicts old_abpkg, * then add it to the replaced_by vector so that old_abpkg * will be upgraded to ab_pkg automatically */ if (pkg_conflicts_abstract(pkg, old_abpkg)) abstract_pkg_vec_insert(old_abpkg->replaced_by, ab_pkg); } return 0;}int buildDepends(hash_table_t * hash, pkg_t * pkg){ int count; register int i; compound_depend_t * depends; if(!(count = pkg->pre_depends_count + pkg->depends_count + pkg->recommends_count + pkg->suggests_count)) return 0; if (0 && pkg->pre_depends_count) fprintf(stderr, "pkg=%s pre_depends_count=%d depends_count=%d\n", pkg->name, pkg->pre_depends_count, pkg->depends_count); depends = pkg->depends = malloc(sizeof(compound_depend_t) * count); if (depends == NULL) { fprintf(stderr, "%s: out of memory\n", __FUNCTION__); return -1; } for(i = 0; i < pkg->pre_depends_count; i++){ parseDepends(depends, hash, pkg->pre_depends_str[i]); if (0 && pkg->pre_depends_count) fprintf(stderr, " pre_depends_str=%s depends=%p possibility_count=%x\n", pkg->pre_depends_str[i], depends, depends->possibility_count); depends->type = PREDEPEND; depends++; } for(i = 0; i < pkg->recommends_count; i++){ parseDepends(depends, hash, pkg->recommends_str[i]); if (0 && pkg->recommends_count) fprintf(stderr, " recommends_str=%s depends=%p possibility_count=%x\n", pkg->recommends_str[i], depends, depends->possibility_count); depends->type = RECOMMEND; depends++; } for(i = 0; i < pkg->suggests_count; i++){ parseDepends(depends, hash, pkg->suggests_str[i]); if (0 && pkg->suggests_count) fprintf(stderr, " suggests_str=%s depends=%p possibility_count=%x\n", pkg->suggests_str[i], depends, depends->possibility_count); depends->type = SUGGEST; depends++; } for(i = 0; i < pkg->depends_count; i++){ parseDepends(depends, hash, pkg->depends_str[i]); if (0 && pkg->depends_count) fprintf(stderr, " depends_str=%s depends=%p possibility_count=%x\n", pkg->depends_str[i], depends, depends->possibility_count); depends++; } return 0;} /* * pkg_depend_string: returns the depends string specified by index. * All 4 kinds of dependences: dependence, pre-dependence, recommend, and suggest are number starting from 0. * [0,npredepends) -> returns pre_depends_str[index] * [npredepends,npredepends+nrecommends) -> returns recommends_str[index] * [npredepends+nrecommends,npredepends+nrecommends+nsuggests) -> returns recommends_str[index] * [npredepends+nrecommends+nsuggests,npredepends+nrecommends+nsuggests+ndepends) -> returns depends_str[index] */char *pkg_depend_str(pkg_t *pkg, int index){ if (index < pkg->pre_depends_count) { return pkg->pre_depends_str[index]; } index -= pkg->pre_depends_count; if (index < pkg->recommends_count) { return pkg->recommends_str[index]; } index -= pkg->recommends_count; if (index < pkg->suggests_count) { return pkg->suggests_str[index]; } index -= pkg->suggests_count; if (index < pkg->depends_count) { return pkg->depends_str[index]; } fprintf(stderr, "pkg_depend_str: index %d out of range for pkg=%s\n", index, pkg->name); return NULL;}void freeDepends(pkg_t *pkg){ int i; if (pkg == NULL || pkg->depends == NULL) { return; } fprintf(stderr, "Freeing depends=%p\n", pkg->depends); for (i=0; i < pkg->depends->possibility_count; i++) { depend_deinit(pkg->depends->possibilities[i]); } free(pkg->depends->possibilities); free(pkg->depends); pkg->depends = NULL;}void buildDependedUponBy(pkg_t * pkg, abstract_pkg_t * ab_pkg){ compound_depend_t * depends; int count, othercount; register int i, j; abstract_pkg_t * ab_depend; abstract_pkg_t ** temp; count = pkg->pre_depends_count + pkg->depends_count; depends = pkg->depends; if (0 && pkg->pre_depends_count) fprintf(stderr, "pkg=%s pre_depends_count=%d depends_count=%d\n", pkg->name, pkg->pre_depends_count, pkg->depends_count); for (i = 0; i < count; i++) { if (0 && pkg->pre_depends_count) fprintf(stderr, " i=%d possibility_count=%x depends=%p\n", i, depends->possibility_count, depends); for (j = 0; j < depends->possibility_count; j++){ ab_depend = depends->possibilities[j]->pkg; if(!ab_depend->depended_upon_by) ab_depend->depended_upon_by = (abstract_pkg_t **)calloc(1, sizeof(abstract_pkg_t *)); temp = ab_depend->depended_upon_by; othercount = 1; while(*temp){ temp++; othercount++; } *temp = ab_pkg; ab_depend->depended_upon_by = (abstract_pkg_t **)realloc(ab_depend->depended_upon_by, (othercount + 1) * sizeof(abstract_pkg_t *)); /* the array may have moved */ temp = ab_depend->depended_upon_by + othercount; *temp = NULL; } depends++; }}static depend_t * depend_init(void){ depend_t * d = (depend_t *)malloc(sizeof(depend_t)); if ( d==NULL ){ fprintf(stderr, "%s: out of memory\n", __FUNCTION__); return NULL; } d->constraint = NONE; d->version = NULL; d->pkg = NULL; return d;}static void depend_deinit(depend_t *d){ free(d);}static int parseDepends(compound_depend_t *compound_depend, hash_table_t * hash, char * depend_str){ char * pkg_name, buffer[2048]; int num_of_ors = 0; register int i; register char * src, * dest; depend_t ** possibilities; /* first count the number of ored possibilities for satisfying dependency */ src = depend_str; while(*src) if(*src++ == '|') num_of_ors++; compound_depend->type = DEPEND; compound_depend->possibility_count = num_of_ors + 1; possibilities = (depend_t **)malloc(sizeof(depend_t *) * (num_of_ors + 1)); if (!possibilities) return -ENOMEM; compound_depend->possibilities = possibilities; src = depend_str; for(i = 0; i < num_of_ors + 1; i++){ possibilities[i] = depend_init(); if (!possibilities[i]) return -ENOMEM; /* gobble up just the name first */ dest = buffer; while(*src && !isspace(*src) && (*src != '(') && (*src != '*') && (*src != '|')) *dest++ = *src++; *dest = '\0'; pkg_name = trim_alloc(buffer); if (pkg_name == NULL ) return -ENOMEM; /* now look at possible version info */ /* skip to next chars */ if(isspace(*src)) while(*src && isspace(*src)) src++; /* extract constraint and version */ if(*src == '('){ src++; if(!strncmp(src, "<<", 2)){ possibilities[i]->constraint = EARLIER; src += 2; } else if(!strncmp(src, "<=", 2)){ possibilities[i]->constraint = EARLIER_EQUAL; src += 2; } else if(!strncmp(src, ">=", 2)){ possibilities[i]->constraint = LATER_EQUAL; src += 2; } else if(!strncmp(src, ">>", 2)){ possibilities[i]->constraint = LATER; src += 2; } else if(!strncmp(src, "=", 1)){ possibilities[i]->constraint = EQUAL; src++; } /* should these be here to support deprecated designations; dpkg does */ else if(!strncmp(src, "<", 1)){ possibilities[i]->constraint = EARLIER_EQUAL; src++; } else if(!strncmp(src, ">", 1)){ possibilities[i]->constraint = LATER_EQUAL; src++; } /* now we have any constraint, pass space to version string */ while(isspace(*src)) src++; /* this would be the version string */ dest = buffer; while(*src && *src != ')') *dest++ = *src++; *dest = '\0'; possibilities[i]->version = trim_alloc(buffer); /* fprintf(stderr, "let's print the depends version string:"); fprintf(stderr, "version %s\n", possibilities[i]->version);*/ if (possibilities[i]->version == NULL ) return -ENOMEM; } /* hook up the dependency to its abstract pkg */ possibilities[i]->pkg = ensure_abstract_pkg_by_name(hash, pkg_name); free(pkg_name); /* now get past the ) and any possible | chars */ while(*src && (isspace(*src) || (*src == ')') || (*src == '|'))) src++; if (*src == '*') { compound_depend->type = GREEDY_DEPEND; src++; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -