diff --git a/src/pike_types.c b/src/pike_types.c index a493100bdd5e2b82f0122ae733ba029580765223..0064cea231504d9b463e7c3a43613e99830c7919 100644 --- a/src/pike_types.c +++ b/src/pike_types.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: pike_types.c,v 1.35 1998/03/02 16:06:59 hubbe Exp $"); +RCSID("$Id: pike_types.c,v 1.36 1998/03/26 00:51:37 hubbe Exp $"); #include <ctype.h> #include "svalue.h" #include "pike_types.h" @@ -247,22 +247,37 @@ void push_unfinished_type(char *s) static void push_unfinished_type_with_markers(char *s, struct pike_string **am) { - int e; - e=type_length(s); - for(e--;e>=0;e--) + int e,c,len=type_length(s); + type_stack_mark(); + for(e=0;e<len;e++) { - if(s[e]>='0' && s[e]<='9') + switch(c=EXTRACT_UCHAR(s+e)) { - if(am[s[e]-'0']) - { - push_finished_type(am[s[e]-'0']); - }else{ - push_type(T_MIXED); - } - }else{ - push_type(s[e]); +#if 1 + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if(am[c-'0']) + { + push_finished_type_backwards(am[c-'0']); + }else{ + push_type(T_MIXED); + } + break; +#endif + + case T_OBJECT: + push_type(c); + push_type(EXTRACT_UCHAR(s+ ++e)); + push_type(EXTRACT_UCHAR(s+ ++e)); + push_type(EXTRACT_UCHAR(s+ ++e)); + push_type(EXTRACT_UCHAR(s+ ++e)); + break; + + default: + push_type(c); } } + type_stack_reverse(); } void push_finished_type(struct pike_string *type) @@ -272,6 +287,14 @@ void push_finished_type(struct pike_string *type) for(e=type->len-1;e>=0;e--) push_type(type->str[e]); } +void push_finished_type_backwards(struct pike_string *type) +{ + int e; + CHECK_TYPE(type); + MEMCPY(type_stackp, type->str, type->len); + type_stackp+=type->len; +} + struct pike_string *debug_pop_unfinished_type(void) { int len,e; diff --git a/src/pike_types.h b/src/pike_types.h index 1f184c9071d4338834704eb6d52d92cca5d13dfb..311edd637b6447721aa567a1c1051712c0f696c1 100644 --- a/src/pike_types.h +++ b/src/pike_types.h @@ -69,6 +69,7 @@ void type_stack_reverse(void); void push_type_int(unsigned INT32 i); void push_unfinished_type(char *s); void push_finished_type(struct pike_string *type); +void push_finished_type_backwards(struct pike_string *type); struct pike_string *debug_pop_unfinished_type(void); struct pike_string *debug_pop_type(void); struct pike_string *parse_type(char *s);