有关计算器gcalctool 4.2.83源码中的一个函数,请高手指教

在计算器gcalctool 4.2.83的源码中有以下函数,小弟不明白这个函数是做什么用的,尤其是结构体中的几个变量,麻烦大家帮忙看看!其中MP是指多精度!
static struct {
  int b, t, m, mxr, r[MP_SIZE];
} MP;

static void
mpchk(int *i, int *j)
{
  static int ib, mx;

/* CHECKS LEGALITY OF B, T, M AND MXR.
 * THE CONDITION ON MXR (THE DIMENSION OF R IN COMMON) IS THAT
 * MXR .GE. (I*T + J)
 */

/* CHECK LEGALITY OF B, T AND M */

  if (MP.b > 1) goto L40;

  if (v->MPerrors) {
  FPRINTF(stderr, _("*** B = %d ILLEGAL IN CALL TO MPCHK.\nPERHAPS NOT SET BEFORE CALL TO AN MP ROUTINE ***\n"), MP.b);
  }
  mperr();

L40:
  if (MP.t > 1) goto L60;

  if (v->MPerrors) {
  FPRINTF(stderr, _("*** T = %d ILLEGAL IN CALL TO MPCHK.\nPERHAPS NOT SET BEFORE CALL TO AN MP ROUTINE ***\n"), MP.t);
  }
  mperr();

L60:
  if (MP.m > MP.t) goto L80;

  if (v->MPerrors) {
  FPRINTF(stderr, _("*** M .LE. T IN CALL TO MPCHK.\nPERHAPS NOT SET BEFORE CALL TO AN MP ROUTINE ***\n"));
  }
  mperr();

/* 8*B*B-1 SHOULD BE REPRESENTABLE, IF NOT WILL OVERFLOW
 * AND MAY BECOME NEGATIVE, SO CHECK FOR THIS
 */

L80:
  ib = (MP.b << 2) * MP.b - 1;
  if (ib > 0 && (ib << 1) + 1 > 0) goto L100;

  if (v->MPerrors) {
  FPRINTF(stderr, _("*** B TOO LARGE IN CALL TO MPCHK ***\n"));
  }

  mperr();

/* CHECK THAT SPACE IN COMMON IS SUFFICIENT */

L100:
  mx = *i * MP.t + *j;
  if (MP.mxr >= mx) return;

/* HERE COMMON IS TOO SMALL, SO GIVE ERROR MESSAGE. */

  if (v->MPerrors) {
  FPRINTF(stderr,  
  _("*** MXR TOO SMALL OR NOT SET TO DIM(R) BEFORE CALL TO AN MP ROUTINE ***\n"));
  FPRINTF(stderr,  
  _("*** MXR SHOULD BE AT LEAST %d*T + %d = %d ***\n*** ACTUALLY MXR = %d, AND T = %d ***\n"),
  *i, *j, mx, MP.mxr, MP.t);
  }

  mperr();
}

tatic void
mperr()
{

/* THIS ROUTINE IS CALLED WHEN AN ERROR CONDITION IS ENCOUNTERED, AND
 * AFTER A MESSAGE HAS BEEN WRITTEN TO STDERR.
 */

  doerr(_("Error"));
}

作者: DennisCPP   发布时间: 2011-03-24

哎.....没人知道么?

作者: DennisCPP   发布时间: 2011-03-24