1/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
2   See the COPYRIGHT file for more information. */
3#include <stdlib.h>
4#include <stdio.h>
5#include <string.h>
6
7#include "list.h"
8
9int listnull(void* e) {return e == NULL;}
10
11#ifndef TRUE
12#define TRUE 1
13#endif
14#ifndef FALSE
15#define FALSE 0
16#endif
17
18#define DEFAULTALLOC 16
19#define ALLOCINCR 16
20
21Listlistnew(void)
22{
23  Listl;
24/*
25  if(!initialized) {
26    memset((void*)&DATANULL,0,sizeof(void*));
27    initialized = 1;
28  }
29*/
30  l = (List*)malloc(sizeof(List));
31  if(l) {
32    l->alloc=0;
33    l->length=0;
34    l->content=NULL;
35  }
36  return l;
37}
38
39int
40listfree(Listl)
41{
42  if(l) {
43    l->alloc = 0;
44    if(l->content != NULL) {free(l->content); l->content = NULL;}
45    free(l);
46  }
47  return TRUE;
48}
49
50int
51listsetalloc(Listl, unsigned long sz)
52{
53  void** newcontent = NULL;
54  if(l == NULL) return FALSE;
55  if(sz <= 0) {sz = (l->length?2*l->length:DEFAULTALLOC);}
56  if(l->alloc >= sz) {return TRUE;}
57  newcontent=(void**)calloc(sz,sizeof(void*));
58  if(newcontent != NULL && l->alloc > 0 && l->length > 0 && l->content != NULL) {
59    memcpy((void*)newcontent,(void*)l->content,sizeof(void*)*l->length);
60  }
61  if(l->content != NULL) free(l->content);
62  l->content=newcontent;
63  l->alloc=sz;
64  return TRUE;
65}
66
67int
68listsetlength(Listl, unsigned long sz)
69{
70  if(l == NULL) return FALSE;
71  if(sz > l->alloc && !listsetalloc(l,sz)) return FALSE;
72  l->length = sz;
73  return TRUE;
74}
75
76void*
77listget(Listl, unsigned long index)
78{
79  if(l == NULL || l->length == 0) return NULL;
80  if(index >= l->length) return NULL;
81  return l->content[index];
82}
83
84int
85listset(Listl, unsigned long index, void* elem)
86{
87  if(l == NULL) return FALSE;
88  if(index >= l->length) return FALSE;
89  l->content[index] = elem;
90  return TRUE;
91}
92
93/* Insert at position i of l; will push up elements i..|seq|. */
94int
95listinsert(Listl, unsigned long index, void* elem)
96{
97  int i; /* do not make unsigned */
98  if(l == NULL) return FALSE;
99  if(index > l->length) return FALSE;
100  listsetalloc(l,0);
101  for(i=(int)l->length;i>index;i--) l->content[i] = l->content[i-1];
102  l->content[index] = elem;
103  l->length++;
104  return TRUE;
105}
106
107int
108listpush(Listl, void* elem)
109{
110  if(l == NULL) return FALSE;
111  if(l->length >= l->alloclistsetalloc(l,0);
112  l->content[l->length] = elem;
113  l->length++;
114  return TRUE;
115}
116
117void*
118listpop(Listl)
119{
120  if(l == NULL || l->length == 0) return NULL;
121  l->length--;
122  return l->content[l->length];
123}
124
125void*
126listtop(Listl)
127{
128  if(l == NULL || l->length == 0) return NULL;
129  return l->content[l->length - 1];
130}
131
132void*
133listremove(Listl, unsigned long i)
134{
135  unsigned long len;
136  void* elem;
137  if(l == NULL || (len=l->length) == 0) return NULL;
138  if(i >= len) return NULL;
139  elem = l->content[i];
140  for(i+=1;i<len;i++) l->content[i-1] = l->content[i];
141  l->length--;
142  return elem;
143}
144
145/* Duplicate and return the content (null terminate) */
146void**
147listdup(Listl)
148{
149    void** result = (void**)malloc(sizeof(void*)*(l->length+1));
150    memcpy((void*)result,(void*)l->content,sizeof(void*)*l->length);
151    result[l->length] = (void*)0;
152    return result;
153}
154
155int
156listcontains(Listl, void* elem)
157{
158    unsigned long i;
159    for(i=0;i<listlength(l);i++) {
160 if(elem == listget(l,i)) return 1;
161    }
162    return 0;
163}
164
165/* Remove element by value; only removes first encountered */
166int
167listelemremove(Listl, void* elem)
168{
169  unsigned long len;
170  unsigned long i;
171  int found = 0;
172  if(l == NULL || (len=l->length) == 0) return 0;
173  for(i=0;i<listlength(l);i++) {
174    void* candidate = l->content[i];
175    if(elem == candidate) {
176      for(i+=1;i<len;i++) l->content[i-1] = l->content[i];
177      l->length--;
178      found = 1;
179      break;
180    }
181  }
182  return found;
183}
184
185
186
187
188/* Extends list to include a unique operator
189   which remove duplicate values; NULL values removed
190   return value is always 1.
191*/
192
193int
194listunique(Listl)
195{
196    unsigned long i,j,k,len;
197    void** content;
198    if(l == NULL || l->length == 0) return 1;
199    len = l->length;
200    content = l->content;
201    for(i=0;i<len;i++) {
202        for(j=i+1;j<len;j++) {
203     if(content[i] == content[j]) {
204 /* compress out jth element */
205                for(k=j+1;k<len;k++) content[k-1] = content[k];
206 len--;
207     }
208 }
209    }
210    l->length = len;
211    return 1;
212}
213
214List*
215listclone(Listl)
216{
217    Listclone = listnew();
218    *clone = *l;
219    clone->content = listdup(l);
220    return clone;
221}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed