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