static void plfloatlabel(PLFLT value, char *string) { PLINT setpre, precis; char form[10], tmpstring[10]; PLINT exponent = 0; PLFLT mant, tmp; PLINT prec = sigprec; plP_gprec(&setpre, &precis); if (setpre) prec = precis; if (value > 0.0) tmp = log10(value); else if (value < 0.0) tmp = log10(-value); else tmp = 0; if (tmp >= 0.0) exponent = (int )tmp; else if (tmp < 0.0) { tmp = -tmp; if (floor(tmp) < tmp) exponent = -(int )(floor(tmp) + 1.0); else exponent = -(int )(floor(tmp)); } mant = value/pow(10.0, exponent); if (mant != 0.0) mant = (int )(mant*pow(10.0, prec-1) + 0.5*mant/fabs(mant))/pow(10.0, prec-1); sprintf(form, "%%.%df", prec-1); sprintf(string, form, mant); /* sprintf(tmpstring, "#(229)10#u%d", exponent); */ sprintf(tmpstring, "#(229)10#u%d", exponent); strcat(string, tmpstring); if (abs(exponent) < limexp || value == 0.0) { value = pow(10.0, exponent) * mant; if (exponent >= 0) prec = prec - 1 - exponent; else prec = prec - 1 + abs(exponent); if (prec < 0) prec = 0; sprintf(form, "%%.%df", (int) prec); sprintf(string, form, value); } }
static void plform(PLFLT value, PLINT scale, PLINT prec, char *string, PLINT ll, PLINT lf) { if (ll) { /* Logarithmic */ if (lf) { /* Fixed point, i.e. .1, 1, 10, etc */ int exponent = ROUND(value); value = pow(10.0, exponent); if (exponent < 0) { char form[10]; sprintf(form, "%%.%df", ABS(exponent)); sprintf(string, form, value); } else { sprintf(string, "%d", (int) value); } } else { /* Exponential, i.e. 10^-1, 10^0, 10^1, etc */ sprintf(string, "10#u%d", (int) ROUND(value)); } } else { /* Linear */ PLINT setpre, precis; char form[10], temp[30]; double scale2; plP_gprec(&setpre, &precis); if (setpre) prec = precis; if (scale) value /= pow(10.,(double)scale); /* This is necessary to prevent labels like "-0.0" on some systems */ scale2 = pow(10., prec); value = floor((value * scale2) + .5) / scale2; sprintf(form, "%%.%df", (int) prec); sprintf(temp, form, value); strcpy(string, temp); } }
static void plfloatlabel(PLFLT value, char *string) { PLINT setpre, precis; /* form[10] gives enough space for all non-malicious formats. * tmpstring[15] gives enough room for 3 digits in a negative exponent * or 4 digits in a positive exponent + null termination. That * should be enough for all non-malicious use. * Obviously there are security issues here that * should be addressed as well. */ char form[10], tmpstring[15]; PLINT exponent = 0; PLFLT mant, tmp; PLINT prec = sigprec; plP_gprec(&setpre, &precis); if (setpre) prec = precis; if (value > 0.0) tmp = log10(value); else if (value < 0.0) tmp = log10(-value); else tmp = 0; if (tmp >= 0.0) exponent = (int )tmp; else if (tmp < 0.0) { tmp = -tmp; if (floor(tmp) < tmp) exponent = -((float) floor(tmp) + 1.0); else exponent = -((float) floor(tmp)); } mant = value/pow(10.0, exponent); if (mant != 0.0) mant = (int )(mant*pow(10.0, prec-1) + 0.5*mant/fabs(mant))/pow(10.0, prec-1); sprintf(form, "%%.%df", prec-1); sprintf(string, form, mant); sprintf(tmpstring, "#(229)10#u%d", exponent); strcat(string, tmpstring); if (abs(exponent) < limexp || value == 0.0) { value = pow(10.0, exponent) * mant; if (exponent >= 0) prec = prec - 1 - exponent; else prec = prec - 1 + abs(exponent); if (prec < 0) prec = 0; sprintf(form, "%%.%df", (int) prec); sprintf(string, form, value); } }