static void c_emit_char (int c, struct ui_file *stream, int quoter) { const char *escape; int host_char; c &= 0xFF; /* Avoid sign bit follies */ escape = c_target_char_has_backslash_escape (c); if (escape) { if (quoter == '"' && strcmp (escape, "0") == 0) /* Print nulls embedded in double quoted strings as \000 to prevent ambiguity. */ fprintf_filtered (stream, "\\000"); else fprintf_filtered (stream, "\\%s", escape); } else if (target_char_to_host (c, &host_char) && host_char_print_literally (host_char)) { if (host_char == '\\' || host_char == quoter) fputs_filtered ("\\", stream); fprintf_filtered (stream, "%c", host_char); } else fprintf_filtered (stream, "\\%.3o", (unsigned int) c); }
/* Translate TARGET_CHAR into the host character set, and see if it matches any of our standard escape sequences. */ static const char * default_c_target_char_has_backslash_escape (void *baton, int target_char) { int host_char; const char *ix; /* If target_char has no equivalent in the host character set, assume it doesn't have a backslashed form. */ if (! target_char_to_host (target_char, &host_char)) return NULL; ix = strchr (represented, host_char); if (ix) return backslashed[ix - represented]; else return NULL; }