1#!/usr/local/bin/ruby -Ke
2# testconv.rb
3# Copyright (C) 2003-2006  K.Kosako (sndgk393 AT ybb DOT ne DOT jp)
4
5WINDOWS = (ARGV.size > 0 && /^-win/i =~ ARGV[0])
6ARGV.shift if WINDOWS
7
8if WINDOWS
9  REGENC  = 'ONIG_ENCODING_SJIS'
10else
11  REGENC  = 'ONIG_ENCODING_EUC_JP'
12end
13
14def conv_reg(s)
15  s.gsub!(/\\/, '\\\\\\\\')  #'
16  s.gsub!(/\?\?/, '?\\\\?')  # escape ANSI trigraph (??)
17  s
18end
19
20def conv_str(s)
21  if (s[0] == ?')
22    s = s[1..-2]
23    return s.gsub(/\\/, '\\\\\\\\')  #'
24  else
25    return s[1..-2]
26  end
27end
28
29print(<<"EOS")
30/*
31 * This program was generated by testconv.rb.
32 */
33#include "config.h"
34#ifdef ONIG_ESCAPE_UCHAR_COLLISION
35#undef ONIG_ESCAPE_UCHAR_COLLISION
36#endif
37#include <stdio.h>
38
39#ifdef POSIX_TEST
40#include "onigmoposix.h"
41#else
42#include "onigmo.h"
43#endif
44
45#include <string.h>
46
47#define SLEN(s)  strlen(s)
48
49static int nsucc  = 0;
50static int nfail  = 0;
51static int nerror = 0;
52
53static FILE* err_file;
54
55#ifndef POSIX_TEST
56static OnigRegion* region;
57#endif
58
59static void xx(char* pattern, char* str, int from, int to, int mem, int not)
60{
61  int r;
62
63#ifdef POSIX_TEST
64  regex_t reg;
65  char buf[200];
66  regmatch_t pmatch[25];
67
68  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);
69  if (r) {
70    regerror(r, &reg, buf, sizeof(buf));
71    fprintf(err_file, "ERROR: %s\\n", buf);
72    nerror++;
73    return ;
74  }
75
76  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);
77  if (r != 0 && r != REG_NOMATCH) {
78    regerror(r, &reg, buf, sizeof(buf));
79    fprintf(err_file, "ERROR: %s\\n", buf);
80    nerror++;
81    return ;
82  }
83
84  if (r == REG_NOMATCH) {
85    if (not) {
86      fprintf(stdout, "OK(N): /%s/ '%s'\\n", pattern, str);
87      nsucc++;
88    }
89    else {
90      fprintf(stdout, "FAIL: /%s/ '%s'\\n", pattern, str);
91      nfail++;
92    }
93  }
94  else {
95    if (not) {
96      fprintf(stdout, "FAIL(N): /%s/ '%s'\\n", pattern, str);
97      nfail++;
98    }
99    else {
100      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {
101        fprintf(stdout, "OK: /%s/ '%s'\\n", pattern, str);
102        nsucc++;
103      }
104      else {
105        fprintf(stdout, "FAIL: /%s/ '%s' %d-%d : %d-%d\\n", pattern, str,
106	        (int)from, (int)to, (int)pmatch[mem].rm_so, (int)pmatch[mem].rm_eo);
107        nfail++;
108      }
109    }
110  }
111  regfree(&reg);
112
113#else
114  regex_t* reg;
115  OnigErrorInfo einfo;
116  OnigSyntaxType syn = *ONIG_SYNTAX_DEFAULT;
117
118  /* ONIG_OPTION_OFF(syn.options, ONIG_OPTION_ASCII_RANGE); */
119
120  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + SLEN(pattern)),
121	       ONIG_OPTION_DEFAULT, #{REGENC}, &syn, &einfo);
122  if (r) {
123    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
124    onig_error_code_to_str((UChar* )s, r, &einfo);
125    fprintf(err_file, "ERROR: %s\\n", s);
126    nerror++;
127    return ;
128  }
129
130  r = onig_search(reg, (UChar* )str, (UChar* )(str + SLEN(str)),
131		  (UChar* )str, (UChar* )(str + SLEN(str)),
132		  region, ONIG_OPTION_NONE);
133  if (r < ONIG_MISMATCH) {
134    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
135    onig_error_code_to_str((UChar* )s, r);
136    fprintf(err_file, "ERROR: %s\\n", s);
137    nerror++;
138    return ;
139  }
140
141  if (r == ONIG_MISMATCH) {
142    if (not) {
143      fprintf(stdout, "OK(N): /%s/ '%s'\\n", pattern, str);
144      nsucc++;
145    }
146    else {
147      fprintf(stdout, "FAIL: /%s/ '%s'\\n", pattern, str);
148      nfail++;
149    }
150  }
151  else {
152    if (not) {
153      fprintf(stdout, "FAIL(N): /%s/ '%s'\\n", pattern, str);
154      nfail++;
155    }
156    else {
157      if (region->beg[mem] == from && region->end[mem] == to) {
158        fprintf(stdout, "OK: /%s/ '%s'\\n", pattern, str);
159        nsucc++;
160      }
161      else {
162        fprintf(stdout, "FAIL: /%s/ '%s' %d-%d : %d-%d\\n", pattern, str,
163	        (int)from, (int)to, (int)region->beg[mem], (int)region->end[mem]);
164        nfail++;
165      }
166    }
167  }
168  onig_free(reg);
169#endif
170}
171
172static void x2(char* pattern, char* str, int from, int to)
173{
174  xx(pattern, str, from, to, 0, 0);
175}
176
177static void x3(char* pattern, char* str, int from, int to, int mem)
178{
179  xx(pattern, str, from, to, mem, 0);
180}
181
182static void n(char* pattern, char* str)
183{
184  xx(pattern, str, 0, 0, 0, 1);
185}
186
187extern int main(int argc, char* argv[])
188{
189  err_file = stdout;
190
191#ifdef POSIX_TEST
192  reg_set_encoding(#{REGENC.sub(/\AONIG_/, 'REG_POSIX_')});
193#else
194  region = onig_region_new();
195#endif
196
197EOS
198
199PAT = '\\/([^\\\\\\/]*(?:\\\\.[^\\\\\\/]*)*)\\/'
200CM = '\s*,\s*'
201RX2 = %r{\Ax\(#{PAT}#{CM}('[^']*'|"[^"]*")#{CM}(\S+)#{CM}(\S+)\)}
202RI2 = %r{\Ai\(#{PAT}#{CM}('[^']*'|"[^"]*")#{CM}(\S+)#{CM}(\S+)\)}
203RX3 = %r{\Ax\(#{PAT}#{CM}('[^']*'|"[^"]*")#{CM}(\S+)#{CM}(\S+)#{CM}(\S+)\)}
204RN  = %r{\An\(#{PAT}#{CM}('[^']*'|"[^"]*")\)} #'
205
206while line = gets()
207  if (m = RX2.match(line))
208    reg = conv_reg(m[1])
209    str = conv_str(m[2])
210    printf("  x2(\"%s\", \"%s\", %s, %s);\n", reg, str, m[3], m[4])
211  elsif (m = RI2.match(line))
212    reg = conv_reg(m[1])
213    str = conv_str(m[2])
214    printf("  x2(\"%s\", \"%s\", %s, %s);\n", reg, str, m[3], m[4])
215  elsif (m = RX3.match(line))
216    reg = conv_reg(m[1])
217    str = conv_str(m[2])
218    printf("  x3(\"%s\", \"%s\", %s, %s, %s);\n", reg, str, m[3], m[4], m[5])
219  elsif (m = RN.match(line))
220    reg = conv_reg(m[1])
221    str = conv_str(m[2])
222    printf("  n(\"%s\", \"%s\");\n", reg, str)
223  else
224
225  end
226end
227
228print(<<'EOS')
229  fprintf(stdout,
230       "\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\n",
231       nsucc, nfail, nerror, onig_version());
232
233#ifndef POSIX_TEST
234  onig_region_free(region, 1);
235  onig_end();
236#endif
237
238  return ((nfail == 0 && nerror == 0) ? 0 : -1);
239}
240EOS
241
242# END OF SCRIPT
243