X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fconcord.git;a=blobdiff_plain;f=print.c;h=0a8952bd3a004971df0c0d003279d3de8be89241;hp=9a0e761d69dc449ba79406df82463ec3fdbb3c4e;hb=9d5ac7dd218b16b424b3bc9af323e2f4725978ce;hpb=2a9f3267270e17def505e553192d7a3f74add9d3 diff --git a/print.c b/print.c index 9a0e761..0a8952b 100644 --- a/print.c +++ b/print.c @@ -16,11 +16,11 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include #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 ("#", 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); +}