windows-nt/Source/XPSP1/NT/sdktools/job/utils.c
2020-09-26 16:20:57 +08:00

194 lines
3.3 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
utils.c
Abstract:
Environment:
User mode only
Revision History:
03-26-96 : Created
--*/
//
// this module may be compiled at warning level 4 with the following
// warnings disabled:
//
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <assert.h>
#include <windows.h>
#include <devioctl.h>
#include "jobmgr.h"
VOID
xprintf(
ULONG Depth,
PTSTR Format,
...
)
{
va_list args;
ULONG i;
TCHAR DebugBuffer[256];
for (i=0; i<Depth; i++) {
_tprintf (" ");
}
va_start(args, Format);
_vsntprintf(DebugBuffer, 255, Format, args);
_tprintf (DebugBuffer);
va_end(args);
}
VOID
DumpFlags(
ULONG Depth,
PTSTR Name,
ULONG Flags,
PFLAG_NAME FlagTable
)
{
ULONG i;
ULONG mask = 0;
ULONG count = 0;
UCHAR prolog[64];
xprintf(Depth, "%s (0x%08x)%c\n", Name, Flags, Flags ? TEXT(':') : TEXT(' '));
if(Flags == 0) {
return;
}
memset(prolog, 0, sizeof(prolog));
memset(prolog, ' ', min(6, _tcslen(Name)) * sizeof(TCHAR));
xprintf(Depth, "%s", prolog);
for(i = 0; FlagTable[i].Name != 0; i++) {
PFLAG_NAME flag = &(FlagTable[i]);
mask |= flag->Flag;
if((Flags & flag->Flag) == flag->Flag) {
//
// print trailing comma
//
if(count != 0) {
_tprintf(", ");
//
// Only print two flags per line.
//
if((count % 2) == 0) {
_tprintf("\n");
xprintf(Depth, "%s", prolog);
}
}
_tprintf("%s", flag->Name);
count++;
}
}
_tprintf("\n");
if((Flags & (~mask)) != 0) {
xprintf(Depth, "%sUnknown flags %#010lx\n", prolog, (Flags & (~mask)));
}
return;
}
#define MICROSECONDS ((ULONGLONG) 10) // 10 nanoseconds
#define MILLISECONDS (MICROSECONDS * 1000)
#define SECONDS (MILLISECONDS * 1000)
#define MINUTES (SECONDS * 60)
#define HOURS (MINUTES * 60)
#define DAYS (HOURS * 24)
LPCTSTR
TicksToString(
LARGE_INTEGER TimeInTicks
)
{
static TCHAR ticksToStringBuffer[256] = "";
LPTSTR buffer = ticksToStringBuffer;
ULONGLONG t = TimeInTicks.QuadPart;
ULONGLONG days;
ULONGLONG hours;
ULONGLONG minutes;
ULONGLONG seconds;
ULONGLONG ticks;
LPTSTR comma = "";
if(t == 0) {
return TEXT("0 Seconds");
}
days = t / DAYS;
t %= DAYS;
hours = t / HOURS;
t %= HOURS;
minutes = t / MINUTES;
t %= MINUTES;
seconds = t / SECONDS;
t %= SECONDS;
ticks = t;
buffer[0] = TEXT('\0');
if(days) {
_stprintf(buffer, "%I64d Days", days);
comma = ", ";
buffer += _tcslen(buffer);
}
if(hours) {
_stprintf(buffer, "%s%I64d Hours", comma, hours);
comma = ", ";
buffer += _tcslen(buffer);
}
if(minutes) {
_stprintf(buffer, "%s%I64d Minutes", comma, minutes);
comma = ", ";
buffer += _tcslen(buffer);
}
if(seconds | ticks) {
_stprintf(buffer, "%s%I64d.%06I64d Seconds", comma, seconds, ticks);
}
return ticksToStringBuffer;
}