[BACK]Return to cmo-gmp.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / plugin

Annotation of OpenXM/src/kan96xx/plugin/cmo-gmp.c, Revision 1.1

1.1     ! maekawa     1: #include <stdio.h>
        !             2: #include <string.h>
        !             3: #include <netinet/in.h>
        !             4: #include "datatype.h"
        !             5: #include "stackm.h"
        !             6: #include "extern.h"
        !             7: #include "extern2.h"
        !             8: #include "mathcap.h"
        !             9: #include "kclass.h"
        !            10:
        !            11: #include "gmp.h"
        !            12: #include "gmp-impl.h"
        !            13:
        !            14: #include "file2.h"
        !            15: #include "cmo.h"
        !            16:
        !            17: extern int OxVersion;
        !            18: size_t cmoOutGMPCoeff_old(mpz_srcptr x);
        !            19: size_t cmoOutGMPCoeff_new(mpz_srcptr x);
        !            20: size_t
        !            21: cmoOutGMPCoeff(mpz_srcptr x) {
        !            22:   if (OxVersion >= 199907170)
        !            23:     return(cmoOutGMPCoeff_new(x));
        !            24:   else
        !            25:     return(cmoOutGMPCoeff_old(x));
        !            26: }
        !            27:
        !            28: cmoGetGMPCoeff(MP_INT *x, struct cmoBuffer *cb) {
        !            29:   if (OxVersion >= 199907170)
        !            30:     return(cmoGetGMPCoeff_new(x,cb));
        !            31:   else
        !            32:     return(cmoGetGMPCoeff_old(x,cb));
        !            33: }
        !            34:
        !            35:
        !            36: /* From gmp/mpz/out_raw.c and inp_raw.c */
        !            37:
        !            38: /* mpz_out_raw -- Output a mpz_t in binary.  Use an endianess and word size
        !            39:    independent format.
        !            40:
        !            41: Copyright (C) 1995 Free Software Foundation, Inc.
        !            42:
        !            43: This file is part of the GNU MP Library.
        !            44:
        !            45: The GNU MP Library is free software; you can redistribute it and/or modify
        !            46: it under the terms of the GNU Library General Public License as published by
        !            47: the Free Software Foundation; either version 2 of the License, or (at your
        !            48: option) any later version.
        !            49:
        !            50: The GNU MP Library is distributed in the hope that it will be useful, but
        !            51: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            52: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
        !            53: License for more details.
        !            54:
        !            55: You should have received a copy of the GNU Library General Public License
        !            56: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
        !            57: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            58: MA 02111-1307, USA. */
        !            59:
        !            60: static int myfputc(int i) {
        !            61:   char tmp[1];
        !            62:   tmp[0] = i;
        !            63:   cmoOutputToBuf(CMOPUT,tmp,1);
        !            64: }
        !            65: static outRawInt32(int k)
        !            66: {
        !            67:   int tmp[1];
        !            68:   tmp[0] = htonl((int) k);
        !            69:   cmoOutputToBuf(CMOPUT,tmp,4);
        !            70: }
        !            71:
        !            72: size_t
        !            73: cmoOutGMPCoeff_old(mpz_srcptr x)
        !            74: {
        !            75:   int i;
        !            76:   mp_size_t s;
        !            77:   mp_size_t xsize = ABS (x->_mp_size);
        !            78:   mp_srcptr xp = x->_mp_d;
        !            79:   mp_size_t out_bytesize;
        !            80:   mp_limb_t hi_limb;
        !            81:   int n_bytes_in_hi_limb;
        !            82:   cmoint tmp[1];
        !            83:   tmp[0] = htonl(CMO_ZZ_OLD);
        !            84:   cmoOutputToBuf(CMOPUT,tmp,sizeof(cmoint));
        !            85:
        !            86:   if (xsize == 0)
        !            87:     {
        !            88:       for (i = 4 - 1; i >= 0; i--)
        !            89:        myfputc (0);
        !            90:       return  4;
        !            91:     }
        !            92:
        !            93:   hi_limb = xp[xsize - 1];
        !            94:   for (i = BYTES_PER_MP_LIMB - 1; i > 0; i--)
        !            95:     {
        !            96:       if ((hi_limb >> i * BITS_PER_CHAR) != 0)
        !            97:        break;
        !            98:     }
        !            99:   n_bytes_in_hi_limb = i + 1;
        !           100:   out_bytesize = BYTES_PER_MP_LIMB * (xsize - 1) + n_bytes_in_hi_limb;
        !           101:   if (x->_mp_size < 0)
        !           102:     out_bytesize = -out_bytesize;
        !           103:
        !           104:   /* Make the size 4 bytes on all machines, to make the format portable.  */
        !           105:   for (i = 4 - 1; i >= 0; i--)
        !           106:     myfputc ((out_bytesize >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR));
        !           107:
        !           108:   /* Output from the most significant limb to the least significant limb,
        !           109:      with each limb also output in decreasing significance order.  */
        !           110:
        !           111:   /* Output the most significant limb separately, since we will only
        !           112:      output some of its bytes.  */
        !           113:   for (i = n_bytes_in_hi_limb - 1; i >= 0; i--)
        !           114:     myfputc ((hi_limb >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR));
        !           115:
        !           116:   /* Output the remaining limbs.  */
        !           117:   for (s = xsize - 2; s >= 0; s--)
        !           118:     {
        !           119:       mp_limb_t x_limb;
        !           120:
        !           121:       x_limb = xp[s];
        !           122:       for (i = BYTES_PER_MP_LIMB - 1; i >= 0; i--)
        !           123:        myfputc ((x_limb >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR));
        !           124:     }
        !           125:   return ( ABS (out_bytesize) + 4);
        !           126: }
        !           127:
        !           128:
        !           129: /* mpz_inp_raw -- Input a mpz_t in raw, but endianess, and wordsize
        !           130:    independent format (as output by mpz_out_raw).
        !           131:
        !           132: Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
        !           133:
        !           134: This file is part of the GNU MP Library.
        !           135:
        !           136: The GNU MP Library is free software; you can redistribute it and/or modify
        !           137: it under the terms of the GNU Library General Public License as published by
        !           138: the Free Software Foundation; either version 2 of the License, or (at your
        !           139: option) any later version.
        !           140:
        !           141: The GNU MP Library is distributed in the hope that it will be useful, but
        !           142: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !           143: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
        !           144: License for more details.
        !           145:
        !           146: You should have received a copy of the GNU Library General Public License
        !           147: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
        !           148: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !           149: MA 02111-1307, USA. */
        !           150:
        !           151:
        !           152: static int myfgetc(struct cmoBuffer *cb)
        !           153: {
        !           154:   int k;
        !           155:   if (cb->isStream) {
        !           156:     k = fp2fgetc(cb->fp);
        !           157:   }else{
        !           158:     k = ((unsigned char *)(cb->buf))[cb->rpos];
        !           159:     cb->rpos++;
        !           160:     if (cb->rpos > cb->pos) {
        !           161:       cb->rpos--;
        !           162:       errorCmo(" cmo-gmp.c : myfgetc(): no data in the buffer.");
        !           163:     }
        !           164:     return(k);
        !           165:   }
        !           166: }
        !           167: static int getRawInt32(struct cmoBuffer *cb)
        !           168: {
        !           169:   char d[4];
        !           170:   int i;
        !           171:   for (i=0; i<4; i++) {
        !           172:     d[i] = myfgetc(cb);
        !           173:   }
        !           174:   return(ntohl(* ( (int *)d)));
        !           175: }
        !           176:
        !           177: cmoGetGMPCoeff_old(MP_INT *x, struct cmoBuffer *cb)
        !           178: {
        !           179:   int i;
        !           180:   mp_size_t s;
        !           181:   mp_size_t xsize;
        !           182:   mp_ptr xp;
        !           183:   unsigned int c;
        !           184:   mp_limb_t x_limb;
        !           185:   mp_size_t in_bytesize;
        !           186:   int neg_flag;
        !           187:
        !           188:   /* Read 4-byte size */
        !           189:   in_bytesize = 0;
        !           190:   for (i = 4 - 1; i >= 0; i--)
        !           191:     {
        !           192:       c = myfgetc (cb);
        !           193:       in_bytesize = (in_bytesize << BITS_PER_CHAR) | c;
        !           194:     }
        !           195:
        !           196:   /* Size is stored as a 32 bit word; sign extend in_bytesize for non-32 bit
        !           197:      machines.  */
        !           198:   if (sizeof (mp_size_t) > 4)
        !           199:     in_bytesize |= (-(in_bytesize < 0)) << 31;
        !           200:
        !           201:   neg_flag = in_bytesize < 0;
        !           202:   in_bytesize = ABS (in_bytesize);
        !           203:   xsize = (in_bytesize + BYTES_PER_MP_LIMB - 1) / BYTES_PER_MP_LIMB;
        !           204:
        !           205:   if (xsize == 0)
        !           206:     {
        !           207:       x->_mp_size = 0;
        !           208:       return 4;                        /* we've read 4 bytes */
        !           209:     }
        !           210:
        !           211:   if (x->_mp_alloc < xsize)
        !           212:     _mpz_realloc (x, xsize);
        !           213:   xp = x->_mp_d;
        !           214:
        !           215:   x_limb = 0;
        !           216:   for (i = (in_bytesize - 1) % BYTES_PER_MP_LIMB; i >= 0; i--)
        !           217:     {
        !           218:       c = myfgetc (cb);
        !           219:       x_limb = (x_limb << BITS_PER_CHAR) | c;
        !           220:     }
        !           221:   xp[xsize - 1] = x_limb;
        !           222:
        !           223:   for (s = xsize - 2; s >= 0; s--)
        !           224:     {
        !           225:       x_limb = 0;
        !           226:       for (i = BYTES_PER_MP_LIMB - 1; i >= 0; i--)
        !           227:        {
        !           228:          c = myfgetc (cb);
        !           229:          x_limb = (x_limb << BITS_PER_CHAR) | c;
        !           230:        }
        !           231:       xp[s] = x_limb;
        !           232:     }
        !           233:
        !           234:   if (c == EOF)
        !           235:     return 0;                  /* error */
        !           236:
        !           237:   MPN_NORMALIZE (xp, xsize);
        !           238:   x->_mp_size = neg_flag ? -xsize : xsize;
        !           239:   return in_bytesize + 4;
        !           240: }
        !           241:
        !           242: /*****************************************************/
        !           243: /*****   new version for CMO_ZZ  *********************/
        !           244: /*****************************************************/
        !           245: size_t
        !           246: cmoOutGMPCoeff_new(mpz_srcptr x)
        !           247: {
        !           248:   int i;
        !           249:   mp_size_t s;
        !           250:   mp_size_t xsize = ABS (x->_mp_size);
        !           251:   mp_srcptr xp = x->_mp_d;
        !           252:   mp_size_t out_bytesize;
        !           253:   mp_limb_t hi_limb;
        !           254:   int n_bytes_in_hi_limb;
        !           255:   cmoint tmp[1];
        !           256:   tmp[0] = htonl(CMO_ZZ);
        !           257:   cmoOutputToBuf(CMOPUT,tmp,sizeof(cmoint));
        !           258:
        !           259:   if (BYTES_PER_MP_LIMB != 4) {
        !           260:     fprintf(stderr,"BYTES_PER_MP_LIMB = %d\n",BYTES_PER_MP_LIMB);
        !           261:     fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
        !           262:     fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
        !           263:     exit(10);
        !           264:   }
        !           265:   if (BITS_PER_CHAR != 8) {
        !           266:     fprintf(stderr,"BITS_PER_CHAR = %d\n",BITS_PER_CHAR);
        !           267:     fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
        !           268:     fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
        !           269:     exit(10);
        !           270:   }
        !           271:
        !           272:   if (xsize == 0)
        !           273:     {
        !           274:       outRawInt32(0);
        !           275:       return  1;
        !           276:     }
        !           277:
        !           278:   if (x->_mp_size >= 0)
        !           279:     outRawInt32(xsize);
        !           280:   else
        !           281:     outRawInt32(-xsize);
        !           282:
        !           283:
        !           284:   /* Output from the least significant limb to the most significant limb */
        !           285:   /* We assume that the size of limb is 4. */
        !           286:
        !           287:   for (s = 0; s < xsize; s++)
        !           288:     {
        !           289:       outRawInt32((int) xp[s]);
        !           290:     }
        !           291:   return ( ABS (xsize) );
        !           292: }
        !           293:
        !           294: cmoGetGMPCoeff_new(MP_INT *x, struct cmoBuffer *cb)
        !           295: {
        !           296:   int i;
        !           297:   mp_size_t s;
        !           298:   mp_size_t xsize;
        !           299:   mp_ptr xp;
        !           300:   unsigned int c;
        !           301:   mp_limb_t x_limb;
        !           302:   mp_size_t in_bytesize;
        !           303:   int neg_flag;
        !           304:
        !           305:   if (BYTES_PER_MP_LIMB != 4) {
        !           306:     fprintf(stderr,"BYTES_PER_MP_LIMB = %d\n",BYTES_PER_MP_LIMB);
        !           307:     fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
        !           308:     fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
        !           309:     exit(10);
        !           310:   }
        !           311:   if (BITS_PER_CHAR != 8) {
        !           312:     fprintf(stderr,"BITS_PER_CHAR = %d\n",BITS_PER_CHAR);
        !           313:     fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
        !           314:     fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
        !           315:     exit(10);
        !           316:   }
        !           317:
        !           318:   /* Read 4-byte size */
        !           319:
        !           320:   xsize = getRawInt32(cb);
        !           321:   neg_flag = xsize < 0;
        !           322:   xsize = ABS(xsize);
        !           323:
        !           324:   if (xsize == 0)
        !           325:     {
        !           326:       x->_mp_size = 0;
        !           327:       return 1;                        /* we've read 4 bytes */
        !           328:     }
        !           329:
        !           330:   if (x->_mp_alloc < xsize)
        !           331:     _mpz_realloc (x, xsize);
        !           332:   xp = x->_mp_d;
        !           333:
        !           334:   for (i=0; i<xsize; i++) {
        !           335:     xp[i] = getRawInt32(cb);
        !           336:   }
        !           337:
        !           338:   MPN_NORMALIZE (xp, xsize);
        !           339:   x->_mp_size = neg_flag ? -xsize : xsize;
        !           340:   return( xsize );
        !           341: }

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