list.c revision ea6ae205
1ea6ae205Smrg/*
2ea6ae205Smrg  Copyright (c) 2002-2003 by Juliusz Chroboczek
3ea6ae205Smrg
4ea6ae205Smrg  Permission is hereby granted, free of charge, to any person obtaining a copy
5ea6ae205Smrg  of this software and associated documentation files (the "Software"), to deal
6ea6ae205Smrg  in the Software without restriction, including without limitation the rights
7ea6ae205Smrg  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8ea6ae205Smrg  copies of the Software, and to permit persons to whom the Software is
9ea6ae205Smrg  furnished to do so, subject to the following conditions:
10ea6ae205Smrg
11ea6ae205Smrg  The above copyright notice and this permission notice shall be included in
12ea6ae205Smrg  all copies or substantial portions of the Software.
13ea6ae205Smrg
14ea6ae205Smrg  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ea6ae205Smrg  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ea6ae205Smrg  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17ea6ae205Smrg  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18ea6ae205Smrg  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19ea6ae205Smrg  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20ea6ae205Smrg  THE SOFTWARE.
21ea6ae205Smrg*/
22ea6ae205Smrg/* $XFree86: xc/programs/mkfontscale/list.c,v 1.5 2003/07/04 16:24:30 eich Exp $ */
23ea6ae205Smrg
24ea6ae205Smrg#include <stdlib.h>
25ea6ae205Smrg#include <stdio.h>
26ea6ae205Smrg#include <stdarg.h>
27ea6ae205Smrg#include <string.h>
28ea6ae205Smrg#include "list.h"
29ea6ae205Smrg
30ea6ae205Smrg#ifdef NEED_SNPRINTF
31ea6ae205Smrg#undef SCOPE
32ea6ae205Smrg#define SCOPE static
33ea6ae205Smrg#include "snprintf.c"
34ea6ae205Smrg#endif
35ea6ae205Smrg
36ea6ae205Smrgint
37ea6ae205SmrglistMember(char *elt, ListPtr list)
38ea6ae205Smrg{
39ea6ae205Smrg    while(list != NULL) {
40ea6ae205Smrg        if(strcmp(elt, list->value) == 0)
41ea6ae205Smrg            return 1;
42ea6ae205Smrg        list = list->next;
43ea6ae205Smrg    }
44ea6ae205Smrg    return 0;
45ea6ae205Smrg}
46ea6ae205Smrg
47ea6ae205SmrgListPtr
48ea6ae205SmrglistCons(char *car, ListPtr cdr)
49ea6ae205Smrg{
50ea6ae205Smrg    ListPtr lcar = malloc(sizeof(ListRec));
51ea6ae205Smrg    if(!lcar)
52ea6ae205Smrg        return NULL;
53ea6ae205Smrg    lcar -> value = car;
54ea6ae205Smrg    lcar -> next = cdr;
55ea6ae205Smrg    return lcar;
56ea6ae205Smrg}
57ea6ae205Smrg
58ea6ae205SmrgListPtr
59ea6ae205SmrglistAdjoin(char *car, ListPtr cdr)
60ea6ae205Smrg{
61ea6ae205Smrg    if(listMember(car, cdr)) {
62ea6ae205Smrg        free(car);
63ea6ae205Smrg        return cdr;
64ea6ae205Smrg    }
65ea6ae205Smrg    return listCons(car, cdr);
66ea6ae205Smrg}
67ea6ae205Smrg
68ea6ae205Smrgchar *
69ea6ae205Smrgdsprintf(char *f, ...)
70ea6ae205Smrg{
71ea6ae205Smrg    va_list args;
72ea6ae205Smrg    char *string;
73ea6ae205Smrg    {
74ea6ae205Smrg	int n, size = 20;
75ea6ae205Smrg	while(1) {
76ea6ae205Smrg	    if(size > 4096)
77ea6ae205Smrg		return NULL;
78ea6ae205Smrg	    string = malloc(size);
79ea6ae205Smrg	    if(!string)
80ea6ae205Smrg		return NULL;
81ea6ae205Smrg	    va_start(args, f);
82ea6ae205Smrg	    n = vsnprintf(string, size, f, args);
83ea6ae205Smrg	    va_end(args);
84ea6ae205Smrg	    if(n >= 0 && n < size)
85ea6ae205Smrg                return string;
86ea6ae205Smrg	    else if(n >= size)
87ea6ae205Smrg		size = n + 1;
88ea6ae205Smrg	    else
89ea6ae205Smrg		size = size * 3 / 2 + 1;
90ea6ae205Smrg	    free(string);
91ea6ae205Smrg	}
92ea6ae205Smrg    }
93ea6ae205Smrg}
94ea6ae205Smrg
95ea6ae205Smrg
96ea6ae205SmrgListPtr
97ea6ae205SmrglistConsF(ListPtr cdr, char *f, ...)
98ea6ae205Smrg{
99ea6ae205Smrg    va_list args;
100ea6ae205Smrg    char *string;
101ea6ae205Smrg    {
102ea6ae205Smrg	int n, size = 20;
103ea6ae205Smrg	while(1) {
104ea6ae205Smrg	    if(size > 4096)
105ea6ae205Smrg		return NULL;
106ea6ae205Smrg	    string = malloc(size);
107ea6ae205Smrg	    if(!string)
108ea6ae205Smrg		return NULL;
109ea6ae205Smrg	    va_start(args, f);
110ea6ae205Smrg	    n = vsnprintf(string, size, f, args);
111ea6ae205Smrg	    va_end(args);
112ea6ae205Smrg	    if(n >= 0 && n < size)
113ea6ae205Smrg		return listCons(string, cdr);
114ea6ae205Smrg	    else if(n >= size)
115ea6ae205Smrg		size = n + 1;
116ea6ae205Smrg	    else
117ea6ae205Smrg		size = size * 3 / 2 + 1;
118ea6ae205Smrg	    free(string);
119ea6ae205Smrg	}
120ea6ae205Smrg    }
121ea6ae205Smrg}
122ea6ae205Smrg
123ea6ae205SmrgListPtr
124ea6ae205SmrglistAdjoinF(ListPtr cdr, char *f, ...)
125ea6ae205Smrg{
126ea6ae205Smrg    va_list args;
127ea6ae205Smrg    char *string;
128ea6ae205Smrg    {
129ea6ae205Smrg	int n, size = 20;
130ea6ae205Smrg	while(1) {
131ea6ae205Smrg	    if(size > 4096)
132ea6ae205Smrg		return NULL;
133ea6ae205Smrg	    string = malloc(size);
134ea6ae205Smrg	    if(!string)
135ea6ae205Smrg		return NULL;
136ea6ae205Smrg	    va_start(args, f);
137ea6ae205Smrg	    n = vsnprintf(string, size, f, args);
138ea6ae205Smrg	    va_end(args);
139ea6ae205Smrg	    if(n >= 0 && n < size)
140ea6ae205Smrg		return listAdjoin(string, cdr);
141ea6ae205Smrg	    else if(n >= size)
142ea6ae205Smrg		size = n + 1;
143ea6ae205Smrg	    else
144ea6ae205Smrg		size = size * 3 / 2 + 1;
145ea6ae205Smrg	    free(string);
146ea6ae205Smrg	}
147ea6ae205Smrg    }
148ea6ae205Smrg}
149ea6ae205Smrg
150ea6ae205Smrgint
151ea6ae205SmrglistLength(ListPtr list)
152ea6ae205Smrg{
153ea6ae205Smrg    int n = 0;
154ea6ae205Smrg    while(list) {
155ea6ae205Smrg        n++;
156ea6ae205Smrg        list = list->next;
157ea6ae205Smrg    }
158ea6ae205Smrg    return n;
159ea6ae205Smrg}
160ea6ae205Smrg
161ea6ae205SmrgListPtr
162ea6ae205SmrgappendList(ListPtr first, ListPtr second)
163ea6ae205Smrg{
164ea6ae205Smrg    ListPtr current;
165ea6ae205Smrg
166ea6ae205Smrg    if(second == NULL)
167ea6ae205Smrg        return first;
168ea6ae205Smrg
169ea6ae205Smrg    if(first == NULL)
170ea6ae205Smrg        return second;
171ea6ae205Smrg
172ea6ae205Smrg    for(current = first; current->next; current = current->next)
173ea6ae205Smrg        ;
174ea6ae205Smrg
175ea6ae205Smrg    current->next = second;
176ea6ae205Smrg    return first;
177ea6ae205Smrg}
178ea6ae205Smrg
179ea6ae205SmrgListPtr
180ea6ae205SmrgmakeList(char **a, int n, ListPtr old, int begin)
181ea6ae205Smrg{
182ea6ae205Smrg    ListPtr first, current, next;
183ea6ae205Smrg    int i;
184ea6ae205Smrg
185ea6ae205Smrg    if(n == 0)
186ea6ae205Smrg        return old;
187ea6ae205Smrg
188ea6ae205Smrg    first = malloc(sizeof(ListRec));
189ea6ae205Smrg    if(!first)
190ea6ae205Smrg        return NULL;
191ea6ae205Smrg
192ea6ae205Smrg    first->value = a[0];
193ea6ae205Smrg    first->next = NULL;
194ea6ae205Smrg
195ea6ae205Smrg    current = first;
196ea6ae205Smrg    for(i = 1; i < n; i++) {
197ea6ae205Smrg        next = malloc(sizeof(ListRec));
198ea6ae205Smrg        if(!next)
199ea6ae205Smrg            return NULL;
200ea6ae205Smrg        next->value = a[i];
201ea6ae205Smrg        next->next = NULL;
202ea6ae205Smrg
203ea6ae205Smrg        current->next = next;
204ea6ae205Smrg        current = next;
205ea6ae205Smrg    }
206ea6ae205Smrg    if(begin) {
207ea6ae205Smrg        current->next = old;
208ea6ae205Smrg        return first;
209ea6ae205Smrg    } else {
210ea6ae205Smrg        return appendList(old, first);
211ea6ae205Smrg    }
212ea6ae205Smrg}
213ea6ae205Smrg
214ea6ae205SmrgListPtr
215ea6ae205SmrgreverseList(ListPtr old)
216ea6ae205Smrg{
217ea6ae205Smrg    ListPtr new = NULL, current;
218ea6ae205Smrg    while(old) {
219ea6ae205Smrg        current = old;
220ea6ae205Smrg        old = old->next;
221ea6ae205Smrg        current->next = new;
222ea6ae205Smrg        new = current;
223ea6ae205Smrg    }
224ea6ae205Smrg    return new;
225ea6ae205Smrg}
226ea6ae205Smrg
227ea6ae205Smrgvoid
228ea6ae205SmrgdestroyList(ListPtr old)
229ea6ae205Smrg{
230ea6ae205Smrg    ListPtr next;
231ea6ae205Smrg    if(!old)
232ea6ae205Smrg        return;
233ea6ae205Smrg    while(old) {
234ea6ae205Smrg        next = old->next;
235ea6ae205Smrg        free(old);
236ea6ae205Smrg        old = next;
237ea6ae205Smrg    }
238ea6ae205Smrg}
239ea6ae205Smrg
240ea6ae205Smrgvoid
241ea6ae205SmrgdeepDestroyList(ListPtr old)
242ea6ae205Smrg{
243ea6ae205Smrg    ListPtr next;
244ea6ae205Smrg    if(!old)
245ea6ae205Smrg        return;
246ea6ae205Smrg    while(old) {
247ea6ae205Smrg        next = old->next;
248ea6ae205Smrg        free(old->value);
249ea6ae205Smrg        free(old);
250ea6ae205Smrg        old = next;
251ea6ae205Smrg    }
252ea6ae205Smrg}
253