else                                                 \
     {                                                  \
       Bufbyte work[MAX_EMCHAR_LEN];                    \
-      int len = ( ch < 256 ) ?                         \
+      int len = ( ch < ( conversion_mode == CCL_MODE_ENCODING ? \
+                         256 : 128 ) ) ?                       \
        simple_set_charptr_emchar (work, ch) :          \
        non_ascii_set_charptr_emchar (work, ch);        \
       Dynarr_add_many (destination, work, len);                \
   };
 
 int
-ccl_driver (struct ccl_program *ccl, CONST unsigned char *source, unsigned_char_dynarr *destination, int src_bytes, int *consumed)
+ccl_driver (struct ccl_program *ccl, CONST unsigned char *source, unsigned_char_dynarr *destination, int src_bytes, int *consumed, int conversion_mode)
 {
   int *reg = ccl->reg;
   int ic = ccl->ic;
                  : 0);
 
   ccl_driver (&ccl, (CONST unsigned char *)0, (unsigned_char_dynarr *)0,
-             0, (int *)0);
+             0, (int *)0, CCL_MODE_ENCODING);
   QUIT;
   if (ccl.status != CCL_STAT_SUCCESS)
     error ("Error in CCL program at %dth code", ccl.ic);
   outbuf = Dynarr_new (unsigned_char);
   ccl.last_block = NILP (contin);
   produced = ccl_driver (&ccl, XSTRING_DATA (str), outbuf,
-                        XSTRING_LENGTH (str), (int *)0);
+                        XSTRING_LENGTH (str), (int *)0, CCL_MODE_ENCODING);
   for (i = 0; i < 8; i++)
     XVECTOR_DATA (status)[i] = make_int(ccl.reg[i]);
   XSETINT (XVECTOR_DATA (status)[8], ccl.ic);