diff --git a/src/encode.c b/src/encode.c
index 82166ef68392b2af13d0b9110f74e64ab25b0759..ec9f1f683d7b347083174680eab6eacf5005f20b 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -24,7 +24,7 @@
 #include "stuff.h"
 #include "version.h"
 
-RCSID("$Id: encode.c,v 1.35 1999/09/17 23:36:57 hubbe Exp $");
+RCSID("$Id: encode.c,v 1.36 1999/09/18 09:20:44 hubbe Exp $");
 
 #ifdef _AIX
 #include <net/nh.h>
@@ -78,18 +78,47 @@ static void encode_value2(struct svalue *val, struct encode_data *data);
 #define addchar(t)   low_my_putchar((t),&(data->buf))
 
 /* Code a pike string */
-/* FIXME: Wide strings! */
-#define adddata(S) do { \
-  code_entry(T_STRING, (S)->len, data); \
-  addstr((char *)((S)->str),(S)->len); \
+
+#if BYTEORDER == 4321
+#define ENCODE_DATA(S) \
+   addstr( (S)->str, (S)->len << (S)->size_shift );
+#else
+#define ENCODE_DATA(S) 				\
+    switch((S)->size_shift)			\
+    {						\
+      case 1:					\
+        for(q=0;q<(S)->len;q++) {		\
+           INT16 s=htons( STR1(S)[q] );		\
+           addstr( (char *)&s, sizeof(s));	\
+        }					\
+        break;					\
+      case 2:					\
+        for(q=0;q<(S)->len;q++) {		\
+           INT32 s=htonl( STR2(S)[q] );		\
+           addstr( (char *)&s, sizeof(s));	\
+        }					\
+        break;					\
+    }
+#endif
+
+#define adddata(S) do {					\
+  if((S)->size_shift)					\
+  {							\
+    int q;                                              \
+    code_entry(T_STRING,-1, data);			\
+    code_entry((S)->size_shift, (S)->len, data);	\
+    ENCODE_DATA(S);                                     \
+  }else{						\
+    code_entry(T_STRING, (S)->len, data);		\
+    addstr((char *)((S)->str),(S)->len);		\
+  }							\
 }while(0)
 
 /* Like adddata, but allows null pointers */
 
 #define adddata3(S) do {			\
   if(S) {					\
-    code_entry(T_STRING, (S)->len, data);	\
-    addstr((char *)((S)->str),(S)->len);	\
+    adddata(S);                                 \
   } else {					\
     code_entry(T_INT, 0, data);			\
   }						\
@@ -280,8 +309,7 @@ static void encode_value2(struct svalue *val, struct encode_data *data)
       break;
       
     case T_STRING:
-      code_entry(T_STRING, val->u.string->len,data);
-      addstr(val->u.string->str, val->u.string->len);
+      adddata(val->u.string);
       break;
       
     case T_FLOAT:
@@ -495,7 +523,10 @@ static void encode_value2(struct svalue *val, struct encode_data *data)
 	}
 
 	for(d=0;d<p->num_constants;d++)
-	  encode_value2(p->constants+d, data);
+	{
+	  encode_value2(& p->constants[d].sval, data);
+	  adddata3(p->constants[d].name);
+	}
 
 	for(d=0;d<NUM_LFUNS;d++)
 	  code_number(p->lfuns[d], data);
@@ -595,20 +626,47 @@ static int my_extract_char(struct decode_data *data)
       data->ptr+=sizeof(S[0])*(L);					\
   }while(0)
 
-#define getdata(X) do {							     \
-   long length;								     \
-      decode_entry(T_STRING, length,data);				     \
-      if(data->ptr + length > data->len || length <0)			     \
-	error("Failed to decode string. (string range error)\n");	     \
-      X=make_shared_binary_string((char *)(data->data + data->ptr), length); \
-      data->ptr+=length;						     \
+#if BYTEORDER == 4123
+#define BITFLIP(S)
+#else
+#define BITFLIP(S)						\
+   switch(what)							\
+   {								\
+     case 1: for(e=0;e<num;e++) STR1(S)[e]=ntohs(STR1(S)[e]); break;	\
+     case 2: for(e=0;e<num;e++) STR2(S)[e]=ntohl(STR2(S)[e]); break;    \
+   }
+#endif
+
+#define get_string_data(STR,LEN, data) do {				    \
+  if((LEN) == -1)							    \
+  {									    \
+    INT32 what, e, num;							    \
+    DECODE();								    \
+    what&=T_MASK;							    \
+    if(data->ptr + num > data->len || num <0)				    \
+       error("Failed to decode string. (string range error)\n");	    \
+    STR=begin_wide_shared_string(num, what);				    \
+    MEMCPY(STR->str, data->data + data->ptr, num << what);		    \
+    data->ptr+=(num << what);						    \
+    BITFLIP(STR);							    \
+    STR=end_shared_string(STR);                                             \
+  }else{								    \
+    if(data->ptr + (LEN) > data->len || (LEN) <0)			    \
+      error("Failed to decode string. (string range error)\n");		    \
+    STR=make_shared_binary_string((char *)(data->data + data->ptr), (LEN)); \
+    data->ptr+=(LEN);							    \
+  }									    \
+}while(0)
+
+#define getdata(X) do {				\
+   long length;					\
+   decode_entry(T_STRING, length,data);		\
+   get_string_data(X, length, data);		\
   }while(0)
 
 #define getdata3(X) do {						     \
-  long length;								     \
-  int what, e, num;							     \
+  INT32 what, e, num;							     \
   DECODE();								     \
-  length=num;                                                                \
   switch(what & T_MASK)							     \
   {									     \
     case T_INT:								     \
@@ -616,10 +674,7 @@ static int my_extract_char(struct decode_data *data)
       break;								     \
 									     \
     case T_STRING:							     \
-      if(data->ptr + length > data->len || length <0)			     \
-        error("Failed to decode string. (string range error)\n");	     \
-      X=make_shared_binary_string((char *)(data->data + data->ptr), length); \
-      data->ptr+=length;						     \
+      get_string_data(X,num,data);                                           \
       break;								     \
 									     \
     default:								     \
@@ -769,13 +824,14 @@ static void decode_value2(struct decode_data *data)
       break;
       
     case T_STRING:
+    {
+      struct pike_string *str;
       tmp=data->counter;
       data->counter.u.integer++;
-      if(data->ptr + num > data->len)
-	error("Failed to decode string. (string range error)\n");
-      push_string(make_shared_binary_string((char *)(data->data + data->ptr), num));
-      data->ptr+=num;
+      get_string_data(str, num, data);
+      push_string(str);
       break;
+    }
       
     case T_FLOAT:
     {
@@ -1013,7 +1069,7 @@ static void decode_value2(struct decode_data *data)
 #include "program_areas.h"
 
 	  for(e=0;e<p->num_constants;e++)
-	    p->constants[e].type=T_INT;
+	    p->constants[e].sval.type=T_INT;
 
 	  debug_malloc_touch(dat);
 
@@ -1117,7 +1173,8 @@ static void decode_value2(struct decode_data *data)
 	  for(d=0;d<p->num_constants;d++)
 	  {
 	    decode_value2(data);
-	    p->constants[d]=*--sp;
+	    p->constants[d].sval=*--sp;
+	    getdata3(p->constants[d].name);
 	  }
 	  data->pickyness--;