[BACK]Return to list.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Annotation of OpenXM/src/kan96xx/Kan/list.c, Revision 1.1

1.1     ! maekawa     1: /* list.c */
        !             2: #include <stdio.h>
        !             3: #include "datatype.h"
        !             4: #include "stackm.h"
        !             5: #include "extern.h"
        !             6:
        !             7: static errorList(char *s);
        !             8: static warningList(char *s);
        !             9:
        !            10: /* The basic data structure for list is
        !            11:     struct object *,
        !            12:    which is used as arguments and return values.
        !            13:    NullList should be expressed by (struct object *)NULL = NULLLIST ;
        !            14:    The null test is isNullList(struct object *).
        !            15: */
        !            16:
        !            17: struct object *newList(objp)
        !            18: struct object *objp;
        !            19: {
        !            20:   struct object *op;
        !            21:   op = (struct object *)sGC_malloc(sizeof(struct object));
        !            22:   if (op == (struct object *)NULL) errorList("no more memory.");
        !            23:   op->tag = Slist;
        !            24:   op->lc.op = (struct object *)sGC_malloc(sizeof(struct object));
        !            25:   if (op->lc.op == (struct object *)NULL) errorList("no more memory.");
        !            26:   /* Warning!! Make a copy of the object. It is important. */
        !            27:   *(op->lc.op) = *(objp);
        !            28:   op->rc.op = (struct object *)NULL;
        !            29:   return(op);
        !            30: }
        !            31:
        !            32: int klength(objp)
        !            33: struct object *objp;
        !            34: {
        !            35:   if (objp->tag != Slist) {
        !            36:     warningList("use klength() for object-list.");
        !            37:     return(-1);
        !            38:   }
        !            39:   if (isNullList(objp->rc.op)) return(1);
        !            40:   else {
        !            41:     return(klength(objp->rc.op) + 1);
        !            42:   }
        !            43: }
        !            44:
        !            45: struct object listToArray(objp)
        !            46: struct object *objp;
        !            47: /* This function copies only the top level of the list */
        !            48: {
        !            49:   int n;
        !            50:   struct object ans;
        !            51:   int i;
        !            52:   if (objp->tag != Slist) {
        !            53:     warningList("use objectListToObjectArray() for object-list.");
        !            54:     return(NullObject);
        !            55:   }
        !            56:
        !            57:   n = klength(objp);
        !            58:
        !            59:   ans = newObjectArray(n);
        !            60:   for (i=0; i<n; i++) {
        !            61:     putoa(ans,i,*(objp->lc.op));  /* Warning!! we do not make a copy. */
        !            62:     objp = objp->rc.op;
        !            63:   }
        !            64:   return(ans);
        !            65: }
        !            66:
        !            67: struct object *arrayToList(obj)
        !            68: struct object obj;
        !            69: /* obj.tag must be Sarray */
        !            70: {
        !            71:   struct object *op;
        !            72:   struct object *list;
        !            73:   struct object elem;
        !            74:   int i,n;
        !            75:   op = NULLLIST;
        !            76:   n = getoaSize(obj);
        !            77:   for (i=0; i<n; i++) {
        !            78:     /*printf("\n%d: ",i); printObjectList(op);*/
        !            79:     elem = getoa(obj,i);
        !            80:     list = newList(&elem);
        !            81:     op = vJoin(op,list);
        !            82:   }
        !            83:   return(op);
        !            84: }
        !            85:
        !            86: struct object *vJoin(list1,list2)
        !            87: struct object *list1,*list2;
        !            88: /* Join[(a b), (c d)] ---> (a b c d) */
        !            89: /* Join [(),(a b)] ---> (a b) */
        !            90: /* We do not copy. NullList is express by (struct object *)NULL.
        !            91:    cf. isNullList()
        !            92: */
        !            93: {
        !            94:   /*
        !            95:   printf("list1=");  printObjectList(list1);
        !            96:   printf("\nlist2=");  printObjectList(list2);  printf("\n");
        !            97:   */
        !            98:
        !            99:   if (isNullList(list1)) return(list2);
        !           100:   if (isNullList(list2)) return(list1);
        !           101:   if (list1->tag != Slist || list2->tag != Slist) {
        !           102:     warningList("use vJoin() for object-list.");
        !           103:     return((struct object *)NULL);
        !           104:   }
        !           105:   if (list1->rc.op == (struct object *)NULL) {
        !           106:     list1->rc.op = list2;
        !           107:     return(list1);
        !           108:   }else{
        !           109:     vJoin(list1->rc.op,list2);
        !           110:     return(list1);
        !           111:   }
        !           112: }
        !           113:
        !           114: struct object car(list)
        !           115: struct object *list;
        !           116: {
        !           117:   if (list->tag != Slist) {
        !           118:     warningList("car() is called for a non-list object.");
        !           119:     return(NullObject);
        !           120:   }
        !           121:   if (isNullList(list)) return(NullObject);
        !           122:   /* We do not copy the object */
        !           123:   return(*(list->lc.op));
        !           124: }
        !           125:
        !           126: struct object *cdr(list)
        !           127: struct object *list;
        !           128: {
        !           129:   if (list->tag != Slist) {
        !           130:     warningList("cdr() is called for a non-list object.");
        !           131:     return((struct object *)NULL);
        !           132:   }
        !           133:   /* We do not copy the object */
        !           134:   return( list->rc.op );
        !           135: }
        !           136:
        !           137:
        !           138: void printObjectList(op)
        !           139: struct object *op;
        !           140: {
        !           141:   if (op == NULL) return;
        !           142:   if (isNullList(op)) return;
        !           143:   if (op->tag == Slist) {
        !           144:     printObjectList(op->lc.op);
        !           145:     printf(", ");
        !           146:     printObjectList(op->rc.op);
        !           147:   }else {
        !           148:     printObject(*op,0,stdout);
        !           149:   }
        !           150: }
        !           151:
        !           152: memberQ(list1,obj2)
        !           153: struct object *list1;
        !           154: struct object obj2;
        !           155: /* If obj2 is an member of list1, the functions the position.
        !           156:    memberQ( (1 (2 3) 4), 4) ----> 3.
        !           157: */
        !           158: {
        !           159:   int n,pos;
        !           160:   if (isNullList(list1)) return(0);
        !           161:   n = klength(list1);
        !           162:   for (pos=1; pos<=n; pos++) {
        !           163:     if (KooEqualQ(car(list1),obj2)) return(pos);
        !           164:     else list1 = cdr(list1);
        !           165:   }
        !           166:   return(0);
        !           167: }
        !           168:
        !           169: static errorList(str)
        !           170: char *str;
        !           171: {
        !           172:   fprintf(stderr,"list.c: %s\n",str);
        !           173:   exit(10);
        !           174: }
        !           175:
        !           176: static warningList(str)
        !           177: char *str;
        !           178: {
        !           179:   fprintf(stderr,"Warning. list.c: %s\n",str);
        !           180: }
        !           181:
        !           182:
        !           183: /********************** test codes for Stest: ********************/
        !           184: /* test of objectArrayToObjectList. in Stest: stackmachine.c
        !           185:     {
        !           186:       struct object *list;
        !           187:       list = arrayToList(ob1);
        !           188:       ob1 = listToArray(list);
        !           189:       push(ob1);
        !           190:     }
        !           191:     test for memberQ().
        !           192:     {
        !           193:       struct object *list;
        !           194:       list = objectArrayToObjectList(pop());
        !           195:       printf("\nmemberQ()=%d\n",memberQ(list,ob1));
        !           196:     }
        !           197:
        !           198: */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>