Merge branch 'wk/test-gpgrt-estream'
[gnupg.git] / common / strlist.c
1 /* strlist.c -  string helpers
2  * Copyright (C) 1998, 2000, 2001, 2006 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB, which is a subsystem of GnuPG.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of either
8  *
9  *   - the GNU Lesser General Public License as published by the Free
10  *     Software Foundation; either version 3 of the License, or (at
11  *     your option) any later version.
12  *
13  * or
14  *
15  *   - the GNU General Public License as published by the Free
16  *     Software Foundation; either version 2 of the License, or (at
17  *     your option) any later version.
18  *
19  * or both in parallel, as here.
20  *
21  * JNLIB is distributed in the hope that it will be useful, but
22  * WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * General Public License for more details.
25  *
26  * You should have received a copies of the GNU General Public License
27  * and the GNU Lesser General Public License along with this program;
28  * if not, see <http://www.gnu.org/licenses/>.
29  */
30
31 #include <config.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <stdarg.h>
35 #include <ctype.h>
36
37 #include "libjnlib-config.h"
38 #include "strlist.h"
39 #ifdef JNLIB_NEED_UTF8CONV
40 #include "utf8conv.h"
41 #endif
42
43 void
44 free_strlist( strlist_t sl )
45 {
46     strlist_t sl2;
47
48     for(; sl; sl = sl2 ) {
49         sl2 = sl->next;
50         jnlib_free(sl);
51     }
52 }
53
54
55 /* Add STRING to the LIST at the front.  This function terminates the
56    process on memory shortage.  */
57 strlist_t
58 add_to_strlist( strlist_t *list, const char *string )
59 {
60     strlist_t sl;
61
62     sl = jnlib_xmalloc( sizeof *sl + strlen(string));
63     sl->flags = 0;
64     strcpy(sl->d, string);
65     sl->next = *list;
66     *list = sl;
67     return sl;
68 }
69
70
71 /* Add STRING to the LIST at the front.  This function returns NULL
72    and sets ERRNO on memory shortage.  */
73 strlist_t
74 add_to_strlist_try (strlist_t *list, const char *string)
75 {
76   strlist_t sl;
77
78   sl = jnlib_malloc (sizeof *sl + strlen (string));
79   if (sl)
80     {
81       sl->flags = 0;
82       strcpy (sl->d, string);
83       sl->next = *list;
84       *list = sl;
85     }
86   return sl;
87 }
88
89
90 /* Same as add_to_strlist() but if IS_UTF8 is *not* set, a conversion
91    to UTF-8 is done.  This function terminates the process on memory
92    shortage.  */
93 #ifdef JNLIB_NEED_UTF8CONV
94 strlist_t
95 add_to_strlist2( strlist_t *list, const char *string, int is_utf8 )
96 {
97   strlist_t sl;
98
99   if (is_utf8)
100     sl = add_to_strlist( list, string );
101   else
102     {
103       char *p = native_to_utf8( string );
104       sl = add_to_strlist( list, p );
105       jnlib_free ( p );
106     }
107   return sl;
108 }
109 #endif /* JNLIB_NEED_UTF8CONV*/
110
111
112 /* Add STRING to the LIST at the end.  This function terminates the
113    process on memory shortage.  */
114 strlist_t
115 append_to_strlist( strlist_t *list, const char *string )
116 {
117     strlist_t r, sl;
118
119     sl = jnlib_xmalloc( sizeof *sl + strlen(string));
120     sl->flags = 0;
121     strcpy(sl->d, string);
122     sl->next = NULL;
123     if( !*list )
124         *list = sl;
125     else {
126         for( r = *list; r->next; r = r->next )
127             ;
128         r->next = sl;
129     }
130     return sl;
131 }
132
133
134 #ifdef JNLIB_NEED_UTF8CONV
135 strlist_t
136 append_to_strlist2( strlist_t *list, const char *string, int is_utf8 )
137 {
138   strlist_t sl;
139
140   if( is_utf8 )
141     sl = append_to_strlist( list, string );
142   else
143     {
144       char *p = native_to_utf8 (string);
145       sl = append_to_strlist( list, p );
146       jnlib_free( p );
147     }
148   return sl;
149 }
150 #endif /* JNLIB_NEED_UTF8CONV */
151
152
153 /* Return a copy of LIST.  This function terminates the process on
154    memory shortage.*/
155 strlist_t
156 strlist_copy (strlist_t list)
157 {
158   strlist_t newlist = NULL, sl, *last;
159
160   last = &newlist;
161   for (; list; list = list->next)
162     {
163       sl = jnlib_xmalloc (sizeof *sl + strlen (list->d));
164       sl->flags = list->flags;
165       strcpy(sl->d, list->d);
166       sl->next = NULL;
167       *last = sl;
168       last = &sl;
169     }
170   return newlist;
171 }
172
173
174
175 strlist_t
176 strlist_prev( strlist_t head, strlist_t node )
177 {
178     strlist_t n;
179
180     for(n=NULL; head && head != node; head = head->next )
181         n = head;
182     return n;
183 }
184
185 strlist_t
186 strlist_last( strlist_t node )
187 {
188     if( node )
189         for( ; node->next ; node = node->next )
190             ;
191     return node;
192 }
193
194
195 /* Remove the first item from LIST and return its content in an
196    allocated buffer.  This function terminates the process on memory
197    shortage.  */
198 char *
199 strlist_pop (strlist_t *list)
200 {
201   char *str=NULL;
202   strlist_t sl=*list;
203
204   if(sl)
205     {
206       str=jnlib_xmalloc(strlen(sl->d)+1);
207       strcpy(str,sl->d);
208
209       *list=sl->next;
210       jnlib_free(sl);
211     }
212
213   return str;
214 }