mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.4 KiB
159 lines
3.4 KiB
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
FindFmt.c
|
|
|
|
Abstract:
|
|
|
|
NetpFindNumberedFormatInWStr.
|
|
|
|
Author:
|
|
|
|
JR (John Rogers, JohnRo@Microsoft) 19-Aug-1993
|
|
|
|
Environment:
|
|
|
|
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Revision History:
|
|
|
|
19-Aug-1993 JohnRo
|
|
RAID 2822: PortUAS maps chars funny. (Work around FormatMessageA bug.)
|
|
RAID 3094: PortUAS displays chars incorrectly.
|
|
|
|
--*/
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <windows.h> // IN, LPWSTR, BOOL, etc.
|
|
#include <lmcons.h> // NET_API_STATUS, UNLEN, GNLEN.
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <netdebug.h> // NetpAssert(), FORMAT_ equates, etc.
|
|
#include <netlib.h> // My prototype, MAX_NETLIB_MESSAGE_ARG, etc.
|
|
#include <wchar.h> // iswdigit(), swprintf(), etc.
|
|
|
|
|
|
// DWORDLEN: DWORD takes this many decimal digits to store.
|
|
// BUGBUG This assumes that DWORD is 32-bits or less.
|
|
#define DWORDLEN 10
|
|
|
|
|
|
LPCWSTR
|
|
NetpFindNumberedFormatInWStr(
|
|
IN LPCWSTR Format,
|
|
IN DWORD ArgNumber // Arg number (1=first).
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
BUGBUG
|
|
|
|
Arguments:
|
|
|
|
BUGBUG
|
|
|
|
Return Value:
|
|
|
|
BUGBUG
|
|
|
|
--*/
|
|
{
|
|
WCHAR ArgStringWanted[DWORDLEN+1];
|
|
DWORD DigitCount;
|
|
LPCWSTR ThisFormat = Format;
|
|
|
|
//
|
|
// Check for caller errors.
|
|
//
|
|
|
|
if ( (Format == NULL) || ((*Format) == L'\0') ) {
|
|
ThisFormat = NULL; // Canonicalize to NULL pointer.
|
|
goto Cleanup;
|
|
}
|
|
if (ArgNumber == 0) {
|
|
ThisFormat = NULL;
|
|
goto Cleanup;
|
|
}
|
|
|
|
//
|
|
// Convert number we're looking for into string.
|
|
//
|
|
|
|
(VOID) swprintf(
|
|
ArgStringWanted, // output buffer (wide)
|
|
L"%lu", // format string (wide)
|
|
ArgNumber ); // arg(s)
|
|
NetpAssert( iswdigit( ArgStringWanted[0] ) );
|
|
DigitCount = wcslen( ArgStringWanted );
|
|
NetpAssert( DigitCount <= MAX_NETLIB_MESSAGE_ARG );
|
|
|
|
//
|
|
// Loop for each percent sign in string.
|
|
//
|
|
|
|
/*lint -save -e716 */ // disable warnings for while(TRUE)
|
|
while (TRUE) {
|
|
|
|
//
|
|
// Find next percent sign (if any).
|
|
//
|
|
|
|
ThisFormat = wcschr( ThisFormat, L'%' );
|
|
if (ThisFormat == NULL) {
|
|
goto Cleanup;
|
|
}
|
|
NetpAssert( ThisFormat[0] == L'%' );
|
|
|
|
//
|
|
// Don't be confused by a pair of percent signs.
|
|
//
|
|
|
|
if (ThisFormat[1] == L'%') {
|
|
ThisFormat += 2; // Skip both chars.
|
|
continue;
|
|
}
|
|
|
|
//
|
|
// Is there a match on number we are looking for?
|
|
//
|
|
|
|
if (wcsncmp( &ThisFormat[1], ArgStringWanted, DigitCount ) == 0) {
|
|
|
|
//
|
|
// Check for tricky case of wanting "%1" but found "%10".
|
|
//
|
|
|
|
if ( iswdigit( ThisFormat[1 + DigitCount] ) ) {
|
|
NetpAssert( ThisFormat[0] == L'%' );
|
|
++ThisFormat; // Skip the percent sign.
|
|
continue;
|
|
}
|
|
|
|
//
|
|
// By George, this is it!
|
|
//
|
|
|
|
goto Cleanup; // Go tell caller.
|
|
|
|
}
|
|
|
|
NetpAssert( ThisFormat[0] == L'%' );
|
|
++ThisFormat; // Skip the percent sign.
|
|
}
|
|
|
|
/*lint -restore */ // re-enable warnings for while(TRUE).
|
|
|
|
/*NOTREACHED*/
|
|
|
|
Cleanup:
|
|
|
|
return (ThisFormat); // Return pointer to '%' (or NULL on error).
|
|
}
|