1645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman/*
2645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * Copyright (c) 2010 MIPS Technologies, Inc.
3645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *
4645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * All rights reserved.
5645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *
6645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * Redistribution and use in source and binary forms, with or without
7645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * modification, are permitted provided that the following conditions
8645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * are met:
9645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *
10645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *      * Redistributions of source code must retain the above copyright
11645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *        notice, this list of conditions and the following disclaimer.
12645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *      * Redistributions in binary form must reproduce the above copyright
13645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *        notice, this list of conditions and the following disclaimer
14645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *        in the documentation and/or other materials provided with
15645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *        the distribution.
16645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *      * Neither the name of MIPS Technologies Inc. nor the names of its
17645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *        contributors may be used to endorse or promote products derived
18645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *        from this software without specific prior written permission.
19645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman *
20645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman */
32645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
33645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#include <string.h>
34645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#include "mips-string-ops.h"
35645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
36645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#define do_strlen_word(__av) {\
37645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    if (detect_zero(x,x,_01s,_80s)) break;\
38645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    x = __av;\
39645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    cnt += sizeof (unsigned);\
40645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    }
41645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
42645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#define do_strlen_byte(__x) {\
43645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  if ((bx.b.B##__x) == 0) break;\
44645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  ++cnt;\
45645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  }
46645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
47645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#if SMOKE_TEST_MIPS_STRLEN
48645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#define strlen my_strlen
49645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#endif
50645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
51645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmansize_t
52645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanstrlen (const char *_a)
53645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman{
54645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  int cnt = 0;
55645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  unsigned long x;
56645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
57645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  /* align the string to word boundary so we can do word at a time.  */
58645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  if ((cvt_ptr_to (unsigned long, _a) & (sizeof (unsigned long) - 1)) != 0)
59645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    {
60645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      if ((cvt_ptr_to (unsigned long, _a) & 1) != 0)
61645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	{
62645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  if (get_byte (_a, 0) == 0)
63645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	    return cnt;
64645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  /* set bit 1 so 2-bytes are checked and incremented. */
65645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  inc_ptr_as (char *, _a, 1);
66645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  ++cnt;
67645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	}
68645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      if ((cvt_ptr_to (unsigned long, _a) & 2) != 0)
69645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	{
70645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  if (get_byte (_a, 0) == 0)
71645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	    return cnt + 0;
72645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  if (get_byte (_a, 1) == 0)
73645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	    return cnt + 1;
74645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  inc_ptr_as (char *, _a, 2);
75645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  cnt += 2;
76645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	}
77645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    }
78645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
79645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#if __mips64
80645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#error strlen: mips64 check for 4-byte alignment not implemented.
81645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#endif
82645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
83645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  if (1)
84645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    {
85645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      def_and_set_01 (_01s);
86645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      def_and_set_80 (_80s);
87645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
88645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      /* as advantagous as it is to performance, this code cannot pre-load
89645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman         the following word, nor can it prefetch the next line at the start
90645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman         of the loop since the string can be at the end of a page with the
91645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman         following page unmapped. There are tests in the suite to catch
92645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman         any attempt to go beyond the current word. */
93645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      x = get_word (_a, 0);
94645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      while (1)
95645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	{
96645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  /* doing 8 words should cover most strings.  */
97645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 1));
98645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 2));
99645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 3));
100645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 4));
101645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 5));
102645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 6));
103645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 7));
104645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  do_strlen_word (get_word (_a, 8));
105645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	  inc_ptr_as (unsigned long*, _a, 8);
106645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	}
107645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    }
108645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  while (1)
109645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    {
110645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      /* pull apart the last word processed and find the zero.  */
111645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      bitfields_t bx;
112645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      bx.v = x;
113645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#if __mips64
114645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (0);
115645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (1);
116645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (2);
117645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (3);
118645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (4);
119645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (5);
120645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (6);
121645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#else
122645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (0);
123645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (1);
124645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      do_strlen_byte (2);
125645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#endif
126645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      /* last byte is zero */
127645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman      break;
128645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    }
129645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  return cnt;
130645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman}
131645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
132645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#undef do_strlen_byte
133645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#undef do_strlen_word
134645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
135645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#if SMOKE_TEST_MIPS_STRLEN
136645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#include <stdio.h>
137645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str1[] = "DHRYSTONE PROGRAM, 1'ST STRING";
138645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str2[] = "DHRYSTONE PROGRAM, 2'ST STRING";
139645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
140645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str3[] = "another string";
141645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str4[] = "another";
142645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
143645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str5[] = "somes tring";
144645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str6[] = "somes_tring";
145645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
146645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchar str7[16], str8[16];
147645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
148645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanstatic char *
149645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanchk (unsigned long mine, unsigned long libs, int *errors)
150645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman{
151645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  static char answer[1024];
152645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  char *result = mine == libs ? "PASS" : "FAIL";
153645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  sprintf (answer, "new_strlen=%d: lib_strlen=%d: %s!", mine, libs, result);
154645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  if (mine != libs)
155645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    (*errors)++;
156645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  return answer;
157645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman}
158645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
159645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanint
160645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearmanmain (int argc, char **argv)
161645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman{
162645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  int errors = 0;
163645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  /* set -1 in one position */
164645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str6[5] = 0xff;
165645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  /* set zero in same position with junk in following 3 */
166645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str7[0] = str8[0] = 0;
167645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str7[1] = 0xff;
168645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str7[2] = 'a';
169645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str7[3] = 2;
170645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str8[1] = 's';
171645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str8[2] = -2;
172645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  str8[3] = 0;
173645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
174645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  fprintf (stderr, "========== mips_strlen%s test...\n",
175645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman	   argv[0] ? argv[0] : "unknown strlen");
176645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#define P(__x,__y) {\
177645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    int a = my_strlen(__x + __y);\
178645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    int b = (strlen)(__x + __y) /* library version */;\
179645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    fprintf(stderr,"%s+%d: %s\n",#__x,__y,chk(a,b,&errors));\
180645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman    }
181645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
182645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str1, 0);
183645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str1, 1);
184645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str1, 2);
185645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str1, 3);
186645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
187645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str2, 0);
188645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str2, 1);
189645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str2, 2);
190645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str2, 3);
191645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
192645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str3, 0);
193645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str3, 1);
194645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str3, 2);
195645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str3, 3);
196645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
197645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str4, 0);
198645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str4, 1);
199645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str4, 2);
200645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str4, 3);
201645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
202645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str5, 0);
203645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str5, 1);
204645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str5, 2);
205645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str5, 3);
206645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
207645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str6, 0);
208645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str6, 1);
209645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str6, 2);
210645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str6, 3);
211645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
212645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str7, 0);
213645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str7, 1);
214645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str7, 2);
215645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str7, 3);
216645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
217645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str8, 0);
218645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str8, 1);
219645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str8, 2);
220645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  P (str8, 3);
221645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman
222645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman  return errors;
223645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman}
224645d0312c2d6b6492cc4b3891bc1a91908dc24b7Chris Dearman#endif
225