2009-01-05 12:41:34 +00:00
|
|
|
/*
|
|
|
|
* PROJECT: ReactOS Automatic Testing Utility
|
|
|
|
* LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
|
|
|
|
* PURPOSE: Various helper functions
|
|
|
|
* COPYRIGHT: Copyright 2008-2009 Colin Finck <colin@reactos.org>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Escapes a string according to RFC 1738.
|
|
|
|
* Required for passing parameters to the web service.
|
|
|
|
*
|
|
|
|
* @param Output
|
|
|
|
* Pointer to a CHAR array, which will receive the escaped string.
|
|
|
|
* The output buffer must be large enough to hold the full escaped string. You're on the safe side
|
|
|
|
* if you make the output buffer three times as large as the input buffer.
|
|
|
|
*
|
|
|
|
* @param Input
|
|
|
|
* Pointer to a CHAR array, which contains the input buffer to escape.
|
|
|
|
*/
|
|
|
|
VOID
|
|
|
|
EscapeString(PCHAR Output, PCHAR Input)
|
|
|
|
{
|
|
|
|
const CHAR HexCharacters[] = "0123456789ABCDEF";
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~", *Input) )
|
|
|
|
{
|
|
|
|
/* It's a character we don't need to escape, just add it to the output string */
|
|
|
|
*Output++ = *Input;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* We need to escape this character */
|
|
|
|
*Output++ = '%';
|
|
|
|
*Output++ = HexCharacters[((UCHAR)*Input >> 4) % 16];
|
|
|
|
*Output++ = HexCharacters[(UCHAR)*Input % 16];
|
|
|
|
}
|
2009-01-17 19:58:18 +00:00
|
|
|
}
|
|
|
|
while(*++Input);
|
2009-01-05 12:41:34 +00:00
|
|
|
|
|
|
|
*Output = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Outputs a string through the standard output and the debug output.
|
2009-01-17 19:58:18 +00:00
|
|
|
* The string may have LF or CRLF line endings.
|
2009-01-05 12:41:34 +00:00
|
|
|
*
|
|
|
|
* @param String
|
|
|
|
* The string to output
|
|
|
|
*/
|
|
|
|
VOID
|
|
|
|
StringOut(PCHAR String)
|
|
|
|
{
|
2009-01-17 19:58:18 +00:00
|
|
|
PCHAR NewString;
|
|
|
|
PCHAR pNewString;
|
|
|
|
size_t Length;
|
|
|
|
|
|
|
|
/* The piped output of the tests may use CRLF line endings, so convert them to LF.
|
|
|
|
As both printf and OutputDebugStringA operate in text mode, the line-endings will be properly converted again later. */
|
|
|
|
Length = strlen(String);
|
|
|
|
NewString = HeapAlloc(hProcessHeap, 0, Length + 1);
|
|
|
|
pNewString = NewString;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
/* If this is a CRLF line-ending, only copy a \n to the new string and skip the next character */
|
|
|
|
if(*String == '\r' && *(String + 1) == '\n')
|
|
|
|
{
|
|
|
|
*pNewString = '\n';
|
|
|
|
++String;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Otherwise copy the string */
|
|
|
|
*pNewString = *String;
|
|
|
|
}
|
|
|
|
|
|
|
|
++pNewString;
|
|
|
|
}
|
|
|
|
while(*++String);
|
|
|
|
|
|
|
|
/* Null-terminate it */
|
|
|
|
*pNewString = 0;
|
|
|
|
|
|
|
|
/* Output it */
|
|
|
|
printf(NewString);
|
|
|
|
OutputDebugStringA(NewString);
|
|
|
|
|
|
|
|
/* Cleanup */
|
|
|
|
HeapFree(hProcessHeap, 0, NewString);
|
2009-01-05 12:41:34 +00:00
|
|
|
}
|