=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/cio.c,v retrieving revision 1.4 retrieving revision 1.6 diff -u -p -r1.4 -r1.6 --- OpenXM_contrib2/asir2000/io/cio.c 2000/08/22 05:04:17 1.4 +++ OpenXM_contrib2/asir2000/io/cio.c 2000/11/08 08:02:51 1.6 @@ -44,7 +44,7 @@ * 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.3 2000/08/21 08:31:38 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/cio.c,v 1.5 2000/09/07 23:59:54 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -64,7 +64,7 @@ Obj obj; return 1; switch ( OID(obj) ) { 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; case O_N: if ( NID((Num)obj) == N_Q || NID((Num)obj) == N_R ) @@ -132,6 +132,9 @@ Obj obj; case O_ERR: write_cmo_error(s,obj); break; + case O_BYTEARRAY: + write_cmo_bytearray(s,obj); + break; case O_VOID: r = ((USINT)obj)->body; write_int(s,&r); break; @@ -142,6 +145,49 @@ Obj obj; } } +int cmo_tag(obj,tag) +Obj obj; +int *tag; +{ + 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; + default: + return 0; + } + return 1; +} + write_cmo_mathcap(s,mc) FILE *s; MATHCAP mc; @@ -342,6 +388,17 @@ STRING str; savestr(s,BDY(str)); } +write_cmo_bytearray(s,array) +FILE *s; +BYTEARRAY array; +{ + int r; + + r = CMO_DATUM; write_int(s,&r); + write_int(s,&array->len); + write_string(s,array->body,array->len); +} + write_cmo_error(s,e) FILE *s; ERR e; @@ -371,6 +428,7 @@ Obj *rp; Obj obj; ERR e; MATHCAP mc; + BYTEARRAY array; read_int(s,&id); switch ( id ) { @@ -382,6 +440,8 @@ Obj *rp; read_cmo_uint(s,rp); break; case CMO_DATUM: + loadbytearray(s,&array); *rp = (Obj)array; + break; case CMO_STRING: loadstring(s,&str); *rp = (Obj)str; break;