conv.c -- simple numeric base converter

David Koblas koblas at mips.COM
Mon Jul 9 06:27:15 AEST 1990


Yet another base converter, but written as a replacement for atof.
Called as:
		val = atov("0x123", 0);
		val = atov("abz", 36);

Where the second argument is the default base, if == 0 then use
default conventions:  0x = 16, 0 = 8, 0% = binary, else base 10.

-----CUT---HERE----------------------------------------------------------

/* +------------------------------------------------------------------+ */
/* | Copyright 1989, David Koblas.                                    | */
/* |   You may copy this file in whole or in part as long as you      | */
/* |   don't try to make money off it, or pretend that you wrote it.  | */
/* +------------------------------------------------------------------+ */

#include	<ctype.h>

#ifdef TEST
main(argc,argv)
int	argc;
char	**argv;
{
	int	i;
	for (i=1;i<argc;i++)
		printf("%10s  == %d\n",argv[i],atov(argv[i],0));
}
#endif

atov(str,type)
char	*str;
int	type;
{
	int		sign = 1;
	int		i;
	char		c;
	int		val=0,n;

	i=0;
	while ((str[i]==' ') || (str[i]=='\t')) i++;
	if (str[i]=='-')  {
		sign = -1;
		i++;
	} else if (str[i]=='+') {
		sign = 1;
		i++;
	}
	if (type==0)  {
		if (str[i]=='0') {
			i++;
			if (str[i]=='%') {
				i++;
				type=2;
			} else if (str[i]=='x') {
				i++;
				type=16;
			} else {
				type=8;
			}
		} else {
			type=10;
		}
	}
	for (;i<strlen(str);i++) {
		c=str[i];
		if (isdigit(c)) {
			n = c - '0';
		} else if (isupper(c)) {
			n = c - 'A' + 10;
		} else if (islower(c)) {
			n = c - 'a' + 10;
		} else {
			goto	out;
		}
		if (n>=type)
			goto out;
		val = (val*type)+n;
	}
out:	
	return(val * sign);
}


-- 
name : David Koblas                        domain: koblas at cs.uoregon.edu
place: Nowhere, I'm just an AI batch job.  domain: koblas at mips.com
quote: "Time has little to do with         domain: koblas at riacs.edu
	infinity and jelly donuts."        domain: koblas at stellar.arc.nasa.gov



More information about the Alt.sources mailing list