|
@@ -247,6 +247,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|
|
union acpi_operand_object *local_operand1 = operand1;
|
|
|
union acpi_operand_object *return_desc;
|
|
|
char *new_buf;
|
|
|
+ const char *type_string;
|
|
|
acpi_status status;
|
|
|
|
|
|
ACPI_FUNCTION_TRACE(ex_do_concatenate);
|
|
@@ -266,10 +267,41 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|
|
break;
|
|
|
|
|
|
case ACPI_TYPE_STRING:
|
|
|
+ /*
|
|
|
+ * Per the ACPI spec, Concatenate only supports int/str/buf.
|
|
|
+ * However, we support all objects here as an extension.
|
|
|
+ * This improves the usefulness of the Printf() macro.
|
|
|
+ * 12/2015.
|
|
|
+ */
|
|
|
+ switch (operand1->common.type) {
|
|
|
+ case ACPI_TYPE_INTEGER:
|
|
|
+ case ACPI_TYPE_STRING:
|
|
|
+ case ACPI_TYPE_BUFFER:
|
|
|
+
|
|
|
+ status =
|
|
|
+ acpi_ex_convert_to_string(operand1, &local_operand1,
|
|
|
+ ACPI_IMPLICIT_CONVERT_HEX);
|
|
|
+ break;
|
|
|
|
|
|
- status =
|
|
|
- acpi_ex_convert_to_string(operand1, &local_operand1,
|
|
|
- ACPI_IMPLICIT_CONVERT_HEX);
|
|
|
+ default:
|
|
|
+ /*
|
|
|
+ * Just emit a string containing the object type.
|
|
|
+ */
|
|
|
+ type_string =
|
|
|
+ acpi_ut_get_type_name(operand1->common.type);
|
|
|
+
|
|
|
+ local_operand1 = acpi_ut_create_string_object(((acpi_size) strlen(type_string) + 9)); /* 9 For "[Object]" */
|
|
|
+ if (!local_operand1) {
|
|
|
+ status = AE_NO_MEMORY;
|
|
|
+ goto cleanup;
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy(local_operand1->string.pointer, "[");
|
|
|
+ strcat(local_operand1->string.pointer, type_string);
|
|
|
+ strcat(local_operand1->string.pointer, " Object]");
|
|
|
+ status = AE_OK;
|
|
|
+ break;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case ACPI_TYPE_BUFFER:
|
|
@@ -348,8 +380,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|
|
/* Concatenate the strings */
|
|
|
|
|
|
strcpy(new_buf, operand0->string.pointer);
|
|
|
- strcpy(new_buf + operand0->string.length,
|
|
|
- local_operand1->string.pointer);
|
|
|
+ strcat(new_buf, local_operand1->string.pointer);
|
|
|
break;
|
|
|
|
|
|
case ACPI_TYPE_BUFFER:
|