| version 1.1, 1999/12/03 07:39:11 | version 1.12, 2003/04/08 22:29:00 | 
|  |  | 
| /* $OpenXM: OpenXM/src/asir99/io/cio.c,v 1.2 1999/11/18 02:24:01 noro Exp $ */ | /* | 
|  | * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED | 
|  | * All rights reserved. | 
|  | * | 
|  | * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited, | 
|  | * non-exclusive and royalty-free license to use, copy, modify and | 
|  | * redistribute, solely for non-commercial and non-profit purposes, the | 
|  | * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and | 
|  | * conditions of this Agreement. For the avoidance of doubt, you acquire | 
|  | * only a limited right to use the SOFTWARE hereunder, and FLL or any | 
|  | * third party developer retains all rights, including but not limited to | 
|  | * copyrights, in and to the SOFTWARE. | 
|  | * | 
|  | * (1) FLL does not grant you a license in any way for commercial | 
|  | * purposes. You may use the SOFTWARE only for non-commercial and | 
|  | * non-profit purposes only, such as academic, research and internal | 
|  | * business use. | 
|  | * (2) The SOFTWARE is protected by the Copyright Law of Japan and | 
|  | * international copyright treaties. If you make copies of the SOFTWARE, | 
|  | * with or without modification, as permitted hereunder, you shall affix | 
|  | * to all such copies of the SOFTWARE the above copyright notice. | 
|  | * (3) An explicit reference to this SOFTWARE and its copyright owner | 
|  | * shall be made on your publication or presentation in any form of the | 
|  | * results obtained by use of the SOFTWARE. | 
|  | * (4) In the event that you modify the SOFTWARE, you shall notify FLL by | 
|  | * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification | 
|  | * for such modification or the source code of the modified part of the | 
|  | * SOFTWARE. | 
|  | * | 
|  | * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL | 
|  | * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND | 
|  | * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS | 
|  | * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES' | 
|  | * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY | 
|  | * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY. | 
|  | * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT, | 
|  | * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY | 
|  | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL | 
|  | * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES | 
|  | * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES | 
|  | * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY | 
|  | * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF | 
|  | * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART | 
|  | * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY | 
|  | * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | 
|  | * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. | 
|  | * $OpenXM: OpenXM_contrib2/asir2000/io/cio.c,v 1.11 2001/10/09 01:36:20 noro Exp $ | 
|  | */ | 
| #include "ca.h" | #include "ca.h" | 
| #include "parse.h" | #include "parse.h" | 
| #include "ox.h" | #include "ox.h" | 
|  | #if !defined(VISUAL) | 
|  | #include <ctype.h> | 
|  | #endif | 
|  |  | 
| #define ISIZ sizeof(int) | #define ISIZ sizeof(int) | 
|  |  | 
| int write_cmo_zz(FILE *,int,N); | int valid_as_cmo(Obj obj) | 
| int read_cmo_zz(FILE *,int *,N *); |  | 
|  |  | 
| int valid_as_cmo(obj) |  | 
| Obj obj; |  | 
| { | { | 
| NODE m; | NODE m; | 
|  |  | 
|  |  | 
| return 1; | return 1; | 
| switch ( OID(obj) ) { | switch ( OID(obj) ) { | 
| case O_MATHCAP: case O_P: case O_R: case O_DP: case O_STR: | case O_MATHCAP: case O_P: case O_R: case O_DP: case O_STR: | 
| case O_ERR: case O_USINT: case O_VOID: | case O_ERR: case O_USINT: case O_BYTEARRAY: case O_VOID: | 
| return 1; | return 1; | 
| case O_N: | case O_N: | 
| if ( NID((Num)obj) == N_Q ) | if ( NID((Num)obj) == N_Q || NID((Num)obj) == N_R ) | 
| return 1; | return 1; | 
| else | else | 
| return 0; | return 0; | 
|  |  | 
| if ( !valid_as_cmo(BDY(m)) ) | if ( !valid_as_cmo(BDY(m)) ) | 
| return 0; | return 0; | 
| return 1; | return 1; | 
|  | case O_QUOTE: | 
|  | return 1; | 
| default: | default: | 
| return 0; | return 0; | 
| } | } | 
| } | } | 
|  |  | 
| write_cmo(s,obj) | void write_cmo(FILE *s,Obj obj) | 
| FILE *s; |  | 
| Obj obj; |  | 
| { | { | 
| int r; | int r; | 
| char errmsg[BUFSIZ]; | char errmsg[BUFSIZ]; | 
|  | LIST l; | 
|  |  | 
| if ( !obj ) { | if ( !obj ) { | 
| r = CMO_NULL; write_int(s,&r); | r = CMO_NULL; write_int(s,&r); | 
|  |  | 
| } | } | 
| switch ( OID(obj) ) { | switch ( OID(obj) ) { | 
| case O_N: | case O_N: | 
| write_cmo_q(s,obj); | switch ( NID((Num)obj) ) { | 
|  | case N_Q: | 
|  | write_cmo_q(s,(Q)obj); | 
|  | break; | 
|  | case N_R: | 
|  | write_cmo_real(s,(Real)obj); | 
|  | break; | 
|  | default: | 
|  | sprintf(errmsg, "write_cmo : number id=%d not implemented.", | 
|  | NID((Num)obj)); | 
|  | error(errmsg); | 
|  | break; | 
|  | } | 
| break; | break; | 
| case O_P: | case O_P: | 
| write_cmo_p(s,obj); | write_cmo_p(s,(P)obj); | 
| break; | break; | 
| case O_R: | case O_R: | 
| write_cmo_r(s,obj); | write_cmo_r(s,(R)obj); | 
| break; | break; | 
| case O_DP: | case O_DP: | 
| write_cmo_dp(s,obj); | write_cmo_dp(s,(DP)obj); | 
| break; | break; | 
| case O_LIST: | case O_LIST: | 
| write_cmo_list(s,obj); | write_cmo_list(s,(LIST)obj); | 
| break; | break; | 
| case O_STR: | case O_STR: | 
| write_cmo_string(s,obj); | write_cmo_string(s,(STRING)obj); | 
| break; | break; | 
| case O_USINT: | case O_USINT: | 
| write_cmo_uint(s,obj); | write_cmo_uint(s,(USINT)obj); | 
| break; | break; | 
| case O_MATHCAP: | case O_MATHCAP: | 
| write_cmo_mathcap(s,obj); | write_cmo_mathcap(s,(MATHCAP)obj); | 
| break; | break; | 
| case O_ERR: | case O_ERR: | 
| write_cmo_error(s,obj); | write_cmo_error(s,(ERR)obj); | 
| break; | break; | 
|  | case O_BYTEARRAY: | 
|  | write_cmo_bytearray(s,(BYTEARRAY)obj); | 
|  | break; | 
| case O_VOID: | case O_VOID: | 
| r = ((USINT)obj)->body; write_int(s,&r); | r = ((USINT)obj)->body; write_int(s,&r); | 
| break; | break; | 
|  | case O_QUOTE: | 
|  | fnodetotree(BDY((QUOTE)obj),&l); | 
|  | write_cmo_tree(s,l); | 
|  | break; | 
| default: | default: | 
| sprintf(errmsg, "write_cmo : id=%d not implemented.",OID(obj)); | sprintf(errmsg, "write_cmo : id=%d not implemented.",OID(obj)); | 
| error(errmsg); | error(errmsg); | 
|  |  | 
| } | } | 
| } | } | 
|  |  | 
| write_cmo_mathcap(s,mc) | int cmo_tag(Obj obj,int *tag) | 
| FILE *s; |  | 
| MATHCAP mc; |  | 
| { | { | 
|  | if ( !valid_as_cmo(obj) ) | 
|  | return 0; | 
|  | if ( !obj ) { | 
|  | *tag = CMO_NULL; | 
|  | return 1; | 
|  | } | 
|  | switch ( OID(obj) ) { | 
|  | case O_N: | 
|  | switch ( NID((Num)obj) ) { | 
|  | case N_Q: | 
|  | *tag = DN((Q)obj) ? CMO_QQ : CMO_ZZ; break; | 
|  | case N_R: | 
|  | *tag = CMO_IEEE_DOUBLE_FLOAT; break; | 
|  | default: | 
|  | return 0; | 
|  | } | 
|  | break; | 
|  | case O_P: | 
|  | *tag = CMO_RECURSIVE_POLYNOMIAL; break; | 
|  | case O_R: | 
|  | *tag = CMO_RATIONAL; break; | 
|  | case O_DP: | 
|  | *tag = CMO_DISTRIBUTED_POLYNOMIAL; break; | 
|  | case O_LIST: | 
|  | *tag = CMO_LIST; break; | 
|  | case O_STR: | 
|  | *tag = CMO_STRING; break; | 
|  | case O_USINT: | 
|  | *tag = CMO_INT32; break; | 
|  | case O_MATHCAP: | 
|  | *tag = CMO_MATHCAP; break; | 
|  | case O_ERR: | 
|  | *tag = CMO_ERROR2; break; | 
|  | case O_QUOTE: | 
|  | *tag = CMO_TREE; break; break; | 
|  | default: | 
|  | return 0; | 
|  | } | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | void write_cmo_mathcap(FILE *s,MATHCAP mc) | 
|  | { | 
| unsigned int r; | unsigned int r; | 
|  |  | 
| r = CMO_MATHCAP; write_int(s,&r); | r = CMO_MATHCAP; write_int(s,&r); | 
| write_cmo(s,BDY(mc)); | write_cmo(s,(Obj)BDY(mc)); | 
| } | } | 
|  |  | 
| write_cmo_uint(s,ui) | void write_cmo_uint(FILE *s,USINT ui) | 
| FILE *s; |  | 
| USINT ui; |  | 
| { | { | 
| unsigned int r; | unsigned int r; | 
|  |  | 
|  |  | 
| r = ui->body; write_int(s,&r); | r = ui->body; write_int(s,&r); | 
| } | } | 
|  |  | 
| write_cmo_q(s,q) | void write_cmo_q(FILE *s,Q q) | 
| FILE *s; |  | 
| Q q; |  | 
| { | { | 
| int r; | int r; | 
|  |  | 
|  |  | 
| } | } | 
| } | } | 
|  |  | 
| write_cmo_zz(s,sgn,n) | void write_cmo_real(FILE *s,Real real) | 
| FILE *s; |  | 
| int sgn; |  | 
| N n; |  | 
| { | { | 
| int i,l,bytes; | unsigned int r; | 
| unsigned int t; | double dbl; | 
| unsigned int *b; |  | 
| unsigned char c; |  | 
|  |  | 
|  | r = CMO_IEEE_DOUBLE_FLOAT; write_int(s,&r); | 
|  | dbl = real->body; write_double(s,&dbl); | 
|  | } | 
|  |  | 
|  | void write_cmo_zz(FILE *s,int sgn,N n) | 
|  | { | 
|  | int l,bytes; | 
|  |  | 
| #if 1 | #if 1 | 
| l = PL(n); | l = PL(n); | 
| bytes = sgn*l; | bytes = sgn*l; | 
|  |  | 
| #endif | #endif | 
| } | } | 
|  |  | 
| write_cmo_p(s,p) | void write_cmo_p(FILE *s,P p) | 
| FILE *s; |  | 
| P p; |  | 
| { | { | 
| int r,i; | int r,i; | 
| VL t,vl; | VL t,vl; | 
| char *namestr; | char *namestr; | 
| STRING name; | STRING name; | 
| NODE n0,n; |  | 
|  |  | 
| r = CMO_RECURSIVE_POLYNOMIAL; write_int(s,&r); | r = CMO_RECURSIVE_POLYNOMIAL; write_int(s,&r); | 
| get_vars((Obj)p,&vl); | get_vars((Obj)p,&vl); | 
|  |  | 
| /*              localname_to_cmoname(NAME(t->v),&namestr); */ | /*              localname_to_cmoname(NAME(t->v),&namestr); */ | 
| namestr = NAME(t->v); | namestr = NAME(t->v); | 
| MKSTR(name,namestr); | MKSTR(name,namestr); | 
| write_cmo(s,name); | write_cmo(s,(Obj)name); | 
| } | } | 
|  |  | 
| /* body */ | /* body */ | 
| write_cmo_upoly(s,vl,p); | write_cmo_upoly(s,vl,p); | 
| } | } | 
|  |  | 
| write_cmo_upoly(s,vl,p) | void write_cmo_upoly(FILE *s,VL vl,P p) | 
| FILE *s; |  | 
| VL vl; |  | 
| P p; |  | 
| { | { | 
| int r,i; | int r,i; | 
| V v; | V v; | 
|  |  | 
| VL vlt; | VL vlt; | 
|  |  | 
| if ( NUM(p) ) | if ( NUM(p) ) | 
| write_cmo(s,p); | write_cmo(s,(Obj)p); | 
| else { | else { | 
| r = CMO_UNIVARIATE_POLYNOMIAL; write_int(s,&r); | r = CMO_UNIVARIATE_POLYNOMIAL; write_int(s,&r); | 
| v = VR(p); | v = VR(p); | 
|  |  | 
| } | } | 
| } | } | 
|  |  | 
| write_cmo_r(s,f) | void write_cmo_r(FILE *s,R f) | 
| FILE *s; |  | 
| R f; |  | 
| { | { | 
| int r; | int r; | 
|  |  | 
| r = CMO_RATIONAL; write_int(s,&r); | r = CMO_RATIONAL; write_int(s,&r); | 
| write_cmo(s,NM(f)); | write_cmo(s,(Obj)NM(f)); | 
| write_cmo(s,DN(f)); | write_cmo(s,(Obj)DN(f)); | 
| } | } | 
|  |  | 
| write_cmo_dp(s,dp) | void write_cmo_dp(FILE *s,DP dp) | 
| FILE *s; |  | 
| DP dp; |  | 
| { | { | 
| int i,n,nv,r; | int i,n,nv,r; | 
| MP m; | MP m; | 
|  |  | 
| write_cmo_monomial(s,m,nv); | write_cmo_monomial(s,m,nv); | 
| } | } | 
|  |  | 
| write_cmo_monomial(s,m,n) | void write_cmo_monomial(FILE *s,MP m,int n) | 
| FILE *s; |  | 
| MP m; |  | 
| int n; |  | 
| { | { | 
| int i,r; | int i,r; | 
| int *p; | int *p; | 
|  |  | 
| for ( i = 0, p = m->dl->d; i < n; i++ ) { | for ( i = 0, p = m->dl->d; i < n; i++ ) { | 
| write_int(s,p++); | write_int(s,p++); | 
| } | } | 
| write_cmo_q(s,m->c); | write_cmo_q(s,(Q)m->c); | 
| } | } | 
|  |  | 
| write_cmo_list(s,list) | void write_cmo_list(FILE *s,LIST list) | 
| FILE *s; |  | 
| LIST list; |  | 
| { | { | 
| NODE m; | NODE m; | 
| int i,n,r; | int i,n,r; | 
|  |  | 
| write_cmo(s,BDY(m)); | write_cmo(s,BDY(m)); | 
| } | } | 
|  |  | 
| write_cmo_string(s,str) | void write_cmo_string(FILE *s,STRING str) | 
| FILE *s; |  | 
| STRING str; |  | 
| { | { | 
| int r; | int r; | 
|  |  | 
|  |  | 
| savestr(s,BDY(str)); | savestr(s,BDY(str)); | 
| } | } | 
|  |  | 
| write_cmo_error(s,e) | void write_cmo_bytearray(FILE *s,BYTEARRAY array) | 
| FILE *s; |  | 
| ERR e; |  | 
| { | { | 
| int r; | int r; | 
|  |  | 
|  | r = CMO_DATUM; write_int(s,&r); | 
|  | write_int(s,&array->len); | 
|  | write_string(s,array->body,array->len); | 
|  | } | 
|  |  | 
|  | void write_cmo_error(FILE *s,ERR e) | 
|  | { | 
|  | int r; | 
|  |  | 
| r = CMO_ERROR2; write_int(s,&r); | r = CMO_ERROR2; write_int(s,&r); | 
| write_cmo(s,BDY(e)); | write_cmo(s,BDY(e)); | 
| } | } | 
|  |  | 
| read_cmo(s,rp) | /* XXX */ | 
| FILE *s; |  | 
| Obj *rp; | /* | 
|  | * BDY(l) = treenode | 
|  | * treenode = [property,(name,)arglist] | 
|  | * arglist = list of treenode | 
|  | */ | 
|  |  | 
|  | void write_cmo_tree(FILE *s,LIST l) | 
| { | { | 
|  | NODE n; | 
|  | int r; | 
|  | STRING prop,name,key; | 
|  |  | 
|  | /* (CMO_TREE (CMO_LIST,n,key1,attr1,...,keyn,attn),(CMO_LIST,m,arg1,...,argm)) */ | 
|  | n = BDY(l); | 
|  | prop = (STRING)BDY(n);  n = NEXT(n); | 
|  | if ( !strcmp(BDY(prop),"internal") ) { | 
|  | write_cmo(s,(Obj)BDY(n)); | 
|  | } else { | 
|  | if ( strcmp(BDY(prop),"list") ) { | 
|  | r = CMO_TREE; write_int(s,&r); | 
|  | name = (STRING)BDY(n); | 
|  | n = NEXT(n); | 
|  | /* function name */ | 
|  | write_cmo(s,(Obj)name); | 
|  |  | 
|  | /* attribute list */ | 
|  | r = CMO_LIST; write_int(s,&r); | 
|  | r = 2; write_int(s,&r); | 
|  | MKSTR(key,"asir"); | 
|  | write_cmo(s,(Obj)key); | 
|  | write_cmo(s,(Obj)prop); | 
|  | } | 
|  |  | 
|  | /* argument list */ | 
|  | r = CMO_LIST; write_int(s,&r); | 
|  | /* len = number of arguments */ | 
|  | r = length(n); write_int(s,&r); | 
|  | while ( n ) { | 
|  | write_cmo_tree(s,BDY(n)); | 
|  | n = NEXT(n); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | void read_cmo(FILE *s,Obj *rp) | 
|  | { | 
| int id; | int id; | 
| int n,sgn,dummy; | int sgn,dummy; | 
| Q q,qnm,qdn; | Q q; | 
| N nm,dn; | N nm,dn; | 
| P p,pnm,pdn; | P p,pnm,pdn; | 
| R r; | Real real; | 
|  | double dbl; | 
| STRING str; | STRING str; | 
| USINT t; | USINT t; | 
| DP dp; | DP dp; | 
| char *b; |  | 
| Obj obj; | Obj obj; | 
| ERR e; | ERR e; | 
| MATHCAP mc; | MATHCAP mc; | 
|  | BYTEARRAY array; | 
|  | LIST list; | 
|  |  | 
| read_int(s,&id); | read_int(s,&id); | 
| switch ( id ) { | switch ( id ) { | 
|  |  | 
| *rp = 0; | *rp = 0; | 
| break; | break; | 
| case CMO_INT32: | case CMO_INT32: | 
| read_cmo_uint(s,rp); | read_cmo_uint(s,&t); *rp = (Obj)t; | 
| break; | break; | 
| case CMO_DATUM: | case CMO_DATUM: | 
|  | loadbytearray(s,&array); *rp = (Obj)array; | 
|  | break; | 
| case CMO_STRING: | case CMO_STRING: | 
| loadstring(s,&str); *rp = (Obj)str; | loadstring(s,&str); *rp = (Obj)str; | 
| break; | break; | 
|  |  | 
| read_cmo_list(s,rp); | read_cmo_list(s,rp); | 
| break; | break; | 
| case CMO_MONOMIAL32: | case CMO_MONOMIAL32: | 
| read_cmo_monomial(s,rp); | read_cmo_monomial(s,&dp); *rp = (Obj)dp; | 
| break; | break; | 
| case CMO_ZZ: | case CMO_ZZ: | 
| read_cmo_zz(s,&sgn,&nm); | read_cmo_zz(s,&sgn,&nm); | 
|  |  | 
| read_cmo_zz(s,&dummy,&dn); | read_cmo_zz(s,&dummy,&dn); | 
| NDTOQ(nm,dn,sgn,q); *rp = (Obj)q; | NDTOQ(nm,dn,sgn,q); *rp = (Obj)q; | 
| break; | break; | 
|  | case CMO_IEEE_DOUBLE_FLOAT: | 
|  | read_double(s,&dbl); MKReal(dbl,real); *rp = (Obj)real; | 
|  | break; | 
| case CMO_DISTRIBUTED_POLYNOMIAL: | case CMO_DISTRIBUTED_POLYNOMIAL: | 
| read_cmo_dp(s,&dp); *rp = (Obj)dp; | read_cmo_dp(s,&dp); *rp = (Obj)dp; | 
| break; | break; | 
|  |  | 
| read_cmo_upoly(s,&p); *rp = (Obj)p; | read_cmo_upoly(s,&p); *rp = (Obj)p; | 
| break; | break; | 
| case CMO_INDETERMINATE: | case CMO_INDETERMINATE: | 
| read_cmo(s,&str); *rp = (Obj)str; | read_cmo(s,rp); | 
| break; | break; | 
| case CMO_RATIONAL: | case CMO_RATIONAL: | 
| read_cmo(s,&pnm); read_cmo(s,&pdn); | read_cmo(s,&obj); pnm = (P)obj; | 
|  | read_cmo(s,&obj); pdn = (P)obj; | 
| divr(CO,(Obj)pnm,(Obj)pdn,rp); | divr(CO,(Obj)pnm,(Obj)pdn,rp); | 
| break; | break; | 
| case CMO_ZERO: | case CMO_ZERO: | 
|  |  | 
| case CMO_RING_BY_NAME: | case CMO_RING_BY_NAME: | 
| read_cmo(s,rp); | read_cmo(s,rp); | 
| break; | break; | 
|  | case CMO_TREE: | 
|  | read_cmo_tree_as_list(s,&list); | 
|  | #if 0 | 
|  | treetofnode(list,&fn); | 
|  | MKQUOTE(quote,fn); | 
|  | *rp = (Obj)quote; | 
|  | #else | 
|  | *rp = (Obj)list; | 
|  | #endif | 
|  | break; | 
| default: | default: | 
| MKUSINT(t,id); | MKUSINT(t,id); | 
| t->id = O_VOID; | t->id = O_VOID; | 
|  |  | 
| } | } | 
| } | } | 
|  |  | 
| read_cmo_uint(s,rp) | void read_cmo_uint(FILE *s,USINT *rp) | 
| FILE *s; |  | 
| USINT *rp; |  | 
| { | { | 
| unsigned int body; | unsigned int body; | 
|  |  | 
|  |  | 
| MKUSINT(*rp,body); | MKUSINT(*rp,body); | 
| } | } | 
|  |  | 
| read_cmo_zz(s,sgn,rp) | void read_cmo_zz(FILE *s,int *sgn,N *rp) | 
| FILE *s; |  | 
| int *sgn; |  | 
| N *rp; |  | 
| { | { | 
| int l,i,words; | int l; | 
| N n; | N n; | 
| unsigned int *b; |  | 
| unsigned int h; |  | 
| unsigned char c; |  | 
|  |  | 
| read_int(s,&l); | read_int(s,&l); | 
| if ( l == 0 ) { | if ( l == 0 ) { | 
|  |  | 
| #endif | #endif | 
| } | } | 
|  |  | 
| read_cmo_list(s,rp) | void read_cmo_list(FILE *s,Obj *rp) | 
| FILE *s; |  | 
| Obj *rp; |  | 
| { | { | 
| int len; | int len; | 
| Obj *w; | Obj *w; | 
| int i; | int i; | 
| Obj r,r1; |  | 
| NODE n0,n1; | NODE n0,n1; | 
| LIST list; | LIST list; | 
|  |  | 
|  |  | 
| *rp = (Obj)list; | *rp = (Obj)list; | 
| } | } | 
|  |  | 
| read_cmo_dp(s,rp) | void read_cmo_dp(FILE *s,DP *rp) | 
| FILE *s; |  | 
| DP *rp; |  | 
| { | { | 
| int len; | int len; | 
| int i; | int i; | 
| NODE n0,n1; |  | 
| MP mp0,mp; | MP mp0,mp; | 
| int nv,d; | int nv,d; | 
| DP dp; | DP dp; | 
|  |  | 
| /* skip the ring definition */ | /* skip the ring definition */ | 
| read_cmo(s,&obj); | read_cmo(s,&obj); | 
| for ( mp0 = 0, i = 0, d = 0; i < len; i++ ) { | for ( mp0 = 0, i = 0, d = 0; i < len; i++ ) { | 
| read_cmo(s,&dp); | read_cmo(s,&obj); dp = (DP)obj; | 
| if ( !mp0 ) { | if ( !mp0 ) { | 
| nv = dp->nv; | nv = dp->nv; | 
| mp0 = dp->body; | mp0 = dp->body; | 
|  |  | 
| dp->sugar = d; *rp = dp; | dp->sugar = d; *rp = dp; | 
| } | } | 
|  |  | 
| read_cmo_monomial(s,rp) | void read_cmo_monomial(FILE *s,DP *rp) | 
| FILE *s; |  | 
| DP *rp; |  | 
| { | { | 
|  | Obj obj; | 
| MP m; | MP m; | 
| DP dp; | DP dp; | 
| int i,sugar,n; | int i,sugar,n; | 
|  |  | 
| for ( sugar = 0, i = 0; i < n; i++ ) | for ( sugar = 0, i = 0; i < n; i++ ) | 
| sugar += dl->d[i]; | sugar += dl->d[i]; | 
| dl->td = sugar; | dl->td = sugar; | 
| read_cmo(s,&m->c); | read_cmo(s,&obj); m->c = (P)obj; | 
| NEXT(m) = 0; MKDP(n,m,dp); dp->sugar = sugar; *rp = dp; | NEXT(m) = 0; MKDP(n,m,dp); dp->sugar = sugar; *rp = dp; | 
| } | } | 
|  |  | 
| static V *remote_vtab; | static V *remote_vtab; | 
|  |  | 
| read_cmo_p(s,rp) | void read_cmo_p(FILE *s,P *rp) | 
| FILE *s; |  | 
| P *rp; |  | 
| { | { | 
|  | Obj obj; | 
| LIST vlist; | LIST vlist; | 
| int nv,i; | int nv,i; | 
| V *vtab; | V *vtab; | 
|  |  | 
| VL tvl,rvl; | VL tvl,rvl; | 
| char *name; | char *name; | 
|  |  | 
| read_cmo(s,&vlist); | read_cmo(s,&obj); vlist = (LIST)obj; | 
| nv = length(BDY(vlist)); | nv = length(BDY(vlist)); | 
| vtab = (V *)ALLOCA(nv*sizeof(V)); | vtab = (V *)ALLOCA(nv*sizeof(V)); | 
| for ( i = 0, t = BDY(vlist); i < nv; t = NEXT(t), i++ ) { | for ( i = 0, t = BDY(vlist); i < nv; t = NEXT(t), i++ ) { | 
|  |  | 
| makevar(name,&v); vtab[i] = VR(v); | makevar(name,&v); vtab[i] = VR(v); | 
| } | } | 
| remote_vtab = vtab; | remote_vtab = vtab; | 
| read_cmo(s,&p); | read_cmo(s,&obj); p = (P)obj; | 
| for ( i = 0; i < nv-1; i++ ) { | for ( i = 0; i < nv-1; i++ ) { | 
| v1 = vtab[i]; v2 = vtab[i+1]; | v1 = vtab[i]; v2 = vtab[i+1]; | 
| for ( tvl = CO; tvl->v != v1 && tvl->v != v2; tvl = NEXT(tvl) ); | for ( tvl = CO; tvl->v != v1 && tvl->v != v2; tvl = NEXT(tvl) ); | 
|  |  | 
| *rp = p; | *rp = p; | 
| } | } | 
|  |  | 
| read_cmo_upoly(s,rp) | void read_cmo_upoly(FILE *s,P *rp) | 
| FILE *s; |  | 
| P *rp; |  | 
| { | { | 
| int n,ind,i,d; | int n,ind,i,d; | 
|  | Obj obj; | 
| P c; | P c; | 
| Q q; | Q q; | 
| DCP dc0,dc; | DCP dc0,dc; | 
|  |  | 
| read_int(s,&ind); | read_int(s,&ind); | 
| for ( i = 0, dc0 = 0; i < n; i++ ) { | for ( i = 0, dc0 = 0; i < n; i++ ) { | 
| read_int(s,&d); | read_int(s,&d); | 
| read_cmo(s,&c); | read_cmo(s,&obj); c = (P)obj; | 
| if ( c ) { | if ( c ) { | 
| if ( OID(c) == O_USINT ) { | if ( OID(c) == O_USINT ) { | 
| UTOQ(((USINT)c)->body,q); c = (P)q; | UTOQ(((USINT)c)->body,q); c = (P)q; | 
|  |  | 
| MKP(remote_vtab[ind],dc0,*rp); | MKP(remote_vtab[ind],dc0,*rp); | 
| } | } | 
|  |  | 
| localname_to_cmoname(a,b) | /* XXX */ | 
| char *a; |  | 
| char **b; | extern struct oARF arf[]; | 
|  |  | 
|  | struct operator_tab { | 
|  | char *name; | 
|  | fid id; | 
|  | ARF arf; | 
|  | cid cid; | 
|  | }; | 
|  |  | 
|  | static struct operator_tab optab[] = { | 
|  | {"+",I_BOP,&arf[0],0}, /* XXX */ | 
|  | {"-",I_BOP,&arf[1],0}, | 
|  | {"*",I_BOP,&arf[2],0}, | 
|  | {"/",I_BOP,&arf[3],0}, | 
|  | {"%",I_BOP,&arf[4],0}, | 
|  | {"^",I_BOP,&arf[5],0}, | 
|  | {"==",I_COP,0,C_EQ}, | 
|  | {"!=",I_COP,0,C_NE}, | 
|  | {"<",I_COP,0,C_LT}, | 
|  | {"<=",I_COP,0,C_LE}, | 
|  | {">",I_COP,0,C_GT}, | 
|  | {">=",I_COP,0,C_GE}, | 
|  | {"&&",I_AND,0,0}, | 
|  | {"||",I_OR,0,0}, | 
|  | {"!",I_NOT,0,0}, | 
|  | }; | 
|  |  | 
|  | static int optab_len = sizeof(optab)/sizeof(struct operator_tab); | 
|  |  | 
|  | #if 0 | 
|  | /* old code */ | 
|  | void read_cmo_tree(s,rp) | 
|  | FILE *s; | 
|  | FNODE *rp; | 
| { | { | 
|  | int r,i,n; | 
|  | char *opname; | 
|  | STRING name,cd; | 
|  | int op; | 
|  | pointer *arg; | 
|  | QUOTE quote; | 
|  | FNODE fn; | 
|  | NODE t,t1; | 
|  | fid id; | 
|  | Obj expr; | 
|  | FUNC func; | 
|  |  | 
|  | read_cmo(s,&name); | 
|  | read_cmo(s,&attr); | 
|  | for ( i = 0; i < optab_len; i++ ) | 
|  | if ( !strcmp(optab[i].name,BDY(name)) ) | 
|  | break; | 
|  | if ( i == optab_len ) { | 
|  | /* may be a function name */ | 
|  | n = read_cmo_tree_arg(s,&arg); | 
|  | for ( i = n-1, t = 0; i >= 0; i-- ) { | 
|  | MKNODE(t1,arg[i],t); t = t1; | 
|  | } | 
|  | searchf(sysf,BDY(name),&func); | 
|  | if ( !func ) | 
|  | searchf(ubinf,BDY(name),&func); | 
|  | if ( !func ) | 
|  | searchpf(BDY(name),&func); | 
|  | if ( !func ) | 
|  | searchf(usrf,BDY(name),&func); | 
|  | if ( !func ) | 
|  | appenduf(BDY(name),&func); | 
|  | *rp = mkfnode(2,I_FUNC,func,mkfnode(1,I_LIST,t)); | 
|  | } else { | 
|  | opname = optab[i].name; | 
|  | id = optab[i].id; | 
|  | switch ( id ) { | 
|  | case I_BOP: | 
|  | read_cmo_tree_arg(s,&arg); | 
|  | *rp = mkfnode(3,I_BOP,optab[i].arf,arg[0],arg[1]); | 
|  | return; | 
|  | case I_COP: | 
|  | read_cmo_tree_arg(s,&arg); | 
|  | *rp = mkfnode(3,I_COP,optab[i].cid,arg[0],arg[0]); | 
|  | return; | 
|  | case I_AND: | 
|  | read_cmo_tree_arg(s,&arg); | 
|  | *rp = mkfnode(2,I_AND,arg[0],arg[1]); | 
|  | return; | 
|  | case I_OR: | 
|  | read_cmo_tree_arg(s,&arg); | 
|  | *rp = mkfnode(2,I_OR,arg[0],arg[1]); | 
|  | return; | 
|  | case I_NOT: | 
|  | read_cmo_tree_arg(s,&arg); | 
|  | *rp = mkfnode(1,I_OR,arg[0]); | 
|  | return; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | int read_cmo_tree_arg(s,argp) | 
|  | FILE *s; | 
|  | pointer **argp; | 
|  | { | 
|  | int id,n,i; | 
|  | pointer *ap; | 
|  | Obj t; | 
|  |  | 
|  | read_int(s,&id); /* id = CMO_LIST */ | 
|  | read_int(s,&n); /* n = the number of args */ | 
|  | *argp = ap = (pointer *) MALLOC(n*sizeof(pointer)); | 
|  | for ( i = 0; i < n; i++ ) { | 
|  | read_cmo(s,&t); | 
|  | if ( !t || (OID(t) != O_QUOTE) ) | 
|  | ap[i] = mkfnode(1,I_FORMULA,t); | 
|  | else | 
|  | ap[i] = BDY((QUOTE)t); | 
|  | } | 
|  | return n; | 
|  | } | 
|  | #else | 
|  | void read_cmo_tree_as_list(FILE *s,LIST *rp) | 
|  | { | 
|  | Obj obj; | 
|  | STRING name; | 
|  | LIST attr,args; | 
|  | NODE t0,t1; | 
|  |  | 
|  | read_cmo(s,&obj); name = (STRING)obj; | 
|  | read_cmo(s,&obj); attr = (LIST)obj; | 
|  | read_cmo(s,&obj); args = (LIST)obj; | 
|  | MKNODE(t1,name,BDY(args)); | 
|  | MKNODE(t0,attr,t1); | 
|  | MKLIST(*rp,t0); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | void localname_to_cmoname(char *a,char **b) | 
|  | { | 
| int l; | int l; | 
| char *t; | char *t; | 
|  |  | 
|  |  | 
| } | } | 
| } | } | 
|  |  | 
| cmoname_to_localname(a,b) | void cmoname_to_localname(char *a,char **b) | 
| char *a; |  | 
| char **b; |  | 
| { | { | 
| int l; | int l; | 
| char *t; | char *t; |