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