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