int ApWriteToBinaryFile ( ACPI_TABLE_HEADER *Table) { char Filename[ACPI_NAME_SIZE + 16]; char SsdtInstance [16]; FILE *File; size_t Actual; /* Construct lower-case filename from the table signature */ Filename[0] = (char) ACPI_TOLOWER (Table->Signature[0]); Filename[1] = (char) ACPI_TOLOWER (Table->Signature[1]); Filename[2] = (char) ACPI_TOLOWER (Table->Signature[2]); Filename[3] = (char) ACPI_TOLOWER (Table->Signature[3]); Filename[ACPI_NAME_SIZE] = 0; /* Handle multiple SSDTs - create different filenames for each */ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT)) { sprintf (SsdtInstance, "%u", Gbl_SsdtCount); strcat (Filename, SsdtInstance); Gbl_SsdtCount++; } strcat (Filename, ACPI_TABLE_FILE_SUFFIX); if (Gbl_VerboseMode) { fprintf (stderr, "Writing [%4.4s] to binary file: %s 0x%X (%u) bytes\n", Table->Signature, Filename, Table->Length, Table->Length); } /* Open the file and dump the entire table in binary mode */ File = fopen (Filename, "wb"); if (!File) { perror ("Could not open output file"); return (-1); } Actual = fwrite (Table, 1, Table->Length, File); if (Actual != Table->Length) { perror ("Error writing binary output file"); fclose (File); return (-1); } fclose (File); return (0); }
static BOOLEAN AcpiDbMatchCommandHelp ( char *Command, const ACPI_DB_COMMAND_HELP *Help) { char *Invocation = Help->Invocation; UINT32 LineCount; /* Valid commands in the help table begin with a couple of spaces */ if (*Invocation != ' ') { return (FALSE); } while (*Invocation == ' ') { Invocation++; } /* Match command name (full command or substring) */ while ((*Command) && (*Invocation) && (*Invocation != ' ')) { if (ACPI_TOLOWER (*Command) != ACPI_TOLOWER (*Invocation)) { return (FALSE); } Invocation++; Command++; } /* Print the appropriate number of help lines */ LineCount = Help->LineCount; while (LineCount) { AcpiOsPrintf ("%-38s : %s", Help->Invocation, Help->Description); Help++; LineCount--; } return (TRUE); }
void AsStrlwr ( char *SrcString) { char *String; /* Walk entire string, lowercasing the letters */ if (SrcString) { for (String = SrcString; *String; String++) { *String = (char) ACPI_TOLOWER (*String); } } }
/******************************************************************************* * * FUNCTION: acpi_ut_strlwr (strlwr) * * PARAMETERS: src_string - The source string to convert * * RETURN: None * * DESCRIPTION: Convert string to lowercase * * NOTE: This is not a POSIX function, so it appears here, not in utclib.c * ******************************************************************************/ void acpi_ut_strlwr(char *src_string) { char *string; ACPI_FUNCTION_ENTRY(); if (!src_string) { return; } /* Walk entire string, lowercasing the letters */ for (string = src_string; *string; string++) { *string = (char)ACPI_TOLOWER(*string); } return; }
void AcpiUtStrlwr ( char *SrcString) { char *String; ACPI_FUNCTION_ENTRY (); if (!SrcString) { return; } /* Walk entire string, lowercasing the letters */ for (String = SrcString; *String; String++) { *String = (char) ACPI_TOLOWER (*String); } return; }
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) { u32 this_digit = 0; u64 return_value = 0; u64 quotient; u64 dividend; u32 to_integer_op = (base == ACPI_ANY_BASE); u32 mode32 = (acpi_gbl_integer_byte_width == 4); u8 valid_digits = 0; u8 sign_of0x = 0; u8 term = 0; ACPI_FUNCTION_TRACE_STR(ut_stroul64, string); switch (base) { case ACPI_ANY_BASE: case 16: break; default: /* Invalid Base */ return_ACPI_STATUS(AE_BAD_PARAMETER); } if (!string) { goto error_exit; } /* Skip over any white space in the buffer */ while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) { string++; } if (to_integer_op) { /* * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. * We need to determine if it is decimal or hexadecimal. */ if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) { sign_of0x = 1; base = 16; /* Skip over the leading '0x' */ string += 2; } else { base = 10; } } /* Any string left? Check that '0x' is not followed by white space. */ if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') { if (to_integer_op) { goto error_exit; } else { goto all_done; } } /* * Perform a 32-bit or 64-bit conversion, depending upon the current * execution mode of the interpreter */ dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; /* Main loop: convert the string to a 32- or 64-bit integer */ while (*string) { if (ACPI_IS_DIGIT(*string)) { /* Convert ASCII 0-9 to Decimal value */ this_digit = ((u8)*string) - '0'; } else if (base == 10) { /* Digit is out of range; possible in to_integer case only */ term = 1; } else { this_digit = (u8)ACPI_TOUPPER(*string); if (ACPI_IS_XDIGIT((char)this_digit)) { /* Convert ASCII Hex char to value */ this_digit = this_digit - 'A' + 10; } else { term = 1; } } if (term) { if (to_integer_op) { goto error_exit; } else { break; } } else if ((valid_digits == 0) && (this_digit == 0) && !sign_of0x) { /* Skip zeros */ string++; continue; } valid_digits++; if (sign_of0x && ((valid_digits > 16) || ((valid_digits > 8) && mode32))) { /* * This is to_integer operation case. * No any restrictions for string-to-integer conversion, * see ACPI spec. */ goto error_exit; } /* Divide the digit into the correct position */ (void)acpi_ut_short_divide((dividend - (u64)this_digit), base, "ient, NULL); if (return_value > quotient) { if (to_integer_op) { goto error_exit; } else { break; } } return_value *= base; return_value += this_digit; string++; } /* All done, normal exit */ all_done: ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", ACPI_FORMAT_UINT64(return_value))); *ret_integer = return_value; return_ACPI_STATUS(AE_OK); error_exit: /* Base was set/validated above */ if (base == 10) { return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT); } else { return_ACPI_STATUS(AE_BAD_HEX_CONSTANT); } }
ACPI_STATUS AcpiUtStrtoul64 ( char *String, UINT32 Base, UINT64 *RetInteger) { UINT32 ThisDigit = 0; UINT64 ReturnValue = 0; UINT64 Quotient; UINT64 Dividend; UINT32 ToIntegerOp = (Base == ACPI_ANY_BASE); UINT32 Mode32 = (AcpiGbl_IntegerByteWidth == 4); UINT8 ValidDigits = 0; UINT8 SignOf0x = 0; UINT8 Term = 0; ACPI_FUNCTION_TRACE_STR (UtStroul64, String); switch (Base) { case ACPI_ANY_BASE: case 16: break; default: /* Invalid Base */ return_ACPI_STATUS (AE_BAD_PARAMETER); } if (!String) { goto ErrorExit; } /* Skip over any white space in the buffer */ while ((*String) && (ACPI_IS_SPACE (*String) || *String == '\t')) { String++; } if (ToIntegerOp) { /* * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. * We need to determine if it is decimal or hexadecimal. */ if ((*String == '0') && (ACPI_TOLOWER (*(String + 1)) == 'x')) { SignOf0x = 1; Base = 16; /* Skip over the leading '0x' */ String += 2; } else { Base = 10; } } /* Any string left? Check that '0x' is not followed by white space. */ if (!(*String) || ACPI_IS_SPACE (*String) || *String == '\t') { if (ToIntegerOp) { goto ErrorExit; } else { goto AllDone; } } /* * Perform a 32-bit or 64-bit conversion, depending upon the current * execution mode of the interpreter */ Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; /* Main loop: convert the string to a 32- or 64-bit integer */ while (*String) { if (ACPI_IS_DIGIT (*String)) { /* Convert ASCII 0-9 to Decimal value */ ThisDigit = ((UINT8) *String) - '0'; } else if (Base == 10) { /* Digit is out of range; possible in ToInteger case only */ Term = 1; } else { ThisDigit = (UINT8) ACPI_TOUPPER (*String); if (ACPI_IS_XDIGIT ((char) ThisDigit)) { /* Convert ASCII Hex char to value */ ThisDigit = ThisDigit - 'A' + 10; } else { Term = 1; } } if (Term) { if (ToIntegerOp) { goto ErrorExit; } else { break; } } else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x) { /* Skip zeros */ String++; continue; } ValidDigits++; if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32))) { /* * This is ToInteger operation case. * No any restrictions for string-to-integer conversion, * see ACPI spec. */ goto ErrorExit; } /* Divide the digit into the correct position */ (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit), Base, &Quotient, NULL); if (ReturnValue > Quotient) { if (ToIntegerOp) { goto ErrorExit; } else { break; } } ReturnValue *= Base; ReturnValue += ThisDigit; String++; } /* All done, normal exit */ AllDone: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ReturnValue))); *RetInteger = ReturnValue; return_ACPI_STATUS (AE_OK); ErrorExit: /* Base was set/validated above */ if (Base == 10) { return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT); } else { return_ACPI_STATUS (AE_BAD_HEX_CONSTANT); } }
int ap_write_to_binary_file(struct acpi_table_header *table, u32 instance) { char filename[ACPI_NAME_SIZE + 16]; char instance_str[16]; ACPI_FILE file; size_t actual; u32 table_length; /* Obtain table length */ table_length = ap_get_table_length(table); /* Construct lower-case filename from the table local signature */ if (ACPI_VALIDATE_RSDP_SIG(table->signature)) { ACPI_MOVE_NAME(filename, ACPI_RSDP_NAME); } else { ACPI_MOVE_NAME(filename, table->signature); } filename[0] = (char)ACPI_TOLOWER(filename[0]); filename[1] = (char)ACPI_TOLOWER(filename[1]); filename[2] = (char)ACPI_TOLOWER(filename[2]); filename[3] = (char)ACPI_TOLOWER(filename[3]); filename[ACPI_NAME_SIZE] = 0; /* Handle multiple SSDts - create different filenames for each */ if (instance > 0) { acpi_ut_snprintf(instance_str, sizeof(instance_str), "%u", instance); ACPI_STRCAT(filename, instance_str); } ACPI_STRCAT(filename, ACPI_TABLE_FILE_SUFFIX); if (gbl_verbose_mode) { acpi_log_error ("Writing [%4.4s] to binary file: %s 0x%X (%u) bytes\n", table->signature, filename, table->length, table->length); } /* Open the file and dump the entire table in binary mode */ file = acpi_os_open_file(filename, ACPI_FILE_WRITING | ACPI_FILE_BINARY); if (!file) { acpi_log_error("Could not open output file: %s\n", filename); return (-1); } actual = acpi_os_write_file(file, table, 1, table_length); if (actual != table_length) { acpi_log_error("Error writing binary output file: %s\n", filename); acpi_os_close_file(file); return (-1); } acpi_os_close_file(file); return (0); }
int ApWriteToBinaryFile ( ACPI_TABLE_HEADER *Table, UINT32 Instance) { char Filename[ACPI_NAME_SIZE + 16]; char InstanceStr [16]; ACPI_FILE File; size_t Actual; UINT32 TableLength; /* Obtain table length */ TableLength = ApGetTableLength (Table); /* Construct lower-case filename from the table local signature */ if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) { ACPI_MOVE_NAME (Filename, ACPI_RSDP_NAME); } else { ACPI_MOVE_NAME (Filename, Table->Signature); } Filename[0] = (char) ACPI_TOLOWER (Filename[0]); Filename[1] = (char) ACPI_TOLOWER (Filename[1]); Filename[2] = (char) ACPI_TOLOWER (Filename[2]); Filename[3] = (char) ACPI_TOLOWER (Filename[3]); Filename[ACPI_NAME_SIZE] = 0; /* Handle multiple SSDTs - create different filenames for each */ if (Instance > 0) { AcpiUtSnprintf (InstanceStr, sizeof (InstanceStr), "%u", Instance); ACPI_STRCAT (Filename, InstanceStr); } ACPI_STRCAT (Filename, ACPI_TABLE_FILE_SUFFIX); if (Gbl_VerboseMode) { AcpiLogError ( "Writing [%4.4s] to binary file: %s 0x%X (%u) bytes\n", Table->Signature, Filename, Table->Length, Table->Length); } /* Open the file and dump the entire table in binary mode */ File = AcpiOsOpenFile (Filename, ACPI_FILE_WRITING | ACPI_FILE_BINARY); if (!File) { AcpiLogError ("Could not open output file: %s\n", Filename); return (-1); } Actual = AcpiOsWriteFile (File, Table, 1, TableLength); if (Actual != TableLength) { AcpiLogError ("Error writing binary output file: %s\n", Filename); AcpiOsCloseFile (File); return (-1); } AcpiOsCloseFile (File); return (0); }
acpi_status acpi_ut_strtoul64 ( char *string, u32 base, acpi_integer *ret_integer) { u32 this_digit = 0; acpi_integer return_value = 0; acpi_integer quotient; ACPI_FUNCTION_TRACE ("ut_stroul64"); if ((!string) || !(*string)) { goto error_exit; } switch (base) { case ACPI_ANY_BASE: case 10: case 16: break; default: /* Invalid Base */ return_ACPI_STATUS (AE_BAD_PARAMETER); } /* Skip over any white space in the buffer */ while (ACPI_IS_SPACE (*string) || *string == '\t') { string++; } /* * If the input parameter Base is zero, then we need to * determine if it is decimal or hexadecimal: */ if (base == 0) { if ((*string == '0') && (ACPI_TOLOWER (*(string + 1)) == 'x')) { base = 16; string += 2; } else { base = 10; } } /* * For hexadecimal base, skip over the leading * 0 or 0x, if they are present. */ if ((base == 16) && (*string == '0') && (ACPI_TOLOWER (*(string + 1)) == 'x')) { string += 2; } /* Any string left? */ if (!(*string)) { goto error_exit; } /* Main loop: convert the string to a 64-bit integer */ while (*string) { if (ACPI_IS_DIGIT (*string)) { /* Convert ASCII 0-9 to Decimal value */ this_digit = ((u8) *string) - '0'; } else { if (base == 10) { /* Digit is out of range */ goto error_exit; } this_digit = (u8) ACPI_TOUPPER (*string); if (ACPI_IS_XDIGIT ((char) this_digit)) { /* Convert ASCII Hex char to value */ this_digit = this_digit - 'A' + 10; } else { /* * We allow non-hex chars, just stop now, same as end-of-string. * See ACPI spec, string-to-integer conversion. */ break; } } /* Divide the digit into the correct position */ (void) acpi_ut_short_divide ((ACPI_INTEGER_MAX - (acpi_integer) this_digit), base, "ient, NULL); if (return_value > quotient) { goto error_exit; } return_value *= base; return_value += this_digit; string++; } /* All done, normal exit */ *ret_integer = return_value; return_ACPI_STATUS (AE_OK); error_exit: /* Base was set/validated above */ if (base == 10) { return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT); } else { return_ACPI_STATUS (AE_BAD_HEX_CONSTANT); } }
int ApWriteToBinaryFile ( ACPI_TABLE_HEADER *Table, UINT32 Instance) { char Filename[ACPI_NAME_SIZE + 16]; char InstanceStr [16]; FILE *File; size_t Actual; UINT32 TableLength; /* Obtain table length */ TableLength = ApGetTableLength (Table); /* Construct lower-case filename from the table local signature */ if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) { ACPI_MOVE_NAME (Filename, AP_DUMP_SIG_RSDP); } else { ACPI_MOVE_NAME (Filename, Table->Signature); } Filename[0] = (char) ACPI_TOLOWER (Filename[0]); Filename[1] = (char) ACPI_TOLOWER (Filename[1]); Filename[2] = (char) ACPI_TOLOWER (Filename[2]); Filename[3] = (char) ACPI_TOLOWER (Filename[3]); Filename[ACPI_NAME_SIZE] = 0; /* Handle multiple SSDTs - create different filenames for each */ if (Instance > 0) { sprintf (InstanceStr, "%u", Instance); strcat (Filename, InstanceStr); } strcat (Filename, ACPI_TABLE_FILE_SUFFIX); if (Gbl_VerboseMode) { fprintf (stderr, "Writing [%4.4s] to binary file: %s 0x%X (%u) bytes\n", Table->Signature, Filename, Table->Length, Table->Length); } /* Open the file and dump the entire table in binary mode */ File = fopen (Filename, "wb"); if (!File) { perror ("Could not open output file"); return (-1); } Actual = fwrite (Table, 1, TableLength, File); if (Actual != TableLength) { perror ("Error writing binary output file"); fclose (File); return (-1); } fclose (File); return (0); }
ACPI_STATUS AcpiUtStrtoul64 ( char *String, UINT32 Base, ACPI_INTEGER *RetInteger) { UINT32 Index; ACPI_INTEGER ReturnValue = 0; ACPI_STATUS Status = AE_OK; ACPI_INTEGER Dividend; ACPI_INTEGER Quotient; *RetInteger = 0; switch (Base) { case 0: case 8: case 10: case 16: break; default: /* * The specified Base parameter is not in the domain of * this function: */ return (AE_BAD_PARAMETER); } /* * skip over any white space in the buffer: */ while (ACPI_IS_SPACE (*String) || *String == '\t') { ++String; } /* * If the input parameter Base is zero, then we need to * determine if it is octal, decimal, or hexadecimal: */ if (Base == 0) { if (*String == '0') { if (ACPI_TOLOWER (*(++String)) == 'x') { Base = 16; ++String; } else { Base = 8; } } else { Base = 10; } } /* * For octal and hexadecimal bases, skip over the leading * 0 or 0x, if they are present. */ if (Base == 8 && *String == '0') { String++; } if (Base == 16 && *String == '0' && ACPI_TOLOWER (*(++String)) == 'x') { String++; } /* Main loop: convert the string to an unsigned long */ while (*String) { if (ACPI_IS_DIGIT (*String)) { Index = ((UINT8) *String) - '0'; } else { Index = (UINT8) ACPI_TOUPPER (*String); if (ACPI_IS_UPPER ((char) Index)) { Index = Index - 'A' + 10; } else { goto ErrorExit; } } if (Index >= Base) { goto ErrorExit; } /* Check to see if value is out of range: */ Dividend = ACPI_INTEGER_MAX - (ACPI_INTEGER) Index; (void) AcpiUtShortDivide (&Dividend, Base, &Quotient, NULL); if (ReturnValue > Quotient) { goto ErrorExit; } ReturnValue *= Base; ReturnValue += Index; ++String; } *RetInteger = ReturnValue; return (Status); ErrorExit: switch (Base) { case 8: Status = AE_BAD_OCTAL_CONSTANT; break; case 10: Status = AE_BAD_DECIMAL_CONSTANT; break; case 16: Status = AE_BAD_HEX_CONSTANT; break; default: /* Base validated above */ break; } return (Status); }