Ejemplo n.º 1
0
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);
    }
}
Ejemplo n.º 2
0
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);
    }
}
Ejemplo n.º 3
0
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);
    }
}