From d672f8cb82878baf3834e938c4c416f4493952cf Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Sat, 15 Dec 2018 19:30:25 +0000 Subject: Several improvements to escape sequence handling. * Add the missing special character \_ (underscore). * Partial implementations of \a (leader character) and \E (uninterpreted escape character). * Parse and ignore \r (reverse line feed). * Add a WARNING message about undefined escape sequences. * Add an UNSUPP message about unsupported escape sequences. * Mark \! and \? (transparent throughput) and \O (suppress output) as unsupported. * Treat the various variants of zero-width spaces as one-byte escape sequences rather than as special characters, to avoid defining bogus forms with square brackets. * For special characters with one-byte names, do not define bogus forms with square brackets, except for \[-], which is valid. * In the form with square brackets, undefined special characters do not fall back to printing the name verbatim, not even for one-byte names. * Starting a special character name with a blank is an error. * Undefined escape sequences never abort formatting of the input string, not even in HTML output mode. * Document the newly handled escapes, and a few that were missing. * Regression tests for most of the above. --- term.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'term.c') diff --git a/term.c b/term.c index 264d0896..d91c90aa 100644 --- a/term.c +++ b/term.c @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.276 2018/10/25 01:32:41 schwarze Exp $ */ +/* $Id: term.c,v 1.277 2018/12/15 19:30:26 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2018 Ingo Schwarze @@ -477,9 +477,6 @@ term_word(struct termp *p, const char *word) word++; esc = mandoc_escape(&word, &seq, &sz); - if (ESCAPE_ERROR == esc) - continue; - switch (esc) { case ESCAPE_UNICODE: uc = mchars_num2uc(seq + 1, sz - 1); @@ -500,6 +497,9 @@ term_word(struct termp *p, const char *word) encode1(p, uc); } continue; + case ESCAPE_UNDEF: + uc = *seq; + break; case ESCAPE_FONTBOLD: term_fontrepl(p, TERMFONT_BOLD); continue; @@ -587,6 +587,9 @@ term_word(struct termp *p, const char *word) case ESCAPE_SPECIAL: uc = mchars_spec2cp(cp, sz); break; + case ESCAPE_UNDEF: + uc = *seq; + break; default: uc = -1; break; @@ -845,12 +848,8 @@ term_strlen(const struct termp *p, const char *cp) switch (*cp) { case '\\': cp++; - esc = mandoc_escape(&cp, &seq, &ssz); - if (ESCAPE_ERROR == esc) - continue; - rhs = NULL; - + esc = mandoc_escape(&cp, &seq, &ssz); switch (esc) { case ESCAPE_UNICODE: uc = mchars_num2uc(seq + 1, ssz - 1); @@ -871,6 +870,9 @@ term_strlen(const struct termp *p, const char *cp) sz += cond_width(p, uc, &skip); } continue; + case ESCAPE_UNDEF: + uc = *seq; + break; case ESCAPE_DEVICE: if (p->type == TERMTYPE_PDF) { rhs = "pdf"; -- cgit v1.2.3 40b\N&H$F8pDSފ4r18c-c ߔAY`eW=+,4qxI ugt6>T#iwd83"GN9-S~E vL#2`ek ev^jw*P35-a9JahDŽYe^ukqd(L@!#uG^,!RoʬN2ĕ:"3j;-LahfXn8s :lbwݝp% fB_Y{L)%OQ֤@RO'^ 0G8R5QtJtHeYJ4{A5!Q@9xDAOע,F D`&(nMM`s-Sh`v0^g(8 a?A܇*-YLș3 ‡YNх! Ȝ6|\y`gDKp_t &%΄0*PZĴ8u4$F &b˲ępf:!Sc QB"2a-Y"iHԕ i}+#b;WPm/iXww^;ePvi,S'GVxߕ0h%IܲǿNr"es^C:bADc:vNj1Y ]|tD#e˝KLʡga|F. @T&Dƴos$*zS5PplTQ; K]څ0kPs+5d@0"oғ#?sH ;N)j$ry{/;9l"%<*PD ifZPF0,9tGJ6Zt9%C]<6wS 45IN̜s)칃HbPo$j55`_ԏB!.\&q7J4l 1^&zB`k8nTFM+k%uxXε :YF#;4h!F(,Hix ,UGi$M³B|0K#a&Ѐeh@cU_[_, J\L^令":ܢ' -P omF>|\+ x@&c $fJDV/^o%%W "wq-ұP#nZZ0&!ɢe'*72/GR.`"쵔8q,vYMJ*򵚧%疁JӪc+aNI,iu(Y'~C3s" #=6Z>k2Bް2Wj?@\s!F]{A;ҕé⮐Nt;bQ}4.Ν.FYL$&JAy2p+W(";5crϥ +Gq=*[n沃cMTL$AG ]"#c0W"Rr+GzO窉 7?S2|G;RUz̽7>YB*hI9" HGaԲ? F%AFJ}T.<Ы'aC,õiXV0F`?U$E:W! Oka5a8Ѡ `Єzinl$Thӻ.i, 8ɀ)#`Kn)3 Lyyiç1{j#THp6rdb%ʻ[dC1kei߂5l)Lj>ti)db}9t-;SH.9C/J]YGc{c_o%O_}>?XCutwwwwwz5Z['׻]׻Z'3m\ j#&m;4C eKMu'W饃|SЦd"PHE蛚jSQ 24nC,HԀw{SH3IG[͒34B$`\Ii϶l@&[ƃX`V}ۃ&P~`-8M'|έBoR򮘏FQ&$F;)-ZR8Mda#mdpB:T2Kx2C<Z}N܏7Vu@\Y>2:<.``LEf&Zw 7YG,wiVԥXH ίo֖+& Yc}o* rxZ1=.*:Yl }!z/kh൅9 zvf;c]B`!b큠=nHEfg2ՏiOVmbg욱aM5aù1X0zLv(MH~u[`:bUAŦŞ`qg6μ`w7_Kp5ZIAs#&+ -HlUSr@I!WWo2dڮPF #Uі5Cp]ޢF\2E泥%zD#t)=4fvsS7[DwefBdݚ\Y SQAaNB`oFRǏ4|kaHAC?^ hR//_=e5B}>n)|)e(m}@ZUhآY#9d ?F1ZH/Z0p(EkO#F j >Z{1a-.|C*#@AFfktm FC4c 3Sq{ʘ&ԍ9!gm.ܤ*UfޮIE~>X~u wWp^_!Eq|^13!cZ3?1q-q` pc4xXث 9h|ApD \Ӆcrw#zJܦJՠGp{*e.ebm_tM t>yUnc Nb'~MX\ ̏^`׎a#yOkAWەJGb~w}QC`vIL7tm/CGj*}ŷf`M ns}js,NVE 7fQ*w¦R#o6\yЫh~\# -ZW֓J΂F%VVj%]"E#Wv\푠s`q2w, lYZ5lB!WSlƲѣTQ+?F8-܃'?O>Y_/o!>;4B=hC4oA zM聾z$Z 4o:  ܤ!RjEZz-&1rp*%!jK%R53*l`6r0׏O88n]8nsGq<;3N/ȘH~bpߴTAm5o0kD;|M$ފ:ɻ oXd-rZ%im.y늯Rw z;N5ms +P9f~^VzJ6?}ei(HZS7 5@8|^SkKKmi84N'dY;?A~QrtDBKlU^^jF6ToEXkMQF~lp^7q)Ȟ5vpw"܅ƑSd7>x9773í77HhXQz[9gwZc7&yyr2DIFonnv},XfQ3lhnV:{$-qAApG-ޝss aʳG;cW1Ba~E:dLQn}6b퉛!8oqЎ=S=~t>T 5F =51o)J1̣r|&8SN Y8ջ۝W{{Oc ؎@R#? /bDb/\\D4L_im ۧwf\ˢZ4MDy s̗#H=߿^O_}̯V(l`NqODsu~j+wv6HL&,6t5fH|P1|b!ŨoBj^cm  iehz2/QAu9X=. b%D/gHcqBaG݉p 7v$1I*HNv$2̦?P~ .b@By,3n:vzF\p9fS>^YBKo=K.FS1gKetph8so2jHǰYo>g(M3`v"FB"$yA43Q\g/!R@}Ѷq퐔k܉:vlㄨ, c.c+mC؝c<(wV]hP8 έQ468D:{&d&M XήaEƾ6=3L`;bYaJ4\n~EYt6Y( ⪹G`t.tWq-܂Me9e;];ekd-ɰmhLlaDhn.%.,s!Y΄d*Njڢf!+s0uǹĈM.ݞ|Y%izޣko@!> YTC")bOV#Jja*x;|sAzLM:X#8)ZJBH5hsAV:[q XZVHυ$ر8&ًt,HA}> Ҿ ׋)hFh Ҋ0lSsa$9zƄq̍bs!=.Jփ4g_DxVYr"뵡D4Kw0̦N fy>5za@4ƒ;@t4Sǟ]5.f8"YRv#q YT"}.; G#! 9 &p",Q$|On U`4~8IP+Z 7*ıKMˋ/T9;$F`; J1Tg6@f D_`I&Qb@5ᶴ'gdՙv_;7*Hd.%Un;O|ϘAd:J`}ǒzVû_tAegߕNUs=}W̖}F>If1=!Gv:mVPȋƢ.HPT$iy(T|‘ [ۅVi!' ~pfH#L7=ɭ7qй䶄-e4By1`a ђ8M,GH9ZZgTFZ1n.\.vfJz۽J .Y,W Pf `iPC^Qf[d˰!nwQZ0L=Ɖ,]yoBCs$'tpm)/C)g`/ދ%hdž{dAk>ݺEsT'0zyOh=DSB<,a5ݥ•*H z{ 6:G 3%|7V+U:vhjk '?,UˮgU"p6,^N QAY`0(p ,]=mkQmzp?#!-IWK'RQ~~dz+Rf9 fE:/Q.P\126SKILG]~R+\5DG 'M,7u@sw4~~y?OfܢJm)NDYNXQ9^S]p͖/Vj݆]Ɇ7m=\8YEdʛV§GIЫUDhAc3͛@UEa7XkM ߎ|Ju!o+P ~X;O巻{eIx|i, +؝] Cɧn]9ESV +X_Dcg ?6kdsJGOXq4ԅxEFb` ˒- -zN=h1Q4 R"%ӦK,) O6hbwcLyˬCآa .݀ݣ[?b$kjyLPva_G3I0 y +cVm蘫tN̑՘됑ڞ9sznEgֆ4ǔrl6:aeiT#V %u\>>W.Y;9qq$b>6&e\-5KQH}Ussms9%)m\٪ud{q?րySJn(@Hļ-u{~b j~ެXmsCdEglvJ3/ILs!UY076{oKo]Je^XGڲY.Iif=2mUJ qmk\J4c;! 7>jwrw~j)|1Tf;(uwL~қ:p[ύf)sƧZ@/PJ]k1uqqƗ–FP=6kk>%j Zrp @:] /3{k(Dc7d|`F7\*q5lWX}}@xfFՒ@ΝHo޹KՂ:38l&f`1f?p9au?d<8\StLV8m420p!j^ϻ ȅf4oGl6IEsLI t 1$ӀBSnJ2 [%kEI@ c?4ɹ=梖V_D(1Ph3(5ΞPh =@4'>B2L:$)Z-NeR>e?:%6DAh%:5Av9 3`Fh&abЂQ/BKhu*DNjn*'jFhyB<H'OEި\ݥ oJ#Ū}XQztHҏH|œX k[JrgrVSQl3 1x4&kxݗQV 6wϣF; ns!͓E$3tc{EqzU+T`;%'Fxc wQ*oVe( I#p51k3Hv+v3;f``z)Va+7IT>?9E[-3|=]!s?^gV/'S* ^ lz Uq\7c e[K좓I?zl:>xj-M,;E=6ۃУC5Σ#&]"IBBrsoyJEfg\kzWF3a3W39Q؇33,\?vʟ:5s[s>cj]S3:O5w~PCP#'gr+s"$ؐypSWmSix6%!e>qhbNi8p' zNӥW p., Hc&Rb)"wTo ]dmm(8Ur+"UO`X7hǙ]܎dtxEv^%S٠l!AØ^E~FJK u\WaB ;5 TGm׀cfU܂)RU/+Ё_"{edd+Y+SF ua$αyP#eQ$Ic=ダm soՓ$m"䭥z)Ph4(]zxДG,5̣a8ZahKB2Ork yɭx:bK:,I@@gL5qib2웥9~lS p'gI]"% '4>'Iw4Ϯ|ڧSյv4>z`>-xIrr?QT H֔!-@7QϬۃb̪$ZS( XJly`4t_%uCby,zhLE,lu%dE3#yUu8QX|({Zg=\|9+mip5cX,僵%l%=N!aRWGP&Pi|ڐ@HΌ luD/t\ h Vr GVV0q >?z/[zA{hm yڋѨO\ ~V'Hԡ<ˠ+z傁>vLK 6᯾N*([Ȕ0\g:7@Dk vZv?_>ax• bz9[ҙ3bqY^쾝EQwaHPMp/#I윱Iqk=g8bvq2{ҖMٚ-@qV&Tzg~Ey$r #.idm~jR_~~/M c;^ΫRkDXLPZ/$(.wuЊ%'tq]^.J <}>xC0R\L+W$>Y, v+'ݏ#tZ<@ H=Β`vgYA@B !:>5SBdЅ5XXA:=B%Zt*»"3wt+o}׃wNrWOS-L 1Th?ER<~mI!C c@}i{6FT8^A}->: S\AÃ=y]o֚@BS|l&lMW^X̝Ru@(0x.JyTq87%bܑZ]BB?*?^ƖUg93cr5OHp! %&^EOC!eaY!e k<d~ 8\ ES~@jM֙4J5j;&2{L:" ˶Dž6jQ\/&k\~LwF@}T_W⻊1Ԃ԰8gm1s`iF9MUnfal?Slf@Ex${b6JKJB[!&aFtPϗ$>%O+2Z UTU 'aU=7Rda,T25$fAy5yl[ 9]:MP Z<mǒV+* .,K9ލr=4O4dT