razor.c
changeset 101 9708f6d5db8c
parent 100 27aada326858
child 102 337a7a55e2c6
     1.1 --- a/razor.c	Thu Jan 10 23:42:42 2008 -0500
     1.2 +++ b/razor.c	Thu Jan 17 23:28:37 2008 -0500
     1.3 @@ -938,34 +938,75 @@
     1.4  struct razor_package_iterator {
     1.5  	struct razor_set *set;
     1.6  	struct razor_package *package, *end;
     1.7 +	unsigned long *index;
     1.8 +	int last;
     1.9  };
    1.10  
    1.11  struct razor_package_iterator *
    1.12 -razor_package_iterator_create(struct razor_set *set)
    1.13 +razor_package_iterator_create_with_index(struct razor_set *set,
    1.14 +					 unsigned long *index)
    1.15  {
    1.16  	struct razor_package_iterator *pi;
    1.17  
    1.18  	pi = zalloc(sizeof *pi);
    1.19  	pi->set = set;
    1.20 +	pi->end = set->packages.data + set->packages.size;
    1.21  	pi->package = set->packages.data;
    1.22 -	pi->end = set->packages.data + set->packages.size;
    1.23 +	pi->index = index;
    1.24  
    1.25  	return pi;
    1.26  }
    1.27  
    1.28 +struct razor_package_iterator *
    1.29 +razor_package_iterator_create(struct razor_set *set)
    1.30 +{
    1.31 +	return razor_package_iterator_create_with_index(set, NULL);
    1.32 +}
    1.33 +
    1.34 +struct razor_package_iterator *
    1.35 +razor_package_iterator_create_for_property(struct razor_set *set,
    1.36 +					   struct razor_property *property)
    1.37 +{
    1.38 +	unsigned long *index;
    1.39 +
    1.40 +	if (property->packages & RAZOR_IMMEDIATE)
    1.41 +		index = &property->packages;
    1.42 +	else
    1.43 +		index = (unsigned long *)
    1.44 +			set->package_pool.data + property->packages;
    1.45 +
    1.46 +	return razor_package_iterator_create_with_index(set, index);
    1.47 +}
    1.48 +
    1.49  int
    1.50  razor_package_iterator_next(struct razor_package_iterator *pi,
    1.51  			    struct razor_package **package,
    1.52  			    const char **name, const char **version)
    1.53  {
    1.54  	char *pool;
    1.55 +	int valid;
    1.56 +	struct razor_package *p, *packages;
    1.57  
    1.58 -	pool = pi->set->string_pool.data;
    1.59 -	*package = pi->package;
    1.60 -	*name = &pool[pi->package->name];
    1.61 -	*version = &pool[pi->package->version];
    1.62 +	if (pi->index) {
    1.63 +		packages = pi->set->packages.data;
    1.64 +		p = &packages[*pi->index & RAZOR_ENTRY_MASK];
    1.65 +		valid = !pi->last;
    1.66 +		pi->last = (*pi->index++ & RAZOR_IMMEDIATE) != 0;
    1.67 +	} else {
    1.68 +		p = pi->package++;
    1.69 +		valid = p < pi->end;
    1.70 +	}			
    1.71  
    1.72 -	return pi->package++ < pi->end;
    1.73 +	if (valid) {
    1.74 +		pool = pi->set->string_pool.data;
    1.75 +		*package = p;
    1.76 +		*name = &pool[p->name & RAZOR_ENTRY_MASK];
    1.77 +		*version = &pool[p->version];
    1.78 +	} else {
    1.79 +		*package = NULL;
    1.80 +	}
    1.81 +
    1.82 +	return valid;
    1.83  }
    1.84  
    1.85  void
    1.86 @@ -1007,12 +1048,11 @@
    1.87  	pi = zalloc(sizeof *pi);
    1.88  	pi->set = set;
    1.89  	pi->end = set->properties.data + set->properties.size;
    1.90 +	pi->property = set->properties.data;
    1.91  
    1.92  	if (package)
    1.93  		pi->index = (unsigned long *)
    1.94  			set->property_pool.data + package->properties;
    1.95 -	else
    1.96 -		pi->property = set->properties.data;
    1.97  
    1.98  	return pi;
    1.99  }
   1.100 @@ -1056,32 +1096,6 @@
   1.101  	free(pi);
   1.102  }
   1.103  
   1.104 -void
   1.105 -razor_set_list_property_packages(struct razor_set *set,
   1.106 -				 struct razor_property *property)
   1.107 -{
   1.108 -	struct razor_package *p, *packages;
   1.109 -	const char *pool;
   1.110 -	unsigned long *r;
   1.111 -
   1.112 -	packages = set->packages.data;
   1.113 -	pool = set->string_pool.data;
   1.114 -
   1.115 -	if (property->packages & RAZOR_IMMEDIATE)
   1.116 -		r = &property->packages;
   1.117 -	else
   1.118 -		r = (unsigned long *)
   1.119 -			set->package_pool.data + property->packages;
   1.120 -	while (1) {
   1.121 -		p = &packages[*r & RAZOR_ENTRY_MASK];
   1.122 -		printf("%s-%s\n",
   1.123 -		       &pool[p->name & RAZOR_ENTRY_MASK],
   1.124 -		       &pool[p->version]);
   1.125 -		if (*r++ & RAZOR_IMMEDIATE)
   1.126 -			break;
   1.127 -	}
   1.128 -}
   1.129 -
   1.130  static struct razor_entry *
   1.131  find_entry(struct razor_set *set, struct razor_entry *dir, const char *pattern)
   1.132  {