From ee6f7d3fc077c0afdfc510e57dc13b326b21fdd8 Mon Sep 17 00:00:00 2001 From: FRIGN Date: Wed, 28 Jan 2015 19:44:05 +0100 Subject: [PATCH] Add trivial equivalence class support in tr(1) and update manpage Equivalence classes are a hard matter and there's still no "standard" way to solve the issue. Previously, tr would just skip those classes, but it's much better when it resolves a [=c=] to a normal c instead of treating it as a literal. Also, reflect recent changes in the manpage (octal escapes) and fix the markup in some areas. --- tr.1 | 19 ++++++++++++------- tr.c | 6 ++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/tr.1 b/tr.1 index 29ea1f1..75d0658 100644 --- a/tr.1 +++ b/tr.1 @@ -25,22 +25,27 @@ Squeeze repeated characters matching .Ar set1 or .Ar set2 -if -d is set. +if +.Fl d +is set. .El .Sh SET .Bl -tag -width Ds -.It Literal 'c' -.It Escape sequence '\ec' -\e\e, \ea, \eb, \ef, \en, \er, \et, \ev -.It Range 'c-d' -.It Repeat '[c*n]' +.It Literal Sy c +.It Escape sequence Sy \ec +\e\e, \ea, \eb, \ef, \en, \er, \et, \ev, \eO[OO] +.It Range Sy c-d +.It Repeat Sy [c*n] Only in .Ar set2 . If n = 0 or left out, set n to length of .Ar set1 . -.It Character class '[:class:]' +.It Character class Sy [:class:] See .Xr wctype 3 . +.It Equivalence class Sy [=c=] +Resolve to +.Sy c . .El .Sh TRANSLATION If no options are specified, diff --git a/tr.c b/tr.c index 7aa71e7..a5b9b62 100644 --- a/tr.c +++ b/tr.c @@ -143,6 +143,12 @@ nextbrack: /* CLASSES [=EQUIV=] (skip) */ if (j - i > 3 && rstr[i + 1] == '=' && rstr[m - 1] == '=') { + if (j - i != 4) + goto literal; + (*set)[setranges].start = rstr[i + 2]; + (*set)[setranges].end = rstr[i + 2]; + (*set)[setranges].quant = 1; + setranges++; i = j; continue; }