File: atov.c

package info (click to toggle)
op 1.32-4
  • links: PTS, VCS
  • area: main
  • in suites: lenny, squeeze
  • size: 716 kB
  • ctags: 360
  • sloc: ansic: 2,272; sh: 800; lex: 447; makefile: 68
file content (76 lines) | stat: -rw-r--r-- 1,585 bytes parent folder | download
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);
}