192 lines
3.6 KiB
C
192 lines
3.6 KiB
C
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
|
|
/* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
|
/* UNIX System Laboratories, Inc. */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
#ident "@(#)ksh:shlib/utos.c 1.2.4.2"
|
|
|
|
/*
|
|
* UTOS.C
|
|
*
|
|
* Programmer: D. G. Korn
|
|
*
|
|
* Date: May 3, 1982
|
|
*
|
|
*
|
|
*
|
|
* LTOS (SINT, BASE)
|
|
*
|
|
* Return a pointer to a string denoting the value of
|
|
* the signed long integer SINT in base BASE.
|
|
*
|
|
* UTOS (USINT, BASE)
|
|
*
|
|
* Return a pointer to a string denoting the value of
|
|
* the unsigned long integer USINT in base BASE.
|
|
*
|
|
*
|
|
*
|
|
* See Also: arith(III)
|
|
*/
|
|
|
|
#include "sh_config.h"
|
|
|
|
#define BASEMAX (4+16*sizeof(int))
|
|
static char hexstr[BASEMAX];
|
|
extern char e_hdigits[];
|
|
char *utos();
|
|
char *ltos();
|
|
#ifdef FLOAT
|
|
char *ftos();
|
|
char *etos();
|
|
#endif /* FLOAT */
|
|
|
|
/*
|
|
* LTOS (SINT, BASE)
|
|
*
|
|
* long USINT;
|
|
*
|
|
* int BASE;
|
|
*
|
|
* Return a pointer to a string denoting the value of SINT
|
|
* in base BASE. The string will be stored within HEXSTR.
|
|
* It will begin with the base followed by a single '#'.
|
|
* A minus sign will be prepended for negative numbers
|
|
*
|
|
*/
|
|
|
|
|
|
char *ltos(sint,base)
|
|
long sint;
|
|
int base;
|
|
{
|
|
register char *sp;
|
|
register long l = (sint>=0?sint:-sint);
|
|
#ifdef pdp11
|
|
sp = utos(l,base);
|
|
#else
|
|
sp = utos((unsigned long)l,base);
|
|
#endif /* pdp11 */
|
|
if(sint<0)
|
|
*--sp = '-';
|
|
return(sp);
|
|
}
|
|
|
|
/*
|
|
* UTOS (USINT, BASE)
|
|
*
|
|
* unsigned USINT;
|
|
*
|
|
* int BASE;
|
|
*
|
|
* Return a pointer to a string denoting the value of USINT
|
|
* in base BASE. The string will be stored within HEXSTR.
|
|
* It will begin with the base followed by a single '#'.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
char *utos(usint,base)
|
|
register int base;
|
|
#ifdef pdp11
|
|
/* unsigned longs are not supported on pdp11 */
|
|
long usint;
|
|
{
|
|
long l = usint;
|
|
#else
|
|
unsigned long usint;
|
|
{
|
|
register unsigned long l = usint;
|
|
#endif /* pdp11 */
|
|
register char *cp = hexstr+(BASEMAX-1);
|
|
if(base < 2 || base > BASEMAX)
|
|
return(cp);
|
|
for(*cp = 0;cp > hexstr && l;l /= base)
|
|
*--cp = e_hdigits[(l%base)<<1];
|
|
if(usint==0)
|
|
*--cp = '0';
|
|
if(base==10)
|
|
return(cp);
|
|
*--cp = '#';
|
|
*--cp = e_hdigits[(base%10)<<1];
|
|
if(base /= 10)
|
|
*--cp = e_hdigits[(base%10)<<1];
|
|
return(cp);
|
|
}
|
|
|
|
char *u64tos(usll,base)
|
|
register int base;
|
|
#ifdef pdp11
|
|
/* unsigned longs are not supported on pdp11 */
|
|
long usint;
|
|
{
|
|
long l = usint;
|
|
#else
|
|
unsigned long long usll;
|
|
{
|
|
register unsigned long long l = usll;
|
|
#endif /* pdp11 */
|
|
register char *cp = hexstr+(BASEMAX-1);
|
|
if(base < 2 || base > BASEMAX)
|
|
return(cp);
|
|
for(*cp = 0;cp > hexstr && l;l /= base)
|
|
*--cp = e_hdigits[(l%base)<<1];
|
|
if(usll==0)
|
|
*--cp = '0';
|
|
if(base==10)
|
|
return(cp);
|
|
*--cp = '#';
|
|
*--cp = e_hdigits[(base%10)<<1];
|
|
if(base /= 10)
|
|
*--cp = e_hdigits[(base%10)<<1];
|
|
return(cp);
|
|
}
|
|
|
|
#ifdef FLOAT
|
|
/*
|
|
* FTOS (VAL, PLACES)
|
|
*
|
|
* double VAL;
|
|
*
|
|
* int PLACES;
|
|
*
|
|
* Return a pointer to a string denoting the value of VAL
|
|
* with PLACES places after the decimal point. The string
|
|
* will be stored within HEXSTR.
|
|
*
|
|
*/
|
|
|
|
char *ftos(val,places)
|
|
double val;
|
|
int places;
|
|
{
|
|
register char *sp=hexstr;
|
|
register char *cp;
|
|
extern char *fcvt();
|
|
int decpt,sign;
|
|
cp = fcvt(val,places,&decpt,&sign);
|
|
if(sign)
|
|
*sp++ = '-';
|
|
while(decpt-- > 0)
|
|
*sp++ = *cp++;
|
|
*sp++ = '.';
|
|
while(++decpt < 0)
|
|
*sp++ = '0';
|
|
while(*sp++ = *cp++);
|
|
return(hexstr);
|
|
}
|
|
|
|
char *etos(val,places)
|
|
double val;
|
|
int places;
|
|
{
|
|
extern char *gcvt();
|
|
return(gcvt(val,places,hexstr));
|
|
}
|
|
#endif /* FLOAT */
|