File: [local] / OpenXM / src / ox_toolkit / dump.c (download)
Revision 1.4, Mon Sep 15 09:31:41 2003 UTC (21 years ago) by ohara
Branch: MAIN
CVS Tags: RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX Changes since 1.3: +3 -3
lines
Add some "cast".
Fixed some bugs.
|
/* -*- mode: C; coding: euc-japan -*- */
/* $OpenXM: OpenXM/src/ox_toolkit/dump.c,v 1.4 2003/09/15 09:31:41 ohara Exp $ */
/*
This module includes functions for sending/receiveng CMO's.
Some commnets is written in Japanese by the EUC-JP coded
character set.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/param.h>
#include "ox_toolkit.h"
static void dump_cmo_int32(cmo_int32* m);
static void dump_cmo_list(cmo_list* m);
static void dump_cmo_mathcap(cmo_mathcap* m);
static void dump_cmo_null(cmo_null* m);
static void dump_cmo_string(cmo_string* m);
static void dump_cmo_monomial32(cmo_monomial32* c);
static void dump_cmo_zz(cmo_zz* c);
static void dump_mpz(mpz_ptr mpz);
static void dump_string(void *s, int len);
static void dump_integer(int x);
/* functions encoding cmo to binary */
static int d_ptr;
static char *d_buf;
void dump_buffer_init(char *s)
{
d_buf = s;
d_ptr = 0;
}
static void dump_string(void *s, int len)
{
memcpy(&d_buf[d_ptr], s, len);
d_ptr += len;
}
static void dump_integer(int x)
{
x = htonl(x);
dump_string(&x, sizeof(int));
}
static void dump_mpz(mpz_ptr mpz)
{
int i;
int len = abs(mpz->_mp_size);
dump_integer(mpz->_mp_size);
for(i=0; i<len; i++) {
dump_integer(mpz->_mp_d[i]);
}
}
__inline__
static void dump_cmo_null(cmo_null* m)
{
return;
}
static void dump_cmo_int32(cmo_int32* m)
{
dump_integer(m->i);
}
static void dump_cmo_string(cmo_string* m)
{
int len = strlen(m->s);
dump_integer(len);
dump_string(m->s, len);
}
static void dump_cmo_mathcap(cmo_mathcap* c)
{
dump_cmo(c->ob);
}
static void dump_cmo_list(cmo_list* m)
{
cell* cp = list_first(m);
int len = list_length(m);
dump_integer(len);
while(!list_endof(m, cp)) {
dump_cmo(cp->cmo);
cp = list_next(cp);
}
}
static void dump_cmo_monomial32(cmo_monomial32* c)
{
int i;
int length = c->length;
dump_integer(c->length);
for(i=0; i<length; i++) {
dump_integer(c->exps[i]);
}
dump_cmo(c->coef);
}
static void dump_cmo_zz(cmo_zz* c)
{
dump_mpz(c->mpz);
}
static void dump_cmo_distributed_polynomial(cmo_distributed_polynomial* m)
{
cell* cp;
dump_integer(list_length((cmo_list *)m));
dump_cmo(m->ringdef);
for(cp = list_first((cmo_list *)m); !list_endof((cmo_list *)m, cp); cp = list_next(cp)) {
dump_cmo(cp->cmo);
}
}
/* after its tag is sent, we invoke each functions. */
void dump_cmo(cmo* m)
{
dump_integer(m->tag);
switch(m->tag) {
case CMO_NULL:
case CMO_ZERO:
case CMO_DMS_GENERIC:
dump_cmo_null(m);
break;
case CMO_INT32:
dump_cmo_int32((cmo_int32 *)m);
break;
case CMO_STRING:
dump_cmo_string((cmo_string *)m);
break;
case CMO_MATHCAP:
case CMO_RING_BY_NAME:
case CMO_INDETERMINATE:
case CMO_ERROR2:
dump_cmo_mathcap((cmo_mathcap *)m);
break;
case CMO_LIST:
dump_cmo_list((cmo_list *)m);
break;
case CMO_MONOMIAL32:
dump_cmo_monomial32((cmo_monomial32 *)m);
break;
case CMO_ZZ:
dump_cmo_zz((cmo_zz *)m);
break;
case CMO_DISTRIBUTED_POLYNOMIAL:
dump_cmo_distributed_polynomial((cmo_distributed_polynomial *)m);
break;
default:
}
}
void dump_ox_data(ox_data* m)
{
dump_integer(OX_DATA);
dump_integer(-1);
dump_cmo(m->cmo);
}
void dump_ox_command(ox_command* m)
{
dump_integer(OX_COMMAND);
dump_integer(-1);
dump_integer(m->command);
}