date and time created 90/06/25 13:56:22 by bostic
[unix-history] / usr / src / usr.bin / f77 / libI77 / fmtlib.c
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)fmtlib.c 5.1 %G%
*/
/*
* integer to ascii conversion
*
* This code has been rearranged to produce optimized runtime code.
*/
#include "fio.h"
static char _digit[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static char _icv_buf[MAXINTLENGTH+1];
#define _mask 0x7fffffff
char *
icvt(value, ndigit, sign)
long value;
int *ndigit;
int *sign;
{
register long val = value;
register long rad = radix;
register char *b = &_icv_buf[MAXINTLENGTH];
register char *d = _digit;
register long tmp1;
register int tmp2;
long rem;
long kludge;
if (val == 0)
{
*--b = '0';
*sign = 0;
*ndigit = 1;
return(b);
}
if (signit && (*sign = (val < 0))) /* signed conversion */
{
/*
* It is necessary to do the first divide
* before the absolute value, for the case -2^31
*
* This is actually what is being done...
* tmp1 = (int)(val % rad);
* val /= rad;
* val = -val
* *--b = d[-tmp1];
*/
tmp1 = val / rad;
*--b = d[(tmp1 * rad) - val];
val = -tmp1;
}
else /* unsigned conversion */
{
*sign = 0;
if (val < 0)
{ /* ALL THIS IS TO SIMULATE UNSIGNED LONG MOD & DIV */
kludge = _mask - (rad - 1);
val &= _mask;
/*
* This is really what's being done...
* rem = (kludge % rad) + (val % rad);
* val = (kludge / rad) + (val / rad) + (rem / rad) + 1;
* *--b = d[rem % rad];
*/
tmp1 = kludge / rad;
tmp2 = val / rad;
rem = (kludge - (tmp1 * rad)) + (val - (tmp2 * rad));
val = ++tmp1 + tmp2;
tmp1 = rem / rad;
val += tmp1;
*--b = d[rem - (tmp1 * rad)];
}
}
while (val)
{
/*
* This is really what's being done ...
* *--b = d[val % rad];
* val /= rad;
*/
tmp1 = val / rad;
*--b = d[val - (tmp1 * rad)];
val = tmp1;
}
*ndigit = (&_icv_buf[MAXINTLENGTH] - b);
return(b);
}