Add a package iterator for iterating through property owners.
authorKristian H?gsberg <krh@redhat.com>
Thu Jan 17 23:28:37 2008 -0500 (2008-01-17)
changeset 1019708f6d5db8c
parent 100 27aada326858
child 102 337a7a55e2c6
Add a package iterator for iterating through property owners.
main.c
razor.c
razor.h
     1.1 --- a/main.c	Thu Jan 10 23:42:42 2008 -0500
     1.2 +++ b/main.c	Thu Jan 17 23:28:37 2008 -0500
     1.3 @@ -136,6 +136,20 @@
     1.4  	return 0;
     1.5  }
     1.6  
     1.7 +static void
     1.8 +list_packages_for_property(struct razor_set *set,
     1.9 +			   struct razor_property *property)
    1.10 +{
    1.11 +	struct razor_package_iterator *pi;
    1.12 +	struct razor_package *package;
    1.13 +	const char *name, *version;
    1.14 +
    1.15 +	pi = razor_package_iterator_create_for_property(set, property);
    1.16 +	while (razor_package_iterator_next(pi, &package, &name, &version))
    1.17 +		printf("%s-%s\n", name, version);
    1.18 +	razor_package_iterator_destroy(pi);
    1.19 +}
    1.20 +
    1.21  static int
    1.22  list_property_packages(const char *ref_name,
    1.23  		       const char *ref_version,
    1.24 @@ -164,7 +178,7 @@
    1.25  		if (ref_type != type)
    1.26  			continue;
    1.27  
    1.28 -		razor_set_list_property_packages(set, property);
    1.29 +		list_packages_for_property(set, property);
    1.30  	}
    1.31  	razor_property_iterator_destroy(pi);
    1.32  
     2.1 --- a/razor.c	Thu Jan 10 23:42:42 2008 -0500
     2.2 +++ b/razor.c	Thu Jan 17 23:28:37 2008 -0500
     2.3 @@ -938,34 +938,75 @@
     2.4  struct razor_package_iterator {
     2.5  	struct razor_set *set;
     2.6  	struct razor_package *package, *end;
     2.7 +	unsigned long *index;
     2.8 +	int last;
     2.9  };
    2.10  
    2.11  struct razor_package_iterator *
    2.12 -razor_package_iterator_create(struct razor_set *set)
    2.13 +razor_package_iterator_create_with_index(struct razor_set *set,
    2.14 +					 unsigned long *index)
    2.15  {
    2.16  	struct razor_package_iterator *pi;
    2.17  
    2.18  	pi = zalloc(sizeof *pi);
    2.19  	pi->set = set;
    2.20 +	pi->end = set->packages.data + set->packages.size;
    2.21  	pi->package = set->packages.data;
    2.22 -	pi->end = set->packages.data + set->packages.size;
    2.23 +	pi->index = index;
    2.24  
    2.25  	return pi;
    2.26  }
    2.27  
    2.28 +struct razor_package_iterator *
    2.29 +razor_package_iterator_create(struct razor_set *set)
    2.30 +{
    2.31 +	return razor_package_iterator_create_with_index(set, NULL);
    2.32 +}
    2.33 +
    2.34 +struct razor_package_iterator *
    2.35 +razor_package_iterator_create_for_property(struct razor_set *set,
    2.36 +					   struct razor_property *property)
    2.37 +{
    2.38 +	unsigned long *index;
    2.39 +
    2.40 +	if (property->packages & RAZOR_IMMEDIATE)
    2.41 +		index = &property->packages;
    2.42 +	else
    2.43 +		index = (unsigned long *)
    2.44 +			set->package_pool.data + property->packages;
    2.45 +
    2.46 +	return razor_package_iterator_create_with_index(set, index);
    2.47 +}
    2.48 +
    2.49  int
    2.50  razor_package_iterator_next(struct razor_package_iterator *pi,
    2.51  			    struct razor_package **package,
    2.52  			    const char **name, const char **version)
    2.53  {
    2.54  	char *pool;
    2.55 +	int valid;
    2.56 +	struct razor_package *p, *packages;
    2.57  
    2.58 -	pool = pi->set->string_pool.data;
    2.59 -	*package = pi->package;
    2.60 -	*name = &pool[pi->package->name];
    2.61 -	*version = &pool[pi->package->version];
    2.62 +	if (pi->index) {
    2.63 +		packages = pi->set->packages.data;
    2.64 +		p = &packages[*pi->index & RAZOR_ENTRY_MASK];
    2.65 +		valid = !pi->last;
    2.66 +		pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0;
    2.67 +	} else {
    2.68 +		p = pi->package++;
    2.69 +		valid = p < pi->end;
    2.70 +	}			
    2.71  
    2.72 -	return pi->package++ < pi->end;
    2.73 +	if (valid) {
    2.74 +		pool = pi->set->string_pool.data;
    2.75 +		*package = p;
    2.76 +		*name = &pool[p->name & RAZOR_ENTRY_MASK];
    2.77 +		*version = &pool[p->version];
    2.78 +	} else {
    2.79 +		*package = NULL;
    2.80 +	}
    2.81 +
    2.82 +	return valid;
    2.83  }
    2.84  
    2.85  void
    2.86 @@ -1007,12 +1048,11 @@
    2.87  	pi = zalloc(sizeof *pi);
    2.88  	pi->set = set;
    2.89  	pi->end = set->properties.data + set->properties.size;
    2.90 +	pi->property = set->properties.data;
    2.91  
    2.92  	if (package)
    2.93  		pi->index = (unsigned long *)
    2.94  			set->property_pool.data + package->properties;
    2.95 -	else
    2.96 -		pi->property = set->properties.data;
    2.97  
    2.98  	return pi;
    2.99  }
   2.100 @@ -1056,32 +1096,6 @@
   2.101  	free(pi);
   2.102  }
   2.103  
   2.104 -void
   2.105 -razor_set_list_property_packages(struct razor_set *set,
   2.106 -				 struct razor_property *property)
   2.107 -{
   2.108 -	struct razor_package *p, *packages;
   2.109 -	const char *pool;
   2.110 -	unsigned long *r;
   2.111 -
   2.112 -	packages = set->packages.data;
   2.113 -	pool = set->string_pool.data;
   2.114 -
   2.115 -	if (property->packages & RAZOR_IMMEDIATE)
   2.116 -		r = &property->packages;
   2.117 -	else
   2.118 -		r = (unsigned long *)
   2.119 -			set->package_pool.data + property->packages;
   2.120 -	while (1) {
   2.121 -		p = &packages[*r & RAZOR_ENTRY_MASK];
   2.122 -		printf("%s-%s\n",
   2.123 -		       &pool[p->name & RAZOR_ENTRY_MASK],
   2.124 -		       &pool[p->version]);
   2.125 -		if (*r++ & RAZOR_IMMEDIATE)
   2.126 -			break;
   2.127 -	}
   2.128 -}
   2.129 -
   2.130  static struct razor_entry *
   2.131  find_entry(struct razor_set *set, struct razor_entry *dir, const char *pattern)
   2.132  {
     3.1 --- a/razor.h	Thu Jan 10 23:42:42 2008 -0500
     3.2 +++ b/razor.h	Thu Jan 17 23:28:37 2008 -0500
     3.3 @@ -25,6 +25,9 @@
     3.4  struct razor_package_iterator;
     3.5  struct razor_package_iterator *
     3.6  razor_package_iterator_create(struct razor_set *set);
     3.7 +struct razor_package_iterator *
     3.8 +razor_package_iterator_create_for_property(struct razor_set *set,
     3.9 +					   struct razor_property *property);
    3.10  
    3.11  int razor_package_iterator_next(struct razor_package_iterator *pi,
    3.12  				struct razor_package **package,
    3.13 @@ -42,12 +45,6 @@
    3.14  void
    3.15  razor_property_iterator_destroy(struct razor_property_iterator *pi);
    3.16  
    3.17 -
    3.18 -void razor_set_list_properties(struct razor_set *set, const char *name,
    3.19 -			       enum razor_property_type type);
    3.20 -void razor_set_list_property_packages(struct razor_set *set,
    3.21 -				      struct razor_property *property);
    3.22 -
    3.23  void razor_set_list_files(struct razor_set *set, const char *prefix);
    3.24  void razor_set_list_file_packages(struct razor_set *set, const char *filename);
    3.25  void razor_set_list_package_files(struct razor_set *set, const char *name);