1 | /*************************************** 2 | $Header: /home/amb/cxref/src/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 | }