(ABI_VERSION): Update to 2:0:1.
[chise/concord.git] / print.c
diff --git a/print.c b/print.c
index 9a0e761..2f936d6 100644 (file)
--- a/print.c
+++ b/print.c
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <stdlib.h>
 #include "cos-print.h"
+#include "cos-i.h"
 
 int
-cos_encode_char_as_utf8 (int cid, unsigned char *dest, size_t size)
+cos_utf8_encode_char (int cid, unsigned char *dest, size_t size)
 {
   int i = 0;
 
@@ -106,3 +106,178 @@ cos_encode_char_as_utf8 (int cid, unsigned char *dest, size_t size)
        return -1;
     }
 }
+
+int
+cos_utf8_print_char (COS_object character, unsigned char *dest, size_t size)
+{
+  int cid = cos_char_id (character);
+  int i = 0;
+
+  dest[i++] = '?';
+  if (cid == '\t')
+    {
+      dest[i++] = '\\';
+      dest[i++] = 't';
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid == '\n')
+    {
+      dest[i++] = '\\';
+      dest[i++] = 'n';
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid == '\r')
+    {
+      dest[i++] = '\\';
+      dest[i++] = 'r';
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid == 0x1C)
+    {
+      dest[i++] = '\\';
+      dest[i++] = '^';
+      dest[i++] = '\\';
+      dest[i++] = '\\';
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0x1F)
+    {
+      dest[i++] = '\\';
+      dest[i++] = '^';
+      dest[i++] = '@' + cid;
+      dest[i] = '\0';
+      return i;
+    }
+  else if ( (cid == ' ') || (cid == '"') ||
+           (cid == '#') || (cid == '\'') ||
+           (cid == '(') || (cid == ')') ||
+           (cid == ',') || (cid == '.') ||
+           (cid == ';') || (cid == '?') ||
+           (cid == '[') || (cid == '\\') ||
+           (cid == ']') || (cid == '`') )
+    {
+      dest[i++] = '\\';
+      dest[i++] = cid;
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0x7E)
+    {
+      dest[i++] = cid;
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid == 0x7F)
+    {
+      dest[i++] = '\\';
+      dest[i++] = '^';
+      dest[i++] = '?';
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0x9F)
+    {
+      dest[i++] = '\\';
+      dest[i++] = '^';
+      dest[i++] = ((cid + '@') >> 6) | 0xC0;
+      dest[i++] = ((cid + '@') & 0x3F) | 0x80;
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0x7FF)
+    {
+      dest[i++] = (cid >> 6) | 0xC0;
+      dest[i++] = (cid & 0x3F) | 0x80;
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0xFFFF)
+    {
+      dest[i++] = (cid >> 12) | 0xE0;
+      dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
+      dest[i++]=  (cid        & 0x3F) | 0x80;
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0x1FFFFF)
+    {
+      dest[i++]=  (cid >> 18) | 0xF0;
+      dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
+      dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
+      dest[i++]=  (cid        & 0x3F) | 0x80;
+      dest[i] = '\0';
+      return i;
+    }
+  else if (cid <= 0x3FFFFFF)
+    {
+      dest[i++]=  (cid >> 24) | 0xF8;
+      dest[i++]= ((cid >> 18) & 0x3F) | 0x80;
+      dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
+      dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
+      dest[i++]=  (cid        & 0x3F) | 0x80;
+      dest[i] = '\0';
+      return i;
+    }
+  else
+    {
+      dest[i++]=  (cid >> 30) | 0xFC;
+      dest[i++]= ((cid >> 24) & 0x3F) | 0x80;
+      dest[i++]= ((cid >> 18) & 0x3F) | 0x80;
+      dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
+      dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
+      dest[i++]=  (cid        & 0x3F) | 0x80;
+      dest[i] = '\0';
+      return i;
+    }
+}
+
+
+void
+cos_print_object (COS_object obj)
+{
+  if ( obj == NULL )
+    printf ("#<NULL>", obj);
+  else if ( COS_OBJECT_INT_P (obj) )
+    printf ("%d", cos_int_value (obj));
+  else if ( COS_OBJECT_CHAR_P (obj) )
+    {
+      char id_buf[256];
+
+      cos_utf8_print_char (obj, id_buf, 256);
+      printf ("%s", id_buf);
+    }
+  else if ( COS_OBJECT_STRING_P (obj) )
+    {
+      printf ("\"%s\"", cos_string_data (obj));
+    }
+  else if ( COS_OBJECT_SYMBOL_P (obj) )
+    {
+      printf ("%s", cos_string_data (cos_symbol_name (obj)));
+    }
+  else if ( COS_OBJECT_CONS_P (obj) )
+    {
+      COS_object rest = COS_CDR (obj);
+
+      printf ("(");
+      cos_print_object (COS_CAR (obj));
+      while ( COS_OBJECT_CONS_P (rest) )
+       {
+         printf (" ");
+         cos_print_object (COS_CAR (rest));
+         rest = COS_CDR (rest);
+       }
+      if ( rest != cos_Qnil )
+       {
+         printf (" . ");
+         cos_print_object (rest);
+       }
+      printf (")");
+    }
+  else
+    printf ("Object[0x%lX] is a fat object.\n",
+           obj);
+}