DVM_Char * dkc_expression_to_string(Expression *expr) { char buf[LINE_BUF_SIZE]; DVM_Char wc_buf[LINE_BUF_SIZE]; int len; DVM_Char *new_str; if (expr->kind == BOOLEAN_EXPRESSION) { if (expr->u.boolean_value) { dvm_mbstowcs("true", wc_buf); } else { dvm_mbstowcs("false", wc_buf); } } else if (expr->kind == INT_EXPRESSION) { sprintf(buf, "%d", expr->u.int_value); dvm_mbstowcs(buf, wc_buf); } else if (expr->kind == DOUBLE_EXPRESSION) { sprintf(buf, "%f", expr->u.double_value); dvm_mbstowcs(buf, wc_buf); } else if (expr->kind == STRING_EXPRESSION) { return expr->u.string_value; } else { return NULL; } len = dvm_wcslen(wc_buf); new_str = MEM_malloc(sizeof(DVM_Char) * (len + 1)); dvm_wcscpy(new_str, wc_buf); return new_str; }
DVM_Char * dkc_close_string_literal(void) { DVM_Char *new_str; int new_str_len; dkc_add_string_literal('\0'); new_str_len = dvm_mbstowcs_len(st_string_literal_buffer); if (new_str_len < 0) { dkc_compile_error(dkc_get_current_compiler()->current_line_number, BAD_MULTIBYTE_CHARACTER_ERR, MESSAGE_ARGUMENT_END); } new_str = MEM_malloc(sizeof(DVM_Char) * (new_str_len+1)); dvm_mbstowcs(st_string_literal_buffer, new_str); return new_str; }
wchar_t * dvm_mbstowcs_alloc(DVM_Executable *exe, Function *func, int pc, const char *src) { int len; wchar_t *ret; len = dvm_mbstowcs_len(src); if (len < 0) { return NULL; dvm_error(exe, func, pc, BAD_MULTIBYTE_CHARACTER_ERR, MESSAGE_ARGUMENT_END); } ret = MEM_malloc(sizeof(wchar_t) * (len+1)); dvm_mbstowcs(src, ret); return ret; }
int dkc_close_character_literal(void) { DVM_Char buf[16]; int new_str_len; dkc_add_string_literal('\0'); new_str_len = dvm_mbstowcs_len(st_string_literal_buffer); if (new_str_len < 0) { dkc_compile_error(dkc_get_current_compiler()->current_line_number, BAD_MULTIBYTE_CHARACTER_ERR, MESSAGE_ARGUMENT_END); } else if (new_str_len > 1) { dkc_compile_error(dkc_get_current_compiler()->current_line_number, TOO_LONG_CHARACTER_LITERAL_ERR, MESSAGE_ARGUMENT_END); } dvm_mbstowcs(st_string_literal_buffer, buf); return buf[0]; }
static void format_message(int line_number, ErrorDefinition *format, VWString *v, va_list ap) { int i; char buf[LINE_BUF_SIZE]; DVM_Char wc_buf[LINE_BUF_SIZE]; int arg_name_index; char arg_name[LINE_BUF_SIZE]; MessageArgument arg[MESSAGE_ARGUMENT_MAX]; MessageArgument cur_arg; DVM_Char *wc_format; create_message_argument(arg, ap); wc_format = dkc_mbstowcs_alloc(line_number, format->format); DBG_assert(wc_format != NULL, ("wc_format is null.\n")); for (i = 0; wc_format[i] != L'\0'; i++) { if (wc_format[i] != L'$') { dkc_vwstr_append_character(v, wc_format[i]); continue; } assert(wc_format[i+1] == L'('); i += 2; for (arg_name_index = 0; wc_format[i] != L')'; arg_name_index++, i++) { arg_name[arg_name_index] = dvm_wctochar(wc_format[i]); } arg_name[arg_name_index] = '\0'; assert(wc_format[i] == L')'); search_argument(arg, arg_name, &cur_arg); switch (cur_arg.type) { case INT_MESSAGE_ARGUMENT: sprintf(buf, "%d", cur_arg.u.int_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case DOUBLE_MESSAGE_ARGUMENT: sprintf(buf, "%f", cur_arg.u.double_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case STRING_MESSAGE_ARGUMENT: dvm_mbstowcs(cur_arg.u.string_val, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case POINTER_MESSAGE_ARGUMENT: sprintf(buf, "%p", cur_arg.u.pointer_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case CHARACTER_MESSAGE_ARGUMENT: sprintf(buf, "%c", cur_arg.u.character_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case MESSAGE_ARGUMENT_END: assert(0); break; default: assert(0); } } MEM_free(wc_format); }