Quake II RTX doxygen  1.0 dev
tests.c
Go to the documentation of this file.
1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License along
15 with this program; if not, write to the Free Software Foundation, Inc.,
16 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18 
19 #include "shared/shared.h"
20 #include "common/bsp.h"
21 #include "common/cmd.h"
22 #include "common/common.h"
23 #include "common/files.h"
24 #include "common/tests.h"
25 #include "refresh/refresh.h"
26 #include "system/system.h"
27 
28 // test error shutdown procedures
29 static void Com_Error_f(void)
30 {
31  Com_Error(ERR_FATAL, "%s", Cmd_Argv(1));
32 }
33 
34 static void Com_ErrorDrop_f(void)
35 {
36  Com_Error(ERR_DROP, "%s", Cmd_Argv(1));
37 }
38 
39 static void Com_Freeze_f(void)
40 {
41  unsigned time, msec;
42  float seconds;
43 
44  if (Cmd_Argc() < 2) {
45  Com_Printf("Usage: %s <seconds>\n", Cmd_Argv(0));
46  return;
47  }
48 
49  seconds = atof(Cmd_Argv(1));
50  if (seconds < 0) {
51  return;
52  }
53 
54  time = Sys_Milliseconds();
55  msec = seconds * 1000;
56  while (Sys_Milliseconds() - time < msec)
57  ;
58 }
59 
60 // test crash dumps and NX support
61 static void Com_Crash_f(void)
62 {
63  static byte buf1[16];
64  byte buf2[16], *buf3;
65  int i = atoi(Cmd_Argv(1));
66 
67  switch (i) {
68  case 1:
69  // data
70  memset(buf1, 0xcc, 16);
71  buf1[0] = 0xc3;
72  ((void (*)(void))buf1)();
73  break;
74  case 2:
75  // stack
76  memset(buf2, 0xcc, 16);
77  buf2[0] = 0xc3;
78  ((void (*)(void))buf2)();
79  break;
80  case 3:
81  // heap
82  buf3 = Z_Malloc(16);
83  memset(buf3, 0xcc, 16);
84  buf3[0] = 0xc3;
85  ((void (*)(void))buf3)();
86  Z_Free(buf3);
87  break;
88  default:
89  *(uint32_t *)1024 = 0x123456;
90  break;
91  }
92 }
93 
94 // use twice normal print buffer size to test for overflows, etc
95 static void Com_PrintJunk_f(void)
96 {
97  char buf[MAXPRINTMSG * 2];
98  int i, count;
99 
100  // generate some junk
101  for (i = 0; i < sizeof(buf) - 1; i++)
102  buf[i] = 'a' + i % ('z' - 'a' + 1);
103  buf[i] = 0;
104 
105  // randomly break into words
106  for (i = 0; i < 64; i++)
107  buf[rand() % (sizeof(buf) - 1)] = ' ';
108 
109  if (Cmd_Argc() > 1)
110  count = atoi(Cmd_Argv(1));
111  else
112  count = 1;
113 
114  for (i = 0; i < count; i++)
115  Com_Printf("%s", buf);
116  Com_Printf("\n");
117 }
118 
119 static void BSP_Test_f(void)
120 {
121  void **list;
122  char *name;
123  int i, count, errors;
124  bsp_t *bsp;
125  qerror_t ret;
126  unsigned start, end;
127 
128  list = FS_ListFiles("maps", ".bsp", FS_SEARCH_SAVEPATH, &count);
129  if (!list) {
130  Com_Printf("No maps found\n");
131  return;
132  }
133 
134  start = Sys_Milliseconds();
135 
136  errors = 0;
137  for (i = 0; i < count; i++) {
138  name = list[i];
139  ret = BSP_Load(name, &bsp);
140  if (!bsp) {
141  Com_EPrintf("%s: %s\n", name, Q_ErrorString(ret));
142  errors++;
143  continue;
144  }
145 
146  Com_DPrintf("%s: success\n", name);
147  BSP_Free(bsp);
148  }
149 
150  end = Sys_Milliseconds();
151 
152  Com_Printf("%d msec, %d failures, %d maps tested\n",
153  end - start, errors, count);
154 
155  FS_FreeList(list);
156 }
157 
158 typedef struct {
159  const char *filter;
160  const char *string;
161  int result;
162 } wildtest_t;
163 
164 static const wildtest_t wildtests[] = {
165  { "", "", 1 },
166  { "*", "foo", 1 },
167  { "***", "foo", 1 },
168  { "foo*bar", "foobar", 1 },
169  { "foo*bar*baz", "foobaz", 0 },
170  { "bar*", "bar", 1 },
171  { "bar*", "barfoo", 1 },
172  { "???*", "barfoo", 1 },
173  { "???\\*", "bar*", 1 },
174  { "???\\*", "bar*bar", 0 },
175  { "???\\*", "bar?", 0 },
176  { "*\\?", "bar?", 1 },
177  { "\\\\", "\\", 1 },
178  { "\\", "\\", 0 },
179  { "foo*bar\\*baz", "foo*abcbar*baz", 1 },
180  { "\\a\\b\\c", "abc", 1 },
181 };
182 
183 static const int numwildtests = q_countof(wildtests);
184 
185 static void Com_TestWild_f(void)
186 {
187  const wildtest_t *w;
188  qboolean match;
189  int i, errors;
190 
191  errors = 0;
192  for (i = 0; i < numwildtests; i++) {
193  w = &wildtests[i];
194  match = Com_WildCmp(w->filter, w->string);
195  if (match != w->result) {
196  Com_EPrintf(
197  "Com_WildCmp( \"%s\", \"%s\" ) == %d, expected %d\n",
198  w->filter, w->string, match, w->result);
199  errors++;
200  }
201  }
202 
203  Com_Printf("%d failures, %d patterns tested\n",
204  errors, numwildtests);
205 }
206 
207 typedef struct {
208  const char *in;
209  const char *out;
210 } normtest_t;
211 
212 static const normtest_t normtests[] = {
213  { "", "", },
214  { "///", "", },
215  { "foo///", "foo/", },
216  { "\\/\\", "", },
217  { "///foo", "foo" },
218  { "\\/foo", "foo" },
219  { "foo\\bar", "foo/bar" },
220  { "foo/..", "" },
221  { "foo.bar.baz/..", "" },
222  { "foo/../bar", "bar" },
223  { "foo/.././bar", "bar" },
224  { "foo/./../bar", "bar" },
225  { "foo/./bar", "foo/bar" },
226  { "foo//bar", "foo/bar" },
227  { "foo///.////bar", "foo/bar" },
228  { "foo/./././bar", "foo/bar" },
229  { "./foo", "foo" },
230  { "../foo", "foo" },
231  { "../../../foo", "foo" },
232  { "./../../foo", "foo" },
233  { "../bar/../foo", "foo" },
234  { "foo/bar/..", "foo" },
235  { "foo/bar/../", "foo/" },
236  { "foo/bar/.", "foo/bar" },
237  { "foo/bar/./", "foo/bar/" },
238  { "..", "" },
239  { ".", "" },
240  { "/..", "" },
241  { "/.", "" },
242  { "../", "" },
243  { "./", "" },
244  { "/../", "" },
245  { "/./", "" },
246  { "../..", "" },
247  { "../../../../", "" },
248  { "../foo..bar/", "foo..bar/" },
249  { "......./", "......./" },
250 
251  { "foo/bar/baz/abc/../def", "foo/bar/baz/def" },
252  { "foo/bar/baz/abc/../../def", "foo/bar/def" },
253  { "foo/bar/../baz/abc/../def", "foo/baz/def" },
254  { "foo/bar/../../baz/abc/../../def", "def" },
255  { "foo/bar/../../../../baz/abc/../../zzz/../def/ghi", "def/ghi" },
256 };
257 
258 static const int numnormtests = q_countof(normtests);
259 
260 static void Com_TestNorm_f(void)
261 {
262  const normtest_t *n;
263  char buffer[MAX_QPATH];
264  int i, errors, pass;
265 
266  for (pass = 0; pass < 2; pass++) {
267  errors = 0;
268  for (i = 0; i < numnormtests; i++) {
269  n = &normtests[i];
270  if (pass == 0) {
271  FS_NormalizePath(buffer, n->in);
272  } else {
273  // test in place operation
274  strcpy(buffer, n->in);
275  FS_NormalizePath(buffer, buffer);
276  }
277  if (strcmp(n->out, buffer)) {
278  Com_EPrintf(
279  "FS_NormalizePath( \"%s\" ) == \"%s\", expected \"%s\" (pass %d)\n",
280  n->in, buffer, n->out, pass);
281  errors++;
282  }
283  }
284  if (errors)
285  break;
286  }
287 
288  Com_Printf("%d failures, %d paths tested (%d passes)\n",
289  errors, numnormtests, pass);
290 }
291 
292 typedef struct {
293  const char *string;
294  int result;
296 
298  { "", 0 },
299  { "\\", 0 },
300  { "\\\\", 0 },
301  { "\\\\\\", 0 },
302  { "\\\\\\key\\value", 1 },
303  { "\\\\value", 1 },
304  { "\\key\\\\key\\value", 1 },
305  { "\\key\\value", 1 },
306  { "\\key\\value\\", 0 },
307  { "key\\value", 1 },
308  { "key\\value\\", 0 },
309  { "\\key", 0 },
310  { "\\key\\", 0 },
311  { "key", 0 },
312  { "key\\", 0 },
313  { "\\ke;y\\value", 0 },
314  { "\\ke\"y\\value", 0 },
315  { "\\key\\va;lue", 0 },
316  { "\\key\\va\"lue", 0 },
317  { "\\ke\x81y\\value", 0 },
318  { "\\key\\val\x82ue", 0 },
319  { "\\ke\ny\\value", 0 },
320  { "\\key\\val\nue", 0 },
321  { "\\abcdabcdabcdabcd"
322  "abcdabcdabcdabcd"
323  "abcdabcdabcdabcd"
324  "abcdabcdabcdabcd"
325  "\\value", 0 },
326  { "\\key\\"
327  "abcdabcdabcdabcd"
328  "abcdabcdabcdabcd"
329  "abcdabcdabcdabcd"
330  "abcdabcdabcdabcd", 0 },
331 };
332 
333 static const int num_info_validate_tests = q_countof(info_validate_tests);
334 
335 typedef struct {
336  const char *string;
337  const char *key;
338  const char *result;
340 
342  { "", "", "" },
343  { "\\key\\value", "key", "" },
344  { "key\\value", "key", "" },
345  { "\\key1\\value1\\key2\\value2", "key1", "\\key2\\value2" },
346  { "\\key1\\value1\\key2\\value2", "key2", "\\key1\\value1" },
347  { "\\key1\\value1\\key2\\value2\\key1\\value3", "key1", "\\key2\\value2" },
348  { "\\key\\value", "", "\\key\\value" },
349  { "\\\\value", "", "" },
350 };
351 
352 static const int num_info_remove_tests = q_countof(info_remove_tests);
353 
354 typedef struct {
355  const char *string;
356  const char *key;
357  const char *value;
358  int result_b;
359  const char *result_s;
361 
362 static const info_set_test_t info_set_tests[] = {
363  { "", "", "", 1, "" },
364  { "\\key\\value1", "key", "value2", 1, "\\key\\value2" },
365  { "\\key\\value1", "key", "", 1, "" },
366  { "\\key\\value1", "", "value2", 1, "\\key\\value1\\\\value2" },
367  { "\\key\\value1", "ke\"y", "value2", 0, "\\key\\value1" },
368  { "\\key\\value1", "ke\\y", "value2", 0, "\\key\\value1" },
369  { "\\key\\value1", "ke;y", "value2", 0, "\\key\\value1" },
370  { "\\key\\value1", "ke\xa2y", "value2", 0, "\\key\\value1" },
371  { "\\key\\value1", "ke\xdcy", "value2", 0, "\\key\\value1" },
372  { "\\key\\value1", "ke\xbby", "value2", 0, "\\key\\value1" },
373  { "\\key\\value1", "key", "val\"ue2", 0, "\\key\\value1" },
374  { "\\key\\value1", "key", "val\\ue2", 0, "\\key\\value1" },
375  { "\\key\\value1", "key", "val;ue2", 0, "\\key\\value1" },
376  { "\\key\\value1", "key", "val\xa2ue2", 0, "\\key\\value1" },
377  { "\\key\\value1", "key", "val\xdcue2", 0, "\\key\\value1" },
378  { "\\key\\value1", "key", "val\xbbue2", 0, "\\key\\value1" },
379  { "\\key1\\value1\\key2\\value2", "key1", "value3", 1, "\\key2\\value2\\key1\\value3" },
380  { "\\key1\\value1\\key2\\value2", "key1", "", 1, "\\key2\\value2" },
381  { "\\key1\\value1\\key2\\value2\\key1\\value3", "key1", "value4", 1, "\\key2\\value2\\key1\\value4" },
382  { "\\key1\\value1\\key2\\value2", "key1", "v\xe1lue3", 1, "\\key2\\value2\\key1\\value3" },
383  { "\\key\\value", "key", "\r\n", 1, "\\key\\" },
384  { "\\key1\\value1\\key2\\value2", "key1", "\r\n", 1, "\\key2\\value2\\key1\\" },
385 };
386 
387 static const int num_info_set_tests = q_countof(info_set_tests);
388 
389 static void Com_TestInfo_f(void)
390 {
391  const info_validate_test_t *v;
392  const info_remove_test_t *r;
393  const info_set_test_t *s;
394  char buffer[MAX_INFO_STRING];
395  int i, errors;
396  qboolean result;
397 
398  errors = 0;
399  for (i = 0; i < num_info_validate_tests; i++) {
400  v = &info_validate_tests[i];
401  result = Info_Validate(v->string);
402  if (result != v->result) {
403  Com_EPrintf("Info_Validate( \"%s\" ) == %d, expected %d\n",
404  v->string, result, v->result);
405  errors++;
406  }
407  }
408 
409  for (i = 0; i < num_info_remove_tests; i++) {
410  r = &info_remove_tests[i];
411  Q_strlcpy(buffer, r->string, sizeof(buffer));
412  Info_RemoveKey(buffer, r->key);
413  if (strcmp(buffer, r->result)) {
414  Com_EPrintf("Info_RemoveKey( \"%s\", \"%s\" ) == \"%s\", expected \"%s\"\n",
415  r->string, r->key, buffer, r->result);
416  errors++;
417  }
418  }
419 
420  for (i = 0; i < num_info_set_tests; i++) {
421  s = &info_set_tests[i];
422  Q_strlcpy(buffer, s->string, sizeof(buffer));
423  result = Info_SetValueForKey(buffer, s->key, s->value);
424  if (result != s->result_b || strcmp(buffer, s->result_s)) {
425  Com_EPrintf("Info_SetValueForKey( \"%s\", \"%s\", \"%s\" ) == \"%s\" (%d), expected \"%s\" (%d)\n",
426  s->string, s->key, s->value, buffer, result, s->result_s, s->result_b);
427  errors++;
428  }
429  }
430 
431  Com_Printf("%d failures, %d strings tested\n", errors,
435 }
436 
437 typedef struct {
438  size_t size;
439  size_t len1, len2;
440  qboolean overflow1, overflow2;
441  const char *res;
443 
444 #ifdef _WIN32
445 #define OV SIZE_MAX
446 #else
447 #define OV 11
448 #endif
449 
450 static const snprintf_test_t snprintf_tests[] = {
451  { 12, 11, 11, 0, 0, "hello world" },
452  { 11, OV, 10, 1, 0, "hello worl" },
453  { 10, OV, 9, 1, 0, "hello wor" },
454  { 0, 11, 0, 1, 1, "xxxxxxxxxxxxxxx" },
455 };
456 
457 static const int num_snprintf_tests = q_countof(snprintf_tests);
458 
459 static void Com_TestSnprintf_f(void)
460 {
461  const snprintf_test_t *t;
462  char buf[16], *ptr;
463  size_t len;
464  int i, errors;
465  qboolean overflow;
466 
467  errors = 0;
468  for (i = 0; i < num_snprintf_tests; i++) {
469  t = &snprintf_tests[i];
470 
471  ptr = t->size ? buf : NULL;
472 
473  memset(buf, 'x', 15); buf[15] = 0;
474  len = Q_snprintf(ptr, t->size, "hello world");
475  overflow = len >= t->size;
476  if (t->len1 != len || strcmp(buf, t->res) || overflow != t->overflow1) {
477  Com_EPrintf("%s( %p, %"PRIz" ) == \"%s\" (%"PRIz") [%d], expected \"%s\" (%"PRIz") [%d]\n",
478  "Q_snprintf", ptr, t->size, buf, len, overflow, t->res, t->len1, t->overflow1);
479  errors++;
480  }
481 
482  memset(buf, 'x', 15); buf[15] = 0;
483  len = Q_scnprintf(ptr, t->size, "hello world");
484  overflow = len >= t->size;
485  if (t->len2 != len || strcmp(buf, t->res) || overflow != t->overflow2) {
486  Com_EPrintf("%s( %p, %"PRIz" ) == \"%s\" (%"PRIz") [%d], expected \"%s\" (%"PRIz") [%d]\n",
487  "Q_scnprintf", ptr, t->size, buf, len, overflow, t->res, t->len2, t->overflow2);
488  errors++;
489  }
490  }
491 
492  Com_Printf("%d failures, %d strings tested\n", errors, num_snprintf_tests * 2);
493 }
494 
495 #if USE_REF
496 static void Com_TestModels_f(void)
497 {
498  void **list;
499  int i, count, errors;
500  unsigned start, end;
501 
502  list = FS_ListFiles("models", ".md2", FS_SEARCH_SAVEPATH, &count);
503  if (!list) {
504  Com_Printf("No models found\n");
505  return;
506  }
507 
508  start = Sys_Milliseconds();
509 
510  errors = 0;
511  for (i = 0; i < count; i++) {
512  if (!R_RegisterModel(list[i])) {
513  errors++;
514  continue;
515  }
516  }
517 
518  end = Sys_Milliseconds();
519 
520  Com_Printf("%d msec, %d failures, %d models tested\n",
521  end - start, errors, count);
522 
523  FS_FreeList(list);
524 }
525 #endif
526 
527 void TST_Init(void)
528 {
529  Cmd_AddCommand("error", Com_Error_f);
530  Cmd_AddCommand("errordrop", Com_ErrorDrop_f);
531  Cmd_AddCommand("freeze", Com_Freeze_f);
532  Cmd_AddCommand("crash", Com_Crash_f);
533  Cmd_AddCommand("printjunk", Com_PrintJunk_f);
534  Cmd_AddCommand("bsptest", BSP_Test_f);
535  Cmd_AddCommand("wildtest", Com_TestWild_f);
536  Cmd_AddCommand("normtest", Com_TestNorm_f);
537  Cmd_AddCommand("infotest", Com_TestInfo_f);
538  Cmd_AddCommand("snprintftest", Com_TestSnprintf_f);
539 #if USE_REF
540  Cmd_AddCommand("modeltest", Com_TestModels_f);
541 #endif
542 }
543 
Com_TestWild_f
static void Com_TestWild_f(void)
Definition: tests.c:185
num_info_remove_tests
static const int num_info_remove_tests
Definition: tests.c:352
Com_Error_f
static void Com_Error_f(void)
Definition: tests.c:29
info_set_test_t::result_s
const char * result_s
Definition: tests.c:359
info_set_test_t::value
const char * value
Definition: tests.c:357
info_validate_test_t::string
const char * string
Definition: tests.c:293
Info_Validate
qboolean Info_Validate(const char *s)
Definition: shared.c:1040
normtests
static const normtest_t normtests[]
Definition: tests.c:212
Q_snprintf
size_t Q_snprintf(char *dest, size_t size, const char *fmt,...)
Definition: shared.c:846
num_info_validate_tests
static const int num_info_validate_tests
Definition: tests.c:333
BSP_Test_f
static void BSP_Test_f(void)
Definition: tests.c:119
Cmd_AddCommand
void Cmd_AddCommand(const char *name, xcommand_t function)
Definition: cmd.c:1562
Com_PrintJunk_f
static void Com_PrintJunk_f(void)
Definition: tests.c:95
wildtests
static const wildtest_t wildtests[]
Definition: tests.c:164
wildtest_t::string
const char * string
Definition: tests.c:160
Q_ErrorString
const char * Q_ErrorString(qerror_t error)
Definition: error.c:51
snprintf_test_t::len1
size_t len1
Definition: tests.c:439
FS_FreeList
void FS_FreeList(void **list)
Definition: files.c:2939
info_remove_tests
static const info_remove_test_t info_remove_tests[]
Definition: tests.c:341
info_validate_tests
static const info_validate_test_t info_validate_tests[]
Definition: tests.c:297
info_set_test_t::key
const char * key
Definition: tests.c:356
wildtest_t
Definition: tests.c:158
snprintf_test_t::res
const char * res
Definition: tests.c:441
numnormtests
static const int numnormtests
Definition: tests.c:258
info_set_test_t::result_b
int result_b
Definition: tests.c:358
info_set_test_t
Definition: tests.c:354
Com_Crash_f
static void Com_Crash_f(void)
Definition: tests.c:61
Cmd_Argv
char * Cmd_Argv(int arg)
Definition: cmd.c:899
Sys_Milliseconds
unsigned Sys_Milliseconds(void)
Definition: system.c:644
Cmd_Argc
int Cmd_Argc(void)
Definition: cmd.c:889
num_snprintf_tests
static const int num_snprintf_tests
Definition: tests.c:457
snprintf_test_t::overflow2
qboolean overflow2
Definition: tests.c:440
Com_Error
void Com_Error(error_type_t type, const char *fmt,...)
Definition: g_main.c:258
BSP_Free
void BSP_Free(bsp_t *bsp)
Definition: bsp.c:932
R_RegisterModel
qhandle_t R_RegisterModel(const char *name)
Definition: models.c:305
info_remove_test_t::result
const char * result
Definition: tests.c:338
wildtest_t::filter
const char * filter
Definition: tests.c:159
normtest_t
Definition: tests.c:207
Z_Free
void Z_Free(void *ptr)
Definition: zone.c:147
Com_ErrorDrop_f
static void Com_ErrorDrop_f(void)
Definition: tests.c:34
normtest_t::in
const char * in
Definition: tests.c:208
FS_ListFiles
void ** FS_ListFiles(const char *path, const char *filter, unsigned flags, int *count_p)
Definition: files.c:2716
snprintf_test_t::size
size_t size
Definition: tests.c:438
info_remove_test_t
Definition: tests.c:335
TST_Init
void TST_Init(void)
Definition: tests.c:527
snprintf_test_t
Definition: tests.c:437
void
void(APIENTRY *qwglDrawBuffer)(GLenum mode)
Q_strlcpy
size_t Q_strlcpy(char *dst, const char *src, size_t size)
Definition: shared.c:715
OV
#define OV
Definition: tests.c:445
snprintf_test_t::overflow1
qboolean overflow1
Definition: tests.c:440
snprintf_tests
static const snprintf_test_t snprintf_tests[]
Definition: tests.c:450
snprintf_test_t::len2
size_t len2
Definition: tests.c:439
Com_TestSnprintf_f
static void Com_TestSnprintf_f(void)
Definition: tests.c:459
Com_TestNorm_f
static void Com_TestNorm_f(void)
Definition: tests.c:260
Com_TestInfo_f
static void Com_TestInfo_f(void)
Definition: tests.c:389
info_remove_test_t::string
const char * string
Definition: tests.c:336
info_validate_test_t::result
int result
Definition: tests.c:294
num_info_set_tests
static const int num_info_set_tests
Definition: tests.c:387
info_set_test_t::string
const char * string
Definition: tests.c:355
BSP_Load
qerror_t BSP_Load(const char *name, bsp_t **bsp_p)
Definition: bsp.c:1087
Com_Freeze_f
static void Com_Freeze_f(void)
Definition: tests.c:39
Info_SetValueForKey
qboolean Info_SetValueForKey(char *s, const char *key, const char *value)
Definition: shared.c:1137
wildtest_t::result
int result
Definition: tests.c:161
numwildtests
static const int numwildtests
Definition: tests.c:183
Q_scnprintf
size_t Q_scnprintf(char *dest, size_t size, const char *fmt,...)
Definition: shared.c:867
info_validate_test_t
Definition: tests.c:292
FS_NormalizePath
size_t FS_NormalizePath(char *out, const char *in)
Definition: files.c:331
info_set_tests
static const info_set_test_t info_set_tests[]
Definition: tests.c:362
Info_RemoveKey
void Info_RemoveKey(char *s, const char *key)
Definition: shared.c:991
normtest_t::out
const char * out
Definition: tests.c:209
info_remove_test_t::key
const char * key
Definition: tests.c:337