summaryrefslogtreecommitdiffstats
path: root/tools/spencer2regexp.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/spencer2regexp.tcl')
-rw-r--r--tools/spencer2regexp.tcl174
1 files changed, 174 insertions, 0 deletions
diff --git a/tools/spencer2regexp.tcl b/tools/spencer2regexp.tcl
new file mode 100644
index 0000000..b23f806
--- /dev/null
+++ b/tools/spencer2regexp.tcl
@@ -0,0 +1,174 @@
+# spencer2regexp.tcl --
+#
+# This file generates a test suite for the regexp command based on
+# Henry Spencer's test suite. This script must be run in tcl 8.1 or
+# higher and takes an output filename as its parameter.
+#
+# Copyright (c) 1996 by Sun Microsystems, Inc.
+#
+# SCCS: @(#) spencer2regexp.tcl 1.4 98/01/22 14:48:09
+#
+
+source ../tools/regexpTestLib.tcl
+
+#
+# remove flags that have no meaning
+#
+proc removeFlags {flags} {
+ regsub -all {a|s|&|-|/|\+|,|\$|;|:|>|=|\.|\[|[A-Z]|[0-9]} $flags "" newFlags
+ return $newFlags
+}
+
+#
+# NOTBOL flag is already tested and can't be tested from the command line, skip ^
+# L is locale dependant, skip L
+# $ flag has no (?$) meaning
+# b&a and q&e are bad flag combinations
+#
+proc findSkipFlag {flags} {
+ if {[string first "^" $flags] != -1} {
+ return 1
+ }
+ if {([string first "q" $flags] != -1)
+ && ([string first "e" $flags] != -1)} {
+ return 1
+ }
+ if {([string first "a" $flags] != -1)
+ && ([string first "b" $flags] != -1)} {
+ return 1
+ }
+ if {[regexp {\$|\+} $flags] == 1} {
+ return 1
+ }
+ return 0
+}
+
+proc prepareCmd {flags re str vars noBraces} {
+ # adjust the re to include to compile-time flag, where applicable
+
+ if {[llength $flags] != 0} {
+
+ # if re already has meta-syntax, skip this test
+
+ if {[regexp {^(\(\?)|^(\*\*\*)} $re] == 1} {
+ return -1
+ }
+ set re "\(?$flags\)$re"
+ }
+ if {$noBraces > 0} {
+ set cmd "regexp -- $re $str $vars"
+ } else {
+ set cmd "regexp -- [list $re] [list $str] $vars"
+ }
+ return $cmd
+}
+
+proc convertTestLineJunk {currentLine len lineNum srcLineNum} {
+
+ regsub -all {(?b)\\} $currentLine {\\\\} currentLine
+ set re [lindex $currentLine 0]
+ set flags [lindex $currentLine 1]
+ set str [lindex $currentLine 2]
+
+ # based on flags, decide whether to skip the test
+
+ if {[findSkipFlag $flags]} {
+ regsub -all {\[|\]|\(|\)|\{|\}|\#} $currentLine {\&} line
+ set msg "\# skipping char mapping test from line $srcLineNum\n"
+ append msg "print \{... skip test from line $srcLineNum: $line\}"
+ return $msg
+ }
+
+ # perform mapping if '=' flag exists
+
+ if {[regexp {=|>} $flags] == 1} {
+ regsub -all {_} $currentLine {\\ } currentLine
+ regsub -all {A} $currentLine {\\007} currentLine
+ regsub -all {B} $currentLine {\\b} currentLine
+ regsub -all {E} $currentLine {\\033} currentLine
+ regsub -all {F} $currentLine {\\f} currentLine
+ regsub -all {N} $currentLine {\\n} currentLine
+ regsub -all {R} $currentLine {\\r} currentLine
+ regsub -all {T} $currentLine {\\t} currentLine
+ regsub -all {V} $currentLine {\\v} currentLine
+ if {[regexp {=} $flags] == 1} {
+ set re [lindex $currentLine 0]
+ }
+ set str [lindex $currentLine 2]
+ }
+ set flags [removeFlags $flags]
+
+ # find the test result
+
+ set numVars [expr $len - 3]
+ set vars {}
+ set vals {}
+ set result 0
+ set v 0
+
+ if {[regsub {\*} "$flags" "" newFlags] == 1} {
+ # an error is expected
+
+ if {[string compare $str "EMPTY"] == 0} {
+ # empty regexp is not an error
+ # skip this test
+
+ return "\# skipping the empty-re test from line $srcLineNum\n"
+ }
+ set flags $newFlags
+ set result "1 \{[convertErrCode $str]\}"
+ } elseif {$numVars > 0} {
+ # at least 1 match is made
+
+ if {[regexp {s} $flags] == 1} {
+ set result {0 1}
+ } else {
+ while {$v < $numVars} {
+ append vars " var($v)"
+ append vals " \$var($v)"
+ incr v
+ }
+ set result "0 \{1 [removeAts [lrange $currentLine 3 $len]]\}"
+ }
+ } else {
+ # no match is made
+
+ set result "0 0"
+ }
+
+ # adjust the re to include to compile-time flag, where applicable
+
+ if {[llength $flags] != 0} {
+
+ # if re already has meta-syntax, skip this test
+
+ if {[regexp {^(\(\?)|^(\*\*\*)} $re] == 1} {
+ return "\# skipping test with metasyntax from line $srcLineNum\n"
+ }
+ set re "\(?$flags\)$re"
+ }
+
+ # set up the test and write it to the output file
+
+ set cmd "regexp -- [list $re] [list $str] $vars"
+ set test "test regexp-1.$srcLineNum \{converted from line $srcLineNum\} \{\n"
+ append test "\tcatch {unset var}\n"
+ append test "\tlist \[catch \{ \n"
+ append test "\t\tset match \[$cmd\] \n"
+ append test "\t\tlist \$match $vals \n"
+ append test "\t\} msg\] \$msg \n"
+ append test "\} \{$result\} \n"
+ return $test
+}
+
+# main
+
+if {$argc != 2} {
+ puts "name of input and outfile reuqired"
+ return
+}
+
+set inFileName [lindex $argv 0]
+set outFileName [lindex $argv 1]
+
+writeOutputFile [readInputFile] regexp