1999-10-23
1999-10-23 06:52:07 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
-
011ad31664fe5a95df7235ac94c9b8edac69d2ab
(111 lines)
(+90/-21)
[
Show
| Annotate
]
Branch: 7.9
lexer now accepts really really large numbers :)
Rev: src/block_alloc.h:1.13
Rev: src/configure.in:1.325
Rev: src/language.yacc:1.128
Rev: src/las.c:1.93
Rev: src/las.h:1.22
Rev: src/lexer.h:1.8
Rev: src/modules/Gmp/configure.in:1.8
Rev: src/opcodes.c:1.48
Rev: src/pike_memory.c:1.49
Rev: src/pike_memory.h:1.12
Rev: src/stralloc.c:1.70
Rev: src/stralloc.h:1.37
25:
#define HUGE HUGE_VAL
#endif /*!HUGE*/
- RCSID("$Id: stralloc.c,v 1.69 1999/10/23 00:43:44 noring Exp $");
+ RCSID("$Id: stralloc.c,v 1.70 1999/10/23 06:51:32 hubbe Exp $");
#define BEGIN_HASH_SIZE 997
#define MAX_AVG_LINK_LENGTH 3
582:
return s;
}
+ struct pike_string * debug_make_shared_binary_pcharp(const PCHARP str,int len)
+ {
+ switch(str.shift)
+ {
+ case 0:
+ return make_shared_binary_string((p_wchar0 *)(str.ptr), len);
+ case 1:
+ return make_shared_binary_string1((p_wchar1 *)(str.ptr), len);
+ case 2:
+ return make_shared_binary_string2((p_wchar2 *)(str.ptr), len);
+ default:
+ fatal("Unknown string width!\n");
+ }
+ }
+
+ struct pike_string * debug_make_shared_pcharp(const PCHARP str)
+ {
+ return debug_make_shared_binary_pcharp(str, pcharp_strlen(str));
+ }
+
struct pike_string * debug_make_shared_binary_string1(const p_wchar1 *str,int len)
{
struct pike_string *s;
1783:
return (neg ? val : -val);
}
- int string_to_svalue_inumber(struct svalue *r, char *str, char **ptr, int base,
+ int string_to_svalue_inumber(struct svalue *r,
+ char * str,
+ char **ptr,
+ int base,
int maxlength)
{
- char *str_start;
+ PCHARP tmp;
+ int ret=pcharp_to_svalue_inumber(r,
+ MKPCHARP(str,0),
+ &tmp,
+ base,
+ maxlength);
+ if(ptr) *ptr=(char *)tmp.ptr;
+ return ret;
+ }
-
+ int wide_string_to_svalue_inumber(struct svalue *r,
+ void * str,
+ void **ptr,
+ int base,
+ int maxlength,
+ int shift)
+ {
+ PCHARP tmp;
+ int ret=pcharp_to_svalue_inumber(r,
+ MKPCHARP(str,shift),
+ &tmp,
+ base,
+ maxlength);
+ if(ptr) *ptr=(char *)tmp.ptr;
+ return ret;
+ }
+
+ int pcharp_to_svalue_inumber(struct svalue *r,
+ PCHARP str,
+ PCHARP *ptr,
+ int base,
+ int maxlength)
+ {
+ PCHARP str_start;
+
INT_TYPE xx, neg = 0, is_bignum = 0;
INT_TYPE val;
INT_TYPE c;
1805:
if(base < 0 || MBASE < base)
return 0;
- if(!isalnum(c = *str))
+ if(!isalnum(c = EXTRACT_PCHARP(str)))
{
while(ISSPACE(c))
- c = *++str;
+ {
+ INC_PCHARP(str,1);
+ c = EXTRACT_PCHARP(str);
+ }
switch (c)
{
1816:
neg++;
/* Fall-through. */
case '+':
- c = *++str;
+ INC_PCHARP(str,1);
+ c = EXTRACT_PCHARP(str);
}
}
1824:
{
if(c != '0')
base = 10;
- else if(str[1] == 'x' || str[1] == 'X')
+ else if(INDEX_PCHARP(str,1) == 'x' || INDEX_PCHARP(str,1) == 'X')
base = 16;
else
base = 8;
1837:
if(!isalnum(c) || (xx = DIGIT(c)) >= base)
return 0; /* No number formed. */
- if(base == 16 && c == '0' && isxdigit(((unsigned char *)str)[2]) &&
- (str[1] == 'x' || str[1] == 'X'))
- c = *(str += 2); /* Skip over leading "0x" or "0X". */
+ if(base == 16 && c == '0' &&
+ INDEX_PCHARP(str,2) < 256 && /* Don't trust isxdigit... */
+ isxdigit(INDEX_PCHARP(str,2)) &&
+ (INDEX_PCHARP(str,1) == 'x' || INDEX_PCHARP(str,1) == 'X'))
+ {
+ /* Skip over leading "0x" or "0X". */
+ INC_PCHARP(str,2);
+ c=EXTRACT_PCHARP(str);
+ }
- for(val = -DIGIT(c); isalnum(c = *++str) &&
+ for(val = -DIGIT(c);
+ isalnum(c = ( INC_PCHARP(str,1),EXTRACT_PCHARP(str) )) &&
(xx = DIGIT(c)) < base &&
0 != maxlength--; )
{
1861: Inside #if defined(AUTO_BIGNUM)
#ifdef AUTO_BIGNUM
if(is_bignum || (!neg && r->u.integer < 0))
{
- struct pike_string *s;
-
- s = begin_shared_string(str - str_start);
- MEMCPY(s->str, str_start, str - str_start);
- s = end_shared_string(s);
-
- push_string(s);
+ push_string(make_shared_binary_pcharp(str_start,
+ SUBTRACT_PCHARP(str,str_start)));
push_int(base);
-
+
+ /* Note that this can concievably throw errors()
+ * in some situations that might not be desirable...
+ * take care.
+ * /Hubbe
+ */
convert_stack_top_with_base_to_bignum();
*r = *--sp;
1886:
if(sp[-1].type != T_STRING)
error("Cannot convert stack top to integer number.\n");
- i = string_to_svalue_inumber(&r, sp[-1].u.string->str, 0, base, 0);
+ i=pcharp_to_svalue_inumber(&r, MKPCHARP_STR(sp[-1].u.string), 0, base, 0);
free_string(sp[-1].u.string);
sp[-1] = r;