diff options
Diffstat (limited to 'mkfontscale/list.c')
-rw-r--r-- | mkfontscale/list.c | 533 |
1 files changed, 281 insertions, 252 deletions
diff --git a/mkfontscale/list.c b/mkfontscale/list.c index 2f5bc2b8c..34abf1bff 100644 --- a/mkfontscale/list.c +++ b/mkfontscale/list.c @@ -1,252 +1,281 @@ -/* - Copyright (c) 2002-2003 by Juliusz Chroboczek - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ -/* $XFree86: xc/programs/mkfontscale/list.c,v 1.5 2003/07/04 16:24:30 eich Exp $ */ - -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include <string.h> -#include "list.h" - -#ifdef NEED_SNPRINTF -#undef SCOPE -#define SCOPE static -#include "snprintf.c" -#endif - -int -listMember(char *elt, ListPtr list) -{ - while(list != NULL) { - if(strcmp(elt, list->value) == 0) - return 1; - list = list->next; - } - return 0; -} - -ListPtr -listCons(char *car, ListPtr cdr) -{ - ListPtr lcar = malloc(sizeof(ListRec)); - if(!lcar) - return NULL; - lcar -> value = car; - lcar -> next = cdr; - return lcar; -} - -ListPtr -listAdjoin(char *car, ListPtr cdr) -{ - if(listMember(car, cdr)) { - free(car); - return cdr; - } - return listCons(car, cdr); -} - -char * -dsprintf(char *f, ...) -{ - va_list args; - char *string; - { - int n, size = 20; - while(1) { - if(size > 4096) - return NULL; - string = malloc(size); - if(!string) - return NULL; - va_start(args, f); - n = vsnprintf(string, size, f, args); - va_end(args); - if(n >= 0 && n < size) - return string; - else if(n >= size) - size = n + 1; - else - size = size * 3 / 2 + 1; - free(string); - } - } -} - - -ListPtr -listConsF(ListPtr cdr, char *f, ...) -{ - va_list args; - char *string; - { - int n, size = 20; - while(1) { - if(size > 4096) - return NULL; - string = malloc(size); - if(!string) - return NULL; - va_start(args, f); - n = vsnprintf(string, size, f, args); - va_end(args); - if(n >= 0 && n < size) - return listCons(string, cdr); - else if(n >= size) - size = n + 1; - else - size = size * 3 / 2 + 1; - free(string); - } - } -} - -ListPtr -listAdjoinF(ListPtr cdr, char *f, ...) -{ - va_list args; - char *string; - { - int n, size = 20; - while(1) { - if(size > 4096) - return NULL; - string = malloc(size); - if(!string) - return NULL; - va_start(args, f); - n = vsnprintf(string, size, f, args); - va_end(args); - if(n >= 0 && n < size) - return listAdjoin(string, cdr); - else if(n >= size) - size = n + 1; - else - size = size * 3 / 2 + 1; - free(string); - } - } -} - -int -listLength(ListPtr list) -{ - int n = 0; - while(list) { - n++; - list = list->next; - } - return n; -} - -ListPtr -appendList(ListPtr first, ListPtr second) -{ - ListPtr current; - - if(second == NULL) - return first; - - if(first == NULL) - return second; - - for(current = first; current->next; current = current->next) - ; - - current->next = second; - return first; -} - -ListPtr -makeList(char **a, int n, ListPtr old, int begin) -{ - ListPtr first, current, next; - int i; - - if(n == 0) - return old; - - first = malloc(sizeof(ListRec)); - if(!first) - return NULL; - - first->value = a[0]; - first->next = NULL; - - current = first; - for(i = 1; i < n; i++) { - next = malloc(sizeof(ListRec)); - if(!next) - return NULL; - next->value = a[i]; - next->next = NULL; - - current->next = next; - current = next; - } - if(begin) { - current->next = old; - return first; - } else { - return appendList(old, first); - } -} - -ListPtr -reverseList(ListPtr old) -{ - ListPtr new = NULL, current; - while(old) { - current = old; - old = old->next; - current->next = new; - new = current; - } - return new; -} - -void -destroyList(ListPtr old) -{ - ListPtr next; - if(!old) - return; - while(old) { - next = old->next; - free(old); - old = next; - } -} - -void -deepDestroyList(ListPtr old) -{ - ListPtr next; - if(!old) - return; - while(old) { - next = old->next; - free(old->value); - free(old); - old = next; - } -} +/*
+ Copyright (c) 2002-2003 by Juliusz Chroboczek
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include "list.h"
+
+int
+listMember(char *elt, ListPtr list)
+{
+ while(list != NULL) {
+ if(strcmp(elt, list->value) == 0)
+ return 1;
+ list = list->next;
+ }
+ return 0;
+}
+
+ListPtr
+listCons(char *car, ListPtr cdr)
+{
+ ListPtr lcar = malloc(sizeof(ListRec));
+ if(!lcar)
+ return NULL;
+ lcar -> value = car;
+ lcar -> next = cdr;
+ return lcar;
+}
+
+ListPtr
+listAdjoin(char *car, ListPtr cdr)
+{
+ if(listMember(car, cdr)) {
+ free(car);
+ return cdr;
+ }
+ return listCons(car, cdr);
+}
+
+char *
+dsprintf(char *f, ...)
+{
+ va_list args;
+ char *string;
+ {
+ int n, size = 20;
+ while(1) {
+ if(size > 4096)
+ return NULL;
+ string = malloc(size);
+ if(!string)
+ return NULL;
+ va_start(args, f);
+ n = vsnprintf(string, size, f, args);
+ va_end(args);
+ if(n >= 0 && n < size)
+ return string;
+ else if(n >= size)
+ size = n + 1;
+ else
+ size = size * 3 / 2 + 1;
+ free(string);
+ }
+ }
+}
+
+
+ListPtr
+listConsF(ListPtr cdr, char *f, ...)
+{
+ va_list args;
+ char *string;
+ {
+ int n, size = 20;
+ while(1) {
+ if(size > 4096)
+ return NULL;
+ string = malloc(size);
+ if(!string)
+ return NULL;
+ va_start(args, f);
+ n = vsnprintf(string, size, f, args);
+ va_end(args);
+ if(n >= 0 && n < size)
+ return listCons(string, cdr);
+ else if(n >= size)
+ size = n + 1;
+ else
+ size = size * 3 / 2 + 1;
+ free(string);
+ }
+ }
+}
+
+ListPtr
+listAdjoinF(ListPtr cdr, char *f, ...)
+{
+ va_list args;
+ char *string;
+ {
+ int n, size = 20;
+ while(1) {
+ if(size > 4096)
+ return NULL;
+ string = malloc(size);
+ if(!string)
+ return NULL;
+ va_start(args, f);
+ n = vsnprintf(string, size, f, args);
+ va_end(args);
+ if(n >= 0 && n < size)
+ return listAdjoin(string, cdr);
+ else if(n >= size)
+ size = n + 1;
+ else
+ size = size * 3 / 2 + 1;
+ free(string);
+ }
+ }
+}
+
+int
+listLength(ListPtr list)
+{
+ int n = 0;
+ while(list) {
+ n++;
+ list = list->next;
+ }
+ return n;
+}
+
+ListPtr
+appendList(ListPtr first, ListPtr second)
+{
+ ListPtr current;
+
+ if(second == NULL)
+ return first;
+
+ if(first == NULL)
+ return second;
+
+ for(current = first; current->next; current = current->next)
+ ;
+
+ current->next = second;
+ return first;
+}
+
+ListPtr
+makeList(char **a, int n, ListPtr old, int begin)
+{
+ ListPtr first, current, next;
+ int i;
+
+ if(n == 0)
+ return old;
+
+ first = malloc(sizeof(ListRec));
+ if(!first)
+ return NULL;
+
+ first->value = a[0];
+ first->next = NULL;
+
+ current = first;
+ for(i = 1; i < n; i++) {
+ next = malloc(sizeof(ListRec));
+ if(!next) {
+ destroyList(first);
+ return NULL;
+ }
+ next->value = a[i];
+ next->next = NULL;
+
+ current->next = next;
+ current = next;
+ }
+ if(begin) {
+ current->next = old;
+ return first;
+ } else {
+ return appendList(old, first);
+ }
+}
+
+ListPtr
+reverseList(ListPtr old)
+{
+ ListPtr new = NULL, current;
+ while(old) {
+ current = old;
+ old = old->next;
+ current->next = new;
+ new = current;
+ }
+ return new;
+}
+
+/* qsort helper for sorting list entries */
+static int
+compareListEntries(const void *a, const void *b)
+{
+ const ListPtr lista = *(const ListPtr *) a;
+ const ListPtr listb = *(const ListPtr *) b;
+
+ return strcmp(lista->value, listb->value);
+}
+
+ListPtr
+sortList(ListPtr old)
+{
+ int i;
+ int l = listLength(old);
+ ListPtr n;
+ ListPtr *sorted = malloc(l * sizeof(ListPtr));
+
+ if (sorted == NULL)
+ return old;
+
+ for (n = old, i = 0; n != NULL; n = n->next) {
+ sorted[i++] = n;
+ }
+ qsort(sorted, i, sizeof(ListPtr), compareListEntries);
+ n = sorted[0];
+ for (i = 0; i < (l - 1); i++) {
+ sorted[i]->next = sorted[i+1];
+ }
+ sorted[i]->next = NULL;
+ free(sorted);
+ return n;
+}
+
+void
+destroyList(ListPtr old)
+{
+ ListPtr next;
+ if(!old)
+ return;
+ while(old) {
+ next = old->next;
+ free(old);
+ old = next;
+ }
+}
+
+void
+deepDestroyList(ListPtr old)
+{
+ ListPtr next;
+ if(!old)
+ return;
+ while(old) {
+ next = old->next;
+ free(old->value);
+ free(old);
+ old = next;
+ }
+}
|