windows-nt/Source/XPSP1/NT/base/busdrv/acpi/tools/kdext/flags.c

296 lines
6.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}