/* Copyright (C) 1994 by Thomas Glen Smith. All Rights Reserved. */ /* dublins APL2 V1.0.0 ************************************************** * Called by dublin to determine the sign of the current constant. * * - *valp will contain the constant, converted from ASCII to double. * * - *divp will contain the factor by which to divide *valp to obtain * * the true real number constant. * ************************************************************************/ #define INCLUDES APLCHDEF+LIMITS+STRING #include "includes.h" int dublins(a,e,sp,signp,valp,divp) char *a,*e,**sp; int *signp; double *divp,*valp; { extern char *aplchar[]; /* global APL character array */ int sw=0; /* set to 1 if constant found */ char *s; for (s = a; s < e && *s == *(aplchar[SPACE]) || *s == '\n' || *s == '\t'; s++) {} /* white space */ *signp = 1; /* default sign is plus */ if (s < e && *s == *(aplchar[OVERBAR])) { *signp = -1; s++; } for (*valp = 0.0; s < e && *s >= *(aplchar[APL_0]) && *s <= *(aplchar[APL_9]); s++) { sw=1; /* constant found */ *valp = 10.0 * *valp + (*s - *(aplchar[APL_0])); } if (s < e && *s == *(aplchar[DOT])) { s++; if (sw == 1) sw = 2; /* real number */ } if ((*signp == +1 && *valp > INT_MAX) || (*signp == -1 && *valp > INT_MIN)) sw = 2; /* real number */ for (*divp = 1.0; s < e && *s >= *(aplchar[APL_0]) && *s <= *(aplchar[APL_9]); s++) { sw=2; /* constant found */ *valp = 10.0 * *valp + (*s - *(aplchar[APL_0])); *divp *= 10.0; } *sp = s; return(sw); }