Skip to content

Commit

Permalink
lib/parsers/awk.tcl: Understand "end" in ranges
Browse files Browse the repository at this point in the history
  • Loading branch information
dbohdan committed Nov 30, 2016
1 parent 29a47c8 commit 8b7fa94
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 8 deletions.
16 changes: 13 additions & 3 deletions lib/parsers/awk.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,16 @@ proc ::sqawk::parsers::awk::trim-record {record mode} {
return $record
}

# Return 1 if $from-$to is a valid field range and 0 otherwise.
proc ::sqawk::parsers::awk::valid-range? {from to} {
return [expr {
[string is integer -strict $from] &&
(0 <= $from) &&
(($to eq {end}) || [string is integer -strict $to]) &&
($from <= $to)
}]
}

# Return 1 if two lists of ranges have overlapping ranges and 0 otherwise.
# O(N*M).
proc ::sqawk::parsers::awk::overlap? {ranges1 ranges2} {
Expand Down Expand Up @@ -127,14 +137,14 @@ proc ::sqawk::parsers::awk::skipmerge {fieldsAndSeps skipRanges mergeRanges
# Takes a range string like {1-2,3-4,5-6} or {1 2 3 4 5 6} and returns a list
# like {0 1 2 3 4 5}.
proc ::sqawk::parsers::awk::normalizeRanges ranges {
set rangeRegexp {[0-9]+-[0-9]+}
set overallRegexp "^(?:$rangeRegexp,)*$rangeRegexp\$"
set rangeRegexp {[0-9]+-(end|[0-9]+)}
set overallRegexp ^(?:$rangeRegexp,)*$rangeRegexp\$
if {[regexp $overallRegexp $ranges]} {
set ranges [string map {- { } , { }} $ranges]
}
set rangesFromZero {}
foreach x $ranges {
lappend rangesFromZero [expr {$x - 1}]
lappend rangesFromZero [expr {$x eq {end} ? $x : $x - 1}]
}
return $rangesFromZero
}
Expand Down
35 changes: 30 additions & 5 deletions tests.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,24 @@ namespace eval ::sqawk::tests {
sqawk-tcl {select a from a} header=1 columns= $header3File
} -result b\nc

tcltest::test skip-and-merge-1.1 {::sqawk::parsers::awk::in-range?} \
tcltest::test skip-and-merge-1.1 {::sqawk::parsers::awk::valid-range?} \
-setup $setup \
-cleanup {unset result} \
-body {
source -encoding utf-8 sqawk.tcl
set result {}
lappend result [::sqawk::parsers::awk::valid-range? 0 1]
lappend result [::sqawk::parsers::awk::valid-range? -5 1]
lappend result [::sqawk::parsers::awk::valid-range? 1 0]
lappend result [::sqawk::parsers::awk::valid-range? 5 end]
lappend result [::sqawk::parsers::awk::valid-range? end 5]
lappend result [::sqawk::parsers::awk::valid-range? start end]
lappend result [::sqawk::parsers::awk::valid-range? start 5]
lappend result [::sqawk::parsers::awk::valid-range? blah blah]
lappend result [::sqawk::parsers::awk::valid-range? 999 9999]
} -result {1 0 0 1 0 0 0 0 1}

tcltest::test skip-and-merge-1.2 {::sqawk::parsers::awk::in-range?} \
-setup $setup \
-cleanup {unset result} \
-body {
Expand All @@ -242,9 +259,12 @@ namespace eval ::sqawk::tests {
lappend result [::sqawk::parsers::awk::in-range? 0 {0 0}]
lappend result [::sqawk::parsers::awk::in-range? 0 {1 1}]
lappend result [::sqawk::parsers::awk::in-range? 1 {0 0}]
} -result {0 3 2 1 0 0}
lappend result [::sqawk::parsers::awk::in-range? 3 {5 end}]
lappend result [::sqawk::parsers::awk::in-range? 5 {5 end}]
lappend result [::sqawk::parsers::awk::in-range? 7 {5 end}]
} -result {0 3 2 1 0 0 0 1 2}

tcltest::test skip-and-merge-1.2 {::sqawk::parsers::awk::overlap?} \
tcltest::test skip-and-merge-1.3 {::sqawk::parsers::awk::overlap?} \
-setup $setup \
-cleanup {unset result} \
-body {
Expand All @@ -255,7 +275,10 @@ namespace eval ::sqawk::tests {
lappend result [::sqawk::parsers::awk::overlap? {0 9} {1 2}]
lappend result [::sqawk::parsers::awk::overlap? {0 0} {0 0}]
lappend result [::sqawk::parsers::awk::overlap? {0 99} {0 54}]
} -result {0 1 1 1 1}
lappend result [::sqawk::parsers::awk::overlap? {0 end} {0 54}]
lappend result [::sqawk::parsers::awk::overlap? {0 end} {99 end}]
lappend result [::sqawk::parsers::awk::overlap? {0 3} {5 end}]
} -result {0 1 1 1 1 1 1 0}

tcltest::test skip-and-merge-2.1 {::sqawk::parsers::awk::skipmerge} \
-setup $setup \
Expand All @@ -265,6 +288,8 @@ namespace eval ::sqawk::tests {
set result {}
lappend result [::sqawk::parsers::awk::skipmerge \
{start AB foo AB bar {}} {} {0 99}]
lappend result [::sqawk::parsers::awk::skipmerge \
{start AB foo AB bar {}} {} {0 end}]
lappend result [::sqawk::parsers::awk::skipmerge \
{start AB foo AB bar {}} {} {0 1}]
lappend result [::sqawk::parsers::awk::skipmerge \
Expand All @@ -273,7 +298,7 @@ namespace eval ::sqawk::tests {
{start AB foo AB bar {}} {} {0 0 1 1 2 2}]
lappend result [::sqawk::parsers::awk::skipmerge \
{start AB foo AB bar {}} {} {0 0 1 2 2 2}]
} -result {startABfooABbar {startABfoo bar} {start foo bar}\
} -result {startABfooABbar startABfooABbar {startABfoo bar} {start foo bar}\
{start foo bar} {start fooABbar}}

tcltest::test skip-and-merge-2.2 {::sqawk::parsers::awk::skipmerge} \
Expand Down

0 comments on commit 8b7fa94

Please sign in to comment.