static ir_tarval *char_literal_to_tarval(string_literal_expression_t const *literal) { type_t *type = skip_typeref(literal->base.type); ir_mode *mode = get_ir_mode_storage(type); const char *string = literal->value->begin; size_t size = literal->value->size; switch (literal->value->encoding) { case STRING_ENCODING_WIDE: { utf32 v = read_utf8_char(&string); char buf[128]; size_t len = snprintf(buf, sizeof(buf), UTF32_PRINTF_FORMAT, v); return new_tarval_from_str(buf, len, mode); } case STRING_ENCODING_CHAR: { long long int v; bool char_is_signed = get_atomic_type_flags(ATOMIC_TYPE_CHAR) & ATOMIC_TYPE_FLAG_SIGNED; if (size == 1 && char_is_signed) { v = (signed char)string[0]; } else { v = 0; for (size_t i = 0; i < size; ++i) { v = (v << 8) | ((unsigned char)string[i]); } } char buf[128]; size_t len = snprintf(buf, sizeof(buf), "%lld", v); return new_tarval_from_str(buf, len, mode); } default: panic("invalid literal kind"); } }
void insert_index_marks(openttsd_message * msg, SPDDataMode ssml_mode) { GString *marked_text; char *pos; char character[6]; char character2[6]; gunichar u_char; int n = 0; int ret; int inside_tag = 0; marked_text = g_string_new(""); assert(msg != NULL); assert(msg->buf != NULL); log_msg2(5, "index_marking", "MSG before index marking: |%s|, ssml_mode=%d", msg->buf, ssml_mode); if (ssml_mode == SPD_DATA_TEXT) g_string_printf(marked_text, "<speak>"); pos = msg->buf; while (pos) { ret = read_utf8_char(pos, character); if (ret == 0 || (strlen(character) == 0)) break; u_char = g_utf8_get_char(character); if (u_char == '<') { if (ssml_mode == SPD_DATA_SSML) { inside_tag = 1; g_string_append_printf(marked_text, "%s", character); } else g_string_append_printf(marked_text, "<"); } else if (u_char == '>') { if (ssml_mode == SPD_DATA_SSML) { inside_tag = 0; g_string_append_printf(marked_text, "%s", character); } else g_string_append_printf(marked_text, ">"); } else if (u_char == '&') { if (ssml_mode == SPD_DATA_SSML) { g_string_append_printf(marked_text, "%s", character); } else { if (!inside_tag) g_string_append_printf(marked_text, "&"); } } else if (((u_char == '.') || (u_char == '?') || (u_char == '!')) && !inside_tag) { pos = g_utf8_find_next_char(pos, NULL); ret = read_utf8_char(pos, character2); if ((ret == 0) || (strlen(character2) == 0)) { g_string_append_printf(marked_text, "%s", character); log_msg2(6, "index_marking", "MSG altering 1: |%s|", marked_text->str); break; } u_char = g_utf8_get_char(character2); if ((g_unichar_isspace(u_char)) || (u_char == '<') || (u_char == '&')) { g_string_append_printf(marked_text, "%s" SD_MARK_HEAD "%d" SD_MARK_TAIL, character, n); n++; log_msg2(6, "index_marking", "MSG altering 2: |%s|", marked_text->str); continue; } else { g_string_append_printf(marked_text, "%s", character); // pos = g_utf8_find_prev_char(pos, NULL); log_msg2(6, "index_marking", "MSG altering 3: |%s|", marked_text->str); continue; } } else { g_string_append_printf(marked_text, "%s", character); } pos = g_utf8_find_next_char(pos, NULL); } if (ssml_mode == SPD_DATA_TEXT) g_string_append_printf(marked_text, "</speak>"); g_free(msg->buf); msg->buf = marked_text->str; g_string_free(marked_text, 0); log_msg2(5, "index_marking", "MSG after index marking: |%s|", msg->buf); }