diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-10-08 09:04:46 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-10-08 09:04:46 -0700 |
commit | d910f624a23e374004924f46541e6f99b48583c7 (patch) | |
tree | dc2fbcd3cdbc57bd9a606e5d3b9c30b55fd3b8d2 /match.c | |
parent | 16a1ef71a6877069f4814ac16aa5e7a85e9a2f11 (diff) | |
download | txr-d910f624a23e374004924f46541e6f99b48583c7.tar.gz txr-d910f624a23e374004924f46541e6f99b48583c7.tar.bz2 txr-d910f624a23e374004924f46541e6f99b48583c7.zip |
* match.c (mintimes_k, maxtimes_k): New keyword variables.
(match_line): Implemented :mintimes and :maxtimes, changing
the semantics of :times.
(match_files): Likewise.
(match_init): New keyword variables initialized.
* txr.1: Updated.
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 47 |
1 files changed, 39 insertions, 8 deletions
@@ -47,7 +47,8 @@ int output_produced; -val mingap_k, maxgap_k, gap_k, times_k, lines_k, chars_k; +val mingap_k, maxgap_k, gap_k, mintimes_k, maxtimes_k, times_k; +val lines_k, chars_k; val choose_s, longest_k, shortest_k, greedy_k; static void debugf(val fmt, ...) @@ -556,16 +557,21 @@ static val match_line(val bindings, val specline, val dataline, val min = getplist(args, mingap_k); val gap = getplist(args, gap_k); val times = getplist(args, times_k); + val mintimes = getplist(args, mintimes_k); + val maxtimes = getplist(args, maxtimes_k); val chars = getplist(args, chars_k); cnum cmax = nump(gap) ? c_num(gap) : (nump(max) ? c_num(max) : 0); cnum cmin = nump(gap) ? c_num(gap) : (nump(min) ? c_num(min) : 0); cnum mincounter = cmin, maxcounter = 0; - cnum timescounter = 0, charscounter = 0; - cnum ctimes = nump(times) ? c_num(times) : 0; + cnum ctimax = nump(times) ? c_num(times) + : (nump(maxtimes) ? c_num(maxtimes) : 0); + cnum ctimin = nump(times) ? c_num(times) + : (nump(mintimes) ? c_num(mintimes) : 0); cnum cchars = nump(chars) ? c_num(chars) : 0; + cnum timescounter = 0, charscounter = 0; val iter; - if ((times && ctimes == 0) || (chars && cchars == 0)) + if (((times || maxtimes) && ctimax == 0) || (chars && cchars == 0)) break; for (;;) { @@ -621,8 +627,11 @@ static val match_line(val bindings, val specline, val dataline, pos = new_pos; bug_unless (length_str_ge(dataline, pos)); - if (times && ++timescounter >= ctimes) + timescounter++; + + if ((times || maxtimes) && timescounter >= ctimax) break; + mincounter = 0; maxcounter = 0; } else { @@ -638,6 +647,12 @@ next_coll: } } + if ((times || mintimes) && timescounter < ctimin) { + debuglf(spec_lineno, lit("fewer than ~a iterations collected"), + num(ctimin), nao); + return nil; + } + if (!bindings_coll) debuglf(spec_lineno, lit("nothing was collected"), nao); @@ -1617,10 +1632,16 @@ repeat_spec_same_data: val min = getplist(args, mingap_k); val gap = getplist(args, gap_k); val times = getplist(args, times_k); + val mintimes = getplist(args, mintimes_k); + val maxtimes = getplist(args, maxtimes_k); val lines = getplist(args, lines_k); cnum cmax = nump(gap) ? c_num(gap) : (nump(max) ? c_num(max) : 0); cnum cmin = nump(gap) ? c_num(gap) : (nump(min) ? c_num(min) : 0); cnum mincounter = cmin, maxcounter = 0; + cnum ctimax = nump(times) ? c_num(times) + : (nump(maxtimes) ? c_num(maxtimes) : 0); + cnum ctimin = nump(times) ? c_num(times) + : (nump(mintimes) ? c_num(mintimes) : 0); cnum timescounter = 0, linescounter = 0; cnum ctimes = nump(times) ? c_num(times) : 0; cnum clines = nump(lines) ? c_num(lines) : 0; @@ -1716,15 +1737,17 @@ repeat_spec_same_data: data = new_data; data_lineno = new_lineno; *car_l(success) = nil; - - if (times && ++timescounter >= ctimes) - break; } else { debuglf(spec_linenum, lit("collect consumed entire file"), nao); data = nil; } mincounter = 0; maxcounter = 0; + + timescounter++; + + if ((times || maxtimes) && timescounter >= ctimax) + break; } else { next_collect: mincounter++; @@ -1743,6 +1766,12 @@ repeat_spec_same_data: return nil; } + if ((times || mintimes) && timescounter < ctimin) { + debuglf(spec_linenum, lit("fewer than ~a iterations collected"), + num(ctimin), nao); + return nil; + } + if (!bindings_coll) debuglf(spec_linenum, lit("nothing was collected"), nao); @@ -2271,6 +2300,8 @@ void match_init(void) mingap_k = intern(lit("mingap"), keyword_package); maxgap_k = intern(lit("maxgap"), keyword_package); gap_k = intern(lit("gap"), keyword_package); + mintimes_k = intern(lit("mintimes"), keyword_package); + maxtimes_k = intern(lit("maxtimes"), keyword_package); times_k = intern(lit("times"), keyword_package); lines_k = intern(lit("lines"), keyword_package); chars_k = intern(lit("chars"), keyword_package); |