ReactOS  0.4.15-dev-320-g2dc9f0a
tools.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Automatic Testing Utility
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: Various helper functions
5  * COPYRIGHT: Copyright 2008-2015 Colin Finck (colin@reactos.org)
6  */
7 
8 #include "precomp.h"
9 
10 #define DBGPRINT_BUFSIZE 511
11 static const char HexCharacters[] = "0123456789ABCDEF";
12 
23 string
24 EscapeString(const char* Input)
25 {
26  string ReturnedString;
27 
28  do
29  {
30  if(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~", *Input))
31  {
32  /* It's a character we don't need to escape, just add it to the output string */
33  ReturnedString += *Input;
34  }
35  else
36  {
37  /* We need to escape this character */
38  ReturnedString += '%';
39  ReturnedString += HexCharacters[((UCHAR)*Input >> 4) % 16];
40  ReturnedString += HexCharacters[(UCHAR)*Input % 16];
41  }
42  }
43  while(*++Input);
44 
45  return ReturnedString;
46 }
47 
58 string
59 EscapeString(const string& Input)
60 {
61  return EscapeString(Input.c_str());
62 }
63 
73 bool
74 IsNumber(const char* Input)
75 {
76  do
77  {
78  if(!isdigit(*Input))
79  return false;
80 
81  ++Input;
82  }
83  while(*Input);
84 
85  return true;
86 }
87 
95 string
96 StringOut(const string& String, bool forcePrint)
97 {
98  char DbgString[DBGPRINT_BUFSIZE + 1];
99  size_t i, start = 0, last_newline = 0, size = 0, curr_pos = 0;
100  string NewString;
101 
102  /* Unify the line endings (the piped output of the tests may use CRLF) */
103  for(i = 0; i < String.size(); i++)
104  {
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')
107  {
108  NewString += '\n';
109  ++i;
110  }
111  else
112  {
113  /* Otherwise copy the string */
114  NewString += String[i];
115  }
116 
117  curr_pos = NewString.size();
118 
119  /* Try to print whole lines but obey the 512 bytes chunk size limit*/
120  if(NewString[curr_pos - 1] == '\n' || (curr_pos - start) == DBGPRINT_BUFSIZE)
121  {
122  if((curr_pos - start) >= DBGPRINT_BUFSIZE)
123  {
124  /* No newlines so far, or the string just fits */
125  if(last_newline <= start || ((curr_pos - start == DBGPRINT_BUFSIZE) && NewString[curr_pos - 1] == '\n'))
126  {
127  size = curr_pos - start;
128  memcpy(DbgString, NewString.c_str() + start, size);
129  start = curr_pos;
130  }
131  else
132  {
133  size = last_newline - start;
134  memcpy(DbgString, NewString.c_str() + start, size);
135  start = last_newline;
136  }
137 
138  DbgString[size] = 0;
139  DbgPrint("%s", DbgString);
140  }
141 
142  last_newline = curr_pos;
143  }
144  }
145 
146  size = curr_pos - start;
147 
148  /* Only print if forced to or if the rest is a whole line */
149  if(forcePrint == true || NewString[curr_pos - 1] == '\n')
150  {
151  /* Output the whole string */
152  if(Configuration.DoPrint())
153  cout << NewString << flush;
154 
155  memcpy(DbgString, NewString.c_str() + start, size);
156  DbgString[size] = 0;
157  DbgPrint("%s", DbgString);
158 
159  NewString.clear();
160  return NewString;
161  }
162 
163  /* Output full lines only */
164  if(Configuration.DoPrint())
165  cout << NewString.substr(0, start) << flush;
166 
167  /* Return the remaining chunk */
168  return NewString.substr(start, size);
169 }
170 
186 string
188 {
189  DWORD Length;
190  PCHAR AsciiBuffer;
191  string ReturnedString;
192  WCHAR Buffer[2048];
193 
194  /* Load the value into a temporary Unicode buffer */
196 
197  if(Length)
198  {
199  /* Convert the string to ASCII charset */
200  AsciiBuffer = new char[Length + 1];
201  WideCharToMultiByte(CP_ACP, 0, Buffer, Length + 1, AsciiBuffer, Length + 1, NULL, NULL);
202 
203  ReturnedString = AsciiBuffer;
204  delete[] AsciiBuffer;
205  }
206 
207  return ReturnedString;
208 }
209 
219 wstring
220 AsciiToUnicode(const char* AsciiString)
221 {
222  DWORD Length;
224  wstring ReturnString;
225 
226  Length = MultiByteToWideChar(CP_ACP, 0, AsciiString, -1, NULL, 0);
227 
228  UnicodeString = new WCHAR[Length];
229  MultiByteToWideChar(CP_ACP, 0, AsciiString, -1, UnicodeString, Length);
230  ReturnString = UnicodeString;
231  delete UnicodeString;
232 
233  return ReturnString;
234 }
235 
245 wstring
246 AsciiToUnicode(const string& AsciiString)
247 {
248  return AsciiToUnicode(AsciiString.c_str());
249 }
250 
260 string
262 {
263  DWORD Length;
264  PCHAR AsciiString;
265  string ReturnString;
266 
268 
269  AsciiString = new char[Length];
270  WideCharToMultiByte(CP_ACP, 0, UnicodeString, -1, AsciiString, Length, NULL, NULL);
271  ReturnString = AsciiString;
272  delete AsciiString;
273 
274  return ReturnString;
275 }
276 
286 string
288 {
289  return UnicodeToAscii(UnicodeString.c_str());
290 }
signed char * PCHAR
Definition: retypes.h:7
CONST WCHAR * PCWCH
Definition: ntbasedef.h:418
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4711
const uint16_t * PCWSTR
Definition: typedefs.h:56
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
*BytesInUnicodeString PWCH UnicodeString
Definition: rtlfuncs.h:1979
#define WideCharToMultiByte
Definition: compat.h:101
#define DbgPrint
Definition: loader.c:25
uint16_t * PWSTR
Definition: typedefs.h:55
#define CP_ACP
Definition: compat.h:99
Definition: arc.h:84
static CHAR AppName[MAX_PATH]
Definition: dem.c:252
static WCHAR String[]
Definition: stringtable.c:55
#define cout
Definition: iostream.cpp:38
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
static const char HexCharacters[]
Definition: tools.cpp:11
#define isdigit(c)
Definition: acclib.h:68
GLsizeiptr size
Definition: glext.h:5919
string GetINIValue(PCWCH AppName, PCWCH KeyName, PCWCH FileName)
Definition: tools.cpp:187
#define DBGPRINT_BUFSIZE
Definition: tools.cpp:10
__wchar_t WCHAR
Definition: xmlstorage.h:180
string UnicodeToAscii(PCWSTR UnicodeString)
Definition: tools.cpp:261
unsigned long DWORD
Definition: ntddk_ex.h:95
int flush
Definition: zlib.h:309
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
string EscapeString(const char *Input)
Definition: tools.cpp:24
unsigned char UCHAR
Definition: xmlstorage.h:181
bool DoPrint() const
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
CConfiguration Configuration
Definition: main.cpp:11
GLuint start
Definition: gl.h:1545
bool IsNumber(const char *Input)
Definition: tools.cpp:74
#define MultiByteToWideChar
Definition: compat.h:100
char * strchr(const char *String, int ch)
Definition: utclib.c:501
wstring AsciiToUnicode(const char *AsciiString)
Definition: tools.cpp:220
string StringOut(const string &String, bool forcePrint)
Definition: tools.cpp:96