有关计算器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"));
}
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