1 /* stringlists.c */
2 /*****************************************************************************/
3 /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */
4 /* */
5 /* AS-Portierung */
6 /* */
7 /* Implementation von String-Listen */
8 /* */
9 /* Historie: 5. 4.1996 Grundsteinlegung */
10 /* */
11 /*****************************************************************************/
12
13 #include "stdinc.h"
14 #include <string.h>
15 #include "strutil.h"
16 #include "stringlists.h"
17
InitStringList(StringList * List)18 void InitStringList(StringList *List)
19 {
20 *List = NULL;
21 }
22
ClearStringEntry(StringRecPtr * Elem)23 void ClearStringEntry(StringRecPtr *Elem)
24 {
25 if ((*Elem)->Content)
26 free((*Elem)->Content);
27 free(*Elem);
28 *Elem = NULL;
29 }
30
ClearStringList(StringList * List)31 void ClearStringList(StringList *List)
32 {
33 StringRecPtr Hilf;
34
35 while (*List)
36 {
37 Hilf = (*List);
38 *List = (*List)->Next;
39 ClearStringEntry(&Hilf);
40 }
41 }
42
AddStringListFirst(StringList * List,const char * NewStr)43 void AddStringListFirst(StringList *List, const char *NewStr)
44 {
45 StringRecPtr Neu;
46
47 Neu=(StringRecPtr) malloc(sizeof(StringRec));
48 Neu->Content = NewStr ? as_strdup(NewStr) : NULL;
49 Neu->Next = (*List);
50 *List = Neu;
51 }
52
AddStringListLast(StringList * List,const char * NewStr)53 void AddStringListLast(StringList *List, const char *NewStr)
54 {
55 StringRecPtr Neu, Lauf;
56
57 Neu = (StringRecPtr) malloc(sizeof(StringRec));
58 Neu->Content = NewStr ? as_strdup(NewStr) : NULL;
59 Neu->Next = NULL;
60 if (!*List)
61 *List = Neu;
62 else
63 {
64 Lauf = (*List);
65 while (Lauf->Next)
66 Lauf = Lauf->Next;
67 Lauf->Next = Neu;
68 }
69 }
70
RemoveStringList(StringList * List,const char * OldStr)71 void RemoveStringList(StringList *List, const char *OldStr)
72 {
73 StringRecPtr Lauf, Hilf;
74
75 if (!*List)
76 return;
77 if (!strcmp((*List)->Content,OldStr))
78 {
79 Hilf = *List;
80 *List = (*List)->Next;
81 ClearStringEntry(&Hilf);
82 }
83 else
84 {
85 Lauf = (*List);
86 while ((Lauf->Next) && (strcmp(Lauf->Next->Content,OldStr)))
87 Lauf = Lauf->Next;
88 if (Lauf->Next)
89 {
90 Hilf = Lauf->Next;
91 Lauf->Next = Hilf->Next;
92 ClearStringEntry(&Hilf);
93 }
94 }
95 }
96
GetStringListFirst(StringList List,StringRecPtr * Lauf)97 const char *GetStringListFirst(StringList List, StringRecPtr *Lauf)
98 {
99 *Lauf = List;
100 if (!*Lauf)
101 return "";
102 else
103 {
104 char *tmp = (*Lauf)->Content;
105 *Lauf = (*Lauf)->Next;
106 return tmp;
107 }
108 }
109
GetStringListNext(StringRecPtr * Lauf)110 const char *GetStringListNext(StringRecPtr *Lauf)
111 {
112 if (!*Lauf)
113 return "";
114 else
115 {
116 char *tmp = (*Lauf)->Content;
117 *Lauf = (*Lauf)->Next;
118 return tmp;
119 }
120 }
121
GetAndCutStringList(StringList * List)122 char *GetAndCutStringList(StringList *List)
123 {
124 StringRecPtr Hilf;
125 static String Result;
126
127 if (!*List)
128 Result[0] = '\0';
129 else
130 {
131 Hilf = (*List);
132 *List = (*List)->Next;
133 strmaxcpy(Result, Hilf->Content, STRINGSIZE);
134 free(Hilf->Content);
135 free(Hilf);
136 }
137 return Result;
138 }
139
StringListEmpty(StringList List)140 Boolean StringListEmpty(StringList List)
141 {
142 return (!List);
143 }
144
DuplicateStringList(StringList Src)145 StringList DuplicateStringList(StringList Src)
146 {
147 StringRecPtr Lauf;
148 StringList Dest;
149
150 InitStringList(&Dest);
151 if (Src)
152 {
153 AddStringListLast(&Dest, GetStringListFirst(Src, &Lauf));
154 while (Lauf)
155 AddStringListLast(&Dest, GetStringListNext(&Lauf));
156 }
157 return Dest;
158 }
159
StringListPresent(StringList List,char * Search)160 Boolean StringListPresent(StringList List, char *Search)
161 {
162 while ((List) && (strcmp(List->Content, Search)))
163 List = List->Next;
164 return (List != NULL);
165 }
166
DumpStringList(StringList List)167 void DumpStringList(StringList List)
168 {
169 while (List)
170 {
171 printf("'%s' -> ", List->Content ? List->Content : "<NULL>");
172 List = List->Next;
173 }
174 printf("\n");
175 }
176