619 lines
14 KiB
C
619 lines
14 KiB
C
|
#include "brian.h"
|
||
|
|
||
|
VOID
|
||
|
FullEnterTime(
|
||
|
PUSHORT BufferPointer,
|
||
|
CSHORT Year,
|
||
|
CSHORT Month,
|
||
|
CSHORT Day,
|
||
|
CSHORT Hour,
|
||
|
CSHORT Minute,
|
||
|
CSHORT Second,
|
||
|
CSHORT MSecond
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
FullDisplayTime (
|
||
|
USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
PrintTime (
|
||
|
IN PTIME Time
|
||
|
)
|
||
|
{
|
||
|
TIME_FIELDS TimeFields;
|
||
|
|
||
|
RtlTimeToTimeFields( Time, &TimeFields );
|
||
|
|
||
|
printf( "%02u-%02u-%02u %02u:%02u:%02u",
|
||
|
TimeFields.Month,
|
||
|
TimeFields.Day,
|
||
|
TimeFields.Year % 100,
|
||
|
TimeFields.Hour,
|
||
|
TimeFields.Minute,
|
||
|
TimeFields.Second );
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
BPrintTime (
|
||
|
IN PTIME Time
|
||
|
)
|
||
|
{
|
||
|
TIME_FIELDS TimeFields;
|
||
|
|
||
|
RtlTimeToTimeFields( Time, &TimeFields );
|
||
|
|
||
|
bprint "%02u-%02u-%02u %02u:%02u:%02u",
|
||
|
TimeFields.Month,
|
||
|
TimeFields.Day,
|
||
|
((USHORT) (TimeFields.Year - 1900)) > 100
|
||
|
? 0
|
||
|
: TimeFields.Year - 1900,
|
||
|
TimeFields.Hour,
|
||
|
TimeFields.Minute,
|
||
|
TimeFields.Second );
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
InputEnterTime (
|
||
|
IN PCHAR ParamBuffer
|
||
|
)
|
||
|
{
|
||
|
USHORT ActualIndex;
|
||
|
PUSHORT BufferPointer;
|
||
|
|
||
|
CSHORT Year;
|
||
|
CSHORT Month;
|
||
|
CSHORT Day;
|
||
|
CSHORT Hour;
|
||
|
CSHORT Minute;
|
||
|
CSHORT Second;
|
||
|
CSHORT MSecond;
|
||
|
|
||
|
BOOLEAN LastInput;
|
||
|
BOOLEAN ParmSpecified;
|
||
|
|
||
|
ActualIndex = 0;
|
||
|
BufferPointer = NULL;
|
||
|
|
||
|
Year = 1601;
|
||
|
Month = 1;
|
||
|
Day = 1;
|
||
|
Hour = 0;
|
||
|
Minute = 0;
|
||
|
Second = 0;
|
||
|
MSecond = 0;
|
||
|
|
||
|
ParmSpecified = FALSE;
|
||
|
LastInput = TRUE;
|
||
|
|
||
|
//
|
||
|
// While there is more input, analyze the parameter and update the
|
||
|
// query flags.
|
||
|
//
|
||
|
|
||
|
while (TRUE) {
|
||
|
ULONG DummyCount;
|
||
|
|
||
|
//
|
||
|
// Swallow leading white spaces.
|
||
|
//
|
||
|
|
||
|
ParamBuffer = SwallowWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
if (*ParamBuffer) {
|
||
|
|
||
|
//
|
||
|
// If the next parameter is legal then check the paramter value.
|
||
|
// Update the parameter value.
|
||
|
//
|
||
|
if ((*ParamBuffer == '-'
|
||
|
|| *ParamBuffer == '/')
|
||
|
&& (ParamBuffer++, *ParamBuffer != '\0')) {
|
||
|
|
||
|
//
|
||
|
// Switch on the next character.
|
||
|
//
|
||
|
|
||
|
switch( *ParamBuffer ) {
|
||
|
|
||
|
//
|
||
|
// Check buffer index.
|
||
|
//
|
||
|
case 'b' :
|
||
|
case 'B' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
ParamBuffer++;
|
||
|
|
||
|
ActualIndex = (USHORT) AsciiToInteger( ParamBuffer );
|
||
|
BufferPointer = &ActualIndex;
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Enter the year value.
|
||
|
//
|
||
|
case 'y' :
|
||
|
case 'Y' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
Year = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Check the month value.
|
||
|
//
|
||
|
|
||
|
case 'm' :
|
||
|
case 'M' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
Month = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Enter the day value.
|
||
|
//
|
||
|
|
||
|
case 'd' :
|
||
|
case 'D' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
Day = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Enter the hour value.
|
||
|
//
|
||
|
|
||
|
case 'h' :
|
||
|
case 'H' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
Hour = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Enter the minute value.
|
||
|
//
|
||
|
|
||
|
case 'i' :
|
||
|
case 'I' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
Minute = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Enter the second value.
|
||
|
//
|
||
|
|
||
|
case 's' :
|
||
|
case 'S' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
Second = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Check the millesecond value.
|
||
|
//
|
||
|
|
||
|
case 'c' :
|
||
|
case 'C' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
|
||
|
ParamBuffer++;
|
||
|
|
||
|
MSecond = (CSHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParmSpecified = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
default :
|
||
|
|
||
|
//
|
||
|
// Swallow to the next white space and continue the
|
||
|
// loop.
|
||
|
//
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Else the text is invalid, skip the entire block.
|
||
|
//
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Else if there is no input then exit.
|
||
|
//
|
||
|
} else if ( LastInput ) {
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Else try to read another line for open parameters.
|
||
|
//
|
||
|
} else {
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If no parameters were received then display the syntax message.
|
||
|
//
|
||
|
if (!ParmSpecified) {
|
||
|
|
||
|
printf( "\n Usage: et [options]*\n" );
|
||
|
printf( "\n Options:" );
|
||
|
printf( "\n -b<digits> Buffer index" );
|
||
|
printf( "\n -y<digits> Year (1601...)" );
|
||
|
printf( "\n -m<digits> Month (1..12)" );
|
||
|
printf( "\n -d<digits> Day (1..31)" );
|
||
|
printf( "\n -h<digits> Hour (0..23)" );
|
||
|
printf( "\n -i<digits> Minute (0..59)" );
|
||
|
printf( "\n -s<digits> Second (0..59)" );
|
||
|
printf( "\n -c<digits> Milleseconds (0..999)" );
|
||
|
printf( "\n\n" );
|
||
|
|
||
|
|
||
|
//
|
||
|
// Else call the routine to enter the time.
|
||
|
//
|
||
|
|
||
|
} else {
|
||
|
|
||
|
FullEnterTime( BufferPointer,
|
||
|
Year,
|
||
|
Month,
|
||
|
Day,
|
||
|
Hour,
|
||
|
Minute,
|
||
|
Second,
|
||
|
MSecond );
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
FullEnterTime(
|
||
|
IN PUSHORT BufferPointer,
|
||
|
IN CSHORT Year,
|
||
|
IN CSHORT Month,
|
||
|
IN CSHORT Day,
|
||
|
IN CSHORT Hour,
|
||
|
IN CSHORT Minute,
|
||
|
IN CSHORT Second,
|
||
|
IN CSHORT MSecond
|
||
|
)
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
TIME_FIELDS TimeFields;
|
||
|
USHORT BufferIndex;
|
||
|
|
||
|
//
|
||
|
// If we need a buffer, allocate it now.
|
||
|
//
|
||
|
|
||
|
try {
|
||
|
|
||
|
if (BufferPointer == NULL) {
|
||
|
|
||
|
SIZE_T ThisLength;
|
||
|
ULONG TempIndex;
|
||
|
|
||
|
ThisLength = sizeof( TIME );
|
||
|
|
||
|
Status = AllocateBuffer( 0L, &ThisLength, &TempIndex );
|
||
|
BufferIndex = (USHORT) TempIndex;
|
||
|
|
||
|
BufferPointer = &BufferIndex;
|
||
|
|
||
|
if (!NT_SUCCESS( Status )) {
|
||
|
|
||
|
printf( "\n\tFullEnterTime: Unable to allocate a buffer -> %08lx",
|
||
|
Status );
|
||
|
|
||
|
try_return( NOTHING );
|
||
|
}
|
||
|
|
||
|
printf( "\n\tFullEnterTime: Using buffer -> %04x", *BufferPointer );
|
||
|
printf( "\n" );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check that the buffer index is valid.
|
||
|
//
|
||
|
|
||
|
if (*BufferPointer >= MAX_BUFFERS) {
|
||
|
|
||
|
printf( "\n\tFullEnterTime: The buffer index is invalid" );
|
||
|
try_return( NOTHING );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Enter the values in the time field structure.
|
||
|
//
|
||
|
|
||
|
TimeFields.Year = Year;
|
||
|
TimeFields.Month = Month;
|
||
|
TimeFields.Day = Day;
|
||
|
TimeFields.Hour = Hour;
|
||
|
TimeFields.Minute = Minute;
|
||
|
TimeFields.Second = Second;
|
||
|
TimeFields.Milliseconds = MSecond;
|
||
|
|
||
|
//
|
||
|
// Convert the time field to TIME format for our buffer.
|
||
|
//
|
||
|
|
||
|
if (!RtlTimeFieldsToTime( &TimeFields,
|
||
|
(PTIME) Buffers[*BufferPointer].Buffer )) {
|
||
|
|
||
|
printf( "\n\tFullEnterTime: Invalid time format" );
|
||
|
try_return( NOTHING );
|
||
|
}
|
||
|
|
||
|
try_exit: NOTHING;
|
||
|
} finally {
|
||
|
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
InputDisplayTime (
|
||
|
IN PCHAR ParamBuffer
|
||
|
)
|
||
|
{
|
||
|
USHORT BufferIndex;
|
||
|
BOOLEAN ParamReceived;
|
||
|
BOOLEAN LastInput;
|
||
|
|
||
|
//
|
||
|
// Set the defaults.
|
||
|
//
|
||
|
|
||
|
BufferIndex = 0;
|
||
|
ParamReceived = FALSE;
|
||
|
LastInput = TRUE;
|
||
|
|
||
|
//
|
||
|
// While there is more input, analyze the parameter and update the
|
||
|
// query flags.
|
||
|
//
|
||
|
|
||
|
while (TRUE) {
|
||
|
|
||
|
ULONG DummyCount;
|
||
|
|
||
|
//
|
||
|
// Swallow leading white spaces.
|
||
|
//
|
||
|
ParamBuffer = SwallowWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
if (*ParamBuffer) {
|
||
|
|
||
|
//
|
||
|
// If the next parameter is legal then check the paramter value.
|
||
|
// Update the parameter value.
|
||
|
//
|
||
|
if ((*ParamBuffer == '-'
|
||
|
|| *ParamBuffer == '/')
|
||
|
&& (ParamBuffer++, *ParamBuffer != '\0')) {
|
||
|
|
||
|
//
|
||
|
// Switch on the next character.
|
||
|
//
|
||
|
|
||
|
switch( *ParamBuffer ) {
|
||
|
|
||
|
//
|
||
|
// Check the buffer index.
|
||
|
//
|
||
|
case 'b' :
|
||
|
case 'B' :
|
||
|
|
||
|
//
|
||
|
// Move to the next character, as long as there
|
||
|
// are no white spaces continue analyzing letters.
|
||
|
// On the first bad letter, skip to the next
|
||
|
// parameter.
|
||
|
//
|
||
|
ParamBuffer++;
|
||
|
|
||
|
BufferIndex = (USHORT) AsciiToInteger( ParamBuffer );
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
|
||
|
ParamReceived = TRUE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
default :
|
||
|
|
||
|
//
|
||
|
// Swallow to the next white space and continue the
|
||
|
// loop.
|
||
|
//
|
||
|
|
||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Else the text is invalid, skip the entire block.
|
||
|
//
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Else if there is no input then exit.
|
||
|
//
|
||
|
} else if ( LastInput ) {
|
||
|
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// Else try to read another line for open parameters.
|
||
|
//
|
||
|
} else {
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If no parameters were received then display the syntax message.
|
||
|
//
|
||
|
if (!ParamReceived) {
|
||
|
|
||
|
printf( "\n Usage: dqf [options]* -b<digits> [options]*\n" );
|
||
|
printf( "\n Options:" );
|
||
|
printf( "\n -b<digits> Buffer index" );
|
||
|
printf( "\n -c<char> Key to buffer format" );
|
||
|
printf( "\n\n" );
|
||
|
|
||
|
//
|
||
|
// Else call our display buffer routine.
|
||
|
//
|
||
|
} else {
|
||
|
|
||
|
FullDisplayTime( BufferIndex );
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
FullDisplayTime (
|
||
|
USHORT BufferIndex
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// Check that the buffer index is valid and the buffer is used.
|
||
|
//
|
||
|
|
||
|
if (BufferIndex >= MAX_BUFFERS
|
||
|
|| Buffers[BufferIndex].Used == FALSE) {
|
||
|
|
||
|
bprint "\n\tFullDisplayTime: Invalid buffer index" );
|
||
|
|
||
|
} else {
|
||
|
|
||
|
printf( "\n\tFullDisplayTime: Index %d ", BufferIndex );
|
||
|
PrintTime( (PTIME) Buffers[BufferIndex].Buffer );
|
||
|
}
|
||
|
|
||
|
printf( "\n" );
|
||
|
|
||
|
return;
|
||
|
}
|