*** empty log message ***

This commit is contained in:
hyung-hwan 2006-10-06 14:35:17 +00:00
parent a3de9b9a97
commit 6a64940914
4 changed files with 68 additions and 26 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: misc.c,v 1.24 2006-10-06 03:33:43 bacon Exp $
* $Id: misc.c,v 1.25 2006-10-06 14:34:37 bacon Exp $
*/
#include <xp/awk/awk_i.h>
@ -234,6 +234,7 @@ xp_real_t xp_awk_strtoreal (xp_awk_t* awk, const xp_char_t* str)
{
fraction = 0.0;
/*p = str;*/
p = pexp;
goto done;
}
else
@ -283,7 +284,8 @@ xp_real_t xp_awk_strtoreal (xp_awk_t* awk, const xp_char_t* str)
if (!XP_AWK_ISDIGIT (awk, *p))
{
/* p = pexp; */
goto done;
/* goto done; */
goto no_exp;
}
while (XP_AWK_ISDIGIT (awk, *p))
{
@ -292,6 +294,7 @@ xp_real_t xp_awk_strtoreal (xp_awk_t* awk, const xp_char_t* str)
}
}
no_exp:
if (exp_negative) exp = frac_exp - exp;
else exp = frac_exp + exp;
@ -385,7 +388,7 @@ xp_real_t xp_awk_strxtoreal (
c = *p;
if (!XP_AWK_ISDIGIT (awk, c))
{
if ((c != XP_T('.')) || (dec_pt >= 0)) break;
if (c != XP_T('.') || dec_pt >= 0) break;
dec_pt = mant_size;
}
p++;
@ -422,11 +425,13 @@ xp_real_t xp_awk_strxtoreal (
{
fraction = 0.0;
/*p = str;*/
p = pexp;
goto done;
}
else
{
int frac1, frac2;
frac1 = 0;
for ( ; mant_size > 9; mant_size--)
{
@ -439,47 +444,56 @@ xp_real_t xp_awk_strxtoreal (
}
frac1 = 10 * frac1 + (c - XP_T('0'));
}
frac2 = 0;
for (; mant_size > 0; mant_size--) {
c = *p;
p++;
c = *p++;
if (c == XP_T('.'))
{
c = *p;
p++;
}
frac2 = 10*frac2 + (c - XP_T('0'));
frac2 = 10 * frac2 + (c - XP_T('0'));
}
fraction = (1.0e9 * frac1) + frac2;
}
/* Skim off the exponent */
p = pexp;
if ((*p == XP_T('E')) || (*p == XP_T('e')))
if (p < end && (*p == XP_T('E') || *p == XP_T('e')))
{
p++;
if (*p == XP_T('-'))
if (p < end)
{
exp_negative = 1;
p++;
}
else
{
if (*p == XP_T('+')) p++;
exp_negative = 0;
if (*p == XP_T('-'))
{
exp_negative = 1;
p++;
}
else
{
if (*p == XP_T('+')) p++;
exp_negative = 0;
}
}
if (!XP_AWK_ISDIGIT (awk, *p))
else exp_negative = 0;
if (!(p < end && XP_AWK_ISDIGIT (awk, *p)))
{
/* p = pexp; */
goto done;
/*p = pexp;*/
/*goto done;*/
goto no_exp;
}
while (XP_AWK_ISDIGIT (awk, *p))
while (p < end && XP_AWK_ISDIGIT (awk, *p))
{
exp = exp * 10 + (*p - XP_T('0'));
p++;
}
}
no_exp:
if (exp_negative) exp = frac_exp - exp;
else exp = frac_exp + exp;
@ -509,6 +523,7 @@ xp_real_t xp_awk_strxtoreal (
else fraction *= dbl_exp;
done:
if (endptr != XP_NULL) *endptr = p;
return (negative)? -fraction: fraction;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.c,v 1.186 2006-10-06 03:33:43 bacon Exp $
* $Id: parse.c,v 1.187 2006-10-06 14:34:37 bacon Exp $
*/
#include <xp/awk/awk_i.h>
@ -3283,7 +3283,7 @@ static int __get_token (xp_awk_t* awk)
{
SET_TOKEN_TYPE (awk, TOKEN_EOF);
}
else if (XP_AWK_ISDIGIT (awk, c))
else if (XP_AWK_ISDIGIT (awk, c) || c == XP_T('.'))
{
if (__get_number (awk) == -1) return -1;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: run.c,v 1.225 2006-10-06 03:41:54 bacon Exp $
* $Id: run.c,v 1.226 2006-10-06 14:34:37 bacon Exp $
*/
#include <xp/awk/awk_i.h>
@ -2838,6 +2838,7 @@ static int __cmp_int_str (
xp_char_t* str;
xp_size_t len;
xp_long_t r;
xp_real_t rr;
int n;
r = xp_awk_strxtolong (run->awk,
@ -2850,11 +2851,10 @@ static int __cmp_int_str (
if (((xp_awk_val_int_t*)left)->val < r) return -1;
return 0;
}
/* TODO: should i do this??? conversion to real and comparision... */
else if (*str == XP_T('.') || *str == XP_T('E') || *str == XP_T('e'))
{
/* TODO: */
/*
r = xp_awk_strxtoreal (run->awk,
rr = xp_awk_strxtoreal (run->awk,
((xp_awk_val_str_t*)right)->buf,
((xp_awk_val_str_t*)right)->len, &str);
if (str == ((xp_awk_val_str_t*)right)->buf +
@ -2864,7 +2864,6 @@ static int __cmp_int_str (
if (((xp_awk_val_int_t*)left)->val < rr) return -1;
return 0;
}
*/
}
str = xp_awk_valtostr (run, left, xp_true, XP_NULL, &len);
@ -2926,8 +2925,20 @@ static int __cmp_real_str (
{
xp_char_t* str;
xp_size_t len;
xp_real_t rr;
int n;
rr = xp_awk_strxtoreal (run->awk,
((xp_awk_val_str_t*)right)->buf,
((xp_awk_val_str_t*)right)->len, &str);
if (str == ((xp_awk_val_str_t*)right)->buf +
((xp_awk_val_str_t*)right)->len)
{
if (((xp_awk_val_real_t*)left)->val > rr) return 1;
if (((xp_awk_val_real_t*)left)->val < rr) return -1;
return 0;
}
str = xp_awk_valtostr (run, left, xp_true, XP_NULL, &len);
if (str == XP_NULL)
{

View File

@ -73,6 +73,15 @@ BEGIN {
print "010 > \"8\"", (010 > "8");
print "010 < \"8\"", (010 < "8");
print "--------------------------";
print "10 == \"10.0\"", (10 == "10.0");
print "10 != \"10.0\"", (10 != "10.0");
print "10 >= \"10.0\"", (10 >= "10.0");
print "10 <= \"10.0\"", (10 <= "10.0");
print "10 > \"10.0\"", (10 > "10.0");
print "10 < \"10.0\"", (10 < "10.0");
#OFMT="abc";
print "--------------------------";
print "10.0 == \"10\"", (10.0 == "10");
print "10.0 != \"10\"", (10.0 != "10");
@ -85,4 +94,11 @@ BEGIN {
#print a == 1;
print (0.234 + 1.01123);
print 12345678901234567890E20;
print .123;
print +.123;
print -.123;
print .123E-;
print +.123E-;
print -.123E-;
}