1a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Regular expression tests. 2a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Copyright (C) 2003 Free Software Foundation, Inc. 3a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This file is part of the GNU C Library. 4a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. 5a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 6a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner The GNU C Library is free software; you can redistribute it and/or 7a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 8a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner License as published by the Free Software Foundation; either 9a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 10a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 11a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner The GNU C Library is distributed in the hope that it will be useful, 12a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 13a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Lesser General Public License for more details. 15a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 16a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 17a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner License along with the GNU C Library; if not, write to the Free 18a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 02110-1301 USA. */ 20a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 21a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_CONFIG_H 22a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include "config.h" 23a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 24a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 25a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <sys/types.h> 26a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_MCHECK_H 27a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <mcheck.h> 28a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 29a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <regex.h> 30a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdio.h> 31a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdlib.h> 32a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <string.h> 33a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 34a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnervoid 35a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerfrob_escapes (char *src, int pattern) 36a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 37a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char *dst; 38a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 39a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (dst = src; *src != '\0'; dst++, src++) 40a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 41a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (*src == '\\') 42a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 43a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner switch (src[1]) 44a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 45a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 't': 46a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner src++; 47a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *dst = '\t'; 48a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 49a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'n': 50a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner src++; 51a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *dst = '\n'; 52a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 53a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case 'r': 54a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner src++; 55a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *dst = '\r'; 56a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 57a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case '\\': 58a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case '^': 59a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case '{': 60a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case '|': 61a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner case '}': 62a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (!pattern) 63a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 64a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner src++; 65a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *dst = *src; 66a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 67a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 68a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 69a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 70a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 71a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (src != dst) 72a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *dst = *src; 73a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 74a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *dst = '\0'; 75a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 76a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 77a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerint 78a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnermain (int argc, char **argv) 79a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 80a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int ret = 0, n; 81a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char *line = NULL; 82a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner size_t line_len = 0; 83a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ssize_t len; 84a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner FILE *f; 85a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char *pattern, *string; 86a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int flags = REG_EXTENDED; 87a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int eflags = 0; 88a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regex_t re; 89a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regmatch_t rm[20]; 90a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 91a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef HAVE_MCHECK_H 92a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner mtrace (); 93a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 94a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 95a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (argc < 2) 96a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 97a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf (stderr, "Missing test filename\n"); 98a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 1; 99a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 100a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 101a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner f = fopen (argv[1], "r"); 102a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (f == NULL) 103a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 104a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fprintf (stderr, "Couldn't open %s\n", argv[1]); 105a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 1; 106a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 107a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 108a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner while ((len = getline (&line, &line_len, f)) > 0) 109a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 110a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char *p, *q; 111a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int i; 112a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 113a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (line[len - 1] == '\n') 114a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner line[--len] = '\0'; 115a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 116a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts (line); 117a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 118a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (line[0] == ';') 119a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 120a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 121a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (line[0] == '\0') 122a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 123a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 124a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (line[0] == '-') 125a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 126a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (strstr (line, "REG_BASIC")) 127a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner flags = 0; 128a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 129a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner flags = REG_EXTENDED; 130a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (strstr (line, "REG_ICASE")) 131a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner flags |= REG_ICASE; 132a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (strstr (line, "REG_NEWLINE")) 133a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner flags |= REG_NEWLINE; 134a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner eflags = 0; 135a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (strstr (line, "REG_NOTBOL")) 136a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner eflags |= REG_NOTBOL; 137a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (strstr (line, "REG_NOTEOL")) 138a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner eflags |= REG_NOTEOL; 139a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 140a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 141a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 142a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner pattern = line + strspn (line, " \t"); 143a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (*pattern == '\0') 144a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 145a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner p = pattern + strcspn (pattern, " \t"); 146a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (*p == '\0') 147a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 148a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *p++ = '\0'; 149a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 150a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner string = p + strspn (p, " \t"); 151a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (*string == '\0') 152a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 153a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (*string == '"') 154a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 155a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner string++; 156a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner p = strchr (string, '"'); 157a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (p == NULL) 158a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 159a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *p++ = '\0'; 160a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 161a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 162a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 163a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner p = string + strcspn (string, " \t"); 164a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (*string == '!') 165a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner string = NULL; 166a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (*p == '\0') 167a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 168a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 169a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner *p++ = '\0'; 170a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 171a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 172a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner frob_escapes (pattern, 1); 173a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (string != NULL) 174a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner frob_escapes (string, 0); 175a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 176a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner n = regcomp (&re, pattern, flags); 177a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (n != 0) 178a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 179a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (string != NULL) 180a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 181a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char buf[500]; 182a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regerror (n, &re, buf, sizeof (buf)); 183a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("FAIL regcomp unexpectedly failed: %s\n", 184a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner buf); 185a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ret = 1; 186a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 187a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 188a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 189a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else if (string == NULL) 190a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 191a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regfree (&re); 192a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner puts ("FAIL regcomp unpexpectedly succeeded"); 193a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ret = 1; 194a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner continue; 195a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 196a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 197a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (regexec (&re, string, 20, rm, eflags)) 198a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 199a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (i = 0; i < 20; ++i) 200a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 201a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner rm[i].rm_so = -1; 202a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner rm[i].rm_eo = -1; 203a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 204a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 205a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 206a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regfree (&re); 207a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 208a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (i = 0; i < 20 && *p != '\0'; ++i) 209a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 210a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int rm_so, rm_eo; 211a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 212a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner rm_so = strtol (p, &q, 10); 213a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (p == q) 214a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 215a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner p = q; 216a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 217a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner rm_eo = strtol (p, &q, 10); 218a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (p == q) 219a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 220a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner p = q; 221a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 222a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (rm[i].rm_so != rm_so || rm[i].rm_eo != rm_eo) 223a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 224a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner printf ("FAIL rm[%d] %d..%d != expected %d..%d\n", 225a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner i, rm[i].rm_so, rm[i].rm_eo, rm_so, rm_eo); 226a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ret = 1; 227a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 228a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 229a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 230a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 231a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 232a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner free (line); 233a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner fclose (f); 234a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return ret; 235a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 236