2021SC@SDUSC
mrio1.c和mrio2.c主要实现库的输入输出。
int instr(_MIPD_ flash x,char *string)
{ /* input a big number *
* returns length in digits */
int i,ipt,n,s,e,pads;
BOOL first_after_pad;
int ch,lc;
#ifdef MR_FLASH
BOOL frac;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return 0;
MR_IN(76)
if (mr_mip->apbase==0 || mr_mip->apbase>256)
{
mr_berror(_MIPP_ MR_ERR_BASE_TOO_BIG);
MR_OUT
return 0;
}
if (!mr_mip->active)
{
mr_berror(_MIPP_ MR_ERR_NO_MIRSYS);
MR_OUT
return 0;
}
该方法主要实现了输入一个大数之后返回其长度的功能。
#ifdef MR_FLASH
done=FALSE;
numer(_MIPP_ x,mr_mip->w6);
if (mr_mip->RPOINT)
{ /* output with radix point */
denom(_MIPP_ x,mr_mip->w5);
if (size(mr_mip->w5)>1)
{ /* multiply up numerator to get full precision in *
* the output. Remember position of radix point. */
nw=(int)(lx&MR_MSK);
dw=(int)((lx>>MR_BTS)&MR_MSK);
if (nw==0) nw++;
check=mr_mip->check;
mr_mip->check=OFF;
if (nw>dw) mr_shift(_MIPP_ mr_mip->w5,nw-dw,mr_mip->w5);
if (dw>nw) mr_shift(_MIPP_ mr_mip->w6,dw-nw,mr_mip->w6);
nd=mr_mip->nib;
if (mr_compare(mr_mip->w6,mr_mip->w5)>=0) nd--;
copy(mr_mip->w6,mr_mip->w0);
if (((int)mr_mip->w0->len+nd)>2*mr_mip->nib) nd=2*mr_mip->nib-(int)mr_mip->w0->len;
mr_shift(_MIPP_ mr_mip->w0,nd,mr_mip->w0);
divide(_MIPP_ mr_mip->w0,mr_mip->w5,mr_mip->w6);
mr_mip->check=check;
rp=mr_mip->pack*(nd+dw-nw);
}
}
实现了小数和分数的输入输出。
static void cbase(_MIPD_ big x,mr_small oldbase,big y)
{ /* change radix of x from oldbase to base */
int i,s;
mr_small n;
BOOL done;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
if (mr_mip->base==oldbase)
{
copy(x,y);
return;
}
MR_IN(13)
s=exsign(x);
#ifdef MR_FLASH
numer(_MIPP_ x,mr_mip->w1);
denom(_MIPP_ x,mr_mip->w2);
done=FALSE;
#else
copy(x,mr_mip->w1);
done=TRUE;
#endif
insign(PLUS,mr_mip->w1);
forever
{
zero(mr_mip->w6);
convert(_MIPP_ 1,mr_mip->w0);
for (i=0;i<(int)mr_mip->w1->len;i++)
{ /* this is a bit slow - but not time critical */
mr_pmul(_MIPP_ mr_mip->w0,mr_mip->w1->w[i],mr_mip->w5);
add(_MIPP_ mr_mip->w6,mr_mip->w5,mr_mip->w6);
if (oldbase==0)
{ /* bit of a frig! */
n=mr_shiftbits(1,MIRACL/2);
mr_pmul(_MIPP_ mr_mip->w0,n,mr_mip->w0);
mr_pmul(_MIPP_ mr_mip->w0,n,mr_mip->w0);
}
else mr_pmul(_MIPP_ mr_mip->w0,oldbase,mr_mip->w0);
}
if (mr_mip->ERNUM || done) break;
#ifdef MR_FLASH
copy(mr_mip->w2,mr_mip->w1);
copy(mr_mip->w6,mr_mip->w7);
done=TRUE;
将x的基数从旧基数改为基数