Exemplo n.º 1
0
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");
	}
}
Exemplo n.º 2
0
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, "&lt;");
		} 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, "&gt;");
		} 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,
							       "&amp;");
			}
		} 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);
}