2 * PROJECT: ReactOS Automatic Testing Utility
3 * LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
4 * PURPOSE: Various helper functions
5 * COPYRIGHT: Copyright 2008-2009 Colin Finck <colin@reactos.org>
10 #define DBGPRINT_BUFSIZE 511
11 static const char HexCharacters
[] = "0123456789ABCDEF";
14 * Escapes a string according to RFC 1738.
15 * Required for passing parameters to the web service.
18 * Constant pointer to a char array, which contains the input buffer to escape.
21 * The escaped string as std::string.
24 EscapeString(const char* Input
)
26 string ReturnedString
;
30 if(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~", *Input
))
32 /* It's a character we don't need to escape, just add it to the output string */
33 ReturnedString
+= *Input
;
37 /* We need to escape this character */
38 ReturnedString
+= '%';
39 ReturnedString
+= HexCharacters
[((UCHAR
)*Input
>> 4) % 16];
40 ReturnedString
+= HexCharacters
[(UCHAR
)*Input
% 16];
45 return ReturnedString
;
49 * Escapes a string according to RFC 1738.
50 * Required for passing parameters to the web service.
53 * Pointer to a std::string, which contains the input buffer to escape.
56 * The escaped string as std::string.
59 EscapeString(const string
& Input
)
61 return EscapeString(Input
.c_str());
65 * Determines whether a string contains entirely numeric values.
68 * Constant pointer to a char array containing the input to check.
71 * true if the string is entirely numeric, false otherwise.
74 IsNumber(const char* Input
)
89 * Outputs a string through the standard output and the debug output.
90 * The string may have LF or CRLF line endings.
93 * The std::string to output
96 StringOut(const string
& String
)
98 char DbgString
[DBGPRINT_BUFSIZE
+ 1];
102 /* Unify the line endings (the piped output of the tests may use CRLF) */
103 for(i
= 0; i
< String
.size(); i
++)
105 /* If this is a CRLF line-ending, only copy a \n to the new string and skip the next character */
106 if(String
[i
] == '\r' && String
[i
+ 1] == '\n')
113 /* Otherwise copy the string */
114 NewString
+= String
[i
];
118 /* Output the string.
119 For DbgPrint, this must be done in chunks of 512 bytes. */
122 for(i
= 0; i
< NewString
.size(); i
+= DBGPRINT_BUFSIZE
)
126 if(NewString
.size() - i
> DBGPRINT_BUFSIZE
)
127 BytesToCopy
= DBGPRINT_BUFSIZE
;
129 BytesToCopy
= NewString
.size() - i
;
131 memcpy(DbgString
, NewString
.c_str() + i
, BytesToCopy
);
132 DbgString
[BytesToCopy
] = 0;
139 * Gets a value from a specified INI file and returns it converted to ASCII.
142 * Constant pointer to a WCHAR array with the INI section to look in (lpAppName parameter passed to GetPrivateProfileStringW)
145 * Constant pointer to a WCHAR array containing the key to look for in the specified section (lpKeyName parameter passed to GetPrivateProfileStringW)
148 * Constant pointer to a WCHAR array containing the path to the INI file
151 * Returns the data of the value as std::string or an empty string if no data could be retrieved.
154 GetINIValue(PCWCH AppName
, PCWCH KeyName
, PCWCH FileName
)
158 string ReturnedString
;
161 /* Load the value into a temporary Unicode buffer */
162 Length
= GetPrivateProfileStringW(AppName
, KeyName
, NULL
, Buffer
, sizeof(Buffer
) / sizeof(WCHAR
), FileName
);
166 /* Convert the string to ASCII charset */
167 AsciiBuffer
= new char[Length
+ 1];
168 WideCharToMultiByte(CP_ACP
, 0, Buffer
, Length
+ 1, AsciiBuffer
, Length
+ 1, NULL
, NULL
);
170 ReturnedString
= AsciiBuffer
;
174 return ReturnedString
;
178 * Converts an ASCII string to a Unicode one.
181 * Constant pointer to a char array containing the ASCII string
184 * The Unicode string as std::wstring
187 AsciiToUnicode(const char* AsciiString
)
191 wstring ReturnString
;
193 Length
= MultiByteToWideChar(CP_ACP
, 0, AsciiString
, -1, NULL
, 0);
195 UnicodeString
= new WCHAR
[Length
];
196 MultiByteToWideChar(CP_ACP
, 0, AsciiString
, -1, UnicodeString
, Length
);
197 ReturnString
= UnicodeString
;
198 delete UnicodeString
;
204 * Converts an ASCII string to a Unicode one.
207 * Pointer to a std::string containing the ASCII string
210 * The Unicode string as std::wstring
213 AsciiToUnicode(const string
& AsciiString
)
215 return AsciiToUnicode(AsciiString
.c_str());
219 * Converts a Unicode string to an ASCII one.
221 * @param UnicodeString
222 * Constant pointer to a WCHAR array containing the Unicode string
225 * The ASCII string as std::string
228 UnicodeToAscii(PCWSTR UnicodeString
)
234 Length
= WideCharToMultiByte(CP_ACP
, 0, UnicodeString
, -1, NULL
, 0, NULL
, NULL
);
236 AsciiString
= new char[Length
];
237 WideCharToMultiByte(CP_ACP
, 0, UnicodeString
, -1, AsciiString
, Length
, NULL
, NULL
);
238 ReturnString
= AsciiString
;
245 * Converts a Unicode string to an ASCII one.
247 * @param UnicodeString
248 * Pointer to a std::wstring containing the Unicode string
251 * The ASCII string as std::string
254 UnicodeToAscii(const wstring
& UnicodeString
)
256 return UnicodeToAscii(UnicodeString
.c_str());