reformat some code to make it readably

svn path=/trunk/; revision=14530
This commit is contained in:
Thomas Bluemel 2005-04-06 18:30:09 +00:00
parent 237d12dc8e
commit 68c2c91476

View file

@ -28,31 +28,23 @@
/* TYPES */
/* Pointer to a callback that handles a particular parameter */
typedef BOOL (*COMMDCB_PARAM_CALLBACK)
(
DCB *,
COMMTIMEOUTS *,
BOOL *,
LPWSTR *
);
typedef BOOL (*COMMDCB_PARAM_CALLBACK)(DCB *, COMMTIMEOUTS *, BOOL *, LPWSTR *);
/* Symbolic flag of any length */
typedef struct _COMMDCB_PARAM_STRFLAG
{
UNICODE_STRING String;
ULONG_PTR Value;
} COMMDCB_PARAM_STRFLAG;
} COMMDCB_PARAM_STRFLAG, *PCOMMDCB_PARAM_STRFLAG;
/* One char long symbolic flag */
typedef struct _COMMDCB_PARAM_CHARFLAG
{
WCHAR Char;
ULONG_PTR Value;
} COMMDCB_PARAM_CHARFLAG;
} COMMDCB_PARAM_CHARFLAG, *PCOMMDCB_PARAM_CHARFLAG;
/* MACROS */
/* stupid Borland C++ requires this */
#define _L(__S__) L ## __S__
/* Declare a parameter handler */
#define COMMDCB_PARAM_HANDLER(__P__) \
@ -69,13 +61,11 @@ typedef struct _COMMDCB_PARAM_CHARFLAG
Lookup a string flag and return its numerical value. The flags array must be
sorted - a dichotomycal search is performed
*/
BOOL COMMDCB_LookupStrFlag
(
UNICODE_STRING * Flag,
COMMDCB_PARAM_STRFLAG * Flags,
static BOOL
COMMDCB_LookupStrFlag(PUNICODE_STRING Flag,
PCOMMDCB_PARAM_STRFLAG Flags,
int FlagCount,
ULONG_PTR * Value
)
PULONG_PTR Value)
{
/* Lower and upper bound for dichotomycal search */
int nLowerBound = 0;
@ -88,12 +78,9 @@ BOOL COMMDCB_LookupStrFlag
int nCurFlag = nLowerBound + (nUpperBound - nLowerBound) / 2;
/* compare the string with the pivot */
nComparison = RtlCompareUnicodeString
(
Flag,
nComparison = RtlCompareUnicodeString(Flag,
&Flags[nCurFlag].String,
TRUE
);
TRUE);
/* string is equal */
if(nComparison == 0)
@ -104,29 +91,21 @@ BOOL COMMDCB_LookupStrFlag
/* success */
return TRUE;
}
/* string is less than */
else if(nComparison < 0)
{
/*
restrict the search to the first half of the current slice, minus the pivot
* restrict the search to the first half of the current slice, minus the pivot
*/
nUpperBound = nCurFlag - 1;
/* fallthrough */
}
/* string is greater than */
else
{
/*
restrict the search to the second half of the current slice, minus the pivot
* restrict the search to the second half of the current slice, minus the pivot
*/
nLowerBound = nCurFlag + 1;
/* fallthrough */
}
}
/* continue until the slice is empty */
while(nLowerBound <= nUpperBound);
} while(nLowerBound <= nUpperBound);
/* string not found: failure */
return FALSE;
@ -137,13 +116,11 @@ BOOL COMMDCB_LookupStrFlag
Find the next character flag and return its numerical value. The flags array
must be sorted - a dichotomycal search is performed
*/
BOOL COMMDCB_ParseCharFlag
(
LPWSTR * StrTail,
COMMDCB_PARAM_CHARFLAG * Flags,
static BOOL
COMMDCB_ParseCharFlag(LPWSTR *StrTail,
PCOMMDCB_PARAM_CHARFLAG Flags,
int FlagCount,
ULONG_PTR * Value
)
PULONG_PTR Value)
{
/* Lower and upper bound for dichotomycal search */
int nLowerBound = 0;
@ -153,14 +130,13 @@ BOOL COMMDCB_ParseCharFlag
/* premature end of string, or the character is whitespace */
if(!wcFlag || iswspace(wcFlag))
/* failure */
return FALSE;
/* uppercase the character for case-insensitive search */
wcFlag = towupper(wcFlag);
/* skip the character flag */
++ (*StrTail);
(*StrTail)++;
/* see COMMDCB_LookupStrFlag for a description of the algorithm */
do
@ -184,8 +160,7 @@ BOOL COMMDCB_ParseCharFlag
{
nLowerBound = nCurFlag + 1;
}
}
while(nUpperBound >= nLowerBound);
} while(nUpperBound >= nLowerBound);
/* flag not found: failure */
return FALSE;
@ -195,24 +170,22 @@ BOOL COMMDCB_ParseCharFlag
Find the next string flag and return its numerical value. The flags array must
be sorted - a dichotomycal search is performed
*/
BOOL COMMDCB_ParseStrFlag
(
LPWSTR * StrTail,
COMMDCB_PARAM_STRFLAG * Flags,
static BOOL
COMMDCB_ParseStrFlag(LPWSTR *StrTail,
PCOMMDCB_PARAM_STRFLAG Flags,
int FlagCount,
ULONG_PTR * Value
)
PULONG_PTR Value)
{
LPWSTR pwcNewTail = *StrTail;
LPWSTR pwcNewTail;
UNICODE_STRING wstrFlag;
/* scan the string until the first space character or the terminating null */
while(pwcNewTail[0] && !iswspace(pwcNewTail[0]))
++ pwcNewTail;
for(pwcNewTail = *StrTail;
pwcNewTail[0] && !iswspace(pwcNewTail[0]);
pwcNewTail++);
/* string flag empty */
if(pwcNewTail == *StrTail)
/* failure */
return FALSE;
/* build the UNICODE_STRING description of the string flag */
@ -230,43 +203,45 @@ BOOL COMMDCB_ParseStrFlag
/*
Parse a boolean value in the symbolic form on/off
*/
BOOL COMMDCB_ParseBool(LPWSTR * StrTail, BOOL * Value)
static BOOL
COMMDCB_ParseBool(LPWSTR *StrTail,
PBOOL Value)
{
BOOL bRetVal;
ULONG_PTR nValue;
static COMMDCB_PARAM_STRFLAG a_BoolFlags[] =
{
static COMMDCB_PARAM_STRFLAG a_BoolFlags[] = {
{ ROS_STRING_INITIALIZER(L"off"), FALSE },
{ ROS_STRING_INITIALIZER(L"on"), TRUE }
};
/* try to recognize the next flag as a boolean */
bRetVal = COMMDCB_ParseStrFlag
(
StrTail,
bRetVal = COMMDCB_ParseStrFlag(StrTail,
a_BoolFlags,
sizeof(a_BoolFlags) / sizeof(a_BoolFlags[0]),
&nValue
);
&nValue);
/* failure */
if(!bRetVal) return FALSE;
if(!bRetVal)
return FALSE;
/* success */
*Value = nValue ? TRUE : FALSE;
*Value = (nValue ? TRUE : FALSE);
return TRUE;
}
/*
Parse a decimal integer
*/
BOOL COMMDCB_ParseInt(LPWSTR * StrTail, DWORD * Value)
static BOOL
COMMDCB_ParseInt(LPWSTR *StrTail,
DWORD *Value)
{
LPWSTR pwcPrevTail = *StrTail;
DWORD nValue = wcstoul(*StrTail, StrTail, 10);
/* no character was consumed: failure */
if(pwcPrevTail == *StrTail) return FALSE;
if(pwcPrevTail == *StrTail)
return FALSE;
/* success */
*Value = nValue;
@ -283,32 +258,54 @@ COMMDCB_PARAM_HANDLER(baud)
/* parse the baudrate */
if(!COMMDCB_ParseInt(StrTail, &nValue))
/* failure */
return FALSE;
switch(nValue)
{
/* documented abbreviations */
case 11: Dcb->BaudRate = 110; break;
case 15: Dcb->BaudRate = 150; break;
case 30: Dcb->BaudRate = 300; break;
case 60: Dcb->BaudRate = 600; break;
case 12: Dcb->BaudRate = 1200; break;
case 24: Dcb->BaudRate = 2400; break;
case 48: Dcb->BaudRate = 4800; break;
case 96: Dcb->BaudRate = 9600; break;
case 19: Dcb->BaudRate = 19200; break;
case 11:
Dcb->BaudRate = 110;
break;
case 15:
Dcb->BaudRate = 150;
break;
case 30:
Dcb->BaudRate = 300;
break;
case 60:
Dcb->BaudRate = 600;
break;
case 12:
Dcb->BaudRate = 1200;
break;
case 24:
Dcb->BaudRate = 2400;
break;
case 48:
Dcb->BaudRate = 4800;
break;
case 96:
Dcb->BaudRate = 9600;
break;
case 19:
Dcb->BaudRate = 19200;
break;
/* literal value */
default: Dcb->BaudRate = nValue; break;
default:
Dcb->BaudRate = nValue;
break;
}
/* if the stop bits haven't been specified explicitely */
if(!(*StopBitsSet))
{
/* default the stop bits to 2 for 110 baud */
if(Dcb->BaudRate == 110) Dcb->StopBits = TWOSTOPBITS;
if(Dcb->BaudRate == 110)
Dcb->StopBits = TWOSTOPBITS;
/* else, default the stop bits to 1 */
else Dcb->StopBits = ONESTOPBIT;
else
Dcb->StopBits = ONESTOPBIT;
}
/* success */
@ -325,11 +322,11 @@ COMMDCB_PARAM_HANDLER(data)
/* parse the data bits */
if(!COMMDCB_ParseInt(StrTail, &nValue))
/* failure */
return FALSE;
/* value out of range: failure */
if(nValue < 5 || nValue > 8) return FALSE;
if(nValue < 5 || nValue > 8)
return FALSE;
/* success */
Dcb->ByteSize = nValue;
@ -341,8 +338,7 @@ COMMDCB_PARAM_HANDLER(dtr)
{
BOOL bRetVal;
ULONG_PTR nValue;
static COMMDCB_PARAM_STRFLAG a_DTRFlags[] =
{
static COMMDCB_PARAM_STRFLAG a_DTRFlags[] = {
{ ROS_STRING_INITIALIZER(L"hs"), DTR_CONTROL_HANDSHAKE },
{ ROS_STRING_INITIALIZER(L"off"), DTR_CONTROL_DISABLE },
{ ROS_STRING_INITIALIZER(L"on"), DTR_CONTROL_ENABLE }
@ -352,16 +348,14 @@ COMMDCB_PARAM_HANDLER(dtr)
(void)StopBitsSet;
/* parse the flag */
bRetVal = COMMDCB_ParseStrFlag
(
StrTail,
bRetVal = COMMDCB_ParseStrFlag(StrTail,
a_DTRFlags,
sizeof(a_DTRFlags) / sizeof(a_DTRFlags[0]),
&nValue
);
&nValue);
/* failure */
if(!bRetVal) return FALSE;
if(!bRetVal)
return FALSE;
/* success */
Dcb->fDtrControl = nValue;
@ -378,7 +372,6 @@ COMMDCB_PARAM_HANDLER(idsr)
/* parse the flag */
if(!COMMDCB_ParseBool(StrTail, &bValue))
/* failure */
return FALSE;
/* success */
@ -396,7 +389,6 @@ COMMDCB_PARAM_HANDLER(octs)
/* parse the flag */
if(!COMMDCB_ParseBool(StrTail, &bValue))
/* failure */
return FALSE;
/* success */
@ -414,7 +406,6 @@ COMMDCB_PARAM_HANDLER(odsr)
/* parse the flag */
if(!COMMDCB_ParseBool(StrTail, &bValue))
/* failure */
return FALSE;
/* success */
@ -427,8 +418,7 @@ COMMDCB_PARAM_HANDLER(parity)
{
BOOL bRetVal;
ULONG_PTR nValue;
static COMMDCB_PARAM_CHARFLAG a_ParityFlags[] =
{
static COMMDCB_PARAM_CHARFLAG a_ParityFlags[] = {
{ L'e', EVENPARITY },
{ L'm', MARKPARITY },
{ L'n', NOPARITY },
@ -440,16 +430,14 @@ COMMDCB_PARAM_HANDLER(parity)
(void)StopBitsSet;
/* parse the flag */
bRetVal = COMMDCB_ParseCharFlag
(
StrTail,
bRetVal = COMMDCB_ParseCharFlag(StrTail,
a_ParityFlags,
sizeof(a_ParityFlags) / sizeof(a_ParityFlags[0]),
&nValue
);
&nValue);
/* failure */
if(!bRetVal) return FALSE;
if(!bRetVal)
return FALSE;
/* success */
Dcb->Parity = nValue;
@ -461,8 +449,7 @@ COMMDCB_PARAM_HANDLER(rts)
{
DWORD nRetVal;
ULONG_PTR nValue;
static COMMDCB_PARAM_STRFLAG a_RTSFlags[] =
{
static COMMDCB_PARAM_STRFLAG a_RTSFlags[] = {
{ ROS_STRING_INITIALIZER(L"hs"), RTS_CONTROL_HANDSHAKE },
{ ROS_STRING_INITIALIZER(L"off"), RTS_CONTROL_DISABLE },
{ ROS_STRING_INITIALIZER(L"on"), RTS_CONTROL_ENABLE },
@ -473,16 +460,14 @@ COMMDCB_PARAM_HANDLER(rts)
(void)StopBitsSet;
/* parse the flag */
nRetVal = COMMDCB_ParseStrFlag
(
StrTail,
nRetVal = COMMDCB_ParseStrFlag(StrTail,
a_RTSFlags,
sizeof(a_RTSFlags) / sizeof(a_RTSFlags[0]),
&nValue
);
&nValue);
/* failure */
if(!nRetVal) return FALSE;
if(!nRetVal)
return FALSE;
/* success */
Dcb->fRtsControl = nValue;
@ -494,8 +479,7 @@ COMMDCB_PARAM_HANDLER(stop)
{
BOOL bRetVal;
ULONG_PTR nValue;
static COMMDCB_PARAM_STRFLAG a_StopFlags[] =
{
static COMMDCB_PARAM_STRFLAG a_StopFlags[] = {
{ ROS_STRING_INITIALIZER(L"1"), ONESTOPBIT },
{ ROS_STRING_INITIALIZER(L"1.5"), ONE5STOPBITS },
{ ROS_STRING_INITIALIZER(L"2"), TWOSTOPBITS }
@ -504,16 +488,14 @@ COMMDCB_PARAM_HANDLER(stop)
(void)Timeouts;
/* parse the flag */
bRetVal = COMMDCB_ParseStrFlag
(
StrTail,
bRetVal = COMMDCB_ParseStrFlag(StrTail,
a_StopFlags,
sizeof(a_StopFlags) / sizeof(a_StopFlags[0]),
&nValue
);
&nValue);
/* failure */
if(!bRetVal) return FALSE;
if(!bRetVal)
return FALSE;
/* tell the baud= handler that the stop bits have been specified explicitely */
*StopBitsSet = TRUE;
@ -533,7 +515,6 @@ COMMDCB_PARAM_HANDLER(to)
/* parse the flag */
if(!COMMDCB_ParseBool(StrTail, &bValue))
/* failure */
return FALSE;
/* for BuildCommDCB(), Timeouts is NULL */
@ -545,10 +526,16 @@ COMMDCB_PARAM_HANDLER(to)
Timeouts->ReadTotalTimeoutConstant = 0;
Timeouts->WriteTotalTimeoutMultiplier = 0;
if(bValue)
{
/* timeout */
if(bValue) Timeouts->WriteTotalTimeoutConstant = 60000;
Timeouts->WriteTotalTimeoutConstant = 60000;
}
else
{
/* no timeout */
else Timeouts->WriteTotalTimeoutConstant = 0;
Timeouts->WriteTotalTimeoutConstant = 0;
}
}
/* success */
@ -565,13 +552,18 @@ COMMDCB_PARAM_HANDLER(xon)
/* parse the flag */
if(!COMMDCB_ParseBool(StrTail, &bValue))
/* failure */
return FALSE;
if(bValue)
{
/* XON/XOFF */
if(bValue) Dcb->fInX = Dcb->fOutX = TRUE;
Dcb->fInX = Dcb->fOutX = TRUE;
}
else
{
/* no XON/XOFF */
else Dcb->fInX = Dcb->fOutX = FALSE;
Dcb->fInX = Dcb->fOutX = FALSE;
}
/* success */
return TRUE;
@ -580,7 +572,7 @@ COMMDCB_PARAM_HANDLER(xon)
/* FUNCTIONS */
#define COMMDCB_PARAM(__P__) \
{ \
ROS_STRING_INITIALIZER(_L(#__P__)), \
ROS_STRING_INITIALIZER( L""#__P__ ), \
(ULONG_PTR)&COMMDCB_ ## __P__ ## Param \
}
@ -589,38 +581,33 @@ COMMDCB_PARAM_HANDLER(xon)
*/
BOOL
STDCALL
BuildCommDCBAndTimeoutsW
(
LPCWSTR lpDef,
BuildCommDCBAndTimeoutsW(LPCWSTR lpDef,
LPDCB lpDCB,
LPCOMMTIMEOUTS lpCommTimeouts
)
LPCOMMTIMEOUTS lpCommTimeouts)
{
/* tell the baud= handler that the stop bits should be defaulted */
BOOL bStopBitsSet = FALSE;
/* parameter validation */
if(lpDCB->DCBlength != sizeof(DCB)) goto InvalidParam;
if(lpDCB->DCBlength != sizeof(DCB))
goto InvalidParam;
/* set defaults */
lpDCB->StopBits = ONESTOPBIT;
/*
The documentation for MODE says that data= defaults to 7, but BuildCommDCB
doesn't seem to set it
* The documentation for MODE says that data= defaults to 7, but BuildCommDCB
* doesn't seem to set it
*/
/* lpDCB->ByteSize = 7; */
/* skip COMx[n] */
if
(
lpDef[0] &&
if(lpDef[0] &&
towupper(lpDef[0]) == L'C' &&
lpDef[1] &&
towupper(lpDef[1]) == L'O' &&
lpDef[2] &&
towupper(lpDef[2]) == L'M'
)
towupper(lpDef[2]) == L'M')
{
DWORD nDummy;
@ -628,23 +615,26 @@ BuildCommDCBAndTimeoutsW
lpDef += 3;
/* premature end of string */
if(!lpDef[0]) goto InvalidParam;
if(!lpDef[0])
goto InvalidParam;
/* skip "x" */
if(!COMMDCB_ParseInt((LPWSTR *)&lpDef, &nDummy)) goto InvalidParam;
if(!COMMDCB_ParseInt((LPWSTR *)&lpDef, &nDummy))
goto InvalidParam;
/* skip ":" */
if(lpDef[0] == L':') ++ lpDef;
if(lpDef[0] == L':')
lpDef++;
}
/* skip leading whitespace */
while(lpDef[0] && iswspace(lpDef[0])) ++ lpDef;
while(lpDef[0] && iswspace(lpDef[0]))
lpDef++;
/* repeat until the end of the string */
while(lpDef[0])
{
static COMMDCB_PARAM_STRFLAG a_Params[] =
{
static COMMDCB_PARAM_STRFLAG a_Params[] = {
COMMDCB_PARAM(baud),
COMMDCB_PARAM(data),
COMMDCB_PARAM(dtr),
@ -663,10 +653,12 @@ BuildCommDCBAndTimeoutsW
LPWSTR pwcPrevTail = (LPWSTR)lpDef;
/* get the parameter */
while(lpDef[0] && lpDef[0] != L'=') ++ lpDef;
while(lpDef[0] && lpDef[0] != L'=')
lpDef++;
/* premature end of string */
if(!lpDef[0]) goto InvalidParam;
if(!lpDef[0])
goto InvalidParam;
/* build the parameter's UNICODE_STRING */
wstrParam.Buffer = pwcPrevTail;
@ -674,34 +666,31 @@ BuildCommDCBAndTimeoutsW
wstrParam.MaximumLength = wstrParam.Length;
/* skip the "=" */
++ lpDef;
lpDef++;
/* lookup the callback for the parameter */
bRetVal = COMMDCB_LookupStrFlag
(
&wstrParam,
bRetVal = COMMDCB_LookupStrFlag(&wstrParam,
a_Params,
sizeof(a_Params) / sizeof(a_Params[0]),
(ULONG_PTR *)&pCallback
);
(ULONG_PTR *)&pCallback);
/* invalid parameter */
if(!bRetVal) goto InvalidParam;
if(!bRetVal)
goto InvalidParam;
/* call the callback to parse the parameter's argument */
if(!pCallback(lpDCB, lpCommTimeouts, &bStopBitsSet, (LPWSTR *)&lpDef))
/* failure */
goto InvalidParam;
/* skip trailing whitespace */
while(lpDef[0] && iswspace(lpDef[0])) ++ lpDef;
while(lpDef[0] && iswspace(lpDef[0]))
lpDef++;
}
/* success */
return TRUE;
InvalidParam:
/* failure */
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
@ -712,20 +701,22 @@ InvalidParam:
*/
BOOL
STDCALL
BuildCommDCBAndTimeoutsA(LPCSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTimeouts)
BuildCommDCBAndTimeoutsA(LPCSTR lpDef,
LPDCB lpDCB,
LPCOMMTIMEOUTS lpCommTimeouts)
{
NTSTATUS nErrCode;
NTSTATUS Status;
BOOL bRetVal;
ANSI_STRING strDef;
UNICODE_STRING wstrDef;
RtlInitAnsiString(&strDef, (LPSTR)lpDef);
nErrCode = RtlAnsiStringToUnicodeString(&wstrDef, &strDef, TRUE);
Status = RtlAnsiStringToUnicodeString(&wstrDef, &strDef, TRUE);
if(!NT_SUCCESS(nErrCode))
if(!NT_SUCCESS(Status))
{
SetLastErrorByStatus(nErrCode);
SetLastErrorByStatus(Status);
return FALSE;
}