Vlib/list.c
Go to the documentation of this file.00001
00021 #include <stdlib.h>
00022 #include <grass/Vect.h>
00023 #include <grass/gis.h>
00024
00034 struct ilist *Vect_new_list(void)
00035 {
00036 struct ilist *p;
00037
00038 p = (struct ilist *)G_malloc(sizeof(struct ilist));
00039
00040 if (p) {
00041 p->value = NULL;
00042 p->n_values = 0;
00043 p->alloc_values = 0;
00044 }
00045
00046 return p;
00047 }
00048
00059 int Vect_reset_list(struct ilist *list)
00060 {
00061 list->n_values = 0;
00062
00063 return 0;
00064 }
00065
00074 int Vect_destroy_list(struct ilist *list)
00075 {
00076 if (list) {
00077 if (list->alloc_values) {
00078 G_free((void *)list->value);
00079 }
00080 G_free((void *)list);
00081 }
00082 list = NULL;
00083
00084 return 0;
00085 }
00086
00096 int Vect_list_append(struct ilist *list, int val)
00097 {
00098 int i;
00099 size_t size;
00100
00101 if (list == NULL)
00102 return 1;
00103
00104 for (i = 0; i < list->n_values; i++) {
00105 if (val == list->value[i])
00106 return 0;
00107 }
00108
00109 if (list->n_values == list->alloc_values) {
00110 size = (list->n_values + 1000) * sizeof(int);
00111 list->value = (int *)G_realloc((void *)list->value, size);
00112 list->alloc_values = list->n_values + 1000;
00113 }
00114
00115 list->value[list->n_values] = val;
00116 list->n_values++;
00117
00118 return 0;
00119 }
00120
00130 int Vect_list_append_list(struct ilist *alist, struct ilist *blist)
00131 {
00132 int i;
00133
00134 if (alist == NULL || blist == NULL)
00135 return 1;
00136
00137 for (i = 0; i < blist->n_values; i++)
00138 Vect_list_append(alist, blist->value[i]);
00139
00140 return 0;
00141 }
00142
00152 int Vect_list_delete(struct ilist *list, int val)
00153 {
00154 int i, j;
00155
00156 if (list == NULL)
00157 return 1;
00158
00159 for (i = 0; i < list->n_values; i++) {
00160 if (val == list->value[i]) {
00161 for (j = i + 1; j < list->n_values; j++)
00162 list->value[j - 1] = list->value[j];
00163
00164 list->n_values--;
00165 return 0;
00166 }
00167 }
00168
00169 return 0;
00170 }
00171
00181 int Vect_list_delete_list(struct ilist *alist, struct ilist *blist)
00182 {
00183 int i;
00184
00185 if (alist == NULL || blist == NULL)
00186 return 1;
00187
00188 for (i = 0; i < blist->n_values; i++)
00189 Vect_list_delete(alist, blist->value[i]);
00190
00191 return 0;
00192 }
00193
00203 int Vect_val_in_list(struct ilist *list, int val)
00204 {
00205 int i;
00206
00207 if (list == NULL)
00208 return 0;
00209
00210 for (i = 0; i < list->n_values; i++) {
00211 if (val == list->value[i])
00212 return 1;
00213 }
00214
00215 return 0;
00216 }