1 | /***************************************
2 | $Header: /home/amb/cxref/RCS/slist.c 1.3 1997/05/11 15:23:11 amb Exp $
3 |
4 | C Cross Referencing & Documentation tool. Version 1.4.
5 |
6 | Handle lists of strings.
7 | ******************/ /******************
8 | Written by Andrew M. Bishop
9 |
10 | This file Copyright 1995,96,97 Andrew M. Bishop
11 | It may be distributed under the GNU Public License, version 2, or
12 | any higher version. See section COPYING of the GNU Public license
13 | for conditions under which this file may be redistributed.
14 | ***************************************/
15 |
16 | /*+ Control the debugging information from this file. +*/
17 | #define DEBUG 0
18 |
19 | #include <stdlib.h>
20 | #include <stdio.h>
21 | #include <string.h>
22 |
23 | #include "memory.h"
24 | #include "datatype.h"
25 | #include "cxref.h"
26 |
27 | /*++++++++++++++++++++++++++++++++++++++
28 | Called to initialise a new string list.
29 |
30 | StringList NewStringList Returns an initialised string list.
31 | ++++++++++++++++++++++++++++++++++++++*/
32 |
33 | StringList NewStringList(void)
34 | {
35 | StringList sl=(StringList)Calloc(1,sizeof(struct _StringList));
36 |
37 | #if DEBUG
38 | printf("#Slist.c# Initialise string list\n");
39 | #endif
40 |
41 | return(sl);
42 | }
43 |
44 |
45 | /*++++++++++++++++++++++++++++++++++++++
46 | Called to initialise a new string list 2.
47 |
48 | StringList2 NewStringList2 Returns an initialised string list 2.
49 | ++++++++++++++++++++++++++++++++++++++*/
50 |
51 | StringList2 NewStringList2(void)
52 | {
53 | StringList2 sl=(StringList2)Calloc(1,sizeof(struct _StringList2));
54 |
55 | #if DEBUG
56 | printf("#Slist.c# Initialise string list 2\n");
57 | #endif
58 |
59 | return(sl);
60 | }
61 |
62 |
63 | /*++++++++++++++++++++++++++++++++++++++
64 | Add a string to the string list, the list stores a Malloced copy of str.
65 |
66 | StringList sl The string list to add to.
67 |
68 | char* str The string to add.
69 |
70 | int alphalist If true then the list is sorted into alphabetical order.
71 |
72 | int uniqlist If true then duplicated entries are not allowed to be added.
73 | ++++++++++++++++++++++++++++++++++++++*/
74 |
75 | void AddToStringList(StringList sl,char* str,int alphalist,int uniqlist)
76 | {
77 | int i;
78 |
79 | #if DEBUG
80 | printf("#Slist.c# Add string %s to the string list\n",str);
81 | #endif
82 |
83 | if(uniqlist)
84 | for(i=0;i<sl->n;i++)
85 | if(!strcmp(str,sl->s[i]))
86 | return;
87 |
88 | if(!sl->n)
89 | sl->s=(char**)Malloc(8*sizeof(char*));
90 | else
91 | if(sl->n%8==0)
92 | sl->s=(char**)Realloc(sl->s,(sl->n+8)*sizeof(char*));
93 |
94 | if(alphalist)
95 | {
96 | char *shuffle=NULL;
97 |
98 | for(i=0;i<sl->n;i++)
99 | if(shuffle)
100 | {
101 | char* temp=sl->s[i];
102 | sl->s[i]=shuffle;
103 | shuffle=temp;
104 | }
105 | else
106 | if(strcmp(str,sl->s[i])<0)
107 | {
108 | shuffle=sl->s[i];
109 | sl->s[i]=MallocString(str);
110 | }
111 |
112 | if(shuffle)
113 | sl->s[sl->n]=shuffle;
114 | else
115 | sl->s[sl->n]=MallocString(str);
116 | }
117 | else
118 | sl->s[sl->n]=MallocString(str);
119 |
120 | sl->n++;
121 | }
122 |
123 |
124 | /*++++++++++++++++++++++++++++++++++++++
125 | Add a pair of strings to the string list 2, the list stores a Malloced copy of the arguments.
126 |
127 | StringList2 sl The string list 2 to add to.
128 |
129 | char* str1 The first string to add.
130 |
131 | char* str2 The second string to add.
132 |
133 | int alphalist If true then the list is sorted into alphabetical order of the first string, then second string.
134 |
135 | int uniqlist If true then duplicated entries of the first string are not allowed to be added.
136 | ++++++++++++++++++++++++++++++++++++++*/
137 |
138 | void AddToStringList2(StringList2 sl,char* str1,char* str2,int alphalist,int uniqlist)
139 | {
140 | int i;
141 |
142 | #if DEBUG
143 | printf("#Slist.c# Add strings %s and %s to the string list 2\n",str1,str2);
144 | #endif
145 |
146 | if(uniqlist)
147 | for(i=0;i<sl->n;i++)
148 | if(!strcmp(str1,sl->s1[i]))
149 | return;
150 |
151 | if(!sl->n)
152 | {
153 | sl->s1=(char**)Malloc(8*sizeof(char*));
154 | sl->s2=(char**)Malloc(8*sizeof(char*));
155 | }
156 | else
157 | if(sl->n%8==0)
158 | {
159 | sl->s1=(char**)Realloc(sl->s1,(sl->n+8)*sizeof(char*));
160 | sl->s2=(char**)Realloc(sl->s2,(sl->n+8)*sizeof(char*));
161 | }
162 |
163 | if(alphalist)
164 | {
165 | char *shuffle1=NULL;
166 | char *shuffle2=NULL;
167 |
168 | for(i=0;i<sl->n;i++)
169 | if(shuffle1)
170 | {
171 | char* temp1=sl->s1[i];
172 | char* temp2=sl->s2[i];
173 | sl->s1[i]=shuffle1;
174 | sl->s2[i]=shuffle2;
175 | shuffle1=temp1;
176 | shuffle2=temp2;
177 | }
178 | else
179 | if(strcmp(str1,sl->s1[i])<0 ||
180 | (str2 && sl->s2[i] && strcmp(str1,sl->s1[i])==0 && strcmp(str2,sl->s2[i])<0))
181 | {
182 | shuffle1=sl->s1[i];
183 | shuffle2=sl->s2[i];
184 | sl->s1[i]=MallocString(str1);
185 | sl->s2[i]=MallocString(str2);
186 | }
187 |
188 | if(shuffle1)
189 | {
190 | sl->s1[sl->n]=shuffle1;
191 | sl->s2[sl->n]=shuffle2;
192 | }
193 | else
194 | {
195 | sl->s1[sl->n]=MallocString(str1);
196 | sl->s2[sl->n]=MallocString(str2);
197 | }
198 | }
199 | else
200 | {
201 | sl->s1[sl->n]=MallocString(str1);
202 | sl->s2[sl->n]=MallocString(str2);
203 | }
204 |
205 | sl->n++;
206 | }
207 |
208 |
209 | /*++++++++++++++++++++++++++++++++++++++
210 | Delete a string list.
211 |
212 | StringList sl The string list to delete.
213 | ++++++++++++++++++++++++++++++++++++++*/
214 |
215 | void DeleteStringList(StringList sl)
216 | {
217 | int i;
218 |
219 | for(i=0;i<sl->n;i++)
220 | Free(sl->s[i]);
221 |
222 | if(sl->s)
223 | Free(sl->s);
224 |
225 | Free(sl);
226 | }
227 |
228 |
229 | /*++++++++++++++++++++++++++++++++++++++
230 | Delete a string list 2.
231 |
232 | StringList2 sl The string list 2 to delete.
233 | ++++++++++++++++++++++++++++++++++++++*/
234 |
235 | void DeleteStringList2(StringList2 sl)
236 | {
237 | int i;
238 |
239 | for(i=0;i<sl->n;i++)
240 | {
241 | Free(sl->s1[i]);
242 | if(sl->s2[i])
243 | Free(sl->s2[i]);
244 | }
245 |
246 | if(sl->s1)
247 | Free(sl->s1);
248 | if(sl->s2)
249 | Free(sl->s2);
250 |
251 | Free(sl);
252 | }