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