1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
/* +-------------------------------------------------------------------+ */
/* | Copyright 1988,1991, David Koblas. | */
/* | Permission to use, copy, modify, and distribute this software | */
/* | and its documentation for any purpose and without fee is hereby | */
/* | granted, provided that the above copyright notice appear in all | */
/* | copies and that both that copyright notice and this permission | */
/* | notice appear in supporting documentation. This software is | */
/* | provided "as is" without express or implied warranty. | */
/* +-------------------------------------------------------------------+ */
#include <string.h>
#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
int 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);
}
|