Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2005 - 2006, Marco Barisione <marco (at) barisione.org>
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Lesser General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library 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 GNU
     12  * Lesser General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Lesser General Public
     15  * License along with this library; if not, write to the
     16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     17  * Boston, MA 02111-1307, USA.
     18  */
     19 
     20 #undef G_DISABLE_ASSERT
     21 #undef G_LOG_DOMAIN
     22 
     23 #include <string.h>
     24 #include <locale.h>
     25 #include "glib.h"
     26 
     27 #ifdef ENABLE_REGEX
     28 
     29 /* U+20AC EURO SIGN (symbol, currency) */
     30 #define EURO "\xe2\x82\xac"
     31 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE (letter, lowercase) */
     32 #define AGRAVE "\xc3\xa0"
     33 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE (letter, uppercase) */
     34 #define AGRAVE_UPPER "\xc3\x80"
     35 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE (letter, lowercase) */
     36 #define EGRAVE "\xc3\xa8"
     37 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE (letter, lowercase) */
     38 #define OGRAVE "\xc3\xb2"
     39 /* U+014B LATIN SMALL LETTER ENG (letter, lowercase) */
     40 #define ENG "\xc5\x8b"
     41 /* U+0127 LATIN SMALL LETTER H WITH STROKE (letter, lowercase) */
     42 #define HSTROKE "\xc4\xa7"
     43 /* U+0634 ARABIC LETTER SHEEN (letter, other) */
     44 #define SHEEN "\xd8\xb4"
     45 /* U+1374 ETHIOPIC NUMBER THIRTY (number, other) */
     46 #define ETH30 "\xe1\x8d\xb4"
     47 
     48 /* A random value use to mark untouched integer variables. */
     49 #define UNTOUCHED -559038737
     50 
     51 static gboolean noisy = FALSE;
     52 static gboolean abort_on_fail = FALSE;
     53 
     54 #define PASS passed++
     55 #define FAIL \
     56   G_STMT_START \
     57     { \
     58       failed++; \
     59       if (abort_on_fail) \
     60 	goto end; \
     61     } \
     62   G_STMT_END
     63 
     64 /* A replacement for strcmp that doesn't crash with null pointers. */
     65 static gboolean
     66 streq (const gchar *s1, const gchar *s2)
     67 {
     68   if (s1 == NULL && s2 == NULL)
     69     return TRUE;
     70   else if (s1 == NULL)
     71     return FALSE;
     72   else if (s2 == NULL)
     73     return FALSE;
     74   else
     75     return strcmp (s1, s2) == 0;
     76 }
     77 
     78 static void
     79 verbose (const gchar *format, ...)
     80 {
     81   /* Function copied from glib/tests/patterntest.c by Matthias Clasen. */
     82   gchar *msg;
     83   va_list args;
     84 
     85   va_start (args, format);
     86   msg = g_strdup_vprintf (format, args);
     87   va_end (args);
     88 
     89   if (noisy)
     90     g_print ("%s", msg);
     91   g_free (msg);
     92 }
     93 
     94 static gboolean
     95 test_new (const gchar        *pattern,
     96 	  GRegexCompileFlags  compile_opts,
     97 	  GRegexMatchFlags    match_opts)
     98 {
     99   GRegex *regex;
    100 
    101   verbose ("compiling \"%s\" \t", pattern);
    102 
    103   regex = g_regex_new (pattern, compile_opts, match_opts, NULL);
    104   if (regex == NULL)
    105     {
    106       g_print ("failed \t(pattern: \"%s\", compile: %d, match %d)\n",
    107 	       pattern, compile_opts, match_opts);
    108       return FALSE;
    109     }
    110 
    111   if (!streq (g_regex_get_pattern (regex), pattern))
    112     {
    113       g_print ("failed \t(pattern: \"%s\")\n",
    114 	       pattern);
    115       g_regex_unref (regex);
    116       return FALSE;
    117     }
    118 
    119   g_regex_unref (regex);
    120 
    121   verbose ("passed\n");
    122   return TRUE;
    123 }
    124 
    125 #define TEST_NEW(pattern, compile_opts, match_opts) { \
    126   total++; \
    127   if (test_new (pattern, compile_opts, match_opts)) \
    128     PASS; \
    129   else \
    130     FAIL; \
    131 }
    132 
    133 static gboolean
    134 test_new_fail (const gchar        *pattern,
    135 	       GRegexCompileFlags  compile_opts,
    136 	       GRegexError         expected_error)
    137 {
    138   GRegex *regex;
    139   GError *error = NULL;
    140 
    141   verbose ("compiling \"%s\" (expected a failure) \t", pattern);
    142 
    143   regex = g_regex_new (pattern, compile_opts, 0, &error);
    144 
    145   if (regex != NULL)
    146     {
    147       g_print ("failed \t(pattern: \"%s\", compile: %d)\n",
    148 	       pattern, compile_opts);
    149       g_regex_unref (regex);
    150       return FALSE;
    151     }
    152 
    153   if (error->code != expected_error)
    154     {
    155       g_print ("failed \t(pattern: \"%s\", compile: %d, got error: %d, "
    156 	       "expected error: %d)\n",
    157 	       pattern, compile_opts, error->code, expected_error);
    158       g_error_free (error);
    159       return FALSE;
    160     }
    161 
    162   verbose ("passed\n");
    163   return TRUE;
    164 }
    165 
    166 #define TEST_NEW_FAIL(pattern, compile_opts, expected_error) { \
    167   total++; \
    168   if (test_new_fail (pattern, compile_opts, expected_error)) \
    169     PASS; \
    170   else \
    171     FAIL; \
    172 }
    173 
    174 static gboolean
    175 test_match_simple (const gchar        *pattern,
    176 		   const gchar        *string,
    177 		   GRegexCompileFlags  compile_opts,
    178 		   GRegexMatchFlags    match_opts,
    179 		   gboolean            expected)
    180 {
    181   gboolean match;
    182 
    183   verbose ("matching \"%s\" against \"%s\" \t", string, pattern);
    184 
    185   match = g_regex_match_simple (pattern, string, compile_opts, match_opts);
    186   if (match != expected)
    187     {
    188       g_print ("failed \t(unexpected %s)\n", match ? "match" : "mismatch");
    189       return FALSE;
    190     }
    191   else
    192     {
    193       verbose ("passed (%s)\n", match ? "match" : "nomatch");
    194       return TRUE;
    195     }
    196 }
    197 
    198 #define TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) { \
    199   total++; \
    200   if (test_match_simple (pattern, string, compile_opts, match_opts, expected)) \
    201     PASS; \
    202   else \
    203     FAIL; \
    204 }
    205 
    206 static gboolean
    207 test_match (const gchar        *pattern,
    208 	    GRegexCompileFlags  compile_opts,
    209 	    GRegexMatchFlags    match_opts,
    210 	    const gchar        *string,
    211 	    gssize              string_len,
    212 	    gint                start_position,
    213 	    GRegexMatchFlags    match_opts2,
    214 	    gboolean            expected)
    215 {
    216   GRegex *regex;
    217   gboolean match;
    218 
    219   verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t",
    220 	   string, pattern, start_position, string_len);
    221 
    222   regex = g_regex_new (pattern, compile_opts, match_opts, NULL);
    223   match = g_regex_match_full (regex, string, string_len,
    224 			      start_position, match_opts2, NULL, NULL);
    225   if (match != expected)
    226     {
    227       gchar *e1 = g_strescape (pattern, NULL);
    228       gchar *e2 = g_strescape (string, NULL);
    229       g_print ("failed \t(unexpected %s) '%s' against '%s'\n", match ? "match" : "mismatch", e1, e2);
    230       g_free (e1);
    231       g_free (e2);
    232       g_regex_unref (regex);
    233       return FALSE;
    234     }
    235 
    236   if (string_len == -1 && start_position == 0)
    237     {
    238       match = g_regex_match (regex, string, match_opts2, NULL);
    239       if (match != expected)
    240 	{
    241 	  g_print ("failed \t(pattern: \"%s\", string: \"%s\")\n",
    242 		   pattern, string);
    243 	  g_regex_unref (regex);
    244 	  return FALSE;
    245 	}
    246     }
    247 
    248   g_regex_unref (regex);
    249 
    250   verbose ("passed (%s)\n", match ? "match" : "nomatch");
    251   return TRUE;
    252 }
    253 
    254 #define TEST_MATCH(pattern, compile_opts, match_opts, string, \
    255 		   string_len, start_position, match_opts2, expected) { \
    256   total++; \
    257   if (test_match (pattern, compile_opts, match_opts, string, \
    258 		  string_len, start_position, match_opts2, expected)) \
    259     PASS; \
    260   else \
    261     FAIL; \
    262 }
    263 
    264 struct _Match
    265 {
    266   gchar *string;
    267   gint start, end;
    268 };
    269 typedef struct _Match Match;
    270 
    271 static void
    272 free_match (gpointer data, gpointer user_data)
    273 {
    274   Match *match = data;
    275   if (match == NULL)
    276     return;
    277   g_free (match->string);
    278   g_free (match);
    279 }
    280 
    281 static gboolean
    282 test_match_next (const gchar *pattern,
    283 		 const gchar *string,
    284 		 gssize       string_len,
    285 		 gint         start_position,
    286 		 ...)
    287 {
    288   GRegex *regex;
    289   GMatchInfo *match_info;
    290   va_list args;
    291   GSList *matches = NULL;
    292   GSList *expected = NULL;
    293   GSList *l_exp, *l_match;
    294   gboolean ret = TRUE;
    295 
    296   verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t",
    297 	   string, pattern, start_position, string_len);
    298 
    299   /* The va_list is a NULL-terminated sequence of: extected matched string,
    300    * expected start and expected end. */
    301   va_start (args, start_position);
    302   while (TRUE)
    303    {
    304       Match *match;
    305       const gchar *expected_string = va_arg (args, const gchar *);
    306       if (expected_string == NULL)
    307         break;
    308       match = g_new0 (Match, 1);
    309       match->string = g_strdup (expected_string);
    310       match->start = va_arg (args, gint);
    311       match->end = va_arg (args, gint);
    312       expected = g_slist_prepend (expected, match);
    313     }
    314   expected = g_slist_reverse (expected);
    315   va_end (args);
    316 
    317   regex = g_regex_new (pattern, 0, 0, NULL);
    318 
    319   g_regex_match_full (regex, string, string_len,
    320 		      start_position, 0, &match_info, NULL);
    321   while (g_match_info_matches (match_info))
    322     {
    323       Match *match = g_new0 (Match, 1);
    324       match->string = g_match_info_fetch (match_info, 0);
    325       match->start = UNTOUCHED;
    326       match->end = UNTOUCHED;
    327       g_match_info_fetch_pos (match_info, 0, &match->start, &match->end);
    328       matches = g_slist_prepend (matches, match);
    329       g_match_info_next (match_info, NULL);
    330     }
    331   g_assert (regex == g_match_info_get_regex (match_info));
    332   g_assert (string == g_match_info_get_string (match_info));
    333   g_match_info_free (match_info);
    334   matches = g_slist_reverse (matches);
    335 
    336   if (g_slist_length (matches) != g_slist_length (expected))
    337     {
    338       gint match_count = g_slist_length (matches);
    339       g_print ("failed \t(got %d %s, expected %d)\n", match_count,
    340 	       match_count == 1 ? "match" : "matches",
    341 	       g_slist_length (expected));
    342       ret = FALSE;
    343       goto exit;
    344     }
    345 
    346   l_exp = expected;
    347   l_match =  matches;
    348   while (l_exp != NULL)
    349     {
    350       Match *exp = l_exp->data;
    351       Match *match = l_match->data;
    352 
    353       if (!streq(exp->string, match->string))
    354 	{
    355 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    356 		   match->string, exp->string);
    357 	  ret = FALSE;
    358 	  goto exit;
    359 	}
    360 
    361       if (exp->start != match->start || exp->end != match->end)
    362 	{
    363 	  g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
    364 		   match->start, match->end, exp->start, exp->end);
    365 	  ret = FALSE;
    366 	  goto exit;
    367 	}
    368 
    369       l_exp = g_slist_next (l_exp);
    370       l_match = g_slist_next (l_match);
    371     }
    372 
    373 exit:
    374   if (ret)
    375     {
    376       gint count = g_slist_length (matches);
    377       verbose ("passed (%d %s)\n", count, count == 1 ? "match" : "matches");
    378     }
    379 
    380   g_regex_unref (regex);
    381   g_slist_foreach (expected, free_match, NULL);
    382   g_slist_free (expected);
    383   g_slist_foreach (matches, free_match, NULL);
    384   g_slist_free (matches);
    385 
    386   return ret;
    387 }
    388 
    389 #define TEST_MATCH_NEXT0(pattern, string, string_len, start_position) { \
    390   total++; \
    391   if (test_match_next (pattern, string, string_len, start_position, NULL)) \
    392     PASS; \
    393   else \
    394     FAIL; \
    395 }
    396 
    397 #define TEST_MATCH_NEXT1(pattern, string, string_len, start_position, \
    398 			      t1, s1, e1) { \
    399   total++; \
    400   if (test_match_next (pattern, string, string_len, start_position, \
    401 		       t1, s1, e1, NULL)) \
    402     PASS; \
    403   else \
    404     FAIL; \
    405 }
    406 
    407 #define TEST_MATCH_NEXT2(pattern, string, string_len, start_position, \
    408 			 t1, s1, e1, t2, s2, e2) { \
    409   total++; \
    410   if (test_match_next (pattern, string, string_len, start_position, \
    411 		       t1, s1, e1, t2, s2, e2, NULL)) \
    412     PASS; \
    413   else \
    414     FAIL; \
    415 }
    416 
    417 #define TEST_MATCH_NEXT3(pattern, string, string_len, start_position, \
    418 			 t1, s1, e1, t2, s2, e2, t3, s3, e3) { \
    419   total++; \
    420   if (test_match_next (pattern, string, string_len, start_position, \
    421 		       t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
    422     PASS; \
    423   else \
    424     FAIL; \
    425 }
    426 
    427 #define TEST_MATCH_NEXT4(pattern, string, string_len, start_position, \
    428 			 t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4) { \
    429   total++; \
    430   if (test_match_next (pattern, string, string_len, start_position, \
    431 		       t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4, NULL)) \
    432     PASS; \
    433   else \
    434     FAIL; \
    435 }
    436 
    437 static gboolean
    438 test_match_count (const gchar      *pattern,
    439 		  const gchar      *string,
    440 		  gint              start_position,
    441                   GRegexMatchFlags  match_opts,
    442 		  gint              expected_count)
    443 {
    444   GRegex *regex;
    445   GMatchInfo *match_info;
    446   gint count;
    447 
    448   verbose ("fetching match count (string: \"%s\", pattern: \"%s\", start: %d) \t",
    449 	   string, pattern, start_position);
    450 
    451   regex = g_regex_new (pattern, 0, 0, NULL);
    452 
    453   g_regex_match_full (regex, string, -1, start_position,
    454 		      match_opts, &match_info, NULL);
    455   count = g_match_info_get_match_count (match_info);
    456 
    457   if (count != expected_count)
    458     {
    459       g_print ("failed \t(got %d, expected: %d)\n", count, expected_count);
    460       return FALSE;
    461     }
    462 
    463   g_match_info_free (match_info);
    464   g_regex_unref (regex);
    465 
    466   verbose ("passed\n");
    467   return TRUE;
    468 }
    469 
    470 #define TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) { \
    471   total++; \
    472   if (test_match_count (pattern, string, start_position, match_opts, expected_count)) \
    473     PASS; \
    474   else \
    475     FAIL; \
    476 }
    477 
    478 static gboolean
    479 test_partial (const gchar *pattern,
    480 	      const gchar *string,
    481 	      gboolean     expected)
    482 {
    483   GRegex *regex;
    484   GMatchInfo *match_info;
    485 
    486   verbose ("partial matching (string: \"%s\", pattern: \"%s\") \t",
    487 	   string, pattern);
    488 
    489   regex = g_regex_new (pattern, 0, 0, NULL);
    490 
    491   g_regex_match (regex, string, G_REGEX_MATCH_PARTIAL, &match_info);
    492   if (expected != g_match_info_is_partial_match (match_info))
    493     {
    494       g_print ("failed \t(got %d, expected: %d)\n", !expected, expected);
    495       g_regex_unref (regex);
    496       return FALSE;
    497     }
    498 
    499   if (expected && g_match_info_fetch_pos (match_info, 0, NULL, NULL))
    500     {
    501       g_print ("failed \t(got sub-pattern 0)\n");
    502       g_regex_unref (regex);
    503       return FALSE;
    504     }
    505 
    506   if (expected && g_match_info_fetch_pos (match_info, 1, NULL, NULL))
    507     {
    508       g_print ("failed \t(got sub-pattern 1)\n");
    509       g_regex_unref (regex);
    510       return FALSE;
    511     }
    512 
    513   g_match_info_free (match_info);
    514   g_regex_unref (regex);
    515 
    516   verbose ("passed\n");
    517   return TRUE;
    518 }
    519 
    520 #define TEST_PARTIAL(pattern, string, expected) { \
    521   total++; \
    522   if (test_partial (pattern, string, expected)) \
    523     PASS; \
    524   else \
    525     FAIL; \
    526 }
    527 
    528 static gboolean
    529 test_sub_pattern (const gchar *pattern,
    530 		  const gchar *string,
    531 		  gint         start_position,
    532 		  gint         sub_n,
    533 		  const gchar *expected_sub,
    534 		  gint         expected_start,
    535 		  gint         expected_end)
    536 {
    537   GRegex *regex;
    538   GMatchInfo *match_info;
    539   gchar *sub_expr;
    540   gint start = UNTOUCHED, end = UNTOUCHED;
    541 
    542   verbose ("fetching sub-pattern %d from \"%s\" (pattern: \"%s\") \t",
    543 	   sub_n, string, pattern);
    544 
    545   regex = g_regex_new (pattern, 0, 0, NULL);
    546   g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL);
    547 
    548   sub_expr = g_match_info_fetch (match_info, sub_n);
    549   if (!streq(sub_expr, expected_sub))
    550     {
    551       g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    552 	       sub_expr, expected_sub);
    553       g_free (sub_expr);
    554       g_regex_unref (regex);
    555       return FALSE;
    556     }
    557   g_free (sub_expr);
    558 
    559   g_match_info_fetch_pos (match_info, sub_n, &start, &end);
    560   if (start != expected_start || end != expected_end)
    561     {
    562       g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
    563 	       start, end, expected_start, expected_end);
    564       g_regex_unref (regex);
    565       return FALSE;
    566     }
    567 
    568   g_match_info_free (match_info);
    569   g_regex_unref (regex);
    570 
    571   verbose ("passed\n");
    572   return TRUE;
    573 }
    574 
    575 #define TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub, \
    576 			 expected_start, expected_end) { \
    577   total++; \
    578   if (test_sub_pattern (pattern, string, start_position, sub_n, expected_sub, \
    579 			expected_start, expected_end)) \
    580     PASS; \
    581   else \
    582     FAIL; \
    583 }
    584 
    585 static gboolean
    586 test_named_sub_pattern (const gchar *pattern,
    587 			GRegexCompileFlags flags,
    588 			const gchar *string,
    589 			gint         start_position,
    590 			const gchar *sub_name,
    591 			const gchar *expected_sub,
    592 			gint         expected_start,
    593 			gint         expected_end)
    594 {
    595   GRegex *regex;
    596   GMatchInfo *match_info;
    597   gint start = UNTOUCHED, end = UNTOUCHED;
    598   gchar *sub_expr;
    599 
    600   verbose ("fetching sub-pattern \"%s\" from \"%s\" (pattern: \"%s\") \t",
    601 	   sub_name, string, pattern);
    602 
    603   regex = g_regex_new (pattern, flags, 0, NULL);
    604 
    605   g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL);
    606   sub_expr = g_match_info_fetch_named (match_info, sub_name);
    607   if (!streq (sub_expr, expected_sub))
    608     {
    609       g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    610 	       sub_expr, expected_sub);
    611       g_free (sub_expr);
    612       g_regex_unref (regex);
    613       return FALSE;
    614     }
    615   g_free (sub_expr);
    616 
    617   g_match_info_fetch_named_pos (match_info, sub_name, &start, &end);
    618   if (start != expected_start || end != expected_end)
    619     {
    620       g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
    621 	       start, end, expected_start, expected_end);
    622       g_regex_unref (regex);
    623       return FALSE;
    624     }
    625 
    626   g_match_info_free (match_info);
    627   g_regex_unref (regex);
    628 
    629   verbose ("passed\n");
    630   return TRUE;
    631 }
    632 
    633 #define TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name, \
    634 			       expected_sub, expected_start, expected_end) { \
    635   total++; \
    636   if (test_named_sub_pattern (pattern, 0, string, start_position, sub_name, \
    637 			      expected_sub, expected_start, expected_end)) \
    638     PASS; \
    639   else \
    640     FAIL; \
    641 }
    642 
    643 #define TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name, \
    644 					expected_sub, expected_start, expected_end) { \
    645   total++; \
    646   if (test_named_sub_pattern (pattern, G_REGEX_DUPNAMES, string, start_position, \
    647 			      sub_name, expected_sub, expected_start, expected_end)) \
    648     PASS; \
    649   else \
    650     FAIL; \
    651 }
    652 
    653 static gboolean
    654 test_fetch_all (const gchar *pattern,
    655 		const gchar *string,
    656 		...)
    657 {
    658   GRegex *regex;
    659   GMatchInfo *match_info;
    660   va_list args;
    661   GSList *expected = NULL;
    662   GSList *l_exp;
    663   gchar **matches;
    664   gint match_count;
    665   gboolean ret = TRUE;
    666   gint i;
    667 
    668   verbose ("fetching all sub-patterns from \"%s\" (pattern: \"%s\") \t",
    669 	   string, pattern);
    670 
    671   /* The va_list is a NULL-terminated sequence of extected strings. */
    672   va_start (args, string);
    673   while (TRUE)
    674    {
    675       gchar *expected_string = va_arg (args, gchar *);
    676       if (expected_string == NULL)
    677         break;
    678       else
    679         expected = g_slist_prepend (expected, g_strdup (expected_string));
    680     }
    681   expected = g_slist_reverse (expected);
    682   va_end (args);
    683 
    684   regex = g_regex_new (pattern, 0, 0, NULL);
    685   g_regex_match (regex, string, 0, &match_info);
    686   matches = g_match_info_fetch_all (match_info);
    687   if (matches)
    688     match_count = g_strv_length (matches);
    689   else
    690     match_count = 0;
    691 
    692   if (match_count != g_slist_length (expected))
    693     {
    694       g_print ("failed \t(got %d %s, expected %d)\n", match_count,
    695 	       match_count == 1 ? "match" : "matches",
    696 	       g_slist_length (expected));
    697       ret = FALSE;
    698       goto exit;
    699     }
    700 
    701   l_exp = expected;
    702   for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
    703     {
    704       if (!streq(l_exp->data, matches [i]))
    705 	{
    706 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    707 		   matches [i], (gchar *)l_exp->data);
    708 	  ret = FALSE;
    709 	  goto exit;
    710 	}
    711     }
    712 
    713   verbose ("passed (%d %s)\n", match_count,
    714 	   match_count == 1 ? "match" : "matches");
    715 
    716 exit:
    717   g_match_info_free (match_info);
    718   g_regex_unref (regex);
    719   g_slist_foreach (expected, (GFunc)g_free, NULL);
    720   g_slist_free (expected);
    721   g_strfreev (matches);
    722 
    723   return ret;
    724 }
    725 
    726 #define TEST_FETCH_ALL0(pattern, string) { \
    727   total++; \
    728   if (test_fetch_all (pattern, string, NULL)) \
    729     PASS; \
    730   else \
    731     FAIL; \
    732 }
    733 
    734 #define TEST_FETCH_ALL1(pattern, string, e1) { \
    735   total++; \
    736   if (test_fetch_all (pattern, string, e1, NULL)) \
    737     PASS; \
    738   else \
    739     FAIL; \
    740 }
    741 
    742 #define TEST_FETCH_ALL2(pattern, string, e1, e2) { \
    743   total++; \
    744   if (test_fetch_all (pattern, string, e1, e2, NULL)) \
    745     PASS; \
    746   else \
    747     FAIL; \
    748 }
    749 
    750 #define TEST_FETCH_ALL3(pattern, string, e1, e2, e3) { \
    751   total++; \
    752   if (test_fetch_all (pattern, string, e1, e2, e3, NULL)) \
    753     PASS; \
    754   else \
    755     FAIL; \
    756 }
    757 
    758 static gboolean
    759 test_split_simple (const gchar *pattern,
    760 		   const gchar *string,
    761 		   ...)
    762 {
    763   va_list args;
    764   GSList *expected = NULL;
    765   GSList *l_exp;
    766   gchar **tokens;
    767   gint token_count;
    768   gboolean ret = TRUE;
    769   gint i;
    770 
    771   verbose ("splitting \"%s\" against \"%s\" \t", string, pattern);
    772 
    773   /* The va_list is a NULL-terminated sequence of extected strings. */
    774   va_start (args, string);
    775   while (TRUE)
    776    {
    777       gchar *expected_string = va_arg (args, gchar *);
    778       if (expected_string == NULL)
    779         break;
    780       else
    781         expected = g_slist_prepend (expected, g_strdup (expected_string));
    782     }
    783   expected = g_slist_reverse (expected);
    784   va_end (args);
    785 
    786   tokens = g_regex_split_simple (pattern, string, 0, 0);
    787   if (tokens)
    788     token_count = g_strv_length (tokens);
    789   else
    790     token_count = 0;
    791 
    792   if (token_count != g_slist_length (expected))
    793     {
    794       g_print ("failed \t(got %d %s, expected %d)\n", token_count,
    795 	       token_count == 1 ? "match" : "matches",
    796 	       g_slist_length (expected));
    797       ret = FALSE;
    798       goto exit;
    799     }
    800 
    801   l_exp = expected;
    802   for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
    803     {
    804       if (!streq(l_exp->data, tokens [i]))
    805 	{
    806 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    807 		   tokens[i], (gchar *)l_exp->data);
    808 	  ret = FALSE;
    809 	  goto exit;
    810 	}
    811     }
    812 
    813   verbose ("passed (%d %s)\n", token_count,
    814 	   token_count == 1 ? "token" : "tokens");
    815 
    816 exit:
    817   g_slist_foreach (expected, (GFunc)g_free, NULL);
    818   g_slist_free (expected);
    819   g_strfreev (tokens);
    820 
    821   return ret;
    822 }
    823 
    824 #define TEST_SPLIT_SIMPLE0(pattern, string) { \
    825   total++; \
    826   if (test_split_simple (pattern, string, NULL)) \
    827     PASS; \
    828   else \
    829     FAIL; \
    830 }
    831 
    832 #define TEST_SPLIT_SIMPLE1(pattern, string, e1) { \
    833   total++; \
    834   if (test_split_simple (pattern, string, e1, NULL)) \
    835     PASS; \
    836   else \
    837     FAIL; \
    838 }
    839 
    840 #define TEST_SPLIT_SIMPLE2(pattern, string, e1, e2) { \
    841   total++; \
    842   if (test_split_simple (pattern, string, e1, e2, NULL)) \
    843     PASS; \
    844   else \
    845     FAIL; \
    846 }
    847 
    848 #define TEST_SPLIT_SIMPLE3(pattern, string, e1, e2, e3) { \
    849   total++; \
    850   if (test_split_simple (pattern, string, e1, e2, e3, NULL)) \
    851     PASS; \
    852   else \
    853     FAIL; \
    854 }
    855 
    856 static gboolean
    857 test_split_full (const gchar *pattern,
    858 		 const gchar *string,
    859 		 gint         start_position,
    860 		 gint         max_tokens,
    861 		 ...)
    862 {
    863   GRegex *regex;
    864   va_list args;
    865   GSList *expected = NULL;
    866   GSList *l_exp;
    867   gchar **tokens;
    868   gint token_count;
    869   gboolean ret = TRUE;
    870   gint i;
    871 
    872   verbose ("splitting \"%s\" against \"%s\" (start: %d, max: %d) \t",
    873 	   string, pattern, start_position, max_tokens);
    874 
    875   /* The va_list is a NULL-terminated sequence of extected strings. */
    876   va_start (args, max_tokens);
    877   while (TRUE)
    878    {
    879       gchar *expected_string = va_arg (args, gchar *);
    880       if (expected_string == NULL)
    881         break;
    882       else
    883         expected = g_slist_prepend (expected, g_strdup (expected_string));
    884     }
    885   expected = g_slist_reverse (expected);
    886   va_end (args);
    887 
    888   regex = g_regex_new (pattern, 0, 0, NULL);
    889   tokens = g_regex_split_full (regex, string, -1, start_position,
    890 			       0, max_tokens, NULL);
    891   if (tokens)
    892     token_count = g_strv_length (tokens);
    893   else
    894     token_count = 0;
    895 
    896   if (token_count != g_slist_length (expected))
    897     {
    898       g_print ("failed \t(got %d %s, expected %d)\n", token_count,
    899 	       token_count == 1 ? "match" : "matches",
    900 	       g_slist_length (expected));
    901       ret = FALSE;
    902       goto exit;
    903     }
    904 
    905   l_exp = expected;
    906   for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
    907     {
    908       if (!streq(l_exp->data, tokens [i]))
    909 	{
    910 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    911 		   tokens[i], (gchar *)l_exp->data);
    912 	  ret = FALSE;
    913 	  goto exit;
    914 	}
    915     }
    916 
    917   verbose ("passed (%d %s)\n", token_count,
    918 	   token_count == 1 ? "token" : "tokens");
    919 
    920 exit:
    921   g_regex_unref (regex);
    922   g_slist_foreach (expected, (GFunc)g_free, NULL);
    923   g_slist_free (expected);
    924   g_strfreev (tokens);
    925 
    926   return ret;
    927 }
    928 
    929 static gboolean
    930 test_split (const gchar *pattern,
    931 	    const gchar *string,
    932 	    ...)
    933 {
    934   GRegex *regex;
    935   va_list args;
    936   GSList *expected = NULL;
    937   GSList *l_exp;
    938   gchar **tokens;
    939   gint token_count;
    940   gboolean ret = TRUE;
    941   gint i;
    942 
    943   verbose ("splitting \"%s\" against \"%s\" \t", string, pattern);
    944 
    945   /* The va_list is a NULL-terminated sequence of extected strings. */
    946   va_start (args, string);
    947   while (TRUE)
    948    {
    949       gchar *expected_string = va_arg (args, gchar *);
    950       if (expected_string == NULL)
    951         break;
    952       else
    953         expected = g_slist_prepend (expected, g_strdup (expected_string));
    954     }
    955   expected = g_slist_reverse (expected);
    956   va_end (args);
    957 
    958   regex = g_regex_new (pattern, 0, 0, NULL);
    959   tokens = g_regex_split (regex, string, 0);
    960   if (tokens)
    961     token_count = g_strv_length (tokens);
    962   else
    963     token_count = 0;
    964 
    965   if (token_count != g_slist_length (expected))
    966     {
    967       g_print ("failed \t(got %d %s, expected %d)\n", token_count,
    968 	       token_count == 1 ? "match" : "matches",
    969 	       g_slist_length (expected));
    970       ret = FALSE;
    971       goto exit;
    972     }
    973 
    974   l_exp = expected;
    975   for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp))
    976     {
    977       if (!streq(l_exp->data, tokens [i]))
    978 	{
    979 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
    980 		   tokens[i], (gchar *)l_exp->data);
    981 	  ret = FALSE;
    982 	  goto exit;
    983 	}
    984     }
    985 
    986   verbose ("passed (%d %s)\n", token_count,
    987 	   token_count == 1 ? "token" : "tokens");
    988 
    989 exit:
    990   g_regex_unref (regex);
    991   g_slist_foreach (expected, (GFunc)g_free, NULL);
    992   g_slist_free (expected);
    993   g_strfreev (tokens);
    994 
    995   return ret;
    996 }
    997 
    998 #define TEST_SPLIT0(pattern, string, start_position, max_tokens) { \
    999   total++; \
   1000   if (test_split_full (pattern, string, start_position, max_tokens, NULL)) \
   1001     PASS; \
   1002   else \
   1003     FAIL; \
   1004   if (start_position == 0 && max_tokens <= 0) \
   1005   { \
   1006     total++; \
   1007     if (test_split (pattern, string, NULL)) \
   1008       PASS; \
   1009     else \
   1010       FAIL; \
   1011   } \
   1012 }
   1013 
   1014 #define TEST_SPLIT1(pattern, string, start_position, max_tokens, e1) { \
   1015   total++; \
   1016   if (test_split_full (pattern, string, start_position, max_tokens, e1, NULL)) \
   1017     PASS; \
   1018   else \
   1019     FAIL; \
   1020   if (start_position == 0 && max_tokens <= 0) \
   1021   { \
   1022     total++; \
   1023     if (test_split (pattern, string, e1, NULL)) \
   1024       PASS; \
   1025     else \
   1026       FAIL; \
   1027   } \
   1028 }
   1029 
   1030 #define TEST_SPLIT2(pattern, string, start_position, max_tokens, e1, e2) { \
   1031   total++; \
   1032   if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, NULL)) \
   1033     PASS; \
   1034   else \
   1035     FAIL; \
   1036   if (start_position == 0 && max_tokens <= 0) \
   1037   { \
   1038     total++; \
   1039     if (test_split (pattern, string, e1, e2, NULL)) \
   1040       PASS; \
   1041     else \
   1042       FAIL; \
   1043   } \
   1044 }
   1045 
   1046 #define TEST_SPLIT3(pattern, string, start_position, max_tokens, e1, e2, e3) { \
   1047   total++; \
   1048   if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, e3, NULL)) \
   1049     PASS; \
   1050   else \
   1051     FAIL; \
   1052   if (start_position == 0 && max_tokens <= 0) \
   1053   { \
   1054     total++; \
   1055     if (test_split (pattern, string, e1, e2, e3, NULL)) \
   1056       PASS; \
   1057     else \
   1058       FAIL; \
   1059   } \
   1060 }
   1061 
   1062 static gboolean
   1063 test_check_replacement (const gchar *string_to_expand,
   1064 			gboolean     expected,
   1065 			gboolean     expected_refs)
   1066 {
   1067   gboolean result;
   1068   gboolean has_refs;
   1069 
   1070   verbose ("checking replacement string \"%s\" \t", string_to_expand);
   1071 
   1072   result = g_regex_check_replacement (string_to_expand, &has_refs, NULL);
   1073   if (expected != result)
   1074     {
   1075       g_print ("failed \t(got \"%s\", expected \"%s\")\n",
   1076 	       result ? "TRUE" : "FALSE",
   1077 	       expected ? "TRUE" : "FALSE");
   1078       return FALSE;
   1079     }
   1080 
   1081   if (expected && expected_refs != has_refs)
   1082     {
   1083       g_print ("failed \t(got has_references \"%s\", expected \"%s\")\n",
   1084 	       has_refs ? "TRUE" : "FALSE",
   1085 	       expected_refs ? "TRUE" : "FALSE");
   1086       return FALSE;
   1087     }
   1088 
   1089   verbose ("passed\n");
   1090   return TRUE;
   1091 }
   1092 
   1093 #define TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) { \
   1094   total++; \
   1095   if (test_check_replacement (string_to_expand, expected, expected_refs)) \
   1096     PASS; \
   1097   else \
   1098     FAIL; \
   1099 }
   1100 static gboolean
   1101 test_expand (const gchar *pattern,
   1102 	     const gchar *string,
   1103 	     const gchar *string_to_expand,
   1104 	     gboolean     raw,
   1105 	     const gchar *expected)
   1106 {
   1107   GRegex *regex = NULL;
   1108   GMatchInfo *match_info = NULL;
   1109   gchar *res;
   1110 
   1111   verbose ("expanding the references in \"%s\" (pattern: \"%s\", string: \"%s\") \t",
   1112 	   string_to_expand,
   1113 	   pattern ? pattern : "(null)",
   1114 	   string ? string : "(null)");
   1115 
   1116   if (pattern)
   1117     {
   1118       regex = g_regex_new (pattern, raw ? G_REGEX_RAW : 0, 0, NULL);
   1119       g_regex_match (regex, string, 0, &match_info);
   1120     }
   1121 
   1122   res = g_match_info_expand_references (match_info, string_to_expand, NULL);
   1123   if (!streq (res, expected))
   1124     {
   1125       g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
   1126       g_free (res);
   1127       g_match_info_free (match_info);
   1128       g_regex_unref (regex);
   1129       return FALSE;
   1130     }
   1131 
   1132   g_free (res);
   1133   g_match_info_free (match_info);
   1134   if (regex)
   1135     g_regex_unref (regex);
   1136 
   1137   verbose ("passed\n");
   1138   return TRUE;
   1139 }
   1140 
   1141 #define TEST_EXPAND(pattern, string, string_to_expand, raw, expected) { \
   1142   total++; \
   1143   if (test_expand (pattern, string, string_to_expand, raw, expected)) \
   1144     PASS; \
   1145   else \
   1146     FAIL; \
   1147 }
   1148 
   1149 static gboolean
   1150 test_replace (const gchar *pattern,
   1151 	      const gchar *string,
   1152 	      gint         start_position,
   1153 	      const gchar *replacement,
   1154 	      const gchar *expected)
   1155 {
   1156   GRegex *regex;
   1157   gchar *res;
   1158 
   1159   verbose ("replacing \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t",
   1160 	   replacement, string, pattern, start_position);
   1161 
   1162   regex = g_regex_new (pattern, 0, 0, NULL);
   1163   res = g_regex_replace (regex, string, -1, start_position, replacement, 0, NULL);
   1164   if (!streq (res, expected))
   1165     {
   1166       g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
   1167       g_free (res);
   1168       g_regex_unref (regex);
   1169       return FALSE;
   1170     }
   1171 
   1172   g_free (res);
   1173   g_regex_unref (regex);
   1174 
   1175   verbose ("passed\n");
   1176   return TRUE;
   1177 }
   1178 
   1179 #define TEST_REPLACE(pattern, string, start_position, replacement, expected) { \
   1180   total++; \
   1181   if (test_replace (pattern, string, start_position, replacement, expected)) \
   1182     PASS; \
   1183   else \
   1184     FAIL; \
   1185 }
   1186 
   1187 static gboolean
   1188 test_replace_lit (const gchar *pattern,
   1189 		  const gchar *string,
   1190 		  gint         start_position,
   1191 		  const gchar *replacement,
   1192 		  const gchar *expected)
   1193 {
   1194   GRegex *regex;
   1195   gchar *res;
   1196 
   1197   verbose ("replacing literally \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t",
   1198 	   replacement, string, pattern, start_position);
   1199 
   1200   regex = g_regex_new (pattern, 0, 0, NULL);
   1201   res = g_regex_replace_literal (regex, string, -1, start_position,
   1202 				 replacement, 0, NULL);
   1203   if (!streq (res, expected))
   1204     {
   1205       g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected);
   1206       g_free (res);
   1207       g_regex_unref (regex);
   1208       return FALSE;
   1209     }
   1210 
   1211   g_free (res);
   1212   g_regex_unref (regex);
   1213 
   1214   verbose ("passed\n");
   1215   return TRUE;
   1216 }
   1217 
   1218 #define TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) { \
   1219   total++; \
   1220   if (test_replace_lit (pattern, string, start_position, replacement, expected)) \
   1221     PASS; \
   1222   else \
   1223     FAIL; \
   1224 }
   1225 
   1226 static gboolean
   1227 test_get_string_number (const gchar *pattern,
   1228 			const gchar *name,
   1229 			gint         expected_num)
   1230 {
   1231   GRegex *regex;
   1232   gint num;
   1233 
   1234   verbose ("getting the number of \"%s\" (pattern: \"%s\") \t",
   1235 	   name, pattern);
   1236 
   1237   regex = g_regex_new (pattern, 0, 0, NULL);
   1238   num = g_regex_get_string_number (regex, name);
   1239   g_regex_unref (regex);
   1240 
   1241   if (num != expected_num)
   1242     {
   1243       g_print ("failed \t(got %d, expected %d)\n", num, expected_num);
   1244       return FALSE;
   1245     }
   1246   else
   1247     {
   1248       verbose ("passed\n");
   1249       return TRUE;
   1250     }
   1251 }
   1252 
   1253 #define TEST_GET_STRING_NUMBER(pattern, name, expected_num) { \
   1254   total++; \
   1255   if (test_get_string_number (pattern, name, expected_num)) \
   1256     PASS; \
   1257   else \
   1258     FAIL; \
   1259 }
   1260 
   1261 static gboolean
   1262 test_escape (const gchar *string,
   1263 	     gint         length,
   1264 	     const gchar *expected)
   1265 {
   1266   gchar *escaped;
   1267 
   1268   verbose ("escaping \"%s\" (len: %d) \t", string, length);
   1269 
   1270   escaped = g_regex_escape_string (string, length);
   1271 
   1272   if (!streq (escaped, expected))
   1273     {
   1274       g_print ("failed \t(got \"%s\", expected \"%s\")\n", escaped, expected);
   1275       g_free (escaped);
   1276       return FALSE;
   1277     }
   1278 
   1279   g_free (escaped);
   1280 
   1281   verbose ("passed\n");
   1282   return TRUE;
   1283 }
   1284 
   1285 #define TEST_ESCAPE(string, length, expected) { \
   1286   total++; \
   1287   if (test_escape (string, length, expected)) \
   1288     PASS; \
   1289   else \
   1290     FAIL; \
   1291 }
   1292 
   1293 static gboolean
   1294 test_match_all_full (const gchar *pattern,
   1295 		     const gchar *string,
   1296 		     gssize       string_len,
   1297 		     gint         start_position,
   1298 		     ...)
   1299 {
   1300   GRegex *regex;
   1301   GMatchInfo *match_info;
   1302   va_list args;
   1303   GSList *expected = NULL;
   1304   GSList *l_exp;
   1305   gboolean match_ok;
   1306   gboolean ret = TRUE;
   1307   gint match_count;
   1308   gint i;
   1309 
   1310   verbose ("matching all in \"%s\" against \"%s\" (start: %d, len: %d) \t",
   1311 	   string, pattern, start_position, string_len);
   1312 
   1313   /* The va_list is a NULL-terminated sequence of: extected matched string,
   1314    * expected start and expected end. */
   1315   va_start (args, start_position);
   1316   while (TRUE)
   1317    {
   1318       Match *match;
   1319       const gchar *expected_string = va_arg (args, const gchar *);
   1320       if (expected_string == NULL)
   1321         break;
   1322       match = g_new0 (Match, 1);
   1323       match->string = g_strdup (expected_string);
   1324       match->start = va_arg (args, gint);
   1325       match->end = va_arg (args, gint);
   1326       expected = g_slist_prepend (expected, match);
   1327     }
   1328   expected = g_slist_reverse (expected);
   1329   va_end (args);
   1330 
   1331   regex = g_regex_new (pattern, 0, 0, NULL);
   1332   match_ok = g_regex_match_all_full (regex, string, string_len, start_position,
   1333 				     0, &match_info, NULL);
   1334 
   1335   if (match_ok && g_slist_length (expected) == 0)
   1336     {
   1337       g_print ("failed\n");
   1338       ret = FALSE;
   1339       goto exit;
   1340     }
   1341   if (!match_ok && g_slist_length (expected) != 0)
   1342     {
   1343       g_print ("failed\n");
   1344       ret = FALSE;
   1345       goto exit;
   1346     }
   1347 
   1348   match_count = g_match_info_get_match_count (match_info);
   1349   if (match_count != g_slist_length (expected))
   1350     {
   1351       g_print ("failed \t(got %d %s, expected %d)\n", match_count,
   1352 	       match_count == 1 ? "match" : "matches",
   1353 	       g_slist_length (expected));
   1354       ret = FALSE;
   1355       goto exit;
   1356     }
   1357 
   1358   l_exp = expected;
   1359   for (i = 0; i < match_count; i++)
   1360     {
   1361       gint start, end;
   1362       gchar *matched_string;
   1363       Match *exp = l_exp->data;
   1364 
   1365       matched_string = g_match_info_fetch (match_info, i);
   1366       g_match_info_fetch_pos (match_info, i, &start, &end);
   1367 
   1368       if (!streq(exp->string, matched_string))
   1369 	{
   1370 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
   1371 		   matched_string, exp->string);
   1372           g_free (matched_string);
   1373 	  ret = FALSE;
   1374 	  goto exit;
   1375 	}
   1376       g_free (matched_string);
   1377 
   1378       if (exp->start != start || exp->end != end)
   1379 	{
   1380 	  g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
   1381 		   start, end, exp->start, exp->end);
   1382 	  ret = FALSE;
   1383 	  goto exit;
   1384 	}
   1385 
   1386       l_exp = g_slist_next (l_exp);
   1387     }
   1388 
   1389 exit:
   1390   if (ret)
   1391     {
   1392       verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches");
   1393     }
   1394 
   1395   g_match_info_free (match_info);
   1396   g_regex_unref (regex);
   1397   g_slist_foreach (expected, free_match, NULL);
   1398   g_slist_free (expected);
   1399 
   1400   return ret;
   1401 }
   1402 
   1403 static gboolean
   1404 test_match_all (const gchar *pattern,
   1405 		const gchar *string,
   1406                 ...)
   1407 {
   1408   GRegex *regex;
   1409   GMatchInfo *match_info;
   1410   va_list args;
   1411   GSList *expected = NULL;
   1412   GSList *l_exp;
   1413   gboolean match_ok;
   1414   gboolean ret = TRUE;
   1415   gint match_count;
   1416   gint i;
   1417 
   1418   verbose ("matching all in \"%s\" against \"%s\" \t", string, pattern);
   1419 
   1420   /* The va_list is a NULL-terminated sequence of: extected matched string,
   1421    * expected start and expected end. */
   1422   va_start (args, string);
   1423   while (TRUE)
   1424    {
   1425       Match *match;
   1426       const gchar *expected_string = va_arg (args, const gchar *);
   1427       if (expected_string == NULL)
   1428         break;
   1429       match = g_new0 (Match, 1);
   1430       match->string = g_strdup (expected_string);
   1431       match->start = va_arg (args, gint);
   1432       match->end = va_arg (args, gint);
   1433       expected = g_slist_prepend (expected, match);
   1434     }
   1435   expected = g_slist_reverse (expected);
   1436   va_end (args);
   1437 
   1438   regex = g_regex_new (pattern, 0, 0, NULL);
   1439   match_ok = g_regex_match_all (regex, string, 0, &match_info);
   1440 
   1441   if (match_ok && g_slist_length (expected) == 0)
   1442     {
   1443       g_print ("failed\n");
   1444       ret = FALSE;
   1445       goto exit;
   1446     }
   1447   if (!match_ok && g_slist_length (expected) != 0)
   1448     {
   1449       g_print ("failed\n");
   1450       ret = FALSE;
   1451       goto exit;
   1452     }
   1453 
   1454   match_count = g_match_info_get_match_count (match_info);
   1455   if (match_count != g_slist_length (expected))
   1456     {
   1457       g_print ("failed \t(got %d %s, expected %d)\n", match_count,
   1458 	       match_count == 1 ? "match" : "matches",
   1459 	       g_slist_length (expected));
   1460       ret = FALSE;
   1461       goto exit;
   1462     }
   1463 
   1464   l_exp = expected;
   1465   for (i = 0; i < match_count; i++)
   1466     {
   1467       gint start, end;
   1468       gchar *matched_string;
   1469       Match *exp = l_exp->data;
   1470 
   1471       matched_string = g_match_info_fetch (match_info, i);
   1472       g_match_info_fetch_pos (match_info, i, &start, &end);
   1473 
   1474       if (!streq(exp->string, matched_string))
   1475 	{
   1476 	  g_print ("failed \t(got \"%s\", expected \"%s\")\n",
   1477 		   matched_string, exp->string);
   1478           g_free (matched_string);
   1479 	  ret = FALSE;
   1480 	  goto exit;
   1481 	}
   1482       g_free (matched_string);
   1483 
   1484       if (exp->start != start || exp->end != end)
   1485 	{
   1486 	  g_print ("failed \t(got [%d, %d], expected [%d, %d])\n",
   1487 		   start, end, exp->start, exp->end);
   1488 	  ret = FALSE;
   1489 	  goto exit;
   1490 	}
   1491 
   1492       l_exp = g_slist_next (l_exp);
   1493     }
   1494 
   1495 exit:
   1496   if (ret)
   1497     {
   1498       verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches");
   1499     }
   1500 
   1501   g_match_info_free (match_info);
   1502   g_regex_unref (regex);
   1503   g_slist_foreach (expected, free_match, NULL);
   1504   g_slist_free (expected);
   1505 
   1506   return ret;
   1507 }
   1508 
   1509 #define TEST_MATCH_ALL0(pattern, string, string_len, start_position) { \
   1510   total++; \
   1511   if (test_match_all_full (pattern, string, string_len, start_position, NULL)) \
   1512     PASS; \
   1513   else \
   1514     FAIL; \
   1515   if (string_len == -1 && start_position == 0) \
   1516   { \
   1517     total++; \
   1518     if (test_match_all (pattern, string, NULL)) \
   1519       PASS; \
   1520     else \
   1521       FAIL; \
   1522   } \
   1523 }
   1524 
   1525 #define TEST_MATCH_ALL1(pattern, string, string_len, start_position, \
   1526 			t1, s1, e1) { \
   1527   total++; \
   1528   if (test_match_all_full (pattern, string, string_len, start_position, \
   1529 			   t1, s1, e1, NULL)) \
   1530     PASS; \
   1531   else \
   1532     FAIL; \
   1533   if (string_len == -1 && start_position == 0) \
   1534   { \
   1535     total++; \
   1536     if (test_match_all (pattern, string, t1, s1, e1, NULL)) \
   1537       PASS; \
   1538     else \
   1539       FAIL; \
   1540   } \
   1541 }
   1542 
   1543 #define TEST_MATCH_ALL2(pattern, string, string_len, start_position, \
   1544 			t1, s1, e1, t2, s2, e2) { \
   1545   total++; \
   1546   if (test_match_all_full (pattern, string, string_len, start_position, \
   1547 			   t1, s1, e1, t2, s2, e2, NULL)) \
   1548     PASS; \
   1549   else \
   1550     FAIL; \
   1551   if (string_len == -1 && start_position == 0) \
   1552   { \
   1553     total++; \
   1554     if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, NULL)) \
   1555       PASS; \
   1556     else \
   1557       FAIL; \
   1558   } \
   1559 }
   1560 
   1561 #define TEST_MATCH_ALL3(pattern, string, string_len, start_position, \
   1562 			t1, s1, e1, t2, s2, e2, t3, s3, e3) { \
   1563   total++; \
   1564   if (test_match_all_full (pattern, string, string_len, start_position, \
   1565 			   t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
   1566     PASS; \
   1567   else \
   1568     FAIL; \
   1569   if (string_len == -1 && start_position == 0) \
   1570   { \
   1571     total++; \
   1572     if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \
   1573       PASS; \
   1574     else \
   1575       FAIL; \
   1576   } \
   1577 }
   1578 
   1579 int
   1580 main (int argc, char *argv[])
   1581 {
   1582   gint total = 0;
   1583   gint passed = 0;
   1584   gint failed = 0;
   1585   gint i = 0;
   1586 
   1587   setlocale (LC_ALL, "");
   1588 
   1589   for (i = 1; i < argc; i++)
   1590     {
   1591       if (streq ("--noisy", argv[i]))
   1592 	noisy = TRUE;
   1593       else if (streq ("--abort", argv[i]))
   1594 	abort_on_fail = TRUE;
   1595     }
   1596 
   1597   g_setenv ("G_DEBUG", "fatal_warnings", TRUE);
   1598 
   1599   /* TEST_NEW(pattern, compile_opts, match_opts) */
   1600   TEST_NEW("", 0, 0);
   1601   TEST_NEW(".*", 0, 0);
   1602   TEST_NEW(".*", G_REGEX_OPTIMIZE, 0);
   1603   TEST_NEW(".*", G_REGEX_MULTILINE, 0);
   1604   TEST_NEW(".*", G_REGEX_DOTALL, 0);
   1605   TEST_NEW(".*", G_REGEX_DOTALL, G_REGEX_MATCH_NOTBOL);
   1606   TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", 0, 0);
   1607   TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", G_REGEX_CASELESS, 0);
   1608   TEST_NEW("(123\\d*)[a-zA-Z]+(?P<hello>.*)", G_REGEX_CASELESS | G_REGEX_OPTIMIZE, 0);
   1609   TEST_NEW("(?P<A>x)|(?P<A>y)", G_REGEX_DUPNAMES, 0);
   1610   TEST_NEW("(?P<A>x)|(?P<A>y)", G_REGEX_DUPNAMES | G_REGEX_OPTIMIZE, 0);
   1611   /* This gives "internal error: code overflow" with pcre 6.0 */
   1612   TEST_NEW("(?i)(?-i)", 0, 0);
   1613 
   1614   /* TEST_NEW_FAIL(pattern, compile_opts, expected_error) */
   1615   TEST_NEW_FAIL("(", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS);
   1616   TEST_NEW_FAIL(")", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS);
   1617   TEST_NEW_FAIL("[", 0, G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS);
   1618   TEST_NEW_FAIL("*", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT);
   1619   TEST_NEW_FAIL("?", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT);
   1620   TEST_NEW_FAIL("(?P<A>x)|(?P<A>y)", 0, G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME);
   1621 
   1622   /* TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) */
   1623   TEST_MATCH_SIMPLE("a", "", 0, 0, FALSE);
   1624   TEST_MATCH_SIMPLE("a", "a", 0, 0, TRUE);
   1625   TEST_MATCH_SIMPLE("a", "ba", 0, 0, TRUE);
   1626   TEST_MATCH_SIMPLE("^a", "ba", 0, 0, FALSE);
   1627   TEST_MATCH_SIMPLE("a", "ba", G_REGEX_ANCHORED, 0, FALSE);
   1628   TEST_MATCH_SIMPLE("a", "ba", 0, G_REGEX_MATCH_ANCHORED, FALSE);
   1629   TEST_MATCH_SIMPLE("a", "ab", G_REGEX_ANCHORED, 0, TRUE);
   1630   TEST_MATCH_SIMPLE("a", "ab", 0, G_REGEX_MATCH_ANCHORED, TRUE);
   1631   TEST_MATCH_SIMPLE("a", "a", G_REGEX_CASELESS, 0, TRUE);
   1632   TEST_MATCH_SIMPLE("a", "A", G_REGEX_CASELESS, 0, TRUE);
   1633   /* These are needed to test extended properties. */
   1634   TEST_MATCH_SIMPLE(AGRAVE, AGRAVE, G_REGEX_CASELESS, 0, TRUE);
   1635   TEST_MATCH_SIMPLE(AGRAVE, AGRAVE_UPPER, G_REGEX_CASELESS, 0, TRUE);
   1636   TEST_MATCH_SIMPLE("\\p{L}", "a", 0, 0, TRUE);
   1637   TEST_MATCH_SIMPLE("\\p{L}", "1", 0, 0, FALSE);
   1638   TEST_MATCH_SIMPLE("\\p{L}", AGRAVE, 0, 0, TRUE);
   1639   TEST_MATCH_SIMPLE("\\p{L}", AGRAVE_UPPER, 0, 0, TRUE);
   1640   TEST_MATCH_SIMPLE("\\p{L}", SHEEN, 0, 0, TRUE);
   1641   TEST_MATCH_SIMPLE("\\p{L}", ETH30, 0, 0, FALSE);
   1642   TEST_MATCH_SIMPLE("\\p{Ll}", "a", 0, 0, TRUE);
   1643   TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE, 0, 0, TRUE);
   1644   TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE_UPPER, 0, 0, FALSE);
   1645   TEST_MATCH_SIMPLE("\\p{Ll}", ETH30, 0, 0, FALSE);
   1646   TEST_MATCH_SIMPLE("\\p{Sc}", AGRAVE, 0, 0, FALSE);
   1647   TEST_MATCH_SIMPLE("\\p{Sc}", EURO, 0, 0, TRUE);
   1648   TEST_MATCH_SIMPLE("\\p{Sc}", ETH30, 0, 0, FALSE);
   1649   TEST_MATCH_SIMPLE("\\p{N}", "a", 0, 0, FALSE);
   1650   TEST_MATCH_SIMPLE("\\p{N}", "1", 0, 0, TRUE);
   1651   TEST_MATCH_SIMPLE("\\p{N}", AGRAVE, 0, 0, FALSE);
   1652   TEST_MATCH_SIMPLE("\\p{N}", AGRAVE_UPPER, 0, 0, FALSE);
   1653   TEST_MATCH_SIMPLE("\\p{N}", SHEEN, 0, 0, FALSE);
   1654   TEST_MATCH_SIMPLE("\\p{N}", ETH30, 0, 0, TRUE);
   1655   TEST_MATCH_SIMPLE("\\p{Nd}", "a", 0, 0, FALSE);
   1656   TEST_MATCH_SIMPLE("\\p{Nd}", "1", 0, 0, TRUE);
   1657   TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE, 0, 0, FALSE);
   1658   TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE_UPPER, 0, 0, FALSE);
   1659   TEST_MATCH_SIMPLE("\\p{Nd}", SHEEN, 0, 0, FALSE);
   1660   TEST_MATCH_SIMPLE("\\p{Nd}", ETH30, 0, 0, FALSE);
   1661   TEST_MATCH_SIMPLE("\\p{Common}", SHEEN, 0, 0, FALSE);
   1662   TEST_MATCH_SIMPLE("\\p{Common}", "a", 0, 0, FALSE);
   1663   TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE, 0, 0, FALSE);
   1664   TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE_UPPER, 0, 0, FALSE);
   1665   TEST_MATCH_SIMPLE("\\p{Common}", ETH30, 0, 0, FALSE);
   1666   TEST_MATCH_SIMPLE("\\p{Common}", "%", 0, 0, TRUE);
   1667   TEST_MATCH_SIMPLE("\\p{Common}", "1", 0, 0, TRUE);
   1668   TEST_MATCH_SIMPLE("\\p{Arabic}", SHEEN, 0, 0, TRUE);
   1669   TEST_MATCH_SIMPLE("\\p{Arabic}", "a", 0, 0, FALSE);
   1670   TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE, 0, 0, FALSE);
   1671   TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE_UPPER, 0, 0, FALSE);
   1672   TEST_MATCH_SIMPLE("\\p{Arabic}", ETH30, 0, 0, FALSE);
   1673   TEST_MATCH_SIMPLE("\\p{Arabic}", "%", 0, 0, FALSE);
   1674   TEST_MATCH_SIMPLE("\\p{Arabic}", "1", 0, 0, FALSE);
   1675   TEST_MATCH_SIMPLE("\\p{Latin}", SHEEN, 0, 0, FALSE);
   1676   TEST_MATCH_SIMPLE("\\p{Latin}", "a", 0, 0, TRUE);
   1677   TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE, 0, 0, TRUE);
   1678   TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE_UPPER, 0, 0, TRUE);
   1679   TEST_MATCH_SIMPLE("\\p{Latin}", ETH30, 0, 0, FALSE);
   1680   TEST_MATCH_SIMPLE("\\p{Latin}", "%", 0, 0, FALSE);
   1681   TEST_MATCH_SIMPLE("\\p{Latin}", "1", 0, 0, FALSE);
   1682   TEST_MATCH_SIMPLE("\\p{Ethiopic}", SHEEN, 0, 0, FALSE);
   1683   TEST_MATCH_SIMPLE("\\p{Ethiopic}", "a", 0, 0, FALSE);
   1684   TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE, 0, 0, FALSE);
   1685   TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE_UPPER, 0, 0, FALSE);
   1686   TEST_MATCH_SIMPLE("\\p{Ethiopic}", ETH30, 0, 0, TRUE);
   1687   TEST_MATCH_SIMPLE("\\p{Ethiopic}", "%", 0, 0, FALSE);
   1688   TEST_MATCH_SIMPLE("\\p{Ethiopic}", "1", 0, 0, FALSE);
   1689   TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Arabic})", SHEEN, 0, 0, TRUE);
   1690   TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Latin})", SHEEN, 0, 0, FALSE);
   1691   /* Invalid patterns. */
   1692   TEST_MATCH_SIMPLE("\\", "a", 0, 0, FALSE);
   1693   TEST_MATCH_SIMPLE("[", "", 0, 0, FALSE);
   1694 
   1695   /* TEST_MATCH(pattern, compile_opts, match_opts, string,
   1696    * 		string_len, start_position, match_opts2, expected) */
   1697   TEST_MATCH("a", 0, 0, "a", -1, 0, 0, TRUE);
   1698   TEST_MATCH("a", 0, 0, "A", -1, 0, 0, FALSE);
   1699   TEST_MATCH("a", G_REGEX_CASELESS, 0, "A", -1, 0, 0, TRUE);
   1700   TEST_MATCH("a", 0, 0, "ab", -1, 1, 0, FALSE);
   1701   TEST_MATCH("a", 0, 0, "ba", 1, 0, 0, FALSE);
   1702   TEST_MATCH("a", 0, 0, "bab", -1, 0, 0, TRUE);
   1703   TEST_MATCH("a", 0, 0, "b", -1, 0, 0, FALSE);
   1704   TEST_MATCH("a", 0, G_REGEX_ANCHORED, "a", -1, 0, 0, TRUE);
   1705   TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ab", -1, 1, 0, FALSE);
   1706   TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ba", 1, 0, 0, FALSE);
   1707   TEST_MATCH("a", 0, G_REGEX_ANCHORED, "bab", -1, 0, 0, FALSE);
   1708   TEST_MATCH("a", 0, G_REGEX_ANCHORED, "b", -1, 0, 0, FALSE);
   1709   TEST_MATCH("a", 0, 0, "a", -1, 0, G_REGEX_ANCHORED, TRUE);
   1710   TEST_MATCH("a", 0, 0, "ab", -1, 1, G_REGEX_ANCHORED, FALSE);
   1711   TEST_MATCH("a", 0, 0, "ba", 1, 0, G_REGEX_ANCHORED, FALSE);
   1712   TEST_MATCH("a", 0, 0, "bab", -1, 0, G_REGEX_ANCHORED, FALSE);
   1713   TEST_MATCH("a", 0, 0, "b", -1, 0, G_REGEX_ANCHORED, FALSE);
   1714   TEST_MATCH("a|b", 0, 0, "a", -1, 0, 0, TRUE);
   1715   TEST_MATCH("\\d", 0, 0, EURO, -1, 0, 0, FALSE);
   1716   TEST_MATCH("^.$", 0, 0, EURO, -1, 0, 0, TRUE);
   1717   TEST_MATCH("^.{3}$", 0, 0, EURO, -1, 0, 0, FALSE);
   1718   TEST_MATCH("^.$", G_REGEX_RAW, 0, EURO, -1, 0, 0, FALSE);
   1719   TEST_MATCH("^.{3}$", G_REGEX_RAW, 0, EURO, -1, 0, 0, TRUE);
   1720   TEST_MATCH(AGRAVE, G_REGEX_CASELESS, 0, AGRAVE_UPPER, -1, 0, 0, TRUE);
   1721 
   1722   /* New lines handling. */
   1723   TEST_MATCH("^a\\Rb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE);
   1724   TEST_MATCH("^a\\Rb$", 0, 0, "a\nb", -1, 0, 0, TRUE);
   1725   TEST_MATCH("^a\\Rb$", 0, 0, "a\rb", -1, 0, 0, TRUE);
   1726   TEST_MATCH("^a\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, FALSE);
   1727   TEST_MATCH("^a\\R\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, TRUE);
   1728   TEST_MATCH("^a\\nb$", 0, 0, "a\r\nb", -1, 0, 0, FALSE);
   1729   TEST_MATCH("^a\\r\\nb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE);
   1730 
   1731   TEST_MATCH("^b$", 0, 0, "a\nb\nc", -1, 0, 0, FALSE);
   1732   TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\nb\nc", -1, 0, 0, TRUE);
   1733   TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE);
   1734   TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\rb\rc", -1, 0, 0, TRUE);
   1735   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\nb\nc", -1, 0, 0, FALSE);
   1736   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\nb\nc", -1, 0, 0, TRUE);
   1737   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\nb\nc", -1, 0, 0, FALSE);
   1738   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE);
   1739   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE);
   1740   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE);
   1741   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\rb\rc", -1, 0, 0, TRUE);
   1742   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\rb\rc", -1, 0, 0, FALSE);
   1743   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\rb\rc", -1, 0, 0, FALSE);
   1744   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\nb\nc", -1, 0, 0, FALSE);
   1745   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE);
   1746   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\nb\nc", -1, 0, 0, FALSE);
   1747   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\r\nb\r\nc", -1, 0, 0, FALSE);
   1748   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\r\nb\r\nc", -1, 0, 0, FALSE);
   1749   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE);
   1750   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\rb\rc", -1, 0, 0, TRUE);
   1751   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE);
   1752   TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE);
   1753 
   1754   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\nb\nc", -1, 0, 0, TRUE);
   1755   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\rb\rc", -1, 0, 0, TRUE);
   1756   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\r\nb\r\nc", -1, 0, 0, TRUE);
   1757   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE);
   1758   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE);
   1759   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE);
   1760   TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE);
   1761 
   1762   TEST_MATCH("a#\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
   1763   TEST_MATCH("a#\r\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
   1764   TEST_MATCH("a#\rb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE);
   1765   TEST_MATCH("a#\nb", G_REGEX_EXTENDED, G_REGEX_MATCH_NEWLINE_CR, "a", -1, 0, 0, FALSE);
   1766   TEST_MATCH("a#\nb", G_REGEX_EXTENDED | G_REGEX_NEWLINE_CR, 0, "a", -1, 0, 0, TRUE);
   1767 
   1768   /* TEST_MATCH_NEXT#(pattern, string, string_len, start_position, ...) */
   1769   TEST_MATCH_NEXT0("a", "x", -1, 0);
   1770   TEST_MATCH_NEXT0("a", "ax", -1, 1);
   1771   TEST_MATCH_NEXT0("a", "xa", 1, 0);
   1772   TEST_MATCH_NEXT0("a", "axa", 1, 2);
   1773   TEST_MATCH_NEXT1("a", "a", -1, 0, "a", 0, 1);
   1774   TEST_MATCH_NEXT1("a", "xax", -1, 0, "a", 1, 2);
   1775   TEST_MATCH_NEXT1(EURO, ENG EURO, -1, 0, EURO, 2, 5);
   1776   TEST_MATCH_NEXT1("a*", "", -1, 0, "", 0, 0);
   1777   TEST_MATCH_NEXT2("a*", "aa", -1, 0, "aa", 0, 2, "", 2, 2);
   1778   TEST_MATCH_NEXT2(EURO "*", EURO EURO, -1, 0, EURO EURO, 0, 6, "", 6, 6);
   1779   TEST_MATCH_NEXT2("a", "axa", -1, 0, "a", 0, 1, "a", 2, 3);
   1780   TEST_MATCH_NEXT2("a+", "aaxa", -1, 0, "aa", 0, 2, "a", 3, 4);
   1781   TEST_MATCH_NEXT2("a", "aa", -1, 0, "a", 0, 1, "a", 1, 2);
   1782   TEST_MATCH_NEXT2("a", "ababa", -1, 2, "a", 2, 3, "a", 4, 5);
   1783   TEST_MATCH_NEXT2(EURO "+", EURO "-" EURO, -1, 0, EURO, 0, 3, EURO, 4, 7);
   1784   TEST_MATCH_NEXT3("", "ab", -1, 0, "", 0, 0, "", 1, 1, "", 2, 2);
   1785   TEST_MATCH_NEXT3("", AGRAVE "b", -1, 0, "", 0, 0, "", 2, 2, "", 3, 3);
   1786   TEST_MATCH_NEXT3("a", "aaxa", -1, 0, "a", 0, 1, "a", 1, 2, "a", 3, 4);
   1787   TEST_MATCH_NEXT3("a", "aa" OGRAVE "a", -1, 0, "a", 0, 1, "a", 1, 2, "a", 4, 5);
   1788   TEST_MATCH_NEXT3("a*", "aax", -1, 0, "aa", 0, 2, "", 2, 2, "", 3, 3);
   1789   TEST_MATCH_NEXT3("(?=[A-Z0-9])", "RegExTest", -1, 0, "", 0, 0, "", 3, 3, "", 5, 5);
   1790   TEST_MATCH_NEXT4("a*", "aaxa", -1, 0, "aa", 0, 2, "", 2, 2, "a", 3, 4, "", 4, 4);
   1791 
   1792   /* TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) */
   1793   TEST_MATCH_COUNT("a", "", 0, 0, 0);
   1794   TEST_MATCH_COUNT("a", "a", 0, 0, 1);
   1795   TEST_MATCH_COUNT("a", "a", 1, 0, 0);
   1796   TEST_MATCH_COUNT("(.)", "a", 0, 0, 2);
   1797   TEST_MATCH_COUNT("(.)", EURO, 0, 0, 2);
   1798   TEST_MATCH_COUNT("(?:.)", "a", 0, 0, 1);
   1799   TEST_MATCH_COUNT("(?P<A>.)", "a", 0, 0, 2);
   1800   TEST_MATCH_COUNT("a$", "a", 0, G_REGEX_MATCH_NOTEOL, 0);
   1801   TEST_MATCH_COUNT("(a)?(b)", "b", 0, 0, 3);
   1802   TEST_MATCH_COUNT("(a)?(b)", "ab", 0, 0, 3);
   1803 
   1804   /* TEST_PARTIAL(pattern, string, expected) */
   1805   TEST_PARTIAL("^ab", "a", TRUE);
   1806   TEST_PARTIAL("^ab", "xa", FALSE);
   1807   TEST_PARTIAL("ab", "xa", TRUE);
   1808   TEST_PARTIAL("ab", "ab", FALSE); /* normal match. */
   1809   TEST_PARTIAL("a+b", "aa", FALSE); /* PCRE_ERROR_BAD_PARTIAL */
   1810   TEST_PARTIAL("(a)+b", "aa", TRUE);
   1811   TEST_PARTIAL("a?b", "a", TRUE);
   1812 
   1813   /* TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub,
   1814    * 		      expected_start, expected_end) */
   1815   TEST_SUB_PATTERN("a", "a", 0, 0, "a", 0, 1);
   1816   TEST_SUB_PATTERN("a(.)", "ab", 0, 1, "b", 1, 2);
   1817   TEST_SUB_PATTERN("a(.)", "a" EURO, 0, 1, EURO, 1, 4);
   1818   TEST_SUB_PATTERN("(?:.*)(a)(.)", "xxa" ENG, 0, 2, ENG, 3, 5);
   1819   TEST_SUB_PATTERN("(" HSTROKE ")", "a" HSTROKE ENG, 0, 1, HSTROKE, 1, 3);
   1820   TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED);
   1821   TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED);
   1822   TEST_SUB_PATTERN("(a)?(b)", "b", 0, 0, "b", 0, 1);
   1823   TEST_SUB_PATTERN("(a)?(b)", "b", 0, 1, "", -1, -1);
   1824   TEST_SUB_PATTERN("(a)?(b)", "b", 0, 2, "b", 0, 1);
   1825 
   1826   /* TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name,
   1827    * 			    expected_sub, expected_start, expected_end) */
   1828   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "ab", 0, "A", "b", 1, 2);
   1829   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "aab", 1, "A", "b", 2, 3);
   1830   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "A", "b", 4, 5);
   1831   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "B", NULL, UNTOUCHED, UNTOUCHED);
   1832   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "C", NULL, UNTOUCHED, UNTOUCHED);
   1833   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "A", EGRAVE, 1, 3);
   1834   TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "B", "x", 3, 4);
   1835   TEST_NAMED_SUB_PATTERN("(?P<A>a)?(?P<B>b)", "b", 0, "A", "", -1, -1);
   1836   TEST_NAMED_SUB_PATTERN("(?P<A>a)?(?P<B>b)", "b", 0, "B", "b", 0, 1);
   1837 
   1838   /* TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name,
   1839    *				     expected_sub, expected_start, expected_end) */
   1840   TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>a)|(?P<N>b)", "ab", 0, "N", "a", 0, 1);
   1841   TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>aa)|(?P<N>a)", "aa", 0, "N", "aa", 0, 2);
   1842   TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>aa)(?P<N>a)", "aaa", 0, "N", "aa", 0, 2);
   1843   TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>x)|(?P<N>a)", "a", 0, "N", "a", 0, 1);
   1844   TEST_NAMED_SUB_PATTERN_DUPNAMES("(?P<N>x)y|(?P<N>a)b", "ab", 0, "N", "a", 0, 1);
   1845 
   1846   /* DUPNAMES option inside the pattern */
   1847   TEST_NAMED_SUB_PATTERN("(?J)(?P<N>a)|(?P<N>b)", "ab", 0, "N", "a", 0, 1);
   1848   TEST_NAMED_SUB_PATTERN("(?J)(?P<N>aa)|(?P<N>a)", "aa", 0, "N", "aa", 0, 2);
   1849   TEST_NAMED_SUB_PATTERN("(?J)(?P<N>aa)(?P<N>a)", "aaa", 0, "N", "aa", 0, 2);
   1850   TEST_NAMED_SUB_PATTERN("(?J)(?P<N>x)|(?P<N>a)", "a", 0, "N", "a", 0, 1);
   1851   TEST_NAMED_SUB_PATTERN("(?J)(?P<N>x)y|(?P<N>a)b", "ab", 0, "N", "a", 0, 1);
   1852 
   1853   /* TEST_FETCH_ALL#(pattern, string, ...) */
   1854   TEST_FETCH_ALL0("a", "");
   1855   TEST_FETCH_ALL0("a", "b");
   1856   TEST_FETCH_ALL1("a", "a", "a");
   1857   TEST_FETCH_ALL1("a+", "aa", "aa");
   1858   TEST_FETCH_ALL1("(?:a)", "a", "a");
   1859   TEST_FETCH_ALL2("(a)", "a", "a", "a");
   1860   TEST_FETCH_ALL2("a(.)", "ab", "ab", "b");
   1861   TEST_FETCH_ALL2("a(.)", "a" HSTROKE, "a" HSTROKE, HSTROKE);
   1862   TEST_FETCH_ALL3("(?:.*)(a)(.)", "xyazk", "xyaz", "a", "z");
   1863   TEST_FETCH_ALL3("(?P<A>.)(a)", "xa", "xa", "x", "a");
   1864   TEST_FETCH_ALL3("(?P<A>.)(a)", ENG "a", ENG "a", ENG, "a");
   1865   TEST_FETCH_ALL3("(a)?(b)", "b", "b", "", "b");
   1866   TEST_FETCH_ALL3("(a)?(b)", "ab", "ab", "a", "b");
   1867 
   1868   /* TEST_SPLIT_SIMPLE#(pattern, string, ...) */
   1869   TEST_SPLIT_SIMPLE0("", "");
   1870   TEST_SPLIT_SIMPLE0("a", "");
   1871   TEST_SPLIT_SIMPLE1(",", "a", "a");
   1872   TEST_SPLIT_SIMPLE1("(,)\\s*", "a", "a");
   1873   TEST_SPLIT_SIMPLE2(",", "a,b", "a", "b");
   1874   TEST_SPLIT_SIMPLE3(",", "a,b,c", "a", "b", "c");
   1875   TEST_SPLIT_SIMPLE3(",\\s*", "a,b,c", "a", "b", "c");
   1876   TEST_SPLIT_SIMPLE3(",\\s*", "a, b, c", "a", "b", "c");
   1877   TEST_SPLIT_SIMPLE3("(,)\\s*", "a,b", "a", ",", "b");
   1878   TEST_SPLIT_SIMPLE3("(,)\\s*", "a, b", "a", ",", "b");
   1879   /* Not matched sub-strings. */
   1880   TEST_SPLIT_SIMPLE2("a|(b)", "xay", "x", "y");
   1881   TEST_SPLIT_SIMPLE3("a|(b)", "xby", "x", "b", "y");
   1882   /* Empty matches. */
   1883   TEST_SPLIT_SIMPLE3("", "abc", "a", "b", "c");
   1884   TEST_SPLIT_SIMPLE3(" *", "ab c", "a", "b", "c");
   1885   /* Invalid patterns. */
   1886   TEST_SPLIT_SIMPLE0("\\", "");
   1887   TEST_SPLIT_SIMPLE0("[", "");
   1888 
   1889   /* TEST_SPLIT#(pattern, string, start_position, max_tokens, ...) */
   1890   TEST_SPLIT0("", "", 0, 0);
   1891   TEST_SPLIT0("a", "", 0, 0);
   1892   TEST_SPLIT0("a", "", 0, 1);
   1893   TEST_SPLIT0("a", "", 0, 2);
   1894   TEST_SPLIT0("a", "a", 1, 0);
   1895   TEST_SPLIT1(",", "a", 0, 0, "a");
   1896   TEST_SPLIT1(",", "a,b", 0, 1, "a,b");
   1897   TEST_SPLIT1("(,)\\s*", "a", 0, 0, "a");
   1898   TEST_SPLIT1(",", "a,b", 2, 0, "b");
   1899   TEST_SPLIT2(",", "a,b", 0, 0, "a", "b");
   1900   TEST_SPLIT2(",", "a,b,c", 0, 2, "a", "b,c");
   1901   TEST_SPLIT2(",", "a,b", 1, 0, "", "b");
   1902   TEST_SPLIT2(",", "a,", 0, 0, "a", "");
   1903   TEST_SPLIT3(",", "a,b,c", 0, 0, "a", "b", "c");
   1904   TEST_SPLIT3(",\\s*", "a,b,c", 0, 0, "a", "b", "c");
   1905   TEST_SPLIT3(",\\s*", "a, b, c", 0, 0, "a", "b", "c");
   1906   TEST_SPLIT3("(,)\\s*", "a,b", 0, 0, "a", ",", "b");
   1907   TEST_SPLIT3("(,)\\s*", "a, b", 0, 0, "a", ",", "b");
   1908   /* Not matched sub-strings. */
   1909   TEST_SPLIT2("a|(b)", "xay", 0, 0, "x", "y");
   1910   TEST_SPLIT3("a|(b)", "xby", 0, -1, "x", "b", "y");
   1911   /* Empty matches. */
   1912   TEST_SPLIT2(" *", "ab c", 1, 0, "b", "c");
   1913   TEST_SPLIT3("", "abc", 0, 0, "a", "b", "c");
   1914   TEST_SPLIT3(" *", "ab c", 0, 0, "a", "b", "c");
   1915   TEST_SPLIT1(" *", "ab c", 0, 1, "ab c");
   1916   TEST_SPLIT2(" *", "ab c", 0, 2, "a", "b c");
   1917   TEST_SPLIT3(" *", "ab c", 0, 3, "a", "b", "c");
   1918   TEST_SPLIT3(" *", "ab c", 0, 4, "a", "b", "c");
   1919 
   1920   /* TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) */
   1921   TEST_CHECK_REPLACEMENT("", TRUE, FALSE);
   1922   TEST_CHECK_REPLACEMENT("a", TRUE, FALSE);
   1923   TEST_CHECK_REPLACEMENT("\\t\\n\\v\\r\\f\\a\\b\\\\\\x{61}", TRUE, FALSE);
   1924   TEST_CHECK_REPLACEMENT("\\0", TRUE, TRUE);
   1925   TEST_CHECK_REPLACEMENT("\\n\\2", TRUE, TRUE);
   1926   TEST_CHECK_REPLACEMENT("\\g<foo>", TRUE, TRUE);
   1927   /* Invalid strings */
   1928   TEST_CHECK_REPLACEMENT("\\Q", FALSE, FALSE);
   1929   TEST_CHECK_REPLACEMENT("x\\Ay", FALSE, FALSE);
   1930 
   1931   /* TEST_EXPAND(pattern, string, string_to_expand, raw, expected) */
   1932   TEST_EXPAND("a", "a", "", FALSE, "");
   1933   TEST_EXPAND("a", "a", "\\0", FALSE, "a");
   1934   TEST_EXPAND("a", "a", "\\1", FALSE, "");
   1935   TEST_EXPAND("(a)", "ab", "\\1", FALSE, "a");
   1936   TEST_EXPAND("(a)", "a", "\\1", FALSE, "a");
   1937   TEST_EXPAND("(a)", "a", "\\g<1>", FALSE, "a");
   1938   TEST_EXPAND("a", "a", "\\0130", FALSE, "X");
   1939   TEST_EXPAND("a", "a", "\\\\\\0", FALSE, "\\a");
   1940   TEST_EXPAND("a(?P<G>.)c", "xabcy", "X\\g<G>X", FALSE, "XbX");
   1941   TEST_EXPAND("(.)(?P<1>.)", "ab", "\\1", FALSE, "a");
   1942   TEST_EXPAND("(.)(?P<1>.)", "ab", "\\g<1>", FALSE, "a");
   1943   TEST_EXPAND(".", EURO, "\\0", FALSE, EURO);
   1944   TEST_EXPAND("(.)", EURO, "\\1", FALSE, EURO);
   1945   TEST_EXPAND("(?P<G>.)", EURO, "\\g<G>", FALSE, EURO);
   1946   TEST_EXPAND(".", "a", EURO, FALSE, EURO);
   1947   TEST_EXPAND(".", "a", EURO "\\0", FALSE, EURO "a");
   1948   TEST_EXPAND(".", "", "\\Lab\\Ec", FALSE, "abc");
   1949   TEST_EXPAND(".", "", "\\LaB\\EC", FALSE, "abC");
   1950   TEST_EXPAND(".", "", "\\Uab\\Ec", FALSE, "ABc");
   1951   TEST_EXPAND(".", "", "a\\ubc", FALSE, "aBc");
   1952   TEST_EXPAND(".", "", "a\\lbc", FALSE, "abc");
   1953   TEST_EXPAND(".", "", "A\\uBC", FALSE, "ABC");
   1954   TEST_EXPAND(".", "", "A\\lBC", FALSE, "AbC");
   1955   TEST_EXPAND(".", "", "A\\l\\\\BC", FALSE, "A\\BC");
   1956   TEST_EXPAND(".", "", "\\L" AGRAVE "\\E", FALSE, AGRAVE);
   1957   TEST_EXPAND(".", "", "\\U" AGRAVE "\\E", FALSE, AGRAVE_UPPER);
   1958   TEST_EXPAND(".", "", "\\u" AGRAVE "a", FALSE, AGRAVE_UPPER "a");
   1959   TEST_EXPAND(".", "ab", "x\\U\\0y\\Ez", FALSE, "xAYz");
   1960   TEST_EXPAND(".(.)", "AB", "x\\L\\1y\\Ez", FALSE, "xbyz");
   1961   TEST_EXPAND(".", "ab", "x\\u\\0y\\Ez", FALSE, "xAyz");
   1962   TEST_EXPAND(".(.)", "AB", "x\\l\\1y\\Ez", FALSE, "xbyz");
   1963   TEST_EXPAND(".(.)", "a" AGRAVE_UPPER, "x\\l\\1y", FALSE, "x" AGRAVE "y");
   1964   TEST_EXPAND("a", "bab", "\\x{61}", FALSE, "a");
   1965   TEST_EXPAND("a", "bab", "\\x61", FALSE, "a");
   1966   TEST_EXPAND("a", "bab", "\\x5a", FALSE, "Z");
   1967   TEST_EXPAND("a", "bab", "\\0\\x5A", FALSE, "aZ");
   1968   TEST_EXPAND("a", "bab", "\\1\\x{5A}", FALSE, "Z");
   1969   TEST_EXPAND("a", "bab", "\\x{00E0}", FALSE, AGRAVE);
   1970   TEST_EXPAND("", "bab", "\\x{0634}", FALSE, SHEEN);
   1971   TEST_EXPAND("", "bab", "\\x{634}", FALSE, SHEEN);
   1972   TEST_EXPAND("", "", "\\t", FALSE, "\t");
   1973   TEST_EXPAND("", "", "\\v", FALSE, "\v");
   1974   TEST_EXPAND("", "", "\\r", FALSE, "\r");
   1975   TEST_EXPAND("", "", "\\n", FALSE, "\n");
   1976   TEST_EXPAND("", "", "\\f", FALSE, "\f");
   1977   TEST_EXPAND("", "", "\\a", FALSE, "\a");
   1978   TEST_EXPAND("", "", "\\b", FALSE, "\b");
   1979   TEST_EXPAND("a(.)", "abc", "\\0\\b\\1", FALSE, "ab\bb");
   1980   TEST_EXPAND("a(.)", "abc", "\\0141", FALSE, "a");
   1981   TEST_EXPAND("a(.)", "abc", "\\078", FALSE, "\a8");
   1982   TEST_EXPAND("a(.)", "abc", "\\077", FALSE, "?");
   1983   TEST_EXPAND("a(.)", "abc", "\\0778", FALSE, "?8");
   1984   TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", FALSE, AGRAVE);
   1985   TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", TRUE, "\xc3");
   1986   TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\0", TRUE, "a\xc3");
   1987   /* Invalid strings. */
   1988   TEST_EXPAND("", "", "\\Q", FALSE, NULL);
   1989   TEST_EXPAND("", "", "x\\Ay", FALSE, NULL);
   1990   TEST_EXPAND("", "", "\\g<", FALSE, NULL);
   1991   TEST_EXPAND("", "", "\\g<>", FALSE, NULL);
   1992   TEST_EXPAND("", "", "\\g<1a>", FALSE, NULL);
   1993   TEST_EXPAND("", "", "\\g<a$>", FALSE, NULL);
   1994   TEST_EXPAND("", "", "\\", FALSE, NULL);
   1995   TEST_EXPAND("a", "a", "\\x{61", FALSE, NULL);
   1996   TEST_EXPAND("a", "a", "\\x6X", FALSE, NULL);
   1997   /* Pattern-less. */
   1998   TEST_EXPAND(NULL, NULL, "", FALSE, "");
   1999   TEST_EXPAND(NULL, NULL, "\\n", FALSE, "\n");
   2000   /* Invalid strings */
   2001   TEST_EXPAND(NULL, NULL, "\\Q", FALSE, NULL);
   2002   TEST_EXPAND(NULL, NULL, "x\\Ay", FALSE, NULL);
   2003 
   2004   /* TEST_REPLACE(pattern, string, start_position, replacement, expected) */
   2005   TEST_REPLACE("a", "ababa", 0, "A", "AbAbA");
   2006   TEST_REPLACE("a", "ababa", 1, "A", "abAbA");
   2007   TEST_REPLACE("a", "ababa", 2, "A", "abAbA");
   2008   TEST_REPLACE("a", "ababa", 3, "A", "ababA");
   2009   TEST_REPLACE("a", "ababa", 4, "A", "ababA");
   2010   TEST_REPLACE("a", "ababa", 5, "A", "ababa");
   2011   TEST_REPLACE("a", "ababa", 6, "A", "ababa");
   2012   TEST_REPLACE("a", "abababa", 2, "A", "abAbAbA");
   2013   TEST_REPLACE("a", "abab", 0, "A", "AbAb");
   2014   TEST_REPLACE("a", "baba", 0, "A", "bAbA");
   2015   TEST_REPLACE("a", "bab", 0, "A", "bAb");
   2016   TEST_REPLACE("$^", "abc", 0, "X", "abc");
   2017   TEST_REPLACE("(.)a", "ciao", 0, "a\\1", "caio");
   2018   TEST_REPLACE("a.", "abc", 0, "\\0\\0", "ababc");
   2019   TEST_REPLACE("a", "asd", 0, "\\0101", "Asd");
   2020   TEST_REPLACE("(a).\\1", "aba cda", 0, "\\1\\n", "a\n cda");
   2021   TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x");
   2022   TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE);
   2023   TEST_REPLACE("[^-]", "-" EURO "-x-" HSTROKE, 0, "a", "-a-a-a");
   2024   TEST_REPLACE("[^-]", "-" EURO "-" HSTROKE, 0, "a\\g<0>a", "-a" EURO "a-a" HSTROKE "a");
   2025   TEST_REPLACE("-", "-" EURO "-" HSTROKE, 0, "", EURO HSTROKE);
   2026   TEST_REPLACE(".*", "hello", 0, "\\U\\0\\E", "HELLO");
   2027   TEST_REPLACE(".*", "hello", 0, "\\u\\0", "Hello");
   2028   TEST_REPLACE("\\S+", "hello world", 0, "\\U-\\0-", "-HELLO- -WORLD-");
   2029   TEST_REPLACE(".", "a", 0, "\\A", NULL);
   2030   TEST_REPLACE(".", "a", 0, "\\g", NULL);
   2031 
   2032   /* TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) */
   2033   TEST_REPLACE_LIT("a", "ababa", 0, "A", "AbAbA");
   2034   TEST_REPLACE_LIT("a", "ababa", 1, "A", "abAbA");
   2035   TEST_REPLACE_LIT("a", "ababa", 2, "A", "abAbA");
   2036   TEST_REPLACE_LIT("a", "ababa", 3, "A", "ababA");
   2037   TEST_REPLACE_LIT("a", "ababa", 4, "A", "ababA");
   2038   TEST_REPLACE_LIT("a", "ababa", 5, "A", "ababa");
   2039   TEST_REPLACE_LIT("a", "ababa", 6, "A", "ababa");
   2040   TEST_REPLACE_LIT("a", "abababa", 2, "A", "abAbAbA");
   2041   TEST_REPLACE_LIT("a", "abcadaa", 0, "A", "AbcAdAA");
   2042   TEST_REPLACE_LIT("$^", "abc", 0, "X", "abc");
   2043   TEST_REPLACE_LIT("(.)a", "ciao", 0, "a\\1", "ca\\1o");
   2044   TEST_REPLACE_LIT("a.", "abc", 0, "\\0\\0\\n", "\\0\\0\\nc");
   2045   TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x");
   2046   TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE);
   2047   TEST_REPLACE_LIT(AGRAVE, "-" AGRAVE "-" HSTROKE, 0, "a" ENG "a", "-a" ENG "a-" HSTROKE);
   2048   TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "a", "-a-a-a");
   2049   TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE, 0, "a\\g<0>a", "-a\\g<0>a-a\\g<0>a");
   2050   TEST_REPLACE_LIT("-", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "", EURO AGRAVE HSTROKE);
   2051   TEST_REPLACE_LIT("(?=[A-Z0-9])", "RegExTest", 0, "_", "_Reg_Ex_Test");
   2052   TEST_REPLACE_LIT("(?=[A-Z0-9])", "RegExTest", 1, "_", "Reg_Ex_Test");
   2053 
   2054   /* TEST_GET_STRING_NUMBER(pattern, name, expected_num) */
   2055   TEST_GET_STRING_NUMBER("", "A", -1);
   2056   TEST_GET_STRING_NUMBER("(?P<A>.)", "A", 1);
   2057   TEST_GET_STRING_NUMBER("(?P<A>.)", "B", -1);
   2058   TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "A", 1);
   2059   TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "B", 2);
   2060   TEST_GET_STRING_NUMBER("(?P<A>.)(?P<B>a)", "C", -1);
   2061   TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "A", 1);
   2062   TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "B", 3);
   2063   TEST_GET_STRING_NUMBER("(?P<A>.)(.)(?P<B>a)", "C", -1);
   2064   TEST_GET_STRING_NUMBER("(?:a)(?P<A>.)", "A", 1);
   2065   TEST_GET_STRING_NUMBER("(?:a)(?P<A>.)", "B", -1);
   2066 
   2067   /* TEST_ESCAPE(string, length, expected) */
   2068   TEST_ESCAPE("hello world", -1, "hello world");
   2069   TEST_ESCAPE("hello world", 5, "hello");
   2070   TEST_ESCAPE("hello.world", -1, "hello\\.world");
   2071   TEST_ESCAPE("a(b\\b.$", -1, "a\\(b\\\\b\\.\\$");
   2072   TEST_ESCAPE("hello\0world", -1, "hello");
   2073   TEST_ESCAPE("hello\0world", 11, "hello\\0world");
   2074   TEST_ESCAPE(EURO "*" ENG, -1, EURO "\\*" ENG);
   2075   TEST_ESCAPE("a$", -1, "a\\$");
   2076   TEST_ESCAPE("$a", -1, "\\$a");
   2077   TEST_ESCAPE("a$a", -1, "a\\$a");
   2078   TEST_ESCAPE("$a$", -1, "\\$a\\$");
   2079   TEST_ESCAPE("$a$", 0, "");
   2080   TEST_ESCAPE("$a$", 1, "\\$");
   2081   TEST_ESCAPE("$a$", 2, "\\$a");
   2082   TEST_ESCAPE("$a$", 3, "\\$a\\$");
   2083   TEST_ESCAPE("$a$", 4, "\\$a\\$\\0");
   2084   TEST_ESCAPE("|()[]{}^$*+?.", -1, "\\|\\(\\)\\[\\]\\{\\}\\^\\$\\*\\+\\?\\.");
   2085   TEST_ESCAPE("a|a(a)a[a]a{a}a^a$a*a+a?a.a", -1,
   2086 	      "a\\|a\\(a\\)a\\[a\\]a\\{a\\}a\\^a\\$a\\*a\\+a\\?a\\.a");
   2087 
   2088   /* TEST_MATCH_ALL#(pattern, string, string_len, start_position, ...) */
   2089   TEST_MATCH_ALL0("<.*>", "", -1, 0);
   2090   TEST_MATCH_ALL0("a+", "", -1, 0);
   2091   TEST_MATCH_ALL0("a+", "a", 0, 0);
   2092   TEST_MATCH_ALL0("a+", "a", -1, 1);
   2093   TEST_MATCH_ALL1("<.*>", "<a>", -1, 0, "<a>", 0, 3);
   2094   TEST_MATCH_ALL1("a+", "a", -1, 0, "a", 0, 1);
   2095   TEST_MATCH_ALL1("a+", "aa", 1, 0, "a", 0, 1);
   2096   TEST_MATCH_ALL1("a+", "aa", -1, 1, "a", 1, 2);
   2097   TEST_MATCH_ALL1("a+", "aa", 2, 1, "a", 1, 2);
   2098   TEST_MATCH_ALL1(".+", ENG, -1, 0, ENG, 0, 2);
   2099   TEST_MATCH_ALL2("<.*>", "<a><b>", -1, 0, "<a><b>", 0, 6, "<a>", 0, 3);
   2100   TEST_MATCH_ALL2("a+", "aa", -1, 0, "aa", 0, 2, "a", 0, 1);
   2101   TEST_MATCH_ALL2(".+", ENG EURO, -1, 0, ENG EURO, 0, 5, ENG, 0, 2);
   2102   TEST_MATCH_ALL3("<.*>", "<a><b><c>", -1, 0, "<a><b><c>", 0, 9,
   2103 		  "<a><b>", 0, 6, "<a>", 0, 3);
   2104   TEST_MATCH_ALL3("a+", "aaa", -1, 0, "aaa", 0, 3, "aa", 0, 2, "a", 0, 1);
   2105 
   2106 end: /* if abort_on_fail is TRUE the flow passes to this label. */
   2107   verbose ("\n%u tests passed, %u failed\n", passed, failed);
   2108   return failed;
   2109 }
   2110 
   2111 #else /* ENABLE_REGEX false */
   2112 
   2113 int
   2114 main (int argc, char *argv[])
   2115 {
   2116   g_print ("GRegex is disabled.\n");
   2117   return 0;
   2118 }
   2119 
   2120 #endif /* ENABLE_REGEX */
   2121