diff options
Diffstat (limited to 'src/backend/nodes/list.c')
-rw-r--r-- | src/backend/nodes/list.c | 685 |
1 files changed, 363 insertions, 322 deletions
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c index 6dc010eff65..334030822f7 100644 --- a/src/backend/nodes/list.c +++ b/src/backend/nodes/list.c @@ -1,23 +1,23 @@ /*------------------------------------------------------------------------- * * list.c-- - * various list handling routines + * various list handling routines * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.4 1997/08/19 21:31:39 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.5 1997/09/07 04:42:46 momjian Exp $ * * NOTES - * XXX a few of the following functions are duplicated to handle - * List of pointers and List of integers separately. Some day, - * someone should unify them. - ay 11/2/94 - * This file needs cleanup. + * XXX a few of the following functions are duplicated to handle + * List of pointers and List of integers separately. Some day, + * someone should unify them. - ay 11/2/94 + * This file needs cleanup. * * HISTORY - * AUTHOR DATE MAJOR EVENT - * Andrew Yu Oct, 1994 file creation + * AUTHOR DATE MAJOR EVENT + * Andrew Yu Oct, 1994 file creation * *------------------------------------------------------------------------- */ @@ -25,442 +25,483 @@ #include "postgres.h" #include "nodes/pg_list.h" #include "nodes/parsenodes.h" -#include "utils/builtins.h" /* for namecpy */ +#include "utils/builtins.h" /* for namecpy */ #include "utils/elog.h" #include "utils/palloc.h" -List * -makeList(void *elem, ...) +List * +makeList(void *elem,...) { - va_list args; - List *retval = NIL; - List *temp = NIL; - List *tempcons = NIL; - - va_start(args, elem); - - temp = elem; - while (temp != (void *) -1) { - temp = lcons(temp, NIL); - if (tempcons == NIL) - retval = temp; - else - lnext(tempcons) = temp; - tempcons = temp; - - temp = va_arg(args, void *); - } + va_list args; + List *retval = NIL; + List *temp = NIL; + List *tempcons = NIL; + + va_start(args, elem); + + temp = elem; + while (temp != (void *) -1) + { + temp = lcons(temp, NIL); + if (tempcons == NIL) + retval = temp; + else + lnext(tempcons) = temp; + tempcons = temp; + + temp = va_arg(args, void *); + } - va_end(args); + va_end(args); - return (retval); + return (retval); } -List * -lcons(void *obj, List *list) +List * +lcons(void *obj, List * list) { - List *l = makeNode(List); - lfirst(l) = obj; - lnext(l) = list; - return l; + List *l = makeNode(List); + + lfirst(l) = obj; + lnext(l) = list; + return l; } -List * -lconsi(int datum, List *list) +List * +lconsi(int datum, List * list) { - List *l = makeNode(List); - lfirsti(l) = datum; - lnext(l) = list; - return l; + List *l = makeNode(List); + + lfirsti(l) = datum; + lnext(l) = list; + return l; } -List * -lappend(List *list, void *obj) +List * +lappend(List * list, void *obj) { - return nconc(list, lcons(obj, NIL)); + return nconc(list, lcons(obj, NIL)); } -List * -lappendi(List *list, int datum) +List * +lappendi(List * list, int datum) { - return nconc(list, lconsi(datum, NIL)); + return nconc(list, lconsi(datum, NIL)); } -Value * +Value * makeInteger(long i) { - Value *v = makeNode(Value); - v->type = T_Integer; - v->val.ival = i; - return v; + Value *v = makeNode(Value); + + v->type = T_Integer; + v->val.ival = i; + return v; } -Value * +Value * makeFloat(double d) { - Value *v = makeNode(Value); - v->type = T_Float; - v->val.dval = d; - return v; + Value *v = makeNode(Value); + + v->type = T_Float; + v->val.dval = d; + return v; } -Value * +Value * makeString(char *str) { - Value *v = makeNode(Value); - v->type = T_String; - v->val.str = str; - return v; + Value *v = makeNode(Value); + + v->type = T_String; + v->val.str = str; + return v; } /* n starts with 0 */ -void * -nth(int n, List *l) +void * +nth(int n, List * l) { - /* XXX assume list is long enough */ - while(n > 0) { - l = lnext(l); - n--; - } - return lfirst(l); + /* XXX assume list is long enough */ + while (n > 0) + { + l = lnext(l); + n--; + } + return lfirst(l); } int -nthi(int n, List *l) +nthi(int n, List * l) { - /* XXX assume list is long enough */ - while(n > 0) { - l = lnext(l); - n--; - } - return lfirsti(l); + /* XXX assume list is long enough */ + while (n > 0) + { + l = lnext(l); + n--; + } + return lfirsti(l); } /* this is here solely for rt_store. Get rid of me some day! */ void -set_nth(List *l, int n, void *elem) +set_nth(List * l, int n, void *elem) { - /* XXX assume list is long enough */ - while(n > 0) { - l = lnext(l); - n--; - } - lfirst(l) = elem; - return; + /* XXX assume list is long enough */ + while (n > 0) + { + l = lnext(l); + n--; + } + lfirst(l) = elem; + return; } int -length(List *l) +length(List * l) { - int i=0; - while(l!=NIL) { - l = lnext(l); - i++; - } - return i; + int i = 0; + + while (l != NIL) + { + l = lnext(l); + i++; + } + return i; } void -freeList(List *list) +freeList(List * list) { - while(list!=NIL) { - List *l = list; - list = lnext(list); - pfree(l); - } + while (list != NIL) + { + List *l = list; + + list = lnext(list); + pfree(l); + } } /* * below are for backwards compatibility */ -List * -append(List *l1, List *l2) +List * +append(List * l1, List * l2) { - List *newlist, *newlist2, *p; + List *newlist, + *newlist2, + *p; - if (l1==NIL) - return copyObject(l2); + if (l1 == NIL) + return copyObject(l2); - newlist = copyObject(l1); - newlist2 = copyObject(l2); + newlist = copyObject(l1); + newlist2 = copyObject(l2); - for (p=newlist; lnext(p)!=NIL; p=lnext(p)) - ; - lnext(p) = newlist2; - return newlist; + for (p = newlist; lnext(p) != NIL; p = lnext(p)) + ; + lnext(p) = newlist2; + return newlist; } /* * below are for backwards compatibility */ -List * -intAppend(List *l1, List *l2) +List * +intAppend(List * l1, List * l2) { - List *newlist, *newlist2, *p; + List *newlist, + *newlist2, + *p; - if (l1==NIL) - return listCopy(l2); + if (l1 == NIL) + return listCopy(l2); - newlist = listCopy(l1); - newlist2 = listCopy(l2); + newlist = listCopy(l1); + newlist2 = listCopy(l2); - for (p=newlist; lnext(p)!=NIL; p=lnext(p)) - ; - lnext(p) = newlist2; - return newlist; + for (p = newlist; lnext(p) != NIL; p = lnext(p)) + ; + lnext(p) = newlist2; + return newlist; } -List * -nconc(List *l1, List *l2) +List * +nconc(List * l1, List * l2) { - List *temp; - - if (l1 == NIL) - return l2; - if (l2 == NIL) - return l1; - if (l1 == l2) - elog(WARN, "tryout to nconc a list to itself"); - - for (temp = l1; lnext(temp)!=NULL; temp = lnext(temp)) - ; - - lnext(temp) = l2; - return(l1); /* list1 is now list1[]list2 */ + List *temp; + + if (l1 == NIL) + return l2; + if (l2 == NIL) + return l1; + if (l1 == l2) + elog(WARN, "tryout to nconc a list to itself"); + + for (temp = l1; lnext(temp) != NULL; temp = lnext(temp)) + ; + + lnext(temp) = l2; + return (l1); /* list1 is now list1[]list2 */ } -List * -nreverse(List *list) +List * +nreverse(List * list) { - List *rlist = NIL; - List *p = NIL; - - if(list==NULL) - return(NIL); - - if (length(list) == 1) - return(list); - - for (p = list; p!=NULL; p = lnext(p)) { - rlist = lcons(lfirst(p),rlist); - } - - lfirst(list) = lfirst(rlist); - lnext(list) = lnext(rlist); - return(list); + List *rlist = NIL; + List *p = NIL; + + if (list == NULL) + return (NIL); + + if (length(list) == 1) + return (list); + + for (p = list; p != NULL; p = lnext(p)) + { + rlist = lcons(lfirst(p), rlist); + } + + lfirst(list) = lfirst(rlist); + lnext(list) = lnext(rlist); + return (list); } -/* - * same - * - * Returns t if two lists contain the same elements. - * now defined in lispdep.c +/* + * same + * + * Returns t if two lists contain the same elements. + * now defined in lispdep.c * * XXX only good for IntList -ay */ bool -same(List *foo, List *bar) +same(List * foo, List * bar) { - List *temp = NIL; - - if (foo == NULL) - return (bar==NULL); - if (bar == NULL) - return (foo==NULL); - if (length(foo) == length(bar)) { - foreach (temp,foo) { - if (!intMember(lfirsti(temp),bar)) - return(false); + List *temp = NIL; + + if (foo == NULL) + return (bar == NULL); + if (bar == NULL) + return (foo == NULL); + if (length(foo) == length(bar)) + { + foreach(temp, foo) + { + if (!intMember(lfirsti(temp), bar)) + return (false); + } + return (true); } - return(true); - } - return(false); - -} - -List * -LispUnion(List *foo, List *bar) + return (false); + +} + +List * +LispUnion(List * foo, List * bar) { - List *retval = NIL; - List *i = NIL; - List *j = NIL; - - if (foo==NIL) - return(bar); /* XXX - should be copy of bar */ - - if (bar==NIL) - return(foo); /* XXX - should be copy of foo */ - - foreach (i,foo) { - foreach (j,bar) { - if (! equal(lfirst(i), lfirst(j))) { - retval = lappend(retval,lfirst(i)); - break; - } + List *retval = NIL; + List *i = NIL; + List *j = NIL; + + if (foo == NIL) + return (bar); /* XXX - should be copy of bar */ + + if (bar == NIL) + return (foo); /* XXX - should be copy of foo */ + + foreach(i, foo) + { + foreach(j, bar) + { + if (!equal(lfirst(i), lfirst(j))) + { + retval = lappend(retval, lfirst(i)); + break; + } + } } - } - foreach(i,bar) { - retval = lappend(retval,lfirst(i)); - } - - return(retval); + foreach(i, bar) + { + retval = lappend(retval, lfirst(i)); + } + + return (retval); } -List * -LispUnioni(List *foo, List *bar) +List * +LispUnioni(List * foo, List * bar) { - List *retval = NIL; - List *i = NIL; - List *j = NIL; - - if (foo==NIL) - return(bar); /* XXX - should be copy of bar */ - - if (bar==NIL) - return(foo); /* XXX - should be copy of foo */ - - foreach (i,foo) { - foreach (j,bar) { - if (lfirsti(i) != lfirsti(j)) { - retval = lappendi(retval,lfirsti(i)); - break; - } + List *retval = NIL; + List *i = NIL; + List *j = NIL; + + if (foo == NIL) + return (bar); /* XXX - should be copy of bar */ + + if (bar == NIL) + return (foo); /* XXX - should be copy of foo */ + + foreach(i, foo) + { + foreach(j, bar) + { + if (lfirsti(i) != lfirsti(j)) + { + retval = lappendi(retval, lfirsti(i)); + break; + } + } + } + foreach(i, bar) + { + retval = lappendi(retval, lfirsti(i)); } - } - foreach(i,bar) { - retval = lappendi(retval, lfirsti(i)); - } - - return(retval); + + return (retval); } /* * member() * - nondestructive, returns t iff foo is a member of the list - * bar + * bar */ bool -member(void *foo, List *bar) +member(void *foo, List * bar) { - List *i; - foreach (i,bar) - if (equal((Node*)(lfirst(i)),(Node*)foo)) - return(true); - return(false); + List *i; + + foreach(i, bar) + if (equal((Node *) (lfirst(i)), (Node *) foo)) + return (true); + return (false); } bool -intMember(int foo, List *bar) +intMember(int foo, List * bar) { - List *i; - foreach (i,bar) - if (foo == lfirsti(i)) - return(true); - return(false); + List *i; + + foreach(i, bar) + if (foo == lfirsti(i)) + return (true); + return (false); } /* * lremove - - * only does pointer comparisons. Removes 'elem' from the the linked list. + * only does pointer comparisons. Removes 'elem' from the the linked list. */ -List * -lremove(void *elem, List *list) +List * +lremove(void *elem, List * list) { - List *l; - List *prev = NIL; - List *result = list; - - foreach(l, list) { - if (elem == lfirst(l)) - break; - prev = l; - } - if (l!=NULL) { - if (prev == NIL) { - result = lnext(list); - } else { - lnext(prev) = lnext(l); + List *l; + List *prev = NIL; + List *result = list; + + foreach(l, list) + { + if (elem == lfirst(l)) + break; + prev = l; + } + if (l != NULL) + { + if (prev == NIL) + { + result = lnext(list); + } + else + { + lnext(prev) = lnext(l); + } } - } - return result; + return result; } - -List * -LispRemove(void *elem, List *list) + +List * +LispRemove(void *elem, List * list) { - List *temp = NIL; - List *prev = NIL; - - if (equal(elem, lfirst(list))) - return lnext(list); - - temp = lnext(list); - prev = list; - while(temp!=NIL) { - if (equal(elem, lfirst(temp))) { - lnext(prev) = lnext(temp); - break; + List *temp = NIL; + List *prev = NIL; + + if (equal(elem, lfirst(list))) + return lnext(list); + + temp = lnext(list); + prev = list; + while (temp != NIL) + { + if (equal(elem, lfirst(temp))) + { + lnext(prev) = lnext(temp); + break; + } + temp = lnext(temp); + prev = lnext(prev); } - temp = lnext(temp); - prev = lnext(prev); - } - return(list); + return (list); } #ifdef NOT_USED -List * -intLispRemove(int elem, List *list) +List * +intLispRemove(int elem, List * list) { - List *temp = NIL; - List *prev = NIL; - - if (elem == lfirsti(list)) - return lnext(list); - - temp = lnext(list); - prev = list; - while(temp!=NIL) { - if (elem == lfirsti(temp)) { - lnext(prev) = lnext(temp); - break; + List *temp = NIL; + List *prev = NIL; + + if (elem == lfirsti(list)) + return lnext(list); + + temp = lnext(list); + prev = list; + while (temp != NIL) + { + if (elem == lfirsti(temp)) + { + lnext(prev) = lnext(temp); + break; + } + temp = lnext(temp); + prev = lnext(prev); } - temp = lnext(temp); - prev = lnext(prev); - } - return(list); + return (list); } + #endif -List * -set_difference(List *list1, List *list2) +List * +set_difference(List * list1, List * list2) { - List *temp1 = NIL; - List *result = NIL; - - if (list2==NIL) - return(list1); - - foreach (temp1, list1) { - if (!member(lfirst(temp1), list2)) - result = lappend(result, lfirst(temp1)); - } - return(result); + List *temp1 = NIL; + List *result = NIL; + + if (list2 == NIL) + return (list1); + + foreach(temp1, list1) + { + if (!member(lfirst(temp1), list2)) + result = lappend(result, lfirst(temp1)); + } + return (result); } -List * -set_differencei(List *list1, List *list2) +List * +set_differencei(List * list1, List * list2) { - List *temp1 = NIL; - List *result = NIL; - - if (list2==NIL) - return(list1); - - foreach (temp1, list1) { - if (!intMember(lfirsti(temp1), list2)) - result = lappendi(result, lfirsti(temp1)); - } - return(result); -} + List *temp1 = NIL; + List *result = NIL; + + if (list2 == NIL) + return (list1); + foreach(temp1, list1) + { + if (!intMember(lfirsti(temp1), list2)) + result = lappendi(result, lfirsti(temp1)); + } + return (result); +} |