=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/dp-supp.c,v retrieving revision 1.48 retrieving revision 1.53 diff -u -p -r1.48 -r1.53 --- OpenXM_contrib2/asir2000/builtin/dp-supp.c 2007/10/21 07:47:59 1.48 +++ OpenXM_contrib2/asir2000/builtin/dp-supp.c 2009/01/07 05:33:18 1.53 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.47 2007/10/14 02:32:21 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.52 2009/01/05 02:14:00 noro Exp $ */ #include "ca.h" #include "base.h" @@ -1683,7 +1683,8 @@ int create_order_spec(VL vl,Obj obj,struct order_spec struct order_pair *l; NODE node,t,tn; MAT m; - pointer **b; + VECT v; + pointer **b,*bv; int **w; if ( vl && obj && OID(obj) == O_LIST ) { @@ -1700,6 +1701,16 @@ int create_order_spec(VL vl,Obj obj,struct order_spec return 1; } else if ( OID(obj) == O_LIST ) { node = BDY((LIST)obj); + if ( !BDY(node) || NUM(BDY(node)) ) { + if ( length(node) < 2 ) + error("create_order_spec : invalid argument"); + create_order_spec(0,(Obj)BDY(NEXT(node)),&spec); + spec->id += 256; spec->obj = obj; + spec->ispot = (BDY(node)!=0); + *specp = spec; + return 1; + } + for ( n = 0, t = node; t; t = NEXT(t), n++ ); l = (struct order_pair *)MALLOC_ATOMIC(n*sizeof(struct order_pair)); for ( i = 0, t = node, s = 0; i < n; t = NEXT(t), i++ ) { @@ -2184,17 +2195,18 @@ void homogenize_order(struct order_spec *old,int n,str error("homogenize_order : invalid input"); } break; - case 1: + case 1: case 257: length = old->ord.block.length; l = (struct order_pair *) MALLOC_ATOMIC((length+1)*sizeof(struct order_pair)); bcopy((char *)old->ord.block.order_pair,(char *)l,length*sizeof(struct order_pair)); l[length].order = 2; l[length].length = 1; - new->id = 1; new->nv = n+1; + new->id = old->id; new->nv = n+1; new->ord.block.order_pair = l; new->ord.block.length = length+1; + new->ispot = old->ispot; break; - case 2: + case 2: case 258: nv = old->nv; row = old->ord.matrix.row; oldm = old->ord.matrix.matrix; newm = almat(row+1,nv+1); for ( i = 0; i <= nv; i++ ) @@ -2204,10 +2216,11 @@ void homogenize_order(struct order_spec *old,int n,str newm[i+1][j] = oldm[i][j]; newm[i+1][j] = 0; } - new->id = 2; new->nv = nv+1; + new->id = old->id; new->nv = nv+1; new->ord.matrix.row = row+1; new->ord.matrix.matrix = newm; + new->ispot = old->ispot; break; - case 3: + case 3: case 259: onv = old->nv; nnv = onv+1; olen = old->ord.composite.length; @@ -2241,11 +2254,32 @@ void homogenize_order(struct order_spec *old,int n,str (struct sparse_weight *)MALLOC(sizeof(struct sparse_weight)); nwb[i].body.sparse_weight[0].pos = onv; nwb[i].body.sparse_weight[0].value = 1; - new->id = 3; + new->id = old->id; new->nv = nnv; new->ord.composite.length = nlen; new->ord.composite.w_or_b = nwb; + new->ispot = old->ispot; print_composite_order_spec(new); + break; + case 256: /* simple module order */ + switch ( old->ord.simple ) { + case 0: + new->id = 256; new->ord.simple = 0; break; + case 1: + l = (struct order_pair *) + MALLOC_ATOMIC(2*sizeof(struct order_pair)); + l[0].length = n; l[0].order = old->ord.simple; + l[1].length = 1; l[1].order = 2; + new->id = 257; + new->ord.block.order_pair = l; + new->ord.block.length = 2; new->nv = n+1; + break; + case 2: + new->id = 256; new->ord.simple = 1; break; + default: + error("homogenize_order : invalid input"); + } + new->ispot = old->ispot; break; default: error("homogenize_order : invalid input");