nsprpub/lib/tests/string.c

Wed, 31 Dec 2014 07:16:47 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:16:47 +0100
branch
TOR_BUG_9701
changeset 3
141e0f1194b1
permissions
-rw-r--r--

Revert simplistic fix pending revisit of Mozilla integration attempt.

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "plstr.h"
     7 #include "nspr.h"
     9 #include <stdio.h>
    11 /* PL_strlen */
    12 PRBool test_001(void)
    13 {
    14     static struct
    15     {
    16         const char *str;
    17         PRUint32    len;
    18     } array[] =
    19       {
    20           { (const char *)0, 0 },
    21           { "", 0 },
    22           { "a", 1 },
    23           { "abcdefg", 7 },
    24           { "abcdefg\0hijk", 7 }
    25       };
    27     int i;
    29     printf("Test 001 (PL_strlen)      ..."); fflush(stdout);
    31     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
    32     {
    33         if( PL_strlen(array[i].str) != array[i].len )
    34         {
    35             printf("FAIL (%d: %s->%d, %d)\n", i, 
    36                    array[i].str ? array[i].str : "(null)",
    37                    PL_strlen(array[i].str), array[i].len);
    38             return PR_FALSE;
    39         }
    40     }
    42     printf("PASS\n");
    43     return PR_TRUE;
    44 }
    46 /* PL_strnlen */
    47 PRBool test_002(void)
    48 {
    49     static struct
    50     {
    51         const char *str;
    52         PRUint32    max;
    53         PRUint32    len;
    54     } array[] =
    55       {
    56           { (const char *)0, 0, 0 },
    57           { (const char *)0, 12, 0 },
    58           { "", 0, 0 },
    59           { "", 12, 0 },
    60           { "a", 0, 0 },
    61           { "a", 1, 1 },
    62           { "a", 12, 1 },
    63           { "abcdefg", 0, 0 },
    64           { "abcdefg", 1, 1 },
    65           { "abcdefg", 7, 7 },
    66           { "abcdefg", 12, 7 },
    67           { "abcdefg\0hijk", 0, 0 },
    68           { "abcdefg\0hijk", 1, 1 },
    69           { "abcdefg\0hijk", 7, 7 },
    70           { "abcdefg\0hijk", 12, 7 },
    71       };
    73     int i;
    75     printf("Test 002 (PL_strnlen)     ..."); fflush(stdout);
    77     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
    78     {
    79         if( PL_strnlen(array[i].str, array[i].max) != array[i].len )
    80         {
    81             printf("FAIL (%d: %s,%d->%d, %d)\n", i,
    82                    array[i].str ? array[i].str : "(null)", array[i].max,
    83                    PL_strnlen(array[i].str, array[i].max), array[i].len);
    84             return PR_FALSE;
    85         }
    86     }
    88     printf("PASS\n");
    89     return PR_TRUE;
    90 }
    92 /* PL_strcpy */
    93 PRBool test_003(void)
    94 {
    95     static char buffer[ 1024 ];
    97     static struct
    98     {
    99         const char *str;
   100         char       *dest;
   101         char       *rv;
   102         PRBool      comp;
   103     } array[] =
   104       {
   105           { (const char *)0, (char *)0, (char *)0, PR_FALSE },
   106           { (const char *)0, buffer, (char *)0, PR_FALSE },
   107           { "", (char *)0, (char *)0, PR_FALSE },
   108           { "", buffer, buffer, PR_TRUE },
   109           { "a", (char *)0, (char *)0, PR_FALSE },
   110           { "a", buffer, buffer, PR_TRUE },
   111           { "abcdefg", (char *)0, (char *)0, PR_FALSE },
   112           { "abcdefg", buffer, buffer, PR_TRUE },
   113           { "wxyz\0abcdefg", (char *)0, (char *)0, PR_FALSE },
   114           { "wxyz\0abcdefg", buffer, buffer, PR_TRUE }
   115       };
   117     int i;
   119     printf("Test 003 (PL_strcpy)      ..."); fflush(stdout);
   121     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   122     {
   123         char *rv;
   124         const char *a = array[i].str;
   125         const char *b = (const char *)array[i].dest;
   127         rv = PL_strcpy(array[i].dest, array[i].str);
   128         if( array[i].rv != rv )
   129         {
   130             printf("FAIL %d: (0x%x, %s)->0x%x\n", i, array[i].dest,
   131                    array[i].str ? array[i].str : "(null)", rv);
   132             return PR_FALSE;
   133         }
   135         if( array[i].comp )
   136         {
   137             while( 1 )
   138             {
   139                 if( *a != *b )
   140                 {
   141                     printf("FAIL %d: %s->%.32s\n", i, 
   142                            array[i].str ? array[i].str : "(null)", 
   143                            array[i].dest ? array[i].dest : "(null)");
   144                     return PR_FALSE;
   145                 }
   147                 if( (char)0 == *a ) break;
   149                 a++;
   150                 b++;
   151             }
   152         }
   153     }
   155     printf("PASS\n");
   156     return PR_TRUE;
   157 }
   159 /* PL_strncpy */
   160 PRBool test_004(void)
   161 {
   162     static char buffer[ 1024 ];
   164     static struct
   165     {
   166         const char *str;
   167         PRUint32    len;
   168         char       *dest;
   169         char       *rv;
   170         PRBool      comp;
   171         const char *result;
   172         PRBool      nulled;
   173     } array[] =
   174       {
   175           { (const char *)0, 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   176           { (const char *)0, 0, buffer, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   177           { (const char *)0, 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   178           { (const char *)0, 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   179           { (const char *)0, 1, buffer, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   180           { (const char *)0, 7, buffer, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   181           { "", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   182           { "", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   183           { "", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   184           { "", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   185           { "", 1, buffer, buffer, PR_TRUE, "", PR_TRUE },
   186           { "", 7, buffer, buffer, PR_TRUE, "", PR_TRUE },
   187           { "a", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   188           { "a", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   189           { "a", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   190           { "a", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   191           { "b", 1, buffer, buffer, PR_TRUE, "b", PR_FALSE },
   192           { "c", 7, buffer, buffer, PR_TRUE, "c", PR_TRUE },
   193           { "de", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   194           { "de", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   195           { "de", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   196           { "de", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   197           { "fg", 1, buffer, buffer, PR_TRUE, "f", PR_FALSE },
   198           { "hi", 7, buffer, buffer, PR_TRUE, "hi", PR_TRUE },
   199           { "jklmnopq", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   200           { "jklmnopq", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   201           { "jklmnopq", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   202           { "jklmnopq", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   203           { "rstuvwxy", 1, buffer, buffer, PR_TRUE, "r", PR_FALSE },
   204           { "zABCDEFG", 7, buffer, buffer, PR_TRUE, "zABCDEF", PR_FALSE },
   205           { "a\0XXX", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   206           { "a\0XXX", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   207           { "a\0XXX", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   208           { "a\0XXX", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   209           { "b\0XXX", 1, buffer, buffer, PR_TRUE, "b", PR_FALSE },
   210           { "c\0XXX", 7, buffer, buffer, PR_TRUE, "c", PR_TRUE },
   211           { "de\0XXX", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   212           { "de\0XXX", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   213           { "de\0XXX", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   214           { "de\0XXX", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   215           { "fg\0XXX", 1, buffer, buffer, PR_TRUE, "f", PR_FALSE },
   216           { "hi\0XXX", 7, buffer, buffer, PR_TRUE, "hi", PR_TRUE },
   217           { "jklmnopq\0XXX", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   218           { "jklmnopq\0XXX", 0, buffer, buffer, PR_FALSE, (const char *)0, PR_FALSE },
   219           { "jklmnopq\0XXX", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   220           { "jklmnopq\0XXX", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0, PR_FALSE },
   221           { "rstuvwxy\0XXX", 1, buffer, buffer, PR_TRUE, "r", PR_FALSE },
   222           { "zABCDEFG\0XXX", 7, buffer, buffer, PR_TRUE, "zABCDEF", PR_FALSE },
   223       };
   225     int i;
   227     printf("Test 004 (PL_strncpy)     ..."); fflush(stdout);
   229     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   230     {
   231         char *rv;
   232         int j;
   234         for( j = 0; j < sizeof(buffer); j++ )
   235             buffer[j] = '-';
   237         rv = PL_strncpy(array[i].dest, array[i].str, array[i].len);
   238         if( array[i].rv != rv )
   239         {
   240             printf("FAIL %d: (0x%x, %s, %lu)->0x%x\n", i, array[i].dest,
   241                    array[i].str ? array[i].str : "(null)", array[i].len, rv);
   242             return PR_FALSE;
   243         }
   245         if( array[i].comp )
   246         {
   247             const char *a = array[i].result;
   248             const char *b = array[i].dest;
   250             while( *a )
   251             {
   252                 if( *a != *b )
   253                 {
   254                     printf("FAIL %d: %s != %.32s\n", i, 
   255                            array[i].result, array[i].dest);
   256                     return PR_FALSE;
   257                 }
   259                 a++;
   260                 b++;
   261             }
   263             if( array[i].nulled )
   264             {
   265                 if( *b != '\0' )
   266                 {
   267                     printf("FAIL %d: not terminated\n", i);
   268                     return PR_FALSE;
   269                 }
   270             }
   271             else
   272             {
   273                 if( *b != '-' )
   274                 {
   275                     printf("FAIL %d: overstepped\n", i);
   276                     return PR_FALSE;
   277                 }
   278             }
   279         }
   280     }
   282     printf("PASS\n");
   283     return PR_TRUE;
   284 }
   286 /* PL_strncpyz */
   287 PRBool test_005(void)
   288 {
   289     static char buffer[ 1024 ];
   291     static struct
   292     {
   293         const char *str;
   294         PRUint32    len;
   295         char       *dest;
   296         char       *rv;
   297         PRBool      comp;
   298         const char *result;
   299     } array[] =
   300       {
   301           { (const char *)0, 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   302           { (const char *)0, 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   303           { (const char *)0, 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   304           { (const char *)0, 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   305           { (const char *)0, 1, buffer, (char *)0, PR_FALSE, (const char *)0 },
   306           { (const char *)0, 7, buffer, (char *)0, PR_FALSE, (const char *)0 },
   307           { "", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   308           { "", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   309           { "", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   310           { "", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   311           { "", 1, buffer, buffer, PR_TRUE, "" },
   312           { "", 7, buffer, buffer, PR_TRUE, "" },
   313           { "a", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   314           { "a", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   315           { "a", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   316           { "a", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   317           { "b", 1, buffer, buffer, PR_TRUE, "" },
   318           { "c", 7, buffer, buffer, PR_TRUE, "c" },
   319           { "de", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   320           { "de", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   321           { "de", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   322           { "de", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   323           { "fg", 1, buffer, buffer, PR_TRUE, "" },
   324           { "hi", 7, buffer, buffer, PR_TRUE, "hi" },
   325           { "jklmnopq", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   326           { "jklmnopq", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   327           { "jklmnopq", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   328           { "jklmnopq", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   329           { "rstuvwxy", 1, buffer, buffer, PR_TRUE, "" },
   330           { "zABCDEFG", 7, buffer, buffer, PR_TRUE, "zABCDE" },
   331           { "a\0XXX", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   332           { "a\0XXX", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   333           { "a\0XXX", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   334           { "a\0XXX", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   335           { "b\0XXX", 1, buffer, buffer, PR_TRUE, "" },
   336           { "c\0XXX", 7, buffer, buffer, PR_TRUE, "c" },
   337           { "de\0XXX", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   338           { "de\0XXX", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   339           { "de\0XXX", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   340           { "de\0XXX", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   341           { "fg\0XXX", 1, buffer, buffer, PR_TRUE, "" },
   342           { "hi\0XXX", 7, buffer, buffer, PR_TRUE, "hi" },
   343           { "jklmnopq\0XXX", 0, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   344           { "jklmnopq\0XXX", 0, buffer, (char *)0, PR_FALSE, (const char *)0 },
   345           { "jklmnopq\0XXX", 1, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   346           { "jklmnopq\0XXX", 7, (char *)0, (char *)0, PR_FALSE, (const char *)0 },
   347           { "rstuvwxy\0XXX", 1, buffer, buffer, PR_TRUE, "" },
   348           { "zABCDEFG\0XXX", 7, buffer, buffer, PR_TRUE, "zABCDE" },
   349       };
   351     int i;
   353     printf("Test 005 (PL_strncpyz)    ..."); fflush(stdout);
   355     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   356     {
   357         char *rv;
   358         int j;
   360         for( j = 0; j < sizeof(buffer); j++ )
   361             buffer[j] = '-';
   363         rv = PL_strncpyz(array[i].dest, array[i].str, array[i].len);
   364         if( array[i].rv != rv )
   365         {
   366             printf("FAIL %d: (0x%x, %s, %lu)->0x%x\n", i, array[i].dest,
   367                    array[i].str ? array[i].str : "(null)", array[i].len, rv);
   368             return PR_FALSE;
   369         }
   371         if( array[i].comp )
   372         {
   373             const char *a = array[i].result;
   374             const char *b = array[i].dest;
   376             while( 1 )
   377             {
   378                 if( *a != *b )
   379                 {
   380                     printf("FAIL %d: %s != %.32s\n", i, 
   381                            array[i].result, array[i].dest);
   382                     return PR_FALSE;
   383                 }
   385                 if( (char)0 == *a ) break;
   387                 a++;
   388                 b++;
   389             }
   390         }
   391     }
   393     printf("PASS\n");
   394     return PR_TRUE;
   395 }
   397 /* PL_strdup */
   398 PRBool test_006(void)
   399 {
   400     static const char *array[] =
   401     {
   402         (const char *)0,
   403         "",
   404         "a",
   405         "abcdefg"
   406     };
   408     int i;
   410     printf("Test 006 (PL_strdup)      ..."); fflush(stdout);
   412     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   413     {
   414         char *rv = PL_strdup(array[i]);
   416         if( (char *)0 == rv )
   417         {
   418             printf("FAIL %d: 0x%x -> 0\n", i, array[i]);
   419             return PR_FALSE;
   420         }
   422         if( (const char *)0 == array[i] )
   423         {
   424             if( (char)0 != *rv )
   425             {
   426                 printf("FAIL %d: (const char *)0 -> %.32s\n", i, rv);
   427                 return PR_FALSE;
   428             }
   429         }
   430         else
   431         {
   432             const char *a = array[i];
   433             const char *b = (const char *)rv;
   435             while( 1 )
   436             {
   437                 if( *a != *b )
   438                 {
   439                     printf("FAIL %d: %s != %.32s\n", i, array[i], rv);
   440                     return PR_FALSE;
   441                 }
   443                 if( (char)0 == *a ) break;
   445                 a++;
   446                 b++;
   447             }
   449         }
   450         PL_strfree(rv);
   451     }
   453     printf("PASS\n");
   454     return PR_TRUE;
   455 }
   457 /* PL_strndup */
   458 PRBool test_007(void)
   459 {
   460     static struct
   461     {
   462         const char *str;
   463         PRUint32    len;
   464         const char *result;
   465     } array[] =
   466       {
   467           { (const char *)0, 0, "" },
   468           { (const char *)0, 1, "" },
   469           { (const char *)0, 7, "" },
   470           { "", 0, "" },
   471           { "", 1, "" },
   472           { "", 7, "" },
   473           { "a", 0, "" },
   474           { "a", 1, "a" },
   475           { "a", 7, "a" },
   476           { "ab", 0, "" },
   477           { "ab", 1, "a" },
   478           { "ab", 7, "ab" },
   479           { "abcdefg", 0, "" },
   480           { "abcdefg", 1, "a" },
   481           { "abcdefg", 7, "abcdefg" },
   482           { "abcdefghijk", 0, "" },
   483           { "abcdefghijk", 1, "a" },
   484           { "abcdefghijk", 7, "abcdefg" },
   485           { "abcdef\0ghijk", 0, "" },
   486           { "abcdef\0ghijk", 1, "a" },
   487           { "abcdef\0ghijk", 7, "abcdef" }
   488       };
   490     int i;
   492     printf("Test 007 (PL_strndup)     ..."); fflush(stdout);
   494     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   495     {
   496         char *rv = PL_strndup(array[i].str, array[i].len);
   497         const char *a;
   498         const char *b;
   500         if( (char *)0 == rv )
   501         {
   502             printf("FAIL %d: %s,%lu -> 0\n", i, 
   503                    array[i].str ? array[i].str : "(null)", array[i].len);
   504             return PR_FALSE;
   505         }
   507         a = array[i].result;
   508         b = (const char *)rv;
   510         while( 1 )
   511         {
   512             if( *a != *b )
   513             {
   514                 printf("FAIL %d: %s != %.32s\n", i, array[i].result, rv);
   515                 return PR_FALSE;
   516             }
   518             if( (char)0 == *a ) break;
   520             a++;
   521             b++;
   522         }
   524         free(rv);
   525     }
   527     printf("PASS\n");
   528     return PR_TRUE;
   529 }
   531 /* PL_strcat */
   532 PRBool test_008(void)
   533 {
   534     static struct
   535     {
   536         const char *first;
   537         const char *second;
   538         const char *result;
   539     } array[] =
   540       {
   541           { (const char *)0, (const char *)0, (const char *)0 },
   542           { (const char *)0, "xyz", (const char *)0 },
   543           { "", (const char *)0, "" },
   544           { "", "", "" },
   545           { "ab", "", "ab" },
   546           { "cd", "ef", "cdef" },
   547           { "gh\0X", "", "gh" },
   548           { "ij\0X", "kl", "ijkl" },
   549           { "mn\0X", "op\0X", "mnop" },
   550           { "qr", "st\0X", "qrst" },
   551           { "uv\0X", "wx\0X", "uvwx" }
   552       };
   554     int i;
   556     printf("Test 008 (PL_strcat)      ..."); fflush(stdout);
   558     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   559     {
   560         char buffer[ 1024 ];
   561         int j;
   562         char *rv;
   564         for( j = 0; j < sizeof(buffer); j++ )
   565             buffer[j] = '-';
   567         if( (const char *)0 != array[i].first )
   568             (void)PL_strcpy(buffer, array[i].first);
   570         rv = PL_strcat(((const char *)0 == array[i].first) ? (char *)0 : buffer,
   571                        array[i].second);
   573         if( (const char *)0 == array[i].result )
   574         {
   575             if( (char *)0 != rv )
   576             {
   577                 printf("FAIL %d: %s+%s -> %.32s, not zero\n", i,
   578                        array[i].first ? array[i].first : "(null)",
   579                        array[i].second ? array[i].second : "(null)",
   580                        rv);
   581                 return PR_FALSE;
   582             }
   583         }
   584         else
   585         {
   586             if( (char *)0 == rv )
   587             {
   588                 printf("FAIL %d: %s+%s -> null, not %s\n", i,
   589                        array[i].first ? array[i].first : "(null)",
   590                        array[i].second ? array[i].second : "(null)",
   591                        array[i].result);
   592                 return PR_FALSE;
   593             }
   594             else
   595             {
   596                 const char *a = array[i].result;
   597                 const char *b = (const char *)rv;
   599                 while( 1 )
   600                 {
   601                     if( *a != *b )
   602                     {
   603                         printf("FAIL %d: %s+%s -> %.32s, not %s\n", i,
   604                                array[i].first ? array[i].first : "(null)",
   605                                array[i].second ? array[i].second : "(null)",
   606                                rv, array[i].result);
   607                         return PR_FALSE;
   608                     }
   610                     if( (char)0 == *a ) break;
   612                     a++;
   613                     b++;
   614                 }
   615             }
   616         }
   617     }
   619     printf("PASS\n");
   620     return PR_TRUE;
   621 }
   623 /* PL_strncat */
   624 PRBool test_009(void)
   625 {
   626     static struct
   627     {
   628         const char *first;
   629         const char *second;
   630         PRUint32    length;
   631         PRBool      nulled;
   632         const char *result;
   633     } array[] = 
   634       {
   635           { (const char *)0, (const char *)0, 0, PR_FALSE, (const char *)0 },
   636           { (const char *)0, (const char *)0, 1, PR_FALSE, (const char *)0 },
   637           { (const char *)0, (const char *)0, 7, PR_FALSE, (const char *)0 },
   638           { (const char *)0, "", 0, PR_FALSE, (const char *)0 },
   639           { (const char *)0, "", 1, PR_FALSE, (const char *)0 },
   640           { (const char *)0, "", 7, PR_FALSE, (const char *)0 },
   641           { (const char *)0, "stuff", 0, PR_FALSE, (const char *)0 },
   642           { (const char *)0, "stuff", 1, PR_FALSE, (const char *)0 },
   643           { (const char *)0, "stuff", 7, PR_FALSE, (const char *)0 },
   644           { "", (const char *)0, 0, PR_TRUE, "" },
   645           { "", (const char *)0, 1, PR_TRUE, "" },
   646           { "", (const char *)0, 7, PR_TRUE, "" },
   647           { "", "", 0, PR_TRUE, "" },
   648           { "", "", 1, PR_TRUE, "" },
   649           { "", "", 7, PR_TRUE, "" },
   650           { "", "abcdefgh", 0, PR_TRUE, "" },
   651           { "", "abcdefgh", 1, PR_FALSE, "a" },
   652           { "", "abcdefgh", 7, PR_FALSE, "abcdefg" },
   653           { "xyz", (const char *)0, 0, PR_TRUE, "xyz" },
   654           { "xyz", (const char *)0, 1, PR_TRUE, "xyz" },
   655           { "xyz", (const char *)0, 7, PR_TRUE, "xyz" },
   656           { "xyz", "", 0, PR_TRUE, "xyz" },
   657           { "xyz", "", 1, PR_TRUE, "xyz" },
   658           { "xyz", "", 7, PR_TRUE, "xyz" },
   659           { "xyz", "abcdefgh", 0, PR_TRUE, "xyz" },
   660           { "xyz", "abcdefgh", 1, PR_FALSE, "xyza" },
   661           { "xyz", "abcdefgh", 7, PR_FALSE, "xyzabcdefg" }
   662       };
   664     int i;
   666     printf("Test 009 (PL_strncat)     ..."); fflush(stdout);
   668     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   669     {
   670         char buffer[ 1024 ];
   671         int j;
   672         char *rv;
   674         for( j = 0; j < sizeof(buffer); j++ )
   675             buffer[j] = '-';
   677         if( (const char *)0 != array[i].first )
   678             (void)PL_strcpy(buffer, array[i].first);
   680         rv = PL_strncat(((const char *)0 == array[i].first) ? (char *)0 : buffer,
   681                          array[i].second, array[i].length);
   683         if( (const char *)0 == array[i].result )
   684         {
   685             if( (char *)0 != rv )
   686             {
   687                 printf("FAIL %d: %s+%s/%lu -> %.32s, not zero\n", i,
   688                        array[i].first ? array[i].first : "(null)",
   689                        array[i].second ? array[i].second : "(null)",
   690                        array[i].length, rv);
   691                 return PR_FALSE;
   692             }
   693         }
   694         else
   695         {
   696             if( (char *)0 == rv )
   697             {
   698                 printf("FAIL %d: %s+%s/%lu -> null, not %s\n", i,
   699                        array[i].first ? array[i].first : "(null)",
   700                        array[i].second ? array[i].second : "(null)",
   701                        array[i].length, array[i].result);
   702                 return PR_FALSE;
   703             }
   704             else
   705             {
   706                 const char *a = array[i].result;
   707                 const char *b = (const char *)rv;
   709                 while( *a )
   710                 {
   711                     if( *a != *b )
   712                     {
   713                         printf("FAIL %d: %s+%s/%lu -> %.32s, not %s\n", i,
   714                                array[i].first ? array[i].first : "(null)",
   715                                array[i].second ? array[i].second : "(null)",
   716                                array[i].length, rv, array[i].result);
   717                         return PR_FALSE;
   718                     }
   720                     a++;
   721                     b++;
   722                 }
   724                 if( array[i].nulled )
   725                 {
   726                     if( (char)0 != *b )
   727                     {
   728                         printf("FAIL %d: %s+%s/%lu -> not nulled\n", i,
   729                                array[i].first ? array[i].first : "(null)",
   730                                array[i].second ? array[i].second : "(null)",
   731                                array[i].length);
   732                         return PR_FALSE;
   733                     }
   734                 }
   735                 else
   736                 {
   737                     if( (char)0 == *b )
   738                     {
   739                         printf("FAIL %d: %s+%s/%lu -> overrun\n", i,
   740                                array[i].first ? array[i].first : "(null)",
   741                                array[i].second ? array[i].second : "(null)",
   742                                array[i].length);
   743                         return PR_FALSE;
   744                     }
   745                 }
   746             }
   747         }
   748     }
   750     printf("PASS\n");
   751     return PR_TRUE;
   752 }
   754 /* PL_strcatn */
   755 PRBool test_010(void)
   756 {
   757     static struct
   758     {
   759         const char *first;
   760         const char *second;
   761         PRUint32    length;
   762         const char *result;
   763     } array[] = 
   764       {
   765           { (const char *)0, (const char *)0, 0, (const char *)0 },
   766           { (const char *)0, (const char *)0, 1, (const char *)0 },
   767           { (const char *)0, (const char *)0, 7, (const char *)0 },
   768           { (const char *)0, "", 0, (const char *)0 },
   769           { (const char *)0, "", 1, (const char *)0 },
   770           { (const char *)0, "", 7, (const char *)0 },
   771           { (const char *)0, "stuff", 0, (const char *)0 },
   772           { (const char *)0, "stuff", 1, (const char *)0 },
   773           { (const char *)0, "stuff", 7, (const char *)0 },
   774           { "", (const char *)0, 0, "" },
   775           { "", (const char *)0, 1, "" },
   776           { "", (const char *)0, 7, "" },
   777           { "", "", 0, "" },
   778           { "", "", 1, "" },
   779           { "", "", 7, "" },
   780           { "", "abcdefgh", 0, "" },
   781           { "", "abcdefgh", 1, "" },
   782           { "", "abcdefgh", 7, "abcdef" },
   783           { "xyz", (const char *)0, 0, "xyz" },
   784           { "xyz", (const char *)0, 1, "xyz" },
   785           { "xyz", (const char *)0, 7, "xyz" },
   786           { "xyz", "", 0, "xyz" },
   787           { "xyz", "", 1, "xyz" },
   788           { "xyz", "", 7, "xyz" },
   789           { "xyz", "abcdefgh", 0, "xyz" },
   790           { "xyz", "abcdefgh", 1, "xyz" },
   791           { "xyz", "abcdefgh", 7, "xyzabc" }
   792       };
   794     int i;
   796     printf("Test 010 (PL_strcatn)     ..."); fflush(stdout);
   798     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   799     {
   800         char buffer[ 1024 ];
   801         int j;
   802         char *rv;
   804         for( j = 0; j < sizeof(buffer); j++ )
   805             buffer[j] = '-';
   807         if( (const char *)0 != array[i].first )
   808             (void)PL_strcpy(buffer, array[i].first);
   810         rv = PL_strcatn(((const char *)0 == array[i].first) ? (char *)0 : buffer,
   811                         array[i].length, array[i].second);
   813         if( (const char *)0 == array[i].result )
   814         {
   815             if( (char *)0 != rv )
   816             {
   817                 printf("FAIL %d: %s+%s/%lu -> %.32s, not zero\n", i,
   818                        array[i].first ? array[i].first : "(null)",
   819                        array[i].second ? array[i].second : "(null)",
   820                        array[i].length, rv);
   821                 return PR_FALSE;
   822             }
   823         }
   824         else
   825         {
   826             if( (char *)0 == rv )
   827             {
   828                 printf("FAIL %d: %s+%s/%lu -> null, not %s\n", i,
   829                        array[i].first ? array[i].first : "(null)",
   830                        array[i].second ? array[i].second : "(null)",
   831                        array[i].length, array[i].result);
   832                 return PR_FALSE;
   833             }
   834             else
   835             {
   836                 const char *a = array[i].result;
   837                 const char *b = (const char *)rv;
   839                 while( 1 )
   840                 {
   841                     if( *a != *b )
   842                     {
   843                         printf("FAIL %d: %s+%s/%lu -> %.32s, not %s\n", i,
   844                                array[i].first ? array[i].first : "(null)",
   845                                array[i].second ? array[i].second : "(null)",
   846                                array[i].length, rv, array[i].result);
   847                         return PR_FALSE;
   848                     }
   850                     if( (char)0 == *a ) break;
   852                     a++;
   853                     b++;
   854                 }
   855             }
   856         }
   857     }
   859     printf("PASS\n");
   860     return PR_TRUE;
   861 }
   863 /* PL_strcmp */
   864 PRBool test_011(void)
   865 {
   866     static struct
   867     {
   868         const char *one;
   869         const char *two;
   870         PRIntn      sign;
   871     } array[] =
   872       {
   873           { (const char *)0, (const char *)0, 0 },
   874           { (const char *)0, "word", -1 },
   875           { "word", (const char *)0, 1 },
   876           { "word", "word", 0 },
   877           { "aZYXVUT", "bZYXVUT", -1 },
   878           { "aZYXVUT", "bAAAAAA", -1 },
   879           { "a", "aa", -1 },
   880           { "a", "a", 0 },
   881           { "a", "A", 1 },
   882           { "aaaaa", "baaaa", -1 },
   883           { "aaaaa", "abaaa", -1 },
   884           { "aaaaa", "aabaa", -1 },
   885           { "aaaaa", "aaaba", -1 },
   886           { "aaaaa", "aaaab", -1 },
   887           { "bZYXVUT", "aZYXVUT", 1 },
   888           { "bAAAAAA", "aZYXVUT", 1 },
   889           { "aa", "a", 1 },
   890           { "A", "a", -1 },
   891           { "baaaa", "aaaaa", 1 },
   892           { "abaaa", "aaaaa", 1 },
   893           { "aabaa", "aaaaa", 1 },
   894           { "aaaba", "aaaaa", 1 },
   895           { "aaaab", "aaaaa", 1 },
   896           { "word", "Word", 1 },
   897           { "word", "wOrd", 1 },
   898           { "word", "woRd", 1 },
   899           { "word", "worD", 1 },
   900           { "WORD", "wORD", -1 },
   901           { "WORD", "WoRD", -1 },
   902           { "WORD", "WOrD", -1 },
   903           { "WORD", "WORd", -1 }
   904       };
   906     int i;
   908     printf("Test 011 (PL_strcmp)      ..."); fflush(stdout);
   910     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
   911     {
   912         PRIntn rv = PL_strcmp(array[i].one, array[i].two);
   914         switch( array[i].sign )
   915         {
   916             case -1:
   917                 if( rv < 0 ) continue;
   918                 break;
   919             case 1:
   920                 if( rv > 0 ) continue;
   921                 break;
   922             case 0:
   923                 if( 0 == rv ) continue;
   924                 break;
   925             default:
   926                 PR_NOT_REACHED("static data inconsistancy");
   927                 break;
   928         }
   930         printf("FAIL %d: %s-%s -> %d, not %d\n", i,
   931                array[i].one ? array[i].one : "(null)",
   932                array[i].two ? array[i].two : "(null)",
   933                rv, array[i].sign);
   934         return PR_FALSE;
   935     }
   937     printf("PASS\n");
   938     return PR_TRUE;
   939 }
   941 /* PL_strncmp */
   942 PRBool test_012(void)
   943 {
   944     static struct
   945     {
   946         const char *one;
   947         const char *two;
   948         PRUint32    max;
   949         PRIntn      sign;
   950     } array[] =
   951       {
   952           { (const char *)0, (const char *)0, 0, 0 },
   953           { (const char *)0, (const char *)0, 1, 0 },
   954           { (const char *)0, (const char *)0, 4, 0 },
   955           { (const char *)0, "word", 0, -1 },
   956           { (const char *)0, "word", 1, -1 },
   957           { (const char *)0, "word", 4, -1 },
   958           { "word", (const char *)0, 0, 1 },
   959           { "word", (const char *)0, 1, 1 },
   960           { "word", (const char *)0, 4, 1 },
   961           { "word", "word", 0, 0 },
   962           { "word", "word", 1, 0 },
   963           { "word", "word", 3, 0 },
   964           { "word", "word", 5, 0 },
   965           { "aZYXVUT", "bZYXVUT", 0, 0 },
   966           { "aZYXVUT", "bZYXVUT", 1, -1 },
   967           { "aZYXVUT", "bZYXVUT", 4, -1 },
   968           { "aZYXVUT", "bZYXVUT", 9, -1 },
   969           { "aZYXVUT", "bAAAAAA", 0, 0 },
   970           { "aZYXVUT", "bAAAAAA", 1, -1 },
   971           { "aZYXVUT", "bAAAAAA", 4, -1 },
   972           { "aZYXVUT", "bAAAAAA", 5, -1 },
   973           { "a", "aa", 0, 0 },
   974           { "a", "aa", 1, 0 },
   975           { "a", "aa", 4, -1 },
   976           { "a", "a", 0, 0 },
   977           { "a", "a", 1, 0 },
   978           { "a", "a", 4, 0 },
   979           { "a", "A", 0, 0 },
   980           { "a", "A", 1, 1 },
   981           { "a", "A", 4, 1 },
   982           { "aaaaa", "baaaa", 0, 0 },
   983           { "aaaaa", "baaaa", 1, -1 },
   984           { "aaaaa", "baaaa", 4, -1 },
   985           { "aaaaa", "abaaa", 0, 0 },
   986           { "aaaaa", "abaaa", 1, 0 },
   987           { "aaaaa", "abaaa", 4, -1 },
   988           { "aaaaa", "aabaa", 0, 0 },
   989           { "aaaaa", "aabaa", 1, 0 },
   990           { "aaaaa", "aabaa", 4, -1 },
   991           { "aaaaa", "aaaba", 0, 0 },
   992           { "aaaaa", "aaaba", 1, 0 },
   993           { "aaaaa", "aaaba", 4, -1 },
   994           { "aaaaa", "aaaab", 0, 0 },
   995           { "aaaaa", "aaaab", 1, 0 },
   996           { "aaaaa", "aaaab", 4, 0 },
   997           { "bZYXVUT", "aZYXVUT", 0, 0 },
   998           { "bZYXVUT", "aZYXVUT", 1, 1 },
   999           { "bZYXVUT", "aZYXVUT", 4, 1 },
  1000           { "bAAAAAA", "aZYXVUT", 0, 0 },
  1001           { "bAAAAAA", "aZYXVUT", 1, 1 },
  1002           { "bAAAAAA", "aZYXVUT", 4, 1 },
  1003           { "aa", "a", 0, 0 },
  1004           { "aa", "a", 1, 0 },
  1005           { "aa", "a", 4, 1 },
  1006           { "A", "a", 0, 0 },
  1007           { "A", "a", 1, -1 },
  1008           { "A", "a", 4, -1 },
  1009           { "baaaa", "aaaaa", 0, 0 },
  1010           { "baaaa", "aaaaa", 1, 1 },
  1011           { "baaaa", "aaaaa", 4, 1 },
  1012           { "abaaa", "aaaaa", 0, 0 },
  1013           { "abaaa", "aaaaa", 1, 0 },
  1014           { "abaaa", "aaaaa", 4, 1 },
  1015           { "aabaa", "aaaaa", 0, 0 },
  1016           { "aabaa", "aaaaa", 1, 0 },
  1017           { "aabaa", "aaaaa", 4, 1 },
  1018           { "aaaba", "aaaaa", 0, 0 },
  1019           { "aaaba", "aaaaa", 1, 0 },
  1020           { "aaaba", "aaaaa", 4, 1 },
  1021           { "aaaab", "aaaaa", 0, 0 },
  1022           { "aaaab", "aaaaa", 1, 0 },
  1023           { "aaaab", "aaaaa", 4, 0 },
  1024           { "word", "Word", 0, 0 },
  1025           { "word", "Word", 1, 1 },
  1026           { "word", "Word", 3, 1 },
  1027           { "word", "wOrd", 0, 0 },
  1028           { "word", "wOrd", 1, 0 },
  1029           { "word", "wOrd", 3, 1 },
  1030           { "word", "woRd", 0, 0 },
  1031           { "word", "woRd", 1, 0 },
  1032           { "word", "woRd", 3, 1 },
  1033           { "word", "worD", 0, 0 },
  1034           { "word", "worD", 1, 0 },
  1035           { "word", "worD", 3, 0 },
  1036           { "WORD", "wORD", 0, 0 },
  1037           { "WORD", "wORD", 1, -1 },
  1038           { "WORD", "wORD", 3, -1 },
  1039           { "WORD", "WoRD", 0, 0 },
  1040           { "WORD", "WoRD", 1, 0 },
  1041           { "WORD", "WoRD", 3, -1 },
  1042           { "WORD", "WOrD", 0, 0 },
  1043           { "WORD", "WOrD", 1, 0 },
  1044           { "WORD", "WOrD", 3, -1 },
  1045           { "WORD", "WORd", 0, 0 },
  1046           { "WORD", "WORd", 1, 0 },
  1047           { "WORD", "WORd", 3, 0 }
  1049       };
  1051     int i;
  1053     printf("Test 012 (PL_strncmp)     ..."); fflush(stdout);
  1055     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1057         PRIntn rv = PL_strncmp(array[i].one, array[i].two, array[i].max);
  1059         switch( array[i].sign )
  1061             case -1:
  1062                 if( rv < 0 ) continue;
  1063                 break;
  1064             case 1:
  1065                 if( rv > 0 ) continue;
  1066                 break;
  1067             case 0:
  1068                 if( 0 == rv ) continue;
  1069                 break;
  1070             default:
  1071                 PR_NOT_REACHED("static data inconsistancy");
  1072                 break;
  1075         printf("FAIL %d: %s-%s/%ld -> %d, not %d\n", i,
  1076                array[i].one ? array[i].one : "(null)",
  1077                array[i].two ? array[i].two : "(null)",
  1078                array[i].max, rv, array[i].sign);
  1079         return PR_FALSE;
  1082     printf("PASS\n");
  1083     return PR_TRUE;
  1086 /* PL_strcasecmp */
  1087 PRBool test_013(void)
  1089     static struct
  1091         const char *one;
  1092         const char *two;
  1093         PRIntn      sign;
  1094     } array[] =
  1096           { (const char *)0, (const char *)0, 0 },
  1097           { (const char *)0, "word", -1 },
  1098           { "word", (const char *)0, 1 },
  1099           { "word", "word", 0 },
  1100           { "aZYXVUT", "bZYXVUT", -1 },
  1101           { "aZYXVUT", "bAAAAAA", -1 },
  1102           { "a", "aa", -1 },
  1103           { "a", "a", 0 },
  1104           { "a", "A", 0 },
  1105           { "aaaaa", "baaaa", -1 },
  1106           { "aaaaa", "abaaa", -1 },
  1107           { "aaaaa", "aabaa", -1 },
  1108           { "aaaaa", "aaaba", -1 },
  1109           { "aaaaa", "aaaab", -1 },
  1110           { "bZYXVUT", "aZYXVUT", 1 },
  1111           { "bAAAAAA", "aZYXVUT", 1 },
  1112           { "aa", "a", 1 },
  1113           { "A", "a", 0 },
  1114           { "baaaa", "aaaaa", 1 },
  1115           { "abaaa", "aaaaa", 1 },
  1116           { "aabaa", "aaaaa", 1 },
  1117           { "aaaba", "aaaaa", 1 },
  1118           { "aaaab", "aaaaa", 1 },
  1119           { "word", "Word", 0 },
  1120           { "word", "wOrd", 0 },
  1121           { "word", "woRd", 0 },
  1122           { "word", "worD", 0 },
  1123           { "WORD", "wORD", 0 },
  1124           { "WORD", "WoRD", 0 },
  1125           { "WORD", "WOrD", 0 },
  1126           { "WORD", "WORd", 0 }
  1127       };
  1129     int i;
  1131     printf("Test 013 (PL_strcasecmp)  ..."); fflush(stdout);
  1133     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1135         PRIntn rv = PL_strcasecmp(array[i].one, array[i].two);
  1137         switch( array[i].sign )
  1139             case -1:
  1140                 if( rv < 0 ) continue;
  1141                 break;
  1142             case 1:
  1143                 if( rv > 0 ) continue;
  1144                 break;
  1145             case 0:
  1146                 if( 0 == rv ) continue;
  1147                 break;
  1148             default:
  1149                 PR_NOT_REACHED("static data inconsistancy");
  1150                 break;
  1153         printf("FAIL %d: %s-%s -> %d, not %d\n", i,
  1154                array[i].one ? array[i].one : "(null)",
  1155                array[i].two ? array[i].two : "(null)",
  1156                rv, array[i].sign);
  1157         return PR_FALSE;
  1160     printf("PASS\n");
  1161     return PR_TRUE;
  1164 /* PL_strncasecmp */
  1165 PRBool test_014(void)
  1167     static struct
  1169         const char *one;
  1170         const char *two;
  1171         PRUint32    max;
  1172         PRIntn      sign;
  1173     } array[] =
  1175           { (const char *)0, (const char *)0, 0, 0 },
  1176           { (const char *)0, (const char *)0, 1, 0 },
  1177           { (const char *)0, (const char *)0, 4, 0 },
  1178           { (const char *)0, "word", 0, -1 },
  1179           { (const char *)0, "word", 1, -1 },
  1180           { (const char *)0, "word", 4, -1 },
  1181           { "word", (const char *)0, 0, 1 },
  1182           { "word", (const char *)0, 1, 1 },
  1183           { "word", (const char *)0, 4, 1 },
  1184           { "word", "word", 0, 0 },
  1185           { "word", "word", 1, 0 },
  1186           { "word", "word", 3, 0 },
  1187           { "word", "word", 5, 0 },
  1188           { "aZYXVUT", "bZYXVUT", 0, 0 },
  1189           { "aZYXVUT", "bZYXVUT", 1, -1 },
  1190           { "aZYXVUT", "bZYXVUT", 4, -1 },
  1191           { "aZYXVUT", "bZYXVUT", 9, -1 },
  1192           { "aZYXVUT", "bAAAAAA", 0, 0 },
  1193           { "aZYXVUT", "bAAAAAA", 1, -1 },
  1194           { "aZYXVUT", "bAAAAAA", 4, -1 },
  1195           { "aZYXVUT", "bAAAAAA", 5, -1 },
  1196           { "a", "aa", 0, 0 },
  1197           { "a", "aa", 1, 0 },
  1198           { "a", "aa", 4, -1 },
  1199           { "a", "a", 0, 0 },
  1200           { "a", "a", 1, 0 },
  1201           { "a", "a", 4, 0 },
  1202           { "a", "A", 0, 0 },
  1203           { "a", "A", 1, 0 },
  1204           { "a", "A", 4, 0 },
  1205           { "aaaaa", "baaaa", 0, 0 },
  1206           { "aaaaa", "baaaa", 1, -1 },
  1207           { "aaaaa", "baaaa", 4, -1 },
  1208           { "aaaaa", "abaaa", 0, 0 },
  1209           { "aaaaa", "abaaa", 1, 0 },
  1210           { "aaaaa", "abaaa", 4, -1 },
  1211           { "aaaaa", "aabaa", 0, 0 },
  1212           { "aaaaa", "aabaa", 1, 0 },
  1213           { "aaaaa", "aabaa", 4, -1 },
  1214           { "aaaaa", "aaaba", 0, 0 },
  1215           { "aaaaa", "aaaba", 1, 0 },
  1216           { "aaaaa", "aaaba", 4, -1 },
  1217           { "aaaaa", "aaaab", 0, 0 },
  1218           { "aaaaa", "aaaab", 1, 0 },
  1219           { "aaaaa", "aaaab", 4, 0 },
  1220           { "bZYXVUT", "aZYXVUT", 0, 0 },
  1221           { "bZYXVUT", "aZYXVUT", 1, 1 },
  1222           { "bZYXVUT", "aZYXVUT", 4, 1 },
  1223           { "bAAAAAA", "aZYXVUT", 0, 0 },
  1224           { "bAAAAAA", "aZYXVUT", 1, 1 },
  1225           { "bAAAAAA", "aZYXVUT", 4, 1 },
  1226           { "aa", "a", 0, 0 },
  1227           { "aa", "a", 1, 0 },
  1228           { "aa", "a", 4, 1 },
  1229           { "A", "a", 0, 0 },
  1230           { "A", "a", 1, 0 },
  1231           { "A", "a", 4, 0 },
  1232           { "baaaa", "aaaaa", 0, 0 },
  1233           { "baaaa", "aaaaa", 1, 1 },
  1234           { "baaaa", "aaaaa", 4, 1 },
  1235           { "abaaa", "aaaaa", 0, 0 },
  1236           { "abaaa", "aaaaa", 1, 0 },
  1237           { "abaaa", "aaaaa", 4, 1 },
  1238           { "aabaa", "aaaaa", 0, 0 },
  1239           { "aabaa", "aaaaa", 1, 0 },
  1240           { "aabaa", "aaaaa", 4, 1 },
  1241           { "aaaba", "aaaaa", 0, 0 },
  1242           { "aaaba", "aaaaa", 1, 0 },
  1243           { "aaaba", "aaaaa", 4, 1 },
  1244           { "aaaab", "aaaaa", 0, 0 },
  1245           { "aaaab", "aaaaa", 1, 0 },
  1246           { "aaaab", "aaaaa", 4, 0 },
  1247           { "word", "Word", 0, 0 },
  1248           { "word", "Word", 1, 0 },
  1249           { "word", "Word", 3, 0 },
  1250           { "word", "wOrd", 0, 0 },
  1251           { "word", "wOrd", 1, 0 },
  1252           { "word", "wOrd", 3, 0 },
  1253           { "word", "woRd", 0, 0 },
  1254           { "word", "woRd", 1, 0 },
  1255           { "word", "woRd", 3, 0 },
  1256           { "word", "worD", 0, 0 },
  1257           { "word", "worD", 1, 0 },
  1258           { "word", "worD", 3, 0 },
  1259           { "WORD", "wORD", 0, 0 },
  1260           { "WORD", "wORD", 1, 0 },
  1261           { "WORD", "wORD", 3, 0 },
  1262           { "WORD", "WoRD", 0, 0 },
  1263           { "WORD", "WoRD", 1, 0 },
  1264           { "WORD", "WoRD", 3, 0 },
  1265           { "WORD", "WOrD", 0, 0 },
  1266           { "WORD", "WOrD", 1, 0 },
  1267           { "WORD", "WOrD", 3, 0 },
  1268           { "WORD", "WORd", 0, 0 },
  1269           { "WORD", "WORd", 1, 0 },
  1270           { "WORD", "WORd", 3, 0 }
  1271       };
  1273     int i;
  1275     printf("Test 014 (PL_strncasecmp) ..."); fflush(stdout);
  1277     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1279         PRIntn rv = PL_strncasecmp(array[i].one, array[i].two, array[i].max);
  1281         switch( array[i].sign )
  1283             case -1:
  1284                 if( rv < 0 ) continue;
  1285                 break;
  1286             case 1:
  1287                 if( rv > 0 ) continue;
  1288                 break;
  1289             case 0:
  1290                 if( 0 == rv ) continue;
  1291                 break;
  1292             default:
  1293                 PR_NOT_REACHED("static data inconsistancy");
  1294                 break;
  1297         printf("FAIL %d: %s-%s/%ld -> %d, not %d\n", i,
  1298                array[i].one ? array[i].one : "(null)",
  1299                array[i].two ? array[i].two : "(null)",
  1300                array[i].max, rv, array[i].sign);
  1301         return PR_FALSE;
  1304     printf("PASS\n");
  1305     return PR_TRUE;
  1308 /* PL_strchr */
  1309 PRBool test_015(void)
  1311     static struct
  1313         const char *str;
  1314         char        chr;
  1315         PRBool      ret;
  1316         PRUint32    off;
  1317     } array[] =
  1319           { (const char *)0, 'a', PR_FALSE, 0 },
  1320           { (const char *)0, '\0', PR_FALSE, 0 },
  1321           { "abcdefg", 'a', PR_TRUE, 0 },
  1322           { "abcdefg", 'b', PR_TRUE, 1 },
  1323           { "abcdefg", 'c', PR_TRUE, 2 },
  1324           { "abcdefg", 'd', PR_TRUE, 3 },
  1325           { "abcdefg", 'e', PR_TRUE, 4 },
  1326           { "abcdefg", 'f', PR_TRUE, 5 },
  1327           { "abcdefg", 'g', PR_TRUE, 6 },
  1328           { "abcdefg", 'h', PR_FALSE, 0 },
  1329           { "abcdefg", '\0', PR_TRUE, 7 },
  1330           { "abcdefg", 'A', PR_FALSE, 0 },
  1331           { "abcdefg", 'B', PR_FALSE, 0 },
  1332           { "abcdefg", 'C', PR_FALSE, 0 },
  1333           { "abcdefg", 'D', PR_FALSE, 0 },
  1334           { "abcdefg", 'E', PR_FALSE, 0 },
  1335           { "abcdefg", 'F', PR_FALSE, 0 },
  1336           { "abcdefg", 'G', PR_FALSE, 0 },
  1337           { "abcdefg", 'H', PR_FALSE, 0 },
  1338           { "abcdefgabcdefg", 'a', PR_TRUE, 0 },
  1339           { "abcdefgabcdefg", 'b', PR_TRUE, 1 },
  1340           { "abcdefgabcdefg", 'c', PR_TRUE, 2 },
  1341           { "abcdefgabcdefg", 'd', PR_TRUE, 3 },
  1342           { "abcdefgabcdefg", 'e', PR_TRUE, 4 },
  1343           { "abcdefgabcdefg", 'f', PR_TRUE, 5 },
  1344           { "abcdefgabcdefg", 'g', PR_TRUE, 6 },
  1345           { "abcdefgabcdefg", 'h', PR_FALSE, 0 },
  1346           { "abcdefgabcdefg", '\0', PR_TRUE, 14 }
  1347       };
  1349     int i;
  1351     printf("Test 015 (PL_strchr)      ..."); fflush(stdout);
  1353     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1355         char *rv = PL_strchr(array[i].str, array[i].chr);
  1357         if( PR_FALSE == array[i].ret )
  1359             if( (char *)0 != rv )
  1361                 printf("FAIL %d: %s,%c -> %.32s, not zero\n", i, array[i].str,
  1362                        array[i].chr, rv);
  1363                 return PR_FALSE;
  1366         else
  1368             if( (char *)0 == rv )
  1370                 printf("FAIL %d: %s,%c -> null, not +%lu\n", i, array[i].str,
  1371                        array[i].chr, array[i].off);
  1372                 return PR_FALSE;
  1375             if( &array[i].str[ array[i].off ] != rv )
  1377                 printf("FAIL %d: %s,%c -> 0x%x, not 0x%x+%lu\n", i, array[i].str,
  1378                        array[i].chr, rv, array[i].str, array[i].off);
  1379                 return PR_FALSE;
  1384     printf("PASS\n");
  1385     return PR_TRUE;
  1388 /* PL_strrchr */
  1389 PRBool test_016(void)
  1391     static struct
  1393         const char *str;
  1394         char        chr;
  1395         PRBool      ret;
  1396         PRUint32    off;
  1397     } array[] =
  1399           { (const char *)0, 'a', PR_FALSE, 0 },
  1400           { (const char *)0, '\0', PR_FALSE, 0 },
  1401           { "abcdefg", 'a', PR_TRUE, 0 },
  1402           { "abcdefg", 'b', PR_TRUE, 1 },
  1403           { "abcdefg", 'c', PR_TRUE, 2 },
  1404           { "abcdefg", 'd', PR_TRUE, 3 },
  1405           { "abcdefg", 'e', PR_TRUE, 4 },
  1406           { "abcdefg", 'f', PR_TRUE, 5 },
  1407           { "abcdefg", 'g', PR_TRUE, 6 },
  1408           { "abcdefg", 'h', PR_FALSE, 0 },
  1409           { "abcdefg", '\0', PR_TRUE, 7 },
  1410           { "abcdefg", 'A', PR_FALSE, 0 },
  1411           { "abcdefg", 'B', PR_FALSE, 0 },
  1412           { "abcdefg", 'C', PR_FALSE, 0 },
  1413           { "abcdefg", 'D', PR_FALSE, 0 },
  1414           { "abcdefg", 'E', PR_FALSE, 0 },
  1415           { "abcdefg", 'F', PR_FALSE, 0 },
  1416           { "abcdefg", 'G', PR_FALSE, 0 },
  1417           { "abcdefg", 'H', PR_FALSE, 0 },
  1418           { "abcdefgabcdefg", 'a', PR_TRUE, 7 },
  1419           { "abcdefgabcdefg", 'b', PR_TRUE, 8 },
  1420           { "abcdefgabcdefg", 'c', PR_TRUE, 9 },
  1421           { "abcdefgabcdefg", 'd', PR_TRUE, 10 },
  1422           { "abcdefgabcdefg", 'e', PR_TRUE, 11 },
  1423           { "abcdefgabcdefg", 'f', PR_TRUE, 12 },
  1424           { "abcdefgabcdefg", 'g', PR_TRUE, 13 },
  1425           { "abcdefgabcdefg", 'h', PR_FALSE, 0 },
  1426           { "abcdefgabcdefg", '\0', PR_TRUE, 14 }
  1427       };
  1429     int i;
  1431     printf("Test 016 (PL_strrchr)     ..."); fflush(stdout);
  1433     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1435         char *rv = PL_strrchr(array[i].str, array[i].chr);
  1437         if( PR_FALSE == array[i].ret )
  1439             if( (char *)0 != rv )
  1441                 printf("FAIL %d: %s,%c -> %.32s, not zero\n", i, array[i].str,
  1442                        array[i].chr, rv);
  1443                 return PR_FALSE;
  1446         else
  1448             if( (char *)0 == rv )
  1450                 printf("FAIL %d: %s,%c -> null, not +%lu\n", i, array[i].str,
  1451                        array[i].chr, array[i].off);
  1452                 return PR_FALSE;
  1455             if( &array[i].str[ array[i].off ] != rv )
  1457                 printf("FAIL %d: %s,%c -> 0x%x, not 0x%x+%lu\n", i, array[i].str,
  1458                        array[i].chr, rv, array[i].str, array[i].off);
  1459                 return PR_FALSE;
  1464     printf("PASS\n");
  1465     return PR_TRUE;
  1468 /* PL_strnchr */
  1469 PRBool test_017(void)
  1471     static struct
  1473         const char *str;
  1474         char        chr;
  1475         PRUint32    max;
  1476         PRBool      ret;
  1477         PRUint32    off;
  1478     } array[] =
  1480           { (const char *)0, 'a', 2, PR_FALSE, 0 },
  1481           { (const char *)0, '\0', 2, PR_FALSE, 0 },
  1482           { "abcdefg", 'a', 5, PR_TRUE, 0 },
  1483           { "abcdefg", 'b', 5, PR_TRUE, 1 },
  1484           { "abcdefg", 'c', 5, PR_TRUE, 2 },
  1485           { "abcdefg", 'd', 5, PR_TRUE, 3 },
  1486           { "abcdefg", 'e', 5, PR_TRUE, 4 },
  1487           { "abcdefg", 'f', 5, PR_FALSE, 0 },
  1488           { "abcdefg", 'g', 5, PR_FALSE, 0 },
  1489           { "abcdefg", 'h', 5, PR_FALSE, 0 },
  1490           { "abcdefg", '\0', 5, PR_FALSE, 0 },
  1491           { "abcdefg", '\0', 15, PR_TRUE, 7 },
  1492           { "abcdefg", 'A', 5, PR_FALSE, 0 },
  1493           { "abcdefg", 'B', 5, PR_FALSE, 0 },
  1494           { "abcdefg", 'C', 5, PR_FALSE, 0 },
  1495           { "abcdefg", 'D', 5, PR_FALSE, 0 },
  1496           { "abcdefg", 'E', 5, PR_FALSE, 0 },
  1497           { "abcdefg", 'F', 5, PR_FALSE, 0 },
  1498           { "abcdefg", 'G', 5, PR_FALSE, 0 },
  1499           { "abcdefg", 'H', 5, PR_FALSE, 0 },
  1500           { "abcdefgabcdefg", 'a', 10, PR_TRUE, 0 },
  1501           { "abcdefgabcdefg", 'b', 10, PR_TRUE, 1 },
  1502           { "abcdefgabcdefg", 'c', 10, PR_TRUE, 2 },
  1503           { "abcdefgabcdefg", 'd', 10, PR_TRUE, 3 },
  1504           { "abcdefgabcdefg", 'e', 10, PR_TRUE, 4 },
  1505           { "abcdefgabcdefg", 'f', 10, PR_TRUE, 5 },
  1506           { "abcdefgabcdefg", 'g', 10, PR_TRUE, 6 },
  1507           { "abcdefgabcdefg", 'h', 10, PR_FALSE, 0 },
  1508           { "abcdefgabcdefg", '\0', 10, PR_FALSE, 0 },
  1509           { "abcdefgabcdefg", '\0', 14, PR_FALSE, 0 },
  1510           { "abcdefgabcdefg", '\0', 15, PR_TRUE, 14 }
  1511       };
  1513     int i;
  1515     printf("Test 017 (PL_strnchr)     ..."); fflush(stdout);
  1517     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1519         char *rv = PL_strnchr(array[i].str, array[i].chr, array[i].max);
  1521         if( PR_FALSE == array[i].ret )
  1523             if( (char *)0 != rv )
  1525                 printf("FAIL %d: %s,%c/%lu -> %.32s, not zero\n", i, array[i].str,
  1526                        array[i].chr, array[i].max, rv);
  1527                 return PR_FALSE;
  1530         else
  1532             if( (char *)0 == rv )
  1534                 printf("FAIL %d: %s,%c/%lu -> null, not +%lu\n", i, array[i].str,
  1535                        array[i].chr, array[i].max, array[i].off);
  1536                 return PR_FALSE;
  1539             if( &array[i].str[ array[i].off ] != rv )
  1541                 printf("FAIL %d: %s,%c/%lu -> 0x%x, not 0x%x+%lu\n", i, array[i].str,
  1542                        array[i].chr, array[i].max, rv, array[i].str, array[i].off);
  1543                 return PR_FALSE;
  1548     printf("PASS\n");
  1549     return PR_TRUE;
  1552 /* PL_strnrchr */
  1553 PRBool test_018(void)
  1555     static struct
  1557         const char *str;
  1558         char        chr;
  1559         PRUint32    max;
  1560         PRBool      ret;
  1561         PRUint32    off;
  1562     } array[] =
  1564           { (const char *)0, 'a', 2, PR_FALSE, 0 },
  1565           { (const char *)0, '\0', 2, PR_FALSE, 0 },
  1566           { "abcdefg", 'a', 5, PR_TRUE, 0 },
  1567           { "abcdefg", 'b', 5, PR_TRUE, 1 },
  1568           { "abcdefg", 'c', 5, PR_TRUE, 2 },
  1569           { "abcdefg", 'd', 5, PR_TRUE, 3 },
  1570           { "abcdefg", 'e', 5, PR_TRUE, 4 },
  1571           { "abcdefg", 'f', 5, PR_FALSE, 0 },
  1572           { "abcdefg", 'g', 5, PR_FALSE, 0 },
  1573           { "abcdefg", 'h', 5, PR_FALSE, 0 },
  1574           { "abcdefg", '\0', 5, PR_FALSE, 0 },
  1575           { "abcdefg", '\0', 15, PR_TRUE, 7 },
  1576           { "abcdefg", 'A', 5, PR_FALSE, 0 },
  1577           { "abcdefg", 'B', 5, PR_FALSE, 0 },
  1578           { "abcdefg", 'C', 5, PR_FALSE, 0 },
  1579           { "abcdefg", 'D', 5, PR_FALSE, 0 },
  1580           { "abcdefg", 'E', 5, PR_FALSE, 0 },
  1581           { "abcdefg", 'F', 5, PR_FALSE, 0 },
  1582           { "abcdefg", 'G', 5, PR_FALSE, 0 },
  1583           { "abcdefg", 'H', 5, PR_FALSE, 0 },
  1584           { "abcdefgabcdefg", 'a', 10, PR_TRUE, 7 },
  1585           { "abcdefgabcdefg", 'b', 10, PR_TRUE, 8 },
  1586           { "abcdefgabcdefg", 'c', 10, PR_TRUE, 9 },
  1587           { "abcdefgabcdefg", 'd', 10, PR_TRUE, 3 },
  1588           { "abcdefgabcdefg", 'e', 10, PR_TRUE, 4 },
  1589           { "abcdefgabcdefg", 'f', 10, PR_TRUE, 5 },
  1590           { "abcdefgabcdefg", 'g', 10, PR_TRUE, 6 },
  1591           { "abcdefgabcdefg", 'h', 10, PR_FALSE, 0 },
  1592           { "abcdefgabcdefg", '\0', 10, PR_FALSE, 0 },
  1593           { "abcdefgabcdefg", '\0', 14, PR_FALSE, 0 },
  1594           { "abcdefgabcdefg", '\0', 15, PR_TRUE, 14 }
  1595       };
  1597     int i;
  1599     printf("Test 018 (PL_strnrchr)    ..."); fflush(stdout);
  1601     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1603         char *rv = PL_strnrchr(array[i].str, array[i].chr, array[i].max);
  1605         if( PR_FALSE == array[i].ret )
  1607             if( (char *)0 != rv )
  1609                 printf("FAIL %d: %s,%c/%lu -> %.32s, not zero\n", i, array[i].str,
  1610                        array[i].chr, array[i].max, rv);
  1611                 return PR_FALSE;
  1614         else
  1616             if( (char *)0 == rv )
  1618                 printf("FAIL %d: %s,%c/%lu -> null, not +%lu\n", i, array[i].str,
  1619                        array[i].chr, array[i].max, array[i].off);
  1620                 return PR_FALSE;
  1623             if( &array[i].str[ array[i].off ] != rv )
  1625                 printf("FAIL %d: %s,%c/%lu -> 0x%x, not 0x%x+%lu\n", i, array[i].str,
  1626                        array[i].chr, array[i].max, rv, array[i].str, array[i].off);
  1627                 return PR_FALSE;
  1632     printf("PASS\n");
  1633     return PR_TRUE;
  1636 /* PL_strpbrk */
  1637 PRBool test_019(void)
  1639     static struct
  1641         const char *str;
  1642         const char *chrs;
  1643         PRBool      ret;
  1644         PRUint32    off;
  1645     } array[] =
  1647           { (const char *)0, (const char *)0, PR_FALSE, 0 },
  1648           { (const char *)0, "abc", PR_FALSE, 0 },
  1649           { "abc", (const char *)0, PR_FALSE, 0 },
  1650           { "abcdefg", "", PR_FALSE, 0 },
  1651           { "", "aeiou", PR_FALSE, 0 },
  1652           { "abcdefg", "ae", PR_TRUE, 0 },
  1653           { "abcdefg", "ei", PR_TRUE, 4 },
  1654           { "abcdefg", "io", PR_FALSE, 0 },
  1655           { "abcdefg", "bcd", PR_TRUE, 1 },
  1656           { "abcdefg", "cbd", PR_TRUE, 1 },
  1657           { "abcdefg", "dbc", PR_TRUE, 1 },
  1658           { "abcdefg", "ghi", PR_TRUE, 6 },
  1659           { "abcdefg", "AE", PR_FALSE, 0 },
  1660           { "abcdefg", "EI", PR_FALSE, 0 },
  1661           { "abcdefg", "IO", PR_FALSE, 0 },
  1662           { "abcdefg", "BCD", PR_FALSE, 0 },
  1663           { "abcdefg", "CBD", PR_FALSE, 0 },
  1664           { "abcdefg", "DBC", PR_FALSE, 0 },
  1665           { "abcdefg", "GHI", PR_FALSE, 0 },
  1666           { "abcdefgabcdefg", "ae", PR_TRUE, 0 },
  1667           { "abcdefgabcdefg", "ei", PR_TRUE, 4 },
  1668           { "abcdefgabcdefg", "io", PR_FALSE, 0 },
  1669           { "abcdefgabcdefg", "bcd", PR_TRUE, 1 },
  1670           { "abcdefgabcdefg", "cbd", PR_TRUE, 1 },
  1671           { "abcdefgabcdefg", "dbc", PR_TRUE, 1 },
  1672           { "abcdefgabcdefg", "ghi", PR_TRUE, 6 },
  1673           { "abcdefgabcdefg", "AE", PR_FALSE, 0 },
  1674           { "abcdefgabcdefg", "EI", PR_FALSE, 0 },
  1675           { "abcdefgabcdefg", "IO", PR_FALSE, 0 },
  1676           { "abcdefgabcdefg", "BCD", PR_FALSE, 0 },
  1677           { "abcdefgabcdefg", "CBD", PR_FALSE, 0 },
  1678           { "abcdefgabcdefg", "DBC", PR_FALSE, 0 },
  1679           { "abcdefgabcdefg", "GHI", PR_FALSE, 0 }
  1680       };
  1682     int i;
  1684     printf("Test 019 (PL_strpbrk)     ..."); fflush(stdout);
  1686     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1688         char *rv = PL_strpbrk(array[i].str, array[i].chrs);
  1690         if( PR_FALSE == array[i].ret )
  1692             if( (char *)0 != rv )
  1694                 printf("FAIL %d: %s,%s -> %.32s, not null\n", i, 
  1695                        array[i].str ? array[i].str : "(null)",
  1696                        array[i].chrs ? array[i].chrs : "(null)", 
  1697                        rv);
  1698                 return PR_FALSE;
  1701         else
  1703             if( (char *)0 == rv )
  1705                 printf("FAIL %d: %s,%s -> null, not +%lu\n", i,
  1706                        array[i].str ? array[i].str : "(null)",
  1707                        array[i].chrs ? array[i].chrs : "(null)", 
  1708                        array[i].off);
  1709                 return PR_FALSE;
  1712             if( &array[i].str[ array[i].off ] != rv )
  1714                 printf("FAIL %d: %s,%s -> 0x%x, not 0x%x+%lu\n", i,
  1715                        array[i].str ? array[i].str : "(null)",
  1716                        array[i].chrs ? array[i].chrs : "(null)", 
  1717                        rv, array[i].str, array[i].off);
  1718                 return PR_FALSE;
  1723     printf("PASS\n");
  1724     return PR_TRUE;
  1727 /* PL_strprbrk */
  1728 PRBool test_020(void)
  1730     static struct
  1732         const char *str;
  1733         const char *chrs;
  1734         PRBool      ret;
  1735         PRUint32    off;
  1736     } array[] =
  1738           { (const char *)0, (const char *)0, PR_FALSE, 0 },
  1739           { (const char *)0, "abc", PR_FALSE, 0 },
  1740           { "abc", (const char *)0, PR_FALSE, 0 },
  1741           { "abcdefg", "", PR_FALSE, 0 },
  1742           { "", "aeiou", PR_FALSE, 0 },
  1743           { "abcdefg", "ae", PR_TRUE, 4 },
  1744           { "abcdefg", "ei", PR_TRUE, 4 },
  1745           { "abcdefg", "io", PR_FALSE, 0 },
  1746           { "abcdefg", "bcd", PR_TRUE, 3 },
  1747           { "abcdefg", "cbd", PR_TRUE, 3 },
  1748           { "abcdefg", "dbc", PR_TRUE, 3 },
  1749           { "abcdefg", "ghi", PR_TRUE, 6 },
  1750           { "abcdefg", "AE", PR_FALSE, 0 },
  1751           { "abcdefg", "EI", PR_FALSE, 0 },
  1752           { "abcdefg", "IO", PR_FALSE, 0 },
  1753           { "abcdefg", "BCD", PR_FALSE, 0 },
  1754           { "abcdefg", "CBD", PR_FALSE, 0 },
  1755           { "abcdefg", "DBC", PR_FALSE, 0 },
  1756           { "abcdefg", "GHI", PR_FALSE, 0 },
  1757           { "abcdefgabcdefg", "ae", PR_TRUE, 11 },
  1758           { "abcdefgabcdefg", "ei", PR_TRUE, 11 },
  1759           { "abcdefgabcdefg", "io", PR_FALSE, 0 },
  1760           { "abcdefgabcdefg", "bcd", PR_TRUE, 10 },
  1761           { "abcdefgabcdefg", "cbd", PR_TRUE, 10 },
  1762           { "abcdefgabcdefg", "dbc", PR_TRUE, 10 },
  1763           { "abcdefgabcdefg", "ghi", PR_TRUE, 13 },
  1764           { "abcdefgabcdefg", "AE", PR_FALSE, 0 },
  1765           { "abcdefgabcdefg", "EI", PR_FALSE, 0 },
  1766           { "abcdefgabcdefg", "IO", PR_FALSE, 0 },
  1767           { "abcdefgabcdefg", "BCD", PR_FALSE, 0 },
  1768           { "abcdefgabcdefg", "CBD", PR_FALSE, 0 },
  1769           { "abcdefgabcdefg", "DBC", PR_FALSE, 0 },
  1770           { "abcdefgabcdefg", "GHI", PR_FALSE, 0 }
  1771       };
  1773     int i;
  1775     printf("Test 020 (PL_strprbrk)    ..."); fflush(stdout);
  1777     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1779         char *rv = PL_strprbrk(array[i].str, array[i].chrs);
  1781         if( PR_FALSE == array[i].ret )
  1783             if( (char *)0 != rv )
  1785                 printf("FAIL %d: %s,%s -> %.32s, not null\n", i, 
  1786                        array[i].str ? array[i].str : "(null)",
  1787                        array[i].chrs ? array[i].chrs : "(null)", 
  1788                        rv);
  1789                 return PR_FALSE;
  1792         else
  1794             if( (char *)0 == rv )
  1796                 printf("FAIL %d: %s,%s -> null, not +%lu\n", i,
  1797                        array[i].str ? array[i].str : "(null)",
  1798                        array[i].chrs ? array[i].chrs : "(null)", 
  1799                        array[i].off);
  1800                 return PR_FALSE;
  1803             if( &array[i].str[ array[i].off ] != rv )
  1805                 printf("FAIL %d: %s,%s -> 0x%x, not 0x%x+%lu\n", i,
  1806                        array[i].str ? array[i].str : "(null)",
  1807                        array[i].chrs ? array[i].chrs : "(null)", 
  1808                        rv, array[i].str, array[i].off);
  1809                 return PR_FALSE;
  1814     printf("PASS\n");
  1815     return PR_TRUE;
  1818 /* PL_strnpbrk */
  1819 PRBool test_021(void)
  1821     static struct
  1823         const char *str;
  1824         const char *chrs;
  1825         PRUint32    max;
  1826         PRBool      ret;
  1827         PRUint32    off;
  1828     } array[] =
  1830           { (const char *)0, (const char *)0, 3, PR_FALSE, 0 },
  1831           { (const char *)0, "abc", 3, PR_FALSE, 0 },
  1832           { "abc", (const char *)0, 3, PR_FALSE, 0 },
  1833           { "abcdefg", "", 3, PR_FALSE, 0 },
  1834           { "", "aeiou", 3, PR_FALSE, 0 },
  1835           { "abcdefg", "ae", 0, PR_FALSE, 0 },
  1836           { "abcdefg", "ae", 1, PR_TRUE, 0 },
  1837           { "abcdefg", "ae", 4, PR_TRUE, 0 },
  1838           { "abcdefg", "ae", 5, PR_TRUE, 0 },
  1839           { "abcdefg", "ae", 6, PR_TRUE, 0 },
  1840           { "abcdefg", "ei", 4, PR_FALSE, 0 },
  1841           { "abcdefg", "io", 10, PR_FALSE, 0 },
  1842           { "abcdefg", "bcd", 2, PR_TRUE, 1 },
  1843           { "abcdefg", "cbd", 2, PR_TRUE, 1 },
  1844           { "abcdefg", "dbc", 2, PR_TRUE, 1 },
  1845           { "abcdefg", "ghi", 6, PR_FALSE, 0 },
  1846           { "abcdefg", "ghi", 7, PR_TRUE, 6 },
  1847           { "abcdefg", "AE", 9, PR_FALSE, 0 },
  1848           { "abcdefg", "EI", 9, PR_FALSE, 0 },
  1849           { "abcdefg", "IO", 9, PR_FALSE, 0 },
  1850           { "abcdefg", "BCD", 9, PR_FALSE, 0 },
  1851           { "abcdefg", "CBD", 9, PR_FALSE, 0 },
  1852           { "abcdefg", "DBC", 9, PR_FALSE, 0 },
  1853           { "abcdefg", "GHI", 9, PR_FALSE, 0 },
  1854           { "abcdefgabcdefg", "ae", 10, PR_TRUE, 0 },
  1855           { "abcdefgabcdefg", "ei", 10, PR_TRUE, 4 },
  1856           { "abcdefgabcdefg", "io", 10, PR_FALSE, 0 },
  1857           { "abcdefgabcdefg", "bcd", 10, PR_TRUE, 1 },
  1858           { "abcdefgabcdefg", "cbd", 10, PR_TRUE, 1 },
  1859           { "abcdefgabcdefg", "dbc", 10, PR_TRUE, 1 },
  1860           { "abcdefgabcdefg", "ghi", 10, PR_TRUE, 6 },
  1861           { "abcdefgabcdefg", "AE", 10, PR_FALSE, 0 },
  1862           { "abcdefgabcdefg", "EI", 10, PR_FALSE, 0 },
  1863           { "abcdefgabcdefg", "IO", 10, PR_FALSE, 0 },
  1864           { "abcdefgabcdefg", "BCD", 10, PR_FALSE, 0 },
  1865           { "abcdefgabcdefg", "CBD", 10, PR_FALSE, 0 },
  1866           { "abcdefgabcdefg", "DBC", 10, PR_FALSE, 0 },
  1867           { "abcdefgabcdefg", "GHI", 10, PR_FALSE, 0 }
  1868       };
  1870     int i;
  1872     printf("Test 021 (PL_strnpbrk)    ..."); fflush(stdout);
  1874     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1876         char *rv = PL_strnpbrk(array[i].str, array[i].chrs, array[i].max);
  1878         if( PR_FALSE == array[i].ret )
  1880             if( (char *)0 != rv )
  1882                 printf("FAIL %d: %s,%s/%lu -> %.32s, not null\n", i, 
  1883                        array[i].str ? array[i].str : "(null)",
  1884                        array[i].chrs ? array[i].chrs : "(null)", 
  1885                        array[i].max, rv);
  1886                 return PR_FALSE;
  1889         else
  1891             if( (char *)0 == rv )
  1893                 printf("FAIL %d: %s,%s/%lu -> null, not +%lu\n", i,
  1894                        array[i].str ? array[i].str : "(null)",
  1895                        array[i].chrs ? array[i].chrs : "(null)", 
  1896                        array[i].max, array[i].off);
  1897                 return PR_FALSE;
  1900             if( &array[i].str[ array[i].off ] != rv )
  1902                 printf("FAIL %d: %s,%s/%lu -> 0x%x, not 0x%x+%lu\n", i,
  1903                        array[i].str ? array[i].str : "(null)",
  1904                        array[i].chrs ? array[i].chrs : "(null)", 
  1905                        array[i].max, rv, array[i].str, array[i].off);
  1906                 return PR_FALSE;
  1911     printf("PASS\n");
  1912     return PR_TRUE;
  1915 /* PL_strnprbrk */
  1916 PRBool test_022(void)
  1918     static struct
  1920         const char *str;
  1921         const char *chrs;
  1922         PRUint32    max;
  1923         PRBool      ret;
  1924         PRUint32    off;
  1925     } array[] =
  1927           { (const char *)0, (const char *)0, 3, PR_FALSE, 0 },
  1928           { (const char *)0, "abc", 3, PR_FALSE, 0 },
  1929           { "abc", (const char *)0, 3, PR_FALSE, 0 },
  1930           { "abcdefg", "", 3, PR_FALSE, 0 },
  1931           { "", "aeiou", 3, PR_FALSE, 0 },
  1932           { "abcdefg", "ae", 0, PR_FALSE, 0 },
  1933           { "abcdefg", "ae", 1, PR_TRUE, 0 },
  1934           { "abcdefg", "ae", 4, PR_TRUE, 0 },
  1935           { "abcdefg", "ae", 5, PR_TRUE, 4 },
  1936           { "abcdefg", "ae", 6, PR_TRUE,  4 },
  1937           { "abcdefg", "ei", 4, PR_FALSE, 0 },
  1938           { "abcdefg", "io", 10, PR_FALSE, 0 },
  1939           { "abcdefg", "bcd", 2, PR_TRUE, 1 },
  1940           { "abcdefg", "cbd", 2, PR_TRUE, 1 },
  1941           { "abcdefg", "dbc", 2, PR_TRUE, 1 },
  1942           { "abcdefg", "bcd", 3, PR_TRUE, 2 },
  1943           { "abcdefg", "cbd", 3, PR_TRUE, 2 },
  1944           { "abcdefg", "dbc", 3, PR_TRUE, 2 },
  1945           { "abcdefg", "bcd", 5, PR_TRUE, 3 },
  1946           { "abcdefg", "cbd", 5, PR_TRUE, 3 },
  1947           { "abcdefg", "dbc", 5, PR_TRUE, 3 },
  1948           { "abcdefg", "bcd", 15, PR_TRUE, 3 },
  1949           { "abcdefg", "cbd", 15, PR_TRUE, 3 },
  1950           { "abcdefg", "dbc", 15, PR_TRUE, 3 },
  1951           { "abcdefg", "ghi", 6, PR_FALSE, 0 },
  1952           { "abcdefg", "ghi", 7, PR_TRUE, 6 },
  1953           { "abcdefg", "AE", 9, PR_FALSE, 0 },
  1954           { "abcdefg", "EI", 9, PR_FALSE, 0 },
  1955           { "abcdefg", "IO", 9, PR_FALSE, 0 },
  1956           { "abcdefg", "BCD", 9, PR_FALSE, 0 },
  1957           { "abcdefg", "CBD", 9, PR_FALSE, 0 },
  1958           { "abcdefg", "DBC", 9, PR_FALSE, 0 },
  1959           { "abcdefg", "GHI", 9, PR_FALSE, 0 },
  1960           { "abcdefgabcdefg", "ae", 10, PR_TRUE, 7 },
  1961           { "abcdefgabcdefg", "ei", 10, PR_TRUE, 4 },
  1962           { "abcdefgabcdefg", "io", 10, PR_FALSE, 0 },
  1963           { "abcdefgabcdefg", "bcd", 10, PR_TRUE, 9 },
  1964           { "abcdefgabcdefg", "cbd", 10, PR_TRUE, 9 },
  1965           { "abcdefgabcdefg", "dbc", 10, PR_TRUE, 9 },
  1966           { "abcdefgabcdefg", "ghi", 10, PR_TRUE, 6 },
  1967           { "abcdefgabcdefg", "AE", 10, PR_FALSE, 0 },
  1968           { "abcdefgabcdefg", "EI", 10, PR_FALSE, 0 },
  1969           { "abcdefgabcdefg", "IO", 10, PR_FALSE, 0 },
  1970           { "abcdefgabcdefg", "BCD", 10, PR_FALSE, 0 },
  1971           { "abcdefgabcdefg", "CBD", 10, PR_FALSE, 0 },
  1972           { "abcdefgabcdefg", "DBC", 10, PR_FALSE, 0 },
  1973           { "abcdefgabcdefg", "GHI", 10, PR_FALSE, 0 }
  1974       };
  1976     int i;
  1978     printf("Test 022 (PL_strnprbrk)   ..."); fflush(stdout);
  1980     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1982         char *rv = PL_strnprbrk(array[i].str, array[i].chrs, array[i].max);
  1984         if( PR_FALSE == array[i].ret )
  1986             if( (char *)0 != rv )
  1988                 printf("FAIL %d: %s,%s/%lu -> %.32s, not null\n", i, 
  1989                        array[i].str ? array[i].str : "(null)",
  1990                        array[i].chrs ? array[i].chrs : "(null)", 
  1991                        array[i].max, rv);
  1992                 return PR_FALSE;
  1995         else
  1997             if( (char *)0 == rv )
  1999                 printf("FAIL %d: %s,%s/%lu -> null, not +%lu\n", i,
  2000                        array[i].str ? array[i].str : "(null)",
  2001                        array[i].chrs ? array[i].chrs : "(null)", 
  2002                        array[i].max, array[i].off);
  2003                 return PR_FALSE;
  2006             if( &array[i].str[ array[i].off ] != rv )
  2008                 printf("FAIL %d: %s,%s/%lu -> 0x%x, not 0x%x+%lu\n", i,
  2009                        array[i].str ? array[i].str : "(null)",
  2010                        array[i].chrs ? array[i].chrs : "(null)", 
  2011                        array[i].max, rv, array[i].str, array[i].off);
  2012                 return PR_FALSE;
  2017     printf("PASS\n");
  2018     return PR_TRUE;
  2021 /* PL_strstr */
  2022 PRBool test_023(void)
  2024     static struct
  2026         const char *str;
  2027         const char *sub;
  2028         PRBool      ret;
  2029         PRUint32    off;
  2030     } array[] =
  2032           { (const char *)0, (const char *)0, PR_FALSE, 0 },
  2033           { (const char *)0, "blah", PR_FALSE, 0 },
  2034           { "blah-de-blah", (const char *)0, PR_FALSE, 0 },
  2035           { "blah-de-blah", "blah", PR_TRUE, 0 },
  2036           { "", "blah", PR_FALSE, 0 },
  2037           { "blah-de-blah", "", PR_FALSE, 0 },
  2038           { "abcdefg", "a", PR_TRUE, 0 },
  2039           { "abcdefg", "c", PR_TRUE, 2 },
  2040           { "abcdefg", "e", PR_TRUE, 4 },
  2041           { "abcdefg", "g", PR_TRUE, 6 },
  2042           { "abcdefg", "i", PR_FALSE, 0 },
  2043           { "abcdefg", "ab", PR_TRUE, 0 },
  2044           { "abcdefg", "cd", PR_TRUE, 2 },
  2045           { "abcdefg", "ef", PR_TRUE, 4 },
  2046           { "abcdefg", "gh", PR_FALSE, 0 },
  2047           { "abcdabc", "bc", PR_TRUE, 1 },
  2048           { "abcdefg", "abcdefg", PR_TRUE, 0 },
  2049           { "abcdefgabcdefg", "a", PR_TRUE, 0 },
  2050           { "abcdefgabcdefg", "c", PR_TRUE, 2 },
  2051           { "abcdefgabcdefg", "e", PR_TRUE, 4 },
  2052           { "abcdefgabcdefg", "g", PR_TRUE, 6 },
  2053           { "abcdefgabcdefg", "i", PR_FALSE, 0 },
  2054           { "abcdefgabcdefg", "ab", PR_TRUE, 0 },
  2055           { "abcdefgabcdefg", "cd", PR_TRUE, 2 },
  2056           { "abcdefgabcdefg", "ef", PR_TRUE, 4 },
  2057           { "abcdefgabcdefg", "gh", PR_FALSE, 0 },
  2058           { "abcdabcabcdabc", "bc", PR_TRUE, 1 },
  2059           { "abcdefgabcdefg", "abcdefg", PR_TRUE, 0 },
  2060           { "ABCDEFG", "a", PR_FALSE, 0 },
  2061           { "ABCDEFG", "c", PR_FALSE, 0 },
  2062           { "ABCDEFG", "e", PR_FALSE, 0 },
  2063           { "ABCDEFG", "g", PR_FALSE, 0 },
  2064           { "ABCDEFG", "i", PR_FALSE, 0 },
  2065           { "ABCDEFG", "ab", PR_FALSE, 0 },
  2066           { "ABCDEFG", "cd", PR_FALSE, 0 },
  2067           { "ABCDEFG", "ef", PR_FALSE, 0 },
  2068           { "ABCDEFG", "gh", PR_FALSE, 0 },
  2069           { "ABCDABC", "bc", PR_FALSE, 0 },
  2070           { "ABCDEFG", "abcdefg", PR_FALSE, 0 },
  2071           { "ABCDEFGABCDEFG", "a", PR_FALSE, 0 },
  2072           { "ABCDEFGABCDEFG", "c", PR_FALSE, 0 },
  2073           { "ABCDEFGABCDEFG", "e", PR_FALSE, 0 },
  2074           { "ABCDEFGABCDEFG", "g", PR_FALSE, 0 },
  2075           { "ABCDEFGABCDEFG", "i", PR_FALSE, 0 },
  2076           { "ABCDEFGABCDEFG", "ab", PR_FALSE, 0 },
  2077           { "ABCDEFGABCDEFG", "cd", PR_FALSE, 0 },
  2078           { "ABCDEFGABCDEFG", "ef", PR_FALSE, 0 },
  2079           { "ABCDEFGABCDEFG", "gh", PR_FALSE, 0 },
  2080           { "ABCDABCABCDABC", "bc", PR_FALSE, 0 },
  2081           { "ABCDEFGABCDEFG", "abcdefg", PR_FALSE, 0 }
  2082       };
  2084     int i;
  2086     printf("Test 023 (PL_strstr)      ..."); fflush(stdout);
  2088     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2090         char *rv = PL_strstr(array[i].str, array[i].sub);
  2092         if( PR_FALSE == array[i].ret )
  2094             if( (char *)0 != rv )
  2096                 printf("FAIL %d: %s,%s -> %.32s, not null\n", i,
  2097                        array[i].str ? array[i].str : "(null)",
  2098                        array[i].sub ? array[i].sub : "(null)",
  2099                        rv);
  2100                 return PR_FALSE;
  2103         else
  2105             if( (char *)0 == rv )
  2107                 printf("FAIL %d: %s,%s -> null, not 0x%x+%lu\n", i,
  2108                        array[i].str ? array[i].str : "(null)",
  2109                        array[i].sub ? array[i].sub : "(null)",
  2110                        array[i].str, array[i].off);
  2111                 return PR_FALSE;
  2114             if( &array[i].str[ array[i].off ] != rv )
  2116                 printf("FAIL %d: %s,%s -> 0x%x, not 0x%x+%lu\n", i, 
  2117                        array[i].str ? array[i].str : "(null)",
  2118                        array[i].sub ? array[i].sub : "(null)",
  2119                        rv, array[i].str, array[i].off);
  2120                 return PR_FALSE;
  2125     printf("PASS\n");
  2126     return PR_TRUE;
  2129 /* PL_strrstr */
  2130 PRBool test_024(void)
  2132     static struct
  2134         const char *str;
  2135         const char *sub;
  2136         PRBool      ret;
  2137         PRUint32    off;
  2138     } array[] =
  2140           { (const char *)0, (const char *)0, PR_FALSE, 0 },
  2141           { (const char *)0, "blah", PR_FALSE, 0 },
  2142           { "blah-de-blah", (const char *)0, PR_FALSE, 0 },
  2143           { "blah-de-blah", "blah", PR_TRUE, 8 },
  2144           { "", "blah", PR_FALSE, 0 },
  2145           { "blah-de-blah", "", PR_FALSE, 0 },
  2146           { "abcdefg", "a", PR_TRUE, 0 },
  2147           { "abcdefg", "c", PR_TRUE, 2 },
  2148           { "abcdefg", "e", PR_TRUE, 4 },
  2149           { "abcdefg", "g", PR_TRUE, 6 },
  2150           { "abcdefg", "i", PR_FALSE, 0 },
  2151           { "abcdefg", "ab", PR_TRUE, 0 },
  2152           { "abcdefg", "cd", PR_TRUE, 2 },
  2153           { "abcdefg", "ef", PR_TRUE, 4 },
  2154           { "abcdefg", "gh", PR_FALSE, 0 },
  2155           { "abcdabc", "bc", PR_TRUE, 5 },
  2156           { "abcdefg", "abcdefg", PR_TRUE, 0 },
  2157           { "abcdefgabcdefg", "a", PR_TRUE, 7 },
  2158           { "abcdefgabcdefg", "c", PR_TRUE, 9 },
  2159           { "abcdefgabcdefg", "e", PR_TRUE, 11 },
  2160           { "abcdefgabcdefg", "g", PR_TRUE, 13 },
  2161           { "abcdefgabcdefg", "i", PR_FALSE, 0 },
  2162           { "abcdefgabcdefg", "ab", PR_TRUE, 7 },
  2163           { "abcdefgabcdefg", "cd", PR_TRUE, 9 },
  2164           { "abcdefgabcdefg", "ef", PR_TRUE, 11 },
  2165           { "abcdefgabcdefg", "gh", PR_FALSE, 0 },
  2166           { "abcdabcabcdabc", "bc", PR_TRUE, 12 },
  2167           { "abcdefgabcdefg", "abcdefg", PR_TRUE, 7 },
  2168           { "ABCDEFG", "a", PR_FALSE, 0 },
  2169           { "ABCDEFG", "c", PR_FALSE, 0 },
  2170           { "ABCDEFG", "e", PR_FALSE, 0 },
  2171           { "ABCDEFG", "g", PR_FALSE, 0 },
  2172           { "ABCDEFG", "i", PR_FALSE, 0 },
  2173           { "ABCDEFG", "ab", PR_FALSE, 0 },
  2174           { "ABCDEFG", "cd", PR_FALSE, 0 },
  2175           { "ABCDEFG", "ef", PR_FALSE, 0 },
  2176           { "ABCDEFG", "gh", PR_FALSE, 0 },
  2177           { "ABCDABC", "bc", PR_FALSE, 0 },
  2178           { "ABCDEFG", "abcdefg", PR_FALSE, 0 },
  2179           { "ABCDEFGABCDEFG", "a", PR_FALSE, 0 },
  2180           { "ABCDEFGABCDEFG", "c", PR_FALSE, 0 },
  2181           { "ABCDEFGABCDEFG", "e", PR_FALSE, 0 },
  2182           { "ABCDEFGABCDEFG", "g", PR_FALSE, 0 },
  2183           { "ABCDEFGABCDEFG", "i", PR_FALSE, 0 },
  2184           { "ABCDEFGABCDEFG", "ab", PR_FALSE, 0 },
  2185           { "ABCDEFGABCDEFG", "cd", PR_FALSE, 0 },
  2186           { "ABCDEFGABCDEFG", "ef", PR_FALSE, 0 },
  2187           { "ABCDEFGABCDEFG", "gh", PR_FALSE, 0 },
  2188           { "ABCDABCABCDABC", "bc", PR_FALSE, 0 },
  2189           { "ABCDEFGABCDEFG", "abcdefg", PR_FALSE, 0 }
  2190       };
  2192     int i;
  2194     printf("Test 024 (PL_strrstr)     ..."); fflush(stdout);
  2196     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2198         char *rv = PL_strrstr(array[i].str, array[i].sub);
  2200         if( PR_FALSE == array[i].ret )
  2202             if( (char *)0 != rv )
  2204                 printf("FAIL %d: %s,%s -> %.32s, not null\n", i,
  2205                        array[i].str ? array[i].str : "(null)",
  2206                        array[i].sub ? array[i].sub : "(null)",
  2207                        rv);
  2208                 return PR_FALSE;
  2211         else
  2213             if( (char *)0 == rv )
  2215                 printf("FAIL %d: %s,%s -> null, not 0x%x+%lu\n", i,
  2216                        array[i].str ? array[i].str : "(null)",
  2217                        array[i].sub ? array[i].sub : "(null)",
  2218                        array[i].str, array[i].off);
  2219                 return PR_FALSE;
  2222             if( &array[i].str[ array[i].off ] != rv )
  2224                 printf("FAIL %d: %s,%s -> 0x%x, not 0x%x+%lu\n", i, 
  2225                        array[i].str ? array[i].str : "(null)",
  2226                        array[i].sub ? array[i].sub : "(null)",
  2227                        rv, array[i].str, array[i].off);
  2228                 return PR_FALSE;
  2233     printf("PASS\n");
  2234     return PR_TRUE;
  2237 /* PL_strnstr */
  2238 PRBool test_025(void)
  2240     static struct
  2242         const char *str;
  2243         const char *sub;
  2244         PRUint32    max;
  2245         PRBool      ret;
  2246         PRUint32    off;
  2247     } array[] =
  2249           { (const char *)0, (const char *)0, 12, PR_FALSE, 0 },
  2250           { (const char *)0, "blah", 12, PR_FALSE, 0 },
  2251           { "blah-de-blah", (const char *)0, 12, PR_FALSE, 0 },
  2252           { "blah-de-blah", "blah", 0, PR_FALSE, 0 },
  2253           { "blah-de-blah", "blah", 2, PR_FALSE, 0 },
  2254           { "blah-de-blah", "blah", 3, PR_FALSE, 0 },
  2255           { "blah-de-blah", "blah", 4, PR_TRUE, 0 },
  2256           { "blah-de-blah", "blah", 5, PR_TRUE, 0 },
  2257           { "blah-de-blah", "blah", 12, PR_TRUE, 0 },
  2258           { "", "blah", 12, PR_FALSE, 0 },
  2259           { "blah-de-blah", "", 12, PR_FALSE, 0 },
  2260           { "abcdefg", "a", 5, PR_TRUE, 0 },
  2261           { "abcdefg", "c", 5, PR_TRUE, 2 },
  2262           { "abcdefg", "e", 5, PR_TRUE, 4 },
  2263           { "abcdefg", "g", 5, PR_FALSE, 0 },
  2264           { "abcdefg", "i", 5, PR_FALSE, 0 },
  2265           { "abcdefg", "ab", 5, PR_TRUE, 0 },
  2266           { "abcdefg", "cd", 5, PR_TRUE, 2 },
  2267           { "abcdefg", "ef", 5, PR_FALSE, 0 },
  2268           { "abcdefg", "gh", 5, PR_FALSE, 0 },
  2269           { "abcdabc", "bc", 5, PR_TRUE, 1 },
  2270           { "abcdabc", "bc", 6, PR_TRUE, 1 },
  2271           { "abcdabc", "bc", 7, PR_TRUE, 1 },
  2272           { "abcdefg", "abcdefg", 6, PR_FALSE, 0 },
  2273           { "abcdefg", "abcdefg", 7, PR_TRUE, 0 },
  2274           { "abcdefg", "abcdefg", 8, PR_TRUE, 0 },
  2275           { "abcdefgabcdefg", "a", 12, PR_TRUE, 0 },
  2276           { "abcdefgabcdefg", "c", 12, PR_TRUE, 2 },
  2277           { "abcdefgabcdefg", "e", 12, PR_TRUE, 4 },
  2278           { "abcdefgabcdefg", "g", 12, PR_TRUE, 6 },
  2279           { "abcdefgabcdefg", "i", 12, PR_FALSE, 0 },
  2280           { "abcdefgabcdefg", "ab", 12, PR_TRUE, 0 },
  2281           { "abcdefgabcdefg", "cd", 12, PR_TRUE, 2 },
  2282           { "abcdefgabcdefg", "ef", 12, PR_TRUE, 4 },
  2283           { "abcdefgabcdefg", "gh", 12, PR_FALSE, 0 },
  2284           { "abcdabcabcdabc", "bc", 5, PR_TRUE, 1 },
  2285           { "abcdabcabcdabc", "bc", 6, PR_TRUE, 1 },
  2286           { "abcdabcabcdabc", "bc", 7, PR_TRUE, 1 },
  2287           { "abcdefgabcdefg", "abcdefg", 6, PR_FALSE, 0 },
  2288           { "abcdefgabcdefg", "abcdefg", 7, PR_TRUE, 0 },
  2289           { "abcdefgabcdefg", "abcdefg", 8, PR_TRUE, 0 },
  2290           { "ABCDEFG", "a", 5, PR_FALSE, 0 },
  2291           { "ABCDEFG", "c", 5, PR_FALSE, 0 },
  2292           { "ABCDEFG", "e", 5, PR_FALSE, 0 },
  2293           { "ABCDEFG", "g", 5, PR_FALSE, 0 },
  2294           { "ABCDEFG", "i", 5, PR_FALSE, 0 },
  2295           { "ABCDEFG", "ab", 5, PR_FALSE, 0 },
  2296           { "ABCDEFG", "cd", 5, PR_FALSE, 0 },
  2297           { "ABCDEFG", "ef", 5, PR_FALSE, 0 },
  2298           { "ABCDEFG", "gh", 5, PR_FALSE, 0 },
  2299           { "ABCDABC", "bc", 5, PR_FALSE, 0 },
  2300           { "ABCDABC", "bc", 6, PR_FALSE, 0 },
  2301           { "ABCDABC", "bc", 7, PR_FALSE, 0 },
  2302           { "ABCDEFG", "abcdefg", 6, PR_FALSE, 0 },
  2303           { "ABCDEFG", "abcdefg", 7, PR_FALSE, 0 },
  2304           { "ABCDEFG", "abcdefg", 8, PR_FALSE, 0 },
  2305           { "ABCDEFGABCDEFG", "a", 12, PR_FALSE, 0 },
  2306           { "ABCDEFGABCDEFG", "c", 12, PR_FALSE, 0 },
  2307           { "ABCDEFGABCDEFG", "e", 12, PR_FALSE, 0 },
  2308           { "ABCDEFGABCDEFG", "g", 12, PR_FALSE, 0 },
  2309           { "ABCDEFGABCDEFG", "i", 12, PR_FALSE, 0 },
  2310           { "ABCDEFGABCDEFG", "ab", 12, PR_FALSE, 0 },
  2311           { "ABCDEFGABCDEFG", "cd", 12, PR_FALSE, 0 },
  2312           { "ABCDEFGABCDEFG", "ef", 12, PR_FALSE, 0 },
  2313           { "ABCDEFGABCDEFG", "gh", 12, PR_FALSE, 0 },
  2314           { "ABCDABCABCDABC", "bc", 5, PR_FALSE, 0 },
  2315           { "ABCDABCABCDABC", "bc", 6, PR_FALSE, 0 },
  2316           { "ABCDABCABCDABC", "bc", 7, PR_FALSE,  },
  2317           { "ABCDEFGABCDEFG", "abcdefg", 6, PR_FALSE, 0 },
  2318           { "ABCDEFGABCDEFG", "abcdefg", 7, PR_FALSE, 0 },
  2319           { "ABCDEFGABCDEFG", "abcdefg", 8, PR_FALSE, 0 }
  2320       };
  2322     int i;
  2324     printf("Test 025 (PL_strnstr)     ..."); fflush(stdout);
  2326     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2328         char *rv = PL_strnstr(array[i].str, array[i].sub, array[i].max);
  2330         if( PR_FALSE == array[i].ret )
  2332             if( (char *)0 != rv )
  2334                 printf("FAIL %d: %s,%s/%lu -> %.32s, not null\n", i,
  2335                        array[i].str ? array[i].str : "(null)",
  2336                        array[i].sub ? array[i].sub : "(null)",
  2337                        array[i].max, rv);
  2338                 return PR_FALSE;
  2341         else
  2343             if( (char *)0 == rv )
  2345                 printf("FAIL %d: %s,%s/%lu -> null, not 0x%x+%lu\n", i,
  2346                        array[i].str ? array[i].str : "(null)",
  2347                        array[i].sub ? array[i].sub : "(null)",
  2348                        array[i].max, array[i].str, array[i].off);
  2349                 return PR_FALSE;
  2352             if( &array[i].str[ array[i].off ] != rv )
  2354                 printf("FAIL %d: %s,%s/%lu -> 0x%x, not 0x%x+%lu\n", i, 
  2355                        array[i].str ? array[i].str : "(null)",
  2356                        array[i].sub ? array[i].sub : "(null)",
  2357                        array[i].max, rv, array[i].str, array[i].off);
  2358                 return PR_FALSE;
  2363     printf("PASS\n");
  2364     return PR_TRUE;
  2367 /* PL_strnrstr */
  2368 PRBool test_026(void)
  2370     static struct
  2372         const char *str;
  2373         const char *sub;
  2374         PRUint32    max;
  2375         PRBool      ret;
  2376         PRUint32    off;
  2377     } array[] =
  2379           { (const char *)0, (const char *)0, 12, PR_FALSE, 0 },
  2380           { (const char *)0, "blah", 12, PR_FALSE, 0 },
  2381           { "blah-de-blah", (const char *)0, 12, PR_FALSE, 0 },
  2382           { "blah-de-blah", "blah", 0, PR_FALSE, 0 },
  2383           { "blah-de-blah", "blah", 2, PR_FALSE, 0 },
  2384           { "blah-de-blah", "blah", 3, PR_FALSE, 0 },
  2385           { "blah-de-blah", "blah", 4, PR_TRUE, 0 },
  2386           { "blah-de-blah", "blah", 5, PR_TRUE, 0 },
  2387           { "blah-de-blah", "blah", 11, PR_TRUE, 0 },
  2388           { "blah-de-blah", "blah", 12, PR_TRUE, 8 },
  2389           { "blah-de-blah", "blah", 13, PR_TRUE, 8 },
  2390           { "", "blah", 12, PR_FALSE, 0 },
  2391           { "blah-de-blah", "", 12, PR_FALSE, 0 },
  2392           { "abcdefg", "a", 5, PR_TRUE, 0 },
  2393           { "abcdefg", "c", 5, PR_TRUE, 2 },
  2394           { "abcdefg", "e", 5, PR_TRUE, 4 },
  2395           { "abcdefg", "g", 5, PR_FALSE, 0 },
  2396           { "abcdefg", "i", 5, PR_FALSE, 0 },
  2397           { "abcdefg", "ab", 5, PR_TRUE, 0 },
  2398           { "abcdefg", "cd", 5, PR_TRUE, 2 },
  2399           { "abcdefg", "ef", 5, PR_FALSE, 0 },
  2400           { "abcdefg", "gh", 5, PR_FALSE, 0 },
  2401           { "abcdabc", "bc", 5, PR_TRUE, 1 },
  2402           { "abcdabc", "bc", 6, PR_TRUE, 1 },
  2403           { "abcdabc", "bc", 7, PR_TRUE, 5 },
  2404           { "abcdefg", "abcdefg", 6, PR_FALSE, 0 },
  2405           { "abcdefg", "abcdefg", 7, PR_TRUE, 0 },
  2406           { "abcdefg", "abcdefg", 8, PR_TRUE, 0 },
  2407           { "abcdefgabcdefg", "a", 12, PR_TRUE, 7 },
  2408           { "abcdefgabcdefg", "c", 12, PR_TRUE, 9 },
  2409           { "abcdefgabcdefg", "e", 12, PR_TRUE, 11 },
  2410           { "abcdefgabcdefg", "g", 12, PR_TRUE, 6 },
  2411           { "abcdefgabcdefg", "i", 12, PR_FALSE, 0 },
  2412           { "abcdefgabcdefg", "ab", 12, PR_TRUE, 7 },
  2413           { "abcdefgabcdefg", "cd", 12, PR_TRUE, 9 },
  2414           { "abcdefgabcdefg", "ef", 12, PR_TRUE, 4 },
  2415           { "abcdefgabcdefg", "gh", 12, PR_FALSE, 0 },
  2416           { "abcdabcabcdabc", "bc", 12, PR_TRUE, 8 },
  2417           { "abcdabcabcdabc", "bc", 13, PR_TRUE, 8 },
  2418           { "abcdabcabcdabc", "bc", 14, PR_TRUE, 12 },
  2419           { "abcdefgabcdefg", "abcdefg", 13, PR_TRUE, 0 },
  2420           { "abcdefgabcdefg", "abcdefg", 14, PR_TRUE, 7 },
  2421           { "abcdefgabcdefg", "abcdefg", 15, PR_TRUE, 7 },
  2422           { "ABCDEFG", "a", 5, PR_FALSE, 0 },
  2423           { "ABCDEFG", "c", 5, PR_FALSE, 0 },
  2424           { "ABCDEFG", "e", 5, PR_FALSE, 0 },
  2425           { "ABCDEFG", "g", 5, PR_FALSE, 0 },
  2426           { "ABCDEFG", "i", 5, PR_FALSE, 0 },
  2427           { "ABCDEFG", "ab", 5, PR_FALSE, 0 },
  2428           { "ABCDEFG", "cd", 5, PR_FALSE, 0 },
  2429           { "ABCDEFG", "ef", 5, PR_FALSE, 0 },
  2430           { "ABCDEFG", "gh", 5, PR_FALSE, 0 },
  2431           { "ABCDABC", "bc", 5, PR_FALSE, 0 },
  2432           { "ABCDABC", "bc", 6, PR_FALSE, 0 },
  2433           { "ABCDABC", "bc", 7, PR_FALSE, 0 },
  2434           { "ABCDEFG", "abcdefg", 6, PR_FALSE, 0 },
  2435           { "ABCDEFG", "abcdefg", 7, PR_FALSE, 0 },
  2436           { "ABCDEFG", "abcdefg", 8, PR_FALSE, 0 },
  2437           { "ABCDEFGABCDEFG", "a", 12, PR_FALSE, 0 },
  2438           { "ABCDEFGABCDEFG", "c", 12, PR_FALSE, 0 },
  2439           { "ABCDEFGABCDEFG", "e", 12, PR_FALSE, 0 },
  2440           { "ABCDEFGABCDEFG", "g", 12, PR_FALSE, 0 },
  2441           { "ABCDEFGABCDEFG", "i", 12, PR_FALSE, 0 },
  2442           { "ABCDEFGABCDEFG", "ab", 12, PR_FALSE, 0 },
  2443           { "ABCDEFGABCDEFG", "cd", 12, PR_FALSE, 0 },
  2444           { "ABCDEFGABCDEFG", "ef", 12, PR_FALSE, 0 },
  2445           { "ABCDEFGABCDEFG", "gh", 12, PR_FALSE, 0 },
  2446           { "ABCDABCABCDABC", "bc", 12, PR_FALSE, 0 },
  2447           { "ABCDABCABCDABC", "bc", 13, PR_FALSE, 0 },
  2448           { "ABCDABCABCDABC", "bc", 14, PR_FALSE, 0 },
  2449           { "ABCDEFGABCDEFG", "abcdefg", 13, PR_FALSE, 0 },
  2450           { "ABCDEFGABCDEFG", "abcdefg", 14, PR_FALSE, 0 },
  2451           { "ABCDEFGABCDEFG", "abcdefg", 15, PR_FALSE, 0 }
  2452       };
  2454     int i;
  2456     printf("Test 026 (PL_strnrstr)    ..."); fflush(stdout);
  2458     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2460         char *rv = PL_strnrstr(array[i].str, array[i].sub, array[i].max);
  2462         if( PR_FALSE == array[i].ret )
  2464             if( (char *)0 != rv )
  2466                 printf("FAIL %d: %s,%s/%lu -> %.32s, not null\n", i,
  2467                        array[i].str ? array[i].str : "(null)",
  2468                        array[i].sub ? array[i].sub : "(null)",
  2469                        array[i].max, rv);
  2470                 return PR_FALSE;
  2473         else
  2475             if( (char *)0 == rv )
  2477                 printf("FAIL %d: %s,%s/%lu -> null, not 0x%x+%lu\n", i,
  2478                        array[i].str ? array[i].str : "(null)",
  2479                        array[i].sub ? array[i].sub : "(null)",
  2480                        array[i].max, array[i].str, array[i].off);
  2481                 return PR_FALSE;
  2484             if( &array[i].str[ array[i].off ] != rv )
  2486                 printf("FAIL %d: %s,%s/%lu -> 0x%x, not 0x%x+%lu\n", i, 
  2487                        array[i].str ? array[i].str : "(null)",
  2488                        array[i].sub ? array[i].sub : "(null)",
  2489                        array[i].max, rv, array[i].str, array[i].off);
  2490                 return PR_FALSE;
  2495     printf("PASS\n");
  2496     return PR_TRUE;
  2499 /* PL_strcasestr */
  2500 PRBool test_027(void)
  2502     static struct
  2504         const char *str;
  2505         const char *sub;
  2506         PRBool      ret;
  2507         PRUint32    off;
  2508     } array[] =
  2510           { (const char *)0, (const char *)0, PR_FALSE, 0 },
  2511           { (const char *)0, "blah", PR_FALSE, 0 },
  2512           { "blah-de-blah", (const char *)0, PR_FALSE, 0 },
  2513           { "blah-de-blah", "blah", PR_TRUE, 0 },
  2514           { "", "blah", PR_FALSE, 0 },
  2515           { "blah-de-blah", "", PR_FALSE, 0 },
  2516           { "abcdefg", "a", PR_TRUE, 0 },
  2517           { "abcdefg", "c", PR_TRUE, 2 },
  2518           { "abcdefg", "e", PR_TRUE, 4 },
  2519           { "abcdefg", "g", PR_TRUE, 6 },
  2520           { "abcdefg", "i", PR_FALSE, 0 },
  2521           { "abcdefg", "ab", PR_TRUE, 0 },
  2522           { "abcdefg", "cd", PR_TRUE, 2 },
  2523           { "abcdefg", "ef", PR_TRUE, 4 },
  2524           { "abcdefg", "gh", PR_FALSE, 0 },
  2525           { "abcdabc", "bc", PR_TRUE, 1 },
  2526           { "abcdefg", "abcdefg", PR_TRUE, 0 },
  2527           { "abcdefgabcdefg", "a", PR_TRUE, 0 },
  2528           { "abcdefgabcdefg", "c", PR_TRUE, 2 },
  2529           { "abcdefgabcdefg", "e", PR_TRUE, 4 },
  2530           { "abcdefgabcdefg", "g", PR_TRUE, 6 },
  2531           { "abcdefgabcdefg", "i", PR_FALSE, 0 },
  2532           { "abcdefgabcdefg", "ab", PR_TRUE, 0 },
  2533           { "abcdefgabcdefg", "cd", PR_TRUE, 2 },
  2534           { "abcdefgabcdefg", "ef", PR_TRUE, 4 },
  2535           { "abcdefgabcdefg", "gh", PR_FALSE, 0 },
  2536           { "abcdabcabcdabc", "bc", PR_TRUE, 1 },
  2537           { "abcdefgabcdefg", "abcdefg", PR_TRUE, 0 },
  2538           { "ABCDEFG", "a", PR_TRUE, 0 },
  2539           { "ABCDEFG", "c", PR_TRUE, 2 },
  2540           { "ABCDEFG", "e", PR_TRUE, 4 },
  2541           { "ABCDEFG", "g", PR_TRUE, 6 },
  2542           { "ABCDEFG", "i", PR_FALSE, 0 },
  2543           { "ABCDEFG", "ab", PR_TRUE, 0 },
  2544           { "ABCDEFG", "cd", PR_TRUE, 2 },
  2545           { "ABCDEFG", "ef", PR_TRUE, 4 },
  2546           { "ABCDEFG", "gh", PR_FALSE, 0 },
  2547           { "ABCDABC", "bc", PR_TRUE, 1 },
  2548           { "ABCDEFG", "abcdefg", PR_TRUE, 0 },
  2549           { "ABCDEFGABCDEFG", "a", PR_TRUE, 0 },
  2550           { "ABCDEFGABCDEFG", "c", PR_TRUE, 2 },
  2551           { "ABCDEFGABCDEFG", "e", PR_TRUE, 4 },
  2552           { "ABCDEFGABCDEFG", "g", PR_TRUE, 6 },
  2553           { "ABCDEFGABCDEFG", "i", PR_FALSE, 0 },
  2554           { "ABCDEFGABCDEFG", "ab", PR_TRUE, 0 },
  2555           { "ABCDEFGABCDEFG", "cd", PR_TRUE, 2 },
  2556           { "ABCDEFGABCDEFG", "ef", PR_TRUE, 4 },
  2557           { "ABCDEFGABCDEFG", "gh", PR_FALSE, 0 },
  2558           { "ABCDABCABCDABC", "bc", PR_TRUE, 1 },
  2559           { "ABCDEFGABCDEFG", "abcdefg", PR_TRUE, 0 }
  2560       };
  2562     int i;
  2564     printf("Test 027 (PL_strcasestr)  ..."); fflush(stdout);
  2566     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2568         char *rv = PL_strcasestr(array[i].str, array[i].sub);
  2570         if( PR_FALSE == array[i].ret )
  2572             if( (char *)0 != rv )
  2574                 printf("FAIL %d: %s,%s -> %.32s, not null\n", i,
  2575                        array[i].str ? array[i].str : "(null)",
  2576                        array[i].sub ? array[i].sub : "(null)",
  2577                        rv);
  2578                 return PR_FALSE;
  2581         else
  2583             if( (char *)0 == rv )
  2585                 printf("FAIL %d: %s,%s -> null, not 0x%x+%lu\n", i,
  2586                        array[i].str ? array[i].str : "(null)",
  2587                        array[i].sub ? array[i].sub : "(null)",
  2588                        array[i].str, array[i].off);
  2589                 return PR_FALSE;
  2592             if( &array[i].str[ array[i].off ] != rv )
  2594                 printf("FAIL %d: %s,%s -> 0x%x, not 0x%x+%lu\n", i, 
  2595                        array[i].str ? array[i].str : "(null)",
  2596                        array[i].sub ? array[i].sub : "(null)",
  2597                        rv, array[i].str, array[i].off);
  2598                 return PR_FALSE;
  2603     printf("PASS\n");
  2604     return PR_TRUE;
  2607 /* PL_strcaserstr */
  2608 PRBool test_028(void)
  2610     static struct
  2612         const char *str;
  2613         const char *sub;
  2614         PRBool      ret;
  2615         PRUint32    off;
  2616     } array[] =
  2618           { (const char *)0, (const char *)0, PR_FALSE, 0 },
  2619           { (const char *)0, "blah", PR_FALSE, 0 },
  2620           { "blah-de-blah", (const char *)0, PR_FALSE, 0 },
  2621           { "blah-de-blah", "blah", PR_TRUE, 8 },
  2622           { "", "blah", PR_FALSE, 0 },
  2623           { "blah-de-blah", "", PR_FALSE, 0 },
  2624           { "abcdefg", "a", PR_TRUE, 0 },
  2625           { "abcdefg", "c", PR_TRUE, 2 },
  2626           { "abcdefg", "e", PR_TRUE, 4 },
  2627           { "abcdefg", "g", PR_TRUE, 6 },
  2628           { "abcdefg", "i", PR_FALSE, 0 },
  2629           { "abcdefg", "ab", PR_TRUE, 0 },
  2630           { "abcdefg", "cd", PR_TRUE, 2 },
  2631           { "abcdefg", "ef", PR_TRUE, 4 },
  2632           { "abcdefg", "gh", PR_FALSE, 0 },
  2633           { "abcdabc", "bc", PR_TRUE, 5 },
  2634           { "abcdefg", "abcdefg", PR_TRUE, 0 },
  2635           { "abcdefgabcdefg", "a", PR_TRUE, 7 },
  2636           { "abcdefgabcdefg", "c", PR_TRUE, 9 },
  2637           { "abcdefgabcdefg", "e", PR_TRUE, 11 },
  2638           { "abcdefgabcdefg", "g", PR_TRUE, 13 },
  2639           { "abcdefgabcdefg", "i", PR_FALSE, 0 },
  2640           { "abcdefgabcdefg", "ab", PR_TRUE, 7 },
  2641           { "abcdefgabcdefg", "cd", PR_TRUE, 9 },
  2642           { "abcdefgabcdefg", "ef", PR_TRUE, 11 },
  2643           { "abcdefgabcdefg", "gh", PR_FALSE, 0 },
  2644           { "abcdabcabcdabc", "bc", PR_TRUE, 12 },
  2645           { "abcdefgabcdefg", "abcdefg", PR_TRUE, 7 },
  2646           { "ABCDEFG", "a", PR_TRUE, 0 },
  2647           { "ABCDEFG", "c", PR_TRUE, 2 },
  2648           { "ABCDEFG", "e", PR_TRUE, 4 },
  2649           { "ABCDEFG", "g", PR_TRUE, 6 },
  2650           { "ABCDEFG", "i", PR_FALSE, 0 },
  2651           { "ABCDEFG", "ab", PR_TRUE, 0 },
  2652           { "ABCDEFG", "cd", PR_TRUE, 2 },
  2653           { "ABCDEFG", "ef", PR_TRUE, 4 },
  2654           { "ABCDEFG", "gh", PR_FALSE, 0 },
  2655           { "ABCDABC", "bc", PR_TRUE, 5 },
  2656           { "ABCDEFG", "abcdefg", PR_TRUE, 0 },
  2657           { "ABCDEFGABCDEFG", "a", PR_TRUE, 7 },
  2658           { "ABCDEFGABCDEFG", "c", PR_TRUE, 9 },
  2659           { "ABCDEFGABCDEFG", "e", PR_TRUE, 11 },
  2660           { "ABCDEFGABCDEFG", "g", PR_TRUE, 13 },
  2661           { "ABCDEFGABCDEFG", "i", PR_FALSE, 0 },
  2662           { "ABCDEFGABCDEFG", "ab", PR_TRUE, 7 },
  2663           { "ABCDEFGABCDEFG", "cd", PR_TRUE, 9 },
  2664           { "ABCDEFGABCDEFG", "ef", PR_TRUE, 11 },
  2665           { "ABCDEFGABCDEFG", "gh", PR_FALSE, 0 },
  2666           { "ABCDABCABCDABC", "bc", PR_TRUE, 12 },
  2667           { "ABCDEFGABCDEFG", "abcdefg", PR_TRUE, 7 }
  2668       };
  2670     int i;
  2672     printf("Test 028 (PL_strcaserstr) ..."); fflush(stdout);
  2674     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2676         char *rv = PL_strcaserstr(array[i].str, array[i].sub);
  2678         if( PR_FALSE == array[i].ret )
  2680             if( (char *)0 != rv )
  2682                 printf("FAIL %d: %s,%s -> %.32s, not null\n", i,
  2683                        array[i].str ? array[i].str : "(null)",
  2684                        array[i].sub ? array[i].sub : "(null)",
  2685                        rv);
  2686                 return PR_FALSE;
  2689         else
  2691             if( (char *)0 == rv )
  2693                 printf("FAIL %d: %s,%s -> null, not 0x%x+%lu\n", i,
  2694                        array[i].str ? array[i].str : "(null)",
  2695                        array[i].sub ? array[i].sub : "(null)",
  2696                        array[i].str, array[i].off);
  2697                 return PR_FALSE;
  2700             if( &array[i].str[ array[i].off ] != rv )
  2702                 printf("FAIL %d: %s,%s -> 0x%x, not 0x%x+%lu\n", i, 
  2703                        array[i].str ? array[i].str : "(null)",
  2704                        array[i].sub ? array[i].sub : "(null)",
  2705                        rv, array[i].str, array[i].off);
  2706                 return PR_FALSE;
  2711     printf("PASS\n");
  2712     return PR_TRUE;
  2715 /* PL_strncasestr */
  2716 PRBool test_029(void)
  2718     static struct
  2720         const char *str;
  2721         const char *sub;
  2722         PRUint32    max;
  2723         PRBool      ret;
  2724         PRUint32    off;
  2725     } array[] =
  2727           { (const char *)0, (const char *)0, 12, PR_FALSE, 0 },
  2728           { (const char *)0, "blah", 12, PR_FALSE, 0 },
  2729           { "blah-de-blah", (const char *)0, 12, PR_FALSE, 0 },
  2730           { "blah-de-blah", "blah", 0, PR_FALSE, 0 },
  2731           { "blah-de-blah", "blah", 2, PR_FALSE, 0 },
  2732           { "blah-de-blah", "blah", 3, PR_FALSE, 0 },
  2733           { "blah-de-blah", "blah", 4, PR_TRUE, 0 },
  2734           { "blah-de-blah", "blah", 5, PR_TRUE, 0 },
  2735           { "blah-de-blah", "blah", 12, PR_TRUE, 0 },
  2736           { "", "blah", 12, PR_FALSE, 0 },
  2737           { "blah-de-blah", "", 12, PR_FALSE, 0 },
  2738           { "abcdefg", "a", 5, PR_TRUE, 0 },
  2739           { "abcdefg", "c", 5, PR_TRUE, 2 },
  2740           { "abcdefg", "e", 5, PR_TRUE, 4 },
  2741           { "abcdefg", "g", 5, PR_FALSE, 0 },
  2742           { "abcdefg", "i", 5, PR_FALSE, 0 },
  2743           { "abcdefg", "ab", 5, PR_TRUE, 0 },
  2744           { "abcdefg", "cd", 5, PR_TRUE, 2 },
  2745           { "abcdefg", "ef", 5, PR_FALSE, 0 },
  2746           { "abcdefg", "gh", 5, PR_FALSE, 0 },
  2747           { "abcdabc", "bc", 5, PR_TRUE, 1 },
  2748           { "abcdabc", "bc", 6, PR_TRUE, 1 },
  2749           { "abcdabc", "bc", 7, PR_TRUE, 1 },
  2750           { "abcdefg", "abcdefg", 6, PR_FALSE, 0 },
  2751           { "abcdefg", "abcdefg", 7, PR_TRUE, 0 },
  2752           { "abcdefg", "abcdefg", 8, PR_TRUE, 0 },
  2753           { "abcdefgabcdefg", "a", 12, PR_TRUE, 0 },
  2754           { "abcdefgabcdefg", "c", 12, PR_TRUE, 2 },
  2755           { "abcdefgabcdefg", "e", 12, PR_TRUE, 4 },
  2756           { "abcdefgabcdefg", "g", 12, PR_TRUE, 6 },
  2757           { "abcdefgabcdefg", "i", 12, PR_FALSE, 0 },
  2758           { "abcdefgabcdefg", "ab", 12, PR_TRUE, 0 },
  2759           { "abcdefgabcdefg", "cd", 12, PR_TRUE, 2 },
  2760           { "abcdefgabcdefg", "ef", 12, PR_TRUE, 4 },
  2761           { "abcdefgabcdefg", "gh", 12, PR_FALSE, 0 },
  2762           { "abcdabcabcdabc", "bc", 5, PR_TRUE, 1 },
  2763           { "abcdabcabcdabc", "bc", 6, PR_TRUE, 1 },
  2764           { "abcdabcabcdabc", "bc", 7, PR_TRUE, 1 },
  2765           { "abcdefgabcdefg", "abcdefg", 6, PR_FALSE, 0 },
  2766           { "abcdefgabcdefg", "abcdefg", 7, PR_TRUE, 0 },
  2767           { "abcdefgabcdefg", "abcdefg", 8, PR_TRUE, 0 },
  2768           { "ABCDEFG", "a", 5, PR_TRUE, 0 },
  2769           { "ABCDEFG", "c", 5, PR_TRUE, 2 },
  2770           { "ABCDEFG", "e", 5, PR_TRUE, 4 },
  2771           { "ABCDEFG", "g", 5, PR_FALSE, 0 },
  2772           { "ABCDEFG", "i", 5, PR_FALSE, 0 },
  2773           { "ABCDEFG", "ab", 5, PR_TRUE, 0 },
  2774           { "ABCDEFG", "cd", 5, PR_TRUE, 2 },
  2775           { "ABCDEFG", "ef", 5, PR_FALSE, 0 },
  2776           { "ABCDEFG", "gh", 5, PR_FALSE, 0 },
  2777           { "ABCDABC", "bc", 5, PR_TRUE, 1 },
  2778           { "ABCDABC", "bc", 6, PR_TRUE, 1 },
  2779           { "ABCDABC", "bc", 7, PR_TRUE, 1 },
  2780           { "ABCDEFG", "abcdefg", 6, PR_FALSE, 0 },
  2781           { "ABCDEFG", "abcdefg", 7, PR_TRUE, 0 },
  2782           { "ABCDEFG", "abcdefg", 8, PR_TRUE, 0 },
  2783           { "ABCDEFGABCDEFG", "a", 12, PR_TRUE, 0 },
  2784           { "ABCDEFGABCDEFG", "c", 12, PR_TRUE, 2 },
  2785           { "ABCDEFGABCDEFG", "e", 12, PR_TRUE, 4 },
  2786           { "ABCDEFGABCDEFG", "g", 12, PR_TRUE, 6 },
  2787           { "ABCDEFGABCDEFG", "i", 12, PR_FALSE, 0 },
  2788           { "ABCDEFGABCDEFG", "ab", 12, PR_TRUE, 0 },
  2789           { "ABCDEFGABCDEFG", "cd", 12, PR_TRUE, 2 },
  2790           { "ABCDEFGABCDEFG", "ef", 12, PR_TRUE, 4 },
  2791           { "ABCDEFGABCDEFG", "gh", 12, PR_FALSE, 0 },
  2792           { "ABCDABCABCDABC", "bc", 5, PR_TRUE, 1 },
  2793           { "ABCDABCABCDABC", "bc", 6, PR_TRUE, 1 },
  2794           { "ABCDABCABCDABC", "bc", 7, PR_TRUE, 1 },
  2795           { "ABCDEFGABCDEFG", "abcdefg", 6, PR_FALSE, 0 },
  2796           { "ABCDEFGABCDEFG", "abcdefg", 7, PR_TRUE, 0 },
  2797           { "ABCDEFGABCDEFG", "abcdefg", 8, PR_TRUE, 0 }
  2798       };
  2800     int i;
  2802     printf("Test 029 (PL_strncasestr) ..."); fflush(stdout);
  2804     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2806         char *rv = PL_strncasestr(array[i].str, array[i].sub, array[i].max);
  2808         if( PR_FALSE == array[i].ret )
  2810             if( (char *)0 != rv )
  2812                 printf("FAIL %d: %s,%s/%lu -> %.32s, not null\n", i,
  2813                        array[i].str ? array[i].str : "(null)",
  2814                        array[i].sub ? array[i].sub : "(null)",
  2815                        array[i].max, rv);
  2816                 return PR_FALSE;
  2819         else
  2821             if( (char *)0 == rv )
  2823                 printf("FAIL %d: %s,%s/%lu -> null, not 0x%x+%lu\n", i,
  2824                        array[i].str ? array[i].str : "(null)",
  2825                        array[i].sub ? array[i].sub : "(null)",
  2826                        array[i].max, array[i].str, array[i].off);
  2827                 return PR_FALSE;
  2830             if( &array[i].str[ array[i].off ] != rv )
  2832                 printf("FAIL %d: %s,%s/%lu -> 0x%x, not 0x%x+%lu\n", i, 
  2833                        array[i].str ? array[i].str : "(null)",
  2834                        array[i].sub ? array[i].sub : "(null)",
  2835                        array[i].max, rv, array[i].str, array[i].off);
  2836                 return PR_FALSE;
  2841     printf("PASS\n");
  2842     return PR_TRUE;
  2845 /* PL_strncaserstr */
  2846 PRBool test_030(void)
  2848     static struct
  2850         const char *str;
  2851         const char *sub;
  2852         PRUint32    max;
  2853         PRBool      ret;
  2854         PRUint32    off;
  2855     } array[] =
  2857           { (const char *)0, (const char *)0, 12, PR_FALSE, 0 },
  2858           { (const char *)0, "blah", 12, PR_FALSE, 0 },
  2859           { "blah-de-blah", (const char *)0, 12, PR_FALSE, 0 },
  2860           { "blah-de-blah", "blah", 0, PR_FALSE, 0 },
  2861           { "blah-de-blah", "blah", 2, PR_FALSE, 0 },
  2862           { "blah-de-blah", "blah", 3, PR_FALSE, 0 },
  2863           { "blah-de-blah", "blah", 4, PR_TRUE, 0 },
  2864           { "blah-de-blah", "blah", 5, PR_TRUE, 0 },
  2865           { "blah-de-blah", "blah", 11, PR_TRUE, 0 },
  2866           { "blah-de-blah", "blah", 12, PR_TRUE, 8 },
  2867           { "blah-de-blah", "blah", 13, PR_TRUE, 8 },
  2868           { "", "blah", 12, PR_FALSE, 0 },
  2869           { "blah-de-blah", "", 12, PR_FALSE, 0 },
  2870           { "abcdefg", "a", 5, PR_TRUE, 0 },
  2871           { "abcdefg", "c", 5, PR_TRUE, 2 },
  2872           { "abcdefg", "e", 5, PR_TRUE, 4 },
  2873           { "abcdefg", "g", 5, PR_FALSE, 0 },
  2874           { "abcdefg", "i", 5, PR_FALSE, 0 },
  2875           { "abcdefg", "ab", 5, PR_TRUE, 0 },
  2876           { "abcdefg", "cd", 5, PR_TRUE, 2 },
  2877           { "abcdefg", "ef", 5, PR_FALSE, 0 },
  2878           { "abcdefg", "gh", 5, PR_FALSE, 0 },
  2879           { "abcdabc", "bc", 5, PR_TRUE, 1 },
  2880           { "abcdabc", "bc", 6, PR_TRUE, 1 },
  2881           { "abcdabc", "bc", 7, PR_TRUE, 5 },
  2882           { "abcdefg", "abcdefg", 6, PR_FALSE, 0 },
  2883           { "abcdefg", "abcdefg", 7, PR_TRUE, 0 },
  2884           { "abcdefg", "abcdefg", 8, PR_TRUE, 0 },
  2885           { "abcdefgabcdefg", "a", 12, PR_TRUE, 7 },
  2886           { "abcdefgabcdefg", "c", 12, PR_TRUE, 9 },
  2887           { "abcdefgabcdefg", "e", 12, PR_TRUE, 11 },
  2888           { "abcdefgabcdefg", "g", 12, PR_TRUE, 6 },
  2889           { "abcdefgabcdefg", "i", 12, PR_FALSE, 0 },
  2890           { "abcdefgabcdefg", "ab", 12, PR_TRUE, 7 },
  2891           { "abcdefgabcdefg", "cd", 12, PR_TRUE, 9 },
  2892           { "abcdefgabcdefg", "ef", 12, PR_TRUE, 4 },
  2893           { "abcdefgabcdefg", "gh", 12, PR_FALSE, 0 },
  2894           { "abcdabcabcdabc", "bc", 12, PR_TRUE, 8 },
  2895           { "abcdabcabcdabc", "bc", 13, PR_TRUE, 8 },
  2896           { "abcdabcabcdabc", "bc", 14, PR_TRUE, 12 },
  2897           { "abcdefgabcdefg", "abcdefg", 13, PR_TRUE, 0 },
  2898           { "abcdefgabcdefg", "abcdefg", 14, PR_TRUE, 7 },
  2899           { "abcdefgabcdefg", "abcdefg", 15, PR_TRUE, 7 },
  2900           { "ABCDEFG", "a", 5, PR_TRUE, 0 },
  2901           { "ABCDEFG", "c", 5, PR_TRUE, 2 },
  2902           { "ABCDEFG", "e", 5, PR_TRUE, 4 },
  2903           { "ABCDEFG", "g", 5, PR_FALSE, 0 },
  2904           { "ABCDEFG", "i", 5, PR_FALSE, 0 },
  2905           { "ABCDEFG", "ab", 5, PR_TRUE, 0 },
  2906           { "ABCDEFG", "cd", 5, PR_TRUE, 2 },
  2907           { "ABCDEFG", "ef", 5, PR_FALSE, 0 },
  2908           { "ABCDEFG", "gh", 5, PR_FALSE, 0 },
  2909           { "ABCDABC", "bc", 5, PR_TRUE, 1 },
  2910           { "ABCDABC", "bc", 6, PR_TRUE, 1 },
  2911           { "ABCDABC", "bc", 7, PR_TRUE, 5 },
  2912           { "ABCDEFG", "abcdefg", 6, PR_FALSE, 0 },
  2913           { "ABCDEFG", "abcdefg", 7, PR_TRUE, 0 },
  2914           { "ABCDEFG", "abcdefg", 8, PR_TRUE, 0 },
  2915           { "ABCDEFGABCDEFG", "a", 12, PR_TRUE, 7 },
  2916           { "ABCDEFGABCDEFG", "c", 12, PR_TRUE, 9 },
  2917           { "ABCDEFGABCDEFG", "e", 12, PR_TRUE, 11 },
  2918           { "ABCDEFGABCDEFG", "g", 12, PR_TRUE, 6 },
  2919           { "ABCDEFGABCDEFG", "i", 12, PR_FALSE, 0 },
  2920           { "ABCDEFGABCDEFG", "ab", 12, PR_TRUE, 7 },
  2921           { "ABCDEFGABCDEFG", "cd", 12, PR_TRUE, 9 },
  2922           { "ABCDEFGABCDEFG", "ef", 12, PR_TRUE, 4 },
  2923           { "ABCDEFGABCDEFG", "gh", 12, PR_FALSE, 0 },
  2924           { "ABCDABCABCDABC", "bc", 12, PR_TRUE, 8 },
  2925           { "ABCDABCABCDABC", "bc", 13, PR_TRUE, 8 },
  2926           { "ABCDABCABCDABC", "bc", 14, PR_TRUE, 12 },
  2927           { "ABCDEFGABCDEFG", "abcdefg", 13, PR_TRUE, 0 },
  2928           { "ABCDEFGABCDEFG", "abcdefg", 14, PR_TRUE, 7 },
  2929           { "ABCDEFGABCDEFG", "abcdefg", 15, PR_TRUE, 7 }
  2930       };
  2932     int i;
  2934     printf("Test 030 (PL_strncaserstr)..."); fflush(stdout);
  2936     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2938         char *rv = PL_strncaserstr(array[i].str, array[i].sub, array[i].max);
  2940         if( PR_FALSE == array[i].ret )
  2942             if( (char *)0 != rv )
  2944                 printf("FAIL %d: %s,%s/%lu -> %.32s, not null\n", i,
  2945                        array[i].str ? array[i].str : "(null)",
  2946                        array[i].sub ? array[i].sub : "(null)",
  2947                        array[i].max, rv);
  2948                 return PR_FALSE;
  2951         else
  2953             if( (char *)0 == rv )
  2955                 printf("FAIL %d: %s,%s/%lu -> null, not 0x%x+%lu\n", i,
  2956                        array[i].str ? array[i].str : "(null)",
  2957                        array[i].sub ? array[i].sub : "(null)",
  2958                        array[i].max, array[i].str, array[i].off);
  2959                 return PR_FALSE;
  2962             if( &array[i].str[ array[i].off ] != rv )
  2964                 printf("FAIL %d: %s,%s/%lu -> 0x%x, not 0x%x+%lu\n", i, 
  2965                        array[i].str ? array[i].str : "(null)",
  2966                        array[i].sub ? array[i].sub : "(null)",
  2967                        array[i].max, rv, array[i].str, array[i].off);
  2968                 return PR_FALSE;
  2973     printf("PASS\n");
  2974     return PR_TRUE;
  2977 /* PL_strtok_r */
  2978 PRBool test_031(void)
  2980     static const char *tokens[] = {
  2981         "wtc", "relyea", "nelsonb", "jpierre", "nicolson",
  2982         "ian.mcgreer", "kirk.erickson", "sonja.mirtitsch", "mhein"
  2983     };
  2985     static const char *seps[] = {
  2986         ", ", ",", " ", "\t", ",,,", " ,", "    ", " \t\t", ","
  2987     };
  2989     static const char s2[] = ", \t";
  2991     char string[ 1024 ];
  2992     char *s1;
  2993     char *token;
  2994     char *lasts;
  2995     unsigned int i;
  2997     printf("Test 031 (PL_strtok_r)    ..."); fflush(stdout);
  2999     /* Build the string. */
  3000     string[0] = '\0';
  3001     for( i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++ )
  3003         PL_strcat(string, tokens[i]);
  3004         PL_strcat(string, seps[i]);
  3007     /* Scan the string for tokens. */
  3008     i = 0;
  3009     s1 = string;
  3010     while( (token = PL_strtok_r(s1, s2, &lasts)) != NULL)
  3012         if( PL_strcmp(token, tokens[i]) != 0 )
  3014             printf("FAIL wrong token scanned\n");
  3015             return PR_FALSE;
  3017         i++;
  3018         s1 = NULL;
  3020     if( i != sizeof(tokens)/sizeof(tokens[0]) )
  3022         printf("FAIL wrong number of tokens scanned\n");
  3023         return PR_FALSE;
  3026     printf("PASS\n");
  3027     return PR_TRUE;
  3030 int
  3031 main
  3033     int     argc,
  3034     char   *argv[]
  3037     printf("Testing the Portable Library string functions:\n");
  3039     if( 1
  3040         && test_001()
  3041         && test_001()
  3042         && test_002()
  3043         && test_003()
  3044         && test_004()
  3045         && test_005()
  3046         && test_006()
  3047         && test_007()
  3048         && test_008()
  3049         && test_009()
  3050         && test_010()
  3051         && test_011()
  3052         && test_012()
  3053         && test_013()
  3054         && test_014()
  3055         && test_015()
  3056         && test_016()
  3057         && test_017()
  3058         && test_018()
  3059         && test_019()
  3060         && test_020()
  3061         && test_021()
  3062         && test_022()
  3063         && test_023()
  3064         && test_024()
  3065         && test_025()
  3066         && test_026()
  3067         && test_027()
  3068         && test_028()
  3069         && test_029()
  3070         && test_030()
  3071         && test_031()
  3074         printf("Suite passed.\n");
  3075         return 0;
  3077     else
  3079         printf("Suite failed.\n");
  3080         return 1;
  3083     /*NOTREACHED*/

mercurial