--- stack/stack.c 2002/02/07 04:34:42 1.48 +++ stack/stack.c 2002/02/07 23:53:14 1.51 @@ -198,12 +198,12 @@ } /* Mangle a symbol name to a valid C identifier name */ -char *mangle_(const char *old_string){ +char *mangle_str(const char *old_string){ char validchars[] ="0123456789abcdef"; char *new_string, *current; - new_string=malloc(strlen(old_string)+4); + new_string=malloc((strlen(old_string)*2)+4); strcpy(new_string, "sx_"); /* Stack eXternal */ current=new_string+3; while(old_string[0] != '\0'){ @@ -233,7 +233,7 @@ return; } - new_string= mangle_((const char *)(env->head->item->content.ptr)); + new_string= mangle_str((const char *)(env->head->item->content.ptr)); toss(env); if(env->err) return; @@ -296,7 +296,7 @@ funcptr= dlsym(handle, in_string); /* Get function pointer */ dlerr=dlerror(); if(dlerr != NULL) { /* If no function was found */ - mangled=mangle_(in_string); + mangled=mangle_str(in_string); funcptr= dlsym(handle, mangled); /* try mangling it */ free(mangled); dlerr=dlerror(); @@ -531,7 +531,7 @@ toss(env); if(env->err) return; temp_string= malloc(strlen((char*)temp_val->content.ptr)+5); - strcat(temp_string, "[ "); + strcpy(temp_string, "[ "); strcat(temp_string, (char*)temp_val->content.ptr); strcat(temp_string, " ]"); stack_read(env, temp_string); @@ -905,12 +905,33 @@ /* + */ extern void sx_2b(environment *env) { int a, b; + size_t len; + char* new_string; + value *a_val, *b_val; if((env->head)==NULL || env->head->next==NULL) { printerr("Too Few Arguments"); env->err=1; return; } + + if(env->head->item->type==string + && env->head->next->item->type==string) { + a_val= env->head->item; + b_val= env->head->next->item; + a_val->refcount++; + b_val->refcount++; + toss(env); if(env->err) return; + toss(env); if(env->err) return; + len= strlen(a_val->content.ptr)+strlen(b_val->content.ptr)+1; + new_string= malloc(len); + strcpy(new_string, b_val->content.ptr); + strcat(new_string, a_val->content.ptr); + free_val(a_val); free_val(b_val); + push_cstring(&(env->head), new_string); + free(new_string); + return; + } if(env->head->item->type!=integer || env->head->next->item->type!=integer) {