296 lines
6.9 KiB
C
296 lines
6.9 KiB
C
|
|
|||
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
flags.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
dumps the various flags that ACPIKD knows about
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Stephane Plante
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
|
|||
|
ULONG
|
|||
|
dumpFlags(
|
|||
|
IN ULONGLONG Value,
|
|||
|
IN PFLAG_RECORD FlagRecords,
|
|||
|
IN ULONG FlagRecordSize,
|
|||
|
IN ULONG IndentLevel,
|
|||
|
IN ULONG Flags
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine dumps the flags specified in Value according to the
|
|||
|
description passing into FlagRecords. The formating is affected by
|
|||
|
the flags field
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Value - The values
|
|||
|
FlagRecord - What each bit in the flags means
|
|||
|
FlagRecordSize - How many flags there are
|
|||
|
IndentLevel - The base indent level
|
|||
|
Flags - How we will process the flags
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ULONG - the number of characters printed. 0 if we printed nothing
|
|||
|
|
|||
|
--*/
|
|||
|
#define STATUS_PRINTED 0x00000001
|
|||
|
#define STATUS_INDENTED 0x00000002
|
|||
|
#define STATUS_NEED_COUNTING 0x00000004
|
|||
|
#define STATUS_COUNTED 0x00000008
|
|||
|
{
|
|||
|
PCHAR string;
|
|||
|
UCHAR indent[80];
|
|||
|
ULONG column = IndentLevel;
|
|||
|
ULONG currentStatus = 0;
|
|||
|
ULONG fixedSize = 0;
|
|||
|
ULONG stringSize;
|
|||
|
ULONG tempCount;
|
|||
|
ULONG totalCount = 0;
|
|||
|
ULONGLONG i, j, k;
|
|||
|
|
|||
|
IndentLevel = (IndentLevel > 79 ? 79 : IndentLevel);
|
|||
|
memset( indent, ' ', IndentLevel );
|
|||
|
indent[IndentLevel] = '\0';
|
|||
|
|
|||
|
//dprintf("DumpFlags( %I64x, %x, %x, %x, %x )\n", Value, FlagRecords, FlagRecordSize, IndentLevel, Flags );
|
|||
|
|
|||
|
//
|
|||
|
// Do we need to make a table?
|
|||
|
//
|
|||
|
if ( (Flags & DUMP_FLAG_TABLE) &&
|
|||
|
!(Flags & DUMP_FLAG_SINGLE_LINE) ) {
|
|||
|
|
|||
|
currentStatus |= STATUS_NEED_COUNTING;
|
|||
|
|
|||
|
}
|
|||
|
if ( (Flags & DUMP_FLAG_ALREADY_INDENTED) ) {
|
|||
|
|
|||
|
currentStatus |= STATUS_INDENTED;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// loop over all the steps that we need to do
|
|||
|
//
|
|||
|
while (1) {
|
|||
|
|
|||
|
//dprintf("While(1)\n");
|
|||
|
|
|||
|
for (i = 0; i < 64; i++) {
|
|||
|
|
|||
|
k = (1 << i);
|
|||
|
for (j = 0; j < FlagRecordSize; j++) {
|
|||
|
|
|||
|
//dprintf("FlagRecords[%x].Bit = %I64x\n", j, FlagRecords[j].Bit );
|
|||
|
if (!(FlagRecords[j].Bit & Value) ) {
|
|||
|
|
|||
|
//
|
|||
|
// Are we looking at the correct bit?
|
|||
|
//
|
|||
|
if (!(FlagRecords[j].Bit & k) ) {
|
|||
|
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Yes, we are, so pick the not-present values
|
|||
|
//
|
|||
|
if ( (Flags & DUMP_FLAG_LONG_NAME && FlagRecords[j].NotLongName == NULL) ||
|
|||
|
(Flags & DUMP_FLAG_SHORT_NAME && FlagRecords[j].NotShortName == NULL) ) {
|
|||
|
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if ( (Flags & DUMP_FLAG_LONG_NAME) ) {
|
|||
|
|
|||
|
string = FlagRecords[j].NotLongName;
|
|||
|
|
|||
|
} else if ( (Flags & DUMP_FLAG_SHORT_NAME) ) {
|
|||
|
|
|||
|
string = FlagRecords[j].NotShortName;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// Are we looking at the correct bit?
|
|||
|
//
|
|||
|
if (!(FlagRecords[j].Bit & k) ) {
|
|||
|
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Yes, we are, so pick the not-present values
|
|||
|
//
|
|||
|
if ( (Flags & DUMP_FLAG_LONG_NAME && FlagRecords[j].LongName == NULL) ||
|
|||
|
(Flags & DUMP_FLAG_SHORT_NAME && FlagRecords[j].ShortName == NULL) ) {
|
|||
|
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if ( (Flags & DUMP_FLAG_LONG_NAME) ) {
|
|||
|
|
|||
|
string = FlagRecords[j].LongName;
|
|||
|
|
|||
|
} else if ( (Flags & DUMP_FLAG_SHORT_NAME) ) {
|
|||
|
|
|||
|
string = FlagRecords[j].ShortName;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (currentStatus & STATUS_NEED_COUNTING) {
|
|||
|
|
|||
|
stringSize = strlen( string ) + 1;
|
|||
|
if (Flags & DUMP_FLAG_SHOW_BIT) {
|
|||
|
|
|||
|
stringSize += (4 + ( (ULONG) i / 4));
|
|||
|
if ( (i % 4) != 0) {
|
|||
|
|
|||
|
stringSize++;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if (stringSize > fixedSize) {
|
|||
|
|
|||
|
fixedSize = stringSize;
|
|||
|
|
|||
|
}
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (currentStatus & STATUS_COUNTED) {
|
|||
|
|
|||
|
stringSize = fixedSize;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
stringSize = strlen( string ) + 1;
|
|||
|
if (Flags & DUMP_FLAG_SHOW_BIT) {
|
|||
|
|
|||
|
stringSize += (4 + ( (ULONG) i / 4));
|
|||
|
if ( (i % 4) != 0) {
|
|||
|
|
|||
|
stringSize++;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (!(Flags & DUMP_FLAG_SINGLE_LINE) ) {
|
|||
|
|
|||
|
if ( (stringSize + column) > 79 ) {
|
|||
|
|
|||
|
dprintf("\n%n", &tempCount);
|
|||
|
currentStatus &= ~STATUS_INDENTED;
|
|||
|
totalCount += tempCount;
|
|||
|
column = 0;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (!(Flags & DUMP_FLAG_NO_INDENT) ) {
|
|||
|
|
|||
|
if (!(currentStatus & STATUS_INDENTED) ) {
|
|||
|
|
|||
|
dprintf("%s%n", indent, &tempCount);
|
|||
|
currentStatus |= STATUS_INDENTED;
|
|||
|
totalCount += tempCount;
|
|||
|
column += IndentLevel;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if ( (Flags & DUMP_FLAG_SHOW_BIT) ) {
|
|||
|
|
|||
|
dprintf("%I64x - %n", k, &tempCount);
|
|||
|
tempCount++; // to account for the fact that we dump
|
|||
|
// another space at the end of the string
|
|||
|
totalCount += tempCount;
|
|||
|
column += tempCount;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
tempCount = 0;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Actually print the string
|
|||
|
//
|
|||
|
dprintf( "%.*s %n", (stringSize - tempCount), string, &tempCount );
|
|||
|
if (Flags & DUMP_FLAG_SHOW_BIT) {
|
|||
|
|
|||
|
dprintf(" ");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
totalCount += tempCount;
|
|||
|
column += tempCount;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Change states
|
|||
|
//
|
|||
|
if (currentStatus & STATUS_NEED_COUNTING) {
|
|||
|
|
|||
|
currentStatus &= ~STATUS_NEED_COUNTING;
|
|||
|
currentStatus |= STATUS_COUNTED;
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (!(Flags & DUMP_FLAG_NO_EOL) && totalCount != 0) {
|
|||
|
|
|||
|
dprintf("\n");
|
|||
|
totalCount++;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Done
|
|||
|
//
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return totalCount;
|
|||
|
|
|||
|
}
|
|||
|
|