Zdenek Prikryl a1e348
--- bc-1.06/dc/numeric.c.dc_ibase	2007-08-22 08:37:57.000000000 +0200
Zdenek Prikryl a1e348
+++ bc-1.06/dc/numeric.c	2007-08-22 08:37:40.000000000 +0200
Zdenek Prikryl 0ef65d
@@ -285,6 +285,8 @@ dc_getnum DC_DECLARG((input, ibase, read
Zdenek Prikryl 0ef65d
 	int		digit;
Zdenek Prikryl 0ef65d
 	int		decimal;
Zdenek Prikryl 0ef65d
 	int		c;
Zdenek Prikryl 0ef65d
+	int		c_buff = 0;
Zdenek Prikryl 0ef65d
+	int		multi = 0;
Zdenek Prikryl 0ef65d
 
Zdenek Prikryl 0ef65d
 	bc_init_num(&tmp);
Zdenek Prikryl 0ef65d
 	bc_init_num(&build);
Zdenek Prikryl 0ef65d
@@ -302,6 +304,9 @@ dc_getnum DC_DECLARG((input, ibase, read
Zdenek Prikryl 0ef65d
 	}
Zdenek Prikryl 0ef65d
 	while (isspace(c))
Zdenek Prikryl 0ef65d
 		c = (*input)();
Zdenek Prikryl 0ef65d
+	c_buff = (*input)();	
Zdenek Prikryl 0ef65d
+	if (isdigit(c_buff) || ('A' <= c_buff && c_buff <= 'F') || c_buff == '.')
Zdenek Prikryl 0ef65d
+			multi = 1;		
Zdenek Prikryl 0ef65d
 	for (;;){
Zdenek Prikryl 0ef65d
 		if (isdigit(c))
Zdenek Prikryl 0ef65d
 			digit = c - '0';
Zdenek Prikryl 0ef65d
@@ -309,10 +314,15 @@ dc_getnum DC_DECLARG((input, ibase, read
Zdenek Prikryl 0ef65d
 			digit = 10 + c - 'A';
Zdenek Prikryl 0ef65d
 		else
Zdenek Prikryl 0ef65d
 			break;
Zdenek Prikryl 0ef65d
-		c = (*input)();
Zdenek Prikryl 0ef65d
+		digit = multi ? (digit >= ibase ? ibase -1 : digit) : digit;
Zdenek Prikryl 0ef65d
 		bc_int2num(&tmp, digit);
Zdenek Prikryl 0ef65d
 		bc_multiply(result, base, &result, 0);
Zdenek Prikryl 0ef65d
 		bc_add(result, tmp, &result, 0);
Zdenek Prikryl 0ef65d
+		if (c_buff) {
Zdenek Prikryl 0ef65d
+			c = c_buff;
Zdenek Prikryl 0ef65d
+			c_buff = 0;
Zdenek Prikryl 0ef65d
+		} else
Zdenek Prikryl 0ef65d
+			c = (*input)();
Zdenek Prikryl 0ef65d
 	}
Zdenek Prikryl 0ef65d
 	if (c == '.'){
Zdenek Prikryl 0ef65d
 		bc_free_num(&build);
Zdenek Prikryl a1e348
@@ -321,13 +331,18 @@ dc_getnum DC_DECLARG((input, ibase, read
Zdenek Prikryl a1e348
 		build = bc_copy_num(_zero_);
Zdenek Prikryl a1e348
 		decimal = 0;
Zdenek Prikryl a1e348
 		for (;;){
Zdenek Prikryl a1e348
-			c = (*input)();
Zdenek Prikryl a1e348
+			if (c_buff) {
Zdenek Prikryl a1e348
+				c = c_buff;
Zdenek Prikryl a1e348
+				c_buff = 0;
Zdenek Prikryl a1e348
+			} else
Zdenek Prikryl a1e348
+				c = (*input)();
Zdenek Prikryl a1e348
 			if (isdigit(c))
Zdenek Prikryl a1e348
 				digit = c - '0';
Zdenek Prikryl a1e348
 			else if ('A' <= c && c <= 'F')
Zdenek Prikryl 0ef65d
 				digit = 10 + c - 'A';
Zdenek Prikryl 0ef65d
 			else
Zdenek Prikryl 0ef65d
 				break;
Zdenek Prikryl 0ef65d
+			digit = digit >= ibase ? ibase -1 : digit;
Zdenek Prikryl 0ef65d
 			bc_int2num(&tmp, digit);
Zdenek Prikryl 0ef65d
 			bc_multiply(build, base, &build, 0);
Zdenek Prikryl 0ef65d
 			bc_add(build, tmp, &build, 0);