/* Symbol printer. NB: Uninterned symbols are treated as sharable objects (can be written with #n= syntax). It is handled by upper layer (write.c) so we don't worry about it in this routine. */ static void symbol_print(ScmObj obj, ScmPort *port, ScmWriteContext *ctx) { if (Scm_WriteContextMode(ctx) == SCM_WRITE_DISPLAY) { SCM_PUTS(SCM_SYMBOL_NAME(obj), port); } else { #if GAUCHE_KEEP_DISJOINT_KEYWORD_OPTION if (SCM_KEYWORDP(obj) && keyword_disjoint_p) { Scm_Putc(':', port); /* We basically print keyword names in the same way as symbols (i.e. using |-escape if necessary). However, as a convention, two things are different from the default symbol writer. (1) We don't check the noninitials; :1 is unambiguously a keyword, so we don't need to print :|1|. (2) A keyword with an empty name can be printed just as :, instead of :||. These conventions are useful if we pass the S-expression with these keywords to other Scheme implementations that don't support CL-style keywords; they would just read those ones as symbols. */ Scm_WriteSymbolName(SCM_KEYWORD(obj)->name, port, ctx, (SCM_SYMBOL_WRITER_NOESCAPE_INITIAL |SCM_SYMBOL_WRITER_NOESCAPE_EMPTY)); return; } #endif /*GAUCHE_KEEP_DISJOINT_KEYWORD_OPTION*/ if (!SCM_SYMBOL_INTERNED(obj)) SCM_PUTZ("#:", -1, port); Scm_WriteSymbolName(SCM_SYMBOL_NAME(obj), port, ctx, 0); } }
/* * utilities for sigset */ static void display_sigset(sigset_t *set, ScmPort *port) { struct sigdesc *desc = sigDesc; int cnt = 0; for (; desc->name; desc++) { if (sigismember(set, desc->num)) { if (cnt++) Scm_Putc('|', port); Scm_Putz(desc->name+3, -1, port); } } }
static void charset_print_ch(ScmPort *out, ScmChar ch, int firstp) { if (ch != 0 && ch < 0x80 && (strchr("[]-\\", ch) != NULL || (ch == '^' && firstp))) { Scm_Printf(out, "\\%C", ch); } else { switch (Scm_CharGeneralCategory(ch)) { case SCM_CHAR_CATEGORY_Mn: case SCM_CHAR_CATEGORY_Mc: case SCM_CHAR_CATEGORY_Me: case SCM_CHAR_CATEGORY_Cc: case SCM_CHAR_CATEGORY_Cf: case SCM_CHAR_CATEGORY_Cs: case SCM_CHAR_CATEGORY_Co: case SCM_CHAR_CATEGORY_Cn: if (ch < 0x10000) Scm_Printf(out, "\\u%04lx", ch); else Scm_Printf(out, "\\U%08lx", ch); break; default: Scm_Putc(ch, out); } } }