⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkg_depends.c

📁 this is the pkg installer for linux
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -