1*61d06d6bSBaptiste Daroussin.\" $Id: mchars_alloc.3,v 1.4 2016/07/07 19:19:01 schwarze Exp $ 2*61d06d6bSBaptiste Daroussin.\" 3*61d06d6bSBaptiste Daroussin.\" Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> 4*61d06d6bSBaptiste Daroussin.\" 5*61d06d6bSBaptiste Daroussin.\" Permission to use, copy, modify, and distribute this software for any 6*61d06d6bSBaptiste Daroussin.\" purpose with or without fee is hereby granted, provided that the above 7*61d06d6bSBaptiste Daroussin.\" copyright notice and this permission notice appear in all copies. 8*61d06d6bSBaptiste Daroussin.\" 9*61d06d6bSBaptiste Daroussin.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10*61d06d6bSBaptiste Daroussin.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*61d06d6bSBaptiste Daroussin.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12*61d06d6bSBaptiste Daroussin.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*61d06d6bSBaptiste Daroussin.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*61d06d6bSBaptiste Daroussin.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15*61d06d6bSBaptiste Daroussin.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16*61d06d6bSBaptiste Daroussin.\" 17*61d06d6bSBaptiste Daroussin.Dd $Mdocdate: July 7 2016 $ 18*61d06d6bSBaptiste Daroussin.Dt MCHARS_ALLOC 3 19*61d06d6bSBaptiste Daroussin.Os 20*61d06d6bSBaptiste Daroussin.Sh NAME 21*61d06d6bSBaptiste Daroussin.Nm mchars_alloc , 22*61d06d6bSBaptiste Daroussin.Nm mchars_free , 23*61d06d6bSBaptiste Daroussin.Nm mchars_num2char , 24*61d06d6bSBaptiste Daroussin.Nm mchars_num2uc , 25*61d06d6bSBaptiste Daroussin.Nm mchars_spec2cp , 26*61d06d6bSBaptiste Daroussin.Nm mchars_spec2str , 27*61d06d6bSBaptiste Daroussin.Nm mchars_uc2str 28*61d06d6bSBaptiste Daroussin.Nd character table for mandoc 29*61d06d6bSBaptiste Daroussin.Sh SYNOPSIS 30*61d06d6bSBaptiste Daroussin.In sys/types.h 31*61d06d6bSBaptiste Daroussin.In mandoc.h 32*61d06d6bSBaptiste Daroussin.Ft void 33*61d06d6bSBaptiste Daroussin.Fn mchars_alloc void 34*61d06d6bSBaptiste Daroussin.Ft void 35*61d06d6bSBaptiste Daroussin.Fn mchars_free void 36*61d06d6bSBaptiste Daroussin.Ft char 37*61d06d6bSBaptiste Daroussin.Fo mchars_num2char 38*61d06d6bSBaptiste Daroussin.Fa "const char *decimal" 39*61d06d6bSBaptiste Daroussin.Fa "size_t sz" 40*61d06d6bSBaptiste Daroussin.Fc 41*61d06d6bSBaptiste Daroussin.Ft int 42*61d06d6bSBaptiste Daroussin.Fo mchars_num2uc 43*61d06d6bSBaptiste Daroussin.Fa "const char *hexadecimal" 44*61d06d6bSBaptiste Daroussin.Fa "size_t sz" 45*61d06d6bSBaptiste Daroussin.Fc 46*61d06d6bSBaptiste Daroussin.Ft int 47*61d06d6bSBaptiste Daroussin.Fo mchars_spec2cp 48*61d06d6bSBaptiste Daroussin.Fa "const char *name" 49*61d06d6bSBaptiste Daroussin.Fa "size_t sz" 50*61d06d6bSBaptiste Daroussin.Fc 51*61d06d6bSBaptiste Daroussin.Ft "const char *" 52*61d06d6bSBaptiste Daroussin.Fo mchars_spec2str 53*61d06d6bSBaptiste Daroussin.Fa "const char *name" 54*61d06d6bSBaptiste Daroussin.Fa "size_t sz" 55*61d06d6bSBaptiste Daroussin.Fa "size_t *rsz" 56*61d06d6bSBaptiste Daroussin.Fc 57*61d06d6bSBaptiste Daroussin.Ft "const char *" 58*61d06d6bSBaptiste Daroussin.Fn mchars_uc2str "int codepoint" 59*61d06d6bSBaptiste Daroussin.Sh DESCRIPTION 60*61d06d6bSBaptiste DaroussinThese functions translate Unicode character numbers and 61*61d06d6bSBaptiste Daroussin.Xr roff 7 62*61d06d6bSBaptiste Daroussincharacter names into glyphs. 63*61d06d6bSBaptiste DaroussinSee 64*61d06d6bSBaptiste Daroussin.Xr mandoc_char 7 65*61d06d6bSBaptiste Daroussinfor a list of 66*61d06d6bSBaptiste Daroussin.Xr roff 7 67*61d06d6bSBaptiste Daroussinspecial characters. 68*61d06d6bSBaptiste DaroussinThese functions are intended for external use by programs formatting 69*61d06d6bSBaptiste Daroussin.Xr mdoc 7 70*61d06d6bSBaptiste Daroussinand 71*61d06d6bSBaptiste Daroussin.Xr man 7 72*61d06d6bSBaptiste Daroussinpages for output, for example the 73*61d06d6bSBaptiste Daroussin.Xr mandoc 1 74*61d06d6bSBaptiste Daroussinoutput formatter modules and 75*61d06d6bSBaptiste Daroussin.Xr makewhatis 8 . 76*61d06d6bSBaptiste DaroussinThe 77*61d06d6bSBaptiste Daroussin.Fa decimal , 78*61d06d6bSBaptiste Daroussin.Fa hexadecimal , 79*61d06d6bSBaptiste Daroussin.Fa name , 80*61d06d6bSBaptiste Daroussinand 81*61d06d6bSBaptiste Daroussin.Fa size 82*61d06d6bSBaptiste Daroussininput arguments are usually obtained from the 83*61d06d6bSBaptiste Daroussin.Xr mandoc_escape 3 84*61d06d6bSBaptiste Daroussinparser function. 85*61d06d6bSBaptiste Daroussin.Pp 86*61d06d6bSBaptiste DaroussinThe function 87*61d06d6bSBaptiste Daroussin.Fn mchars_num2char 88*61d06d6bSBaptiste Daroussinconverts a 89*61d06d6bSBaptiste Daroussin.Fa decimal 90*61d06d6bSBaptiste Daroussinstring representation of a character number consisting of 91*61d06d6bSBaptiste Daroussin.Fa sz 92*61d06d6bSBaptiste Daroussindigits into a printable ASCII character. 93*61d06d6bSBaptiste DaroussinIf the input string is non-numeric or does not represent a printable 94*61d06d6bSBaptiste DaroussinASCII character, the NUL character 95*61d06d6bSBaptiste Daroussin.Pq Sq \e0 96*61d06d6bSBaptiste Daroussinis returned. 97*61d06d6bSBaptiste DaroussinFor example, the 98*61d06d6bSBaptiste Daroussin.Xr mandoc 1 99*61d06d6bSBaptiste Daroussin.Fl Tascii , 100*61d06d6bSBaptiste Daroussin.Fl Tutf8 , 101*61d06d6bSBaptiste Daroussinand 102*61d06d6bSBaptiste Daroussin.Fl Thtml 103*61d06d6bSBaptiste Daroussinoutput modules use this function to render 104*61d06d6bSBaptiste Daroussin.Xr roff 7 105*61d06d6bSBaptiste Daroussin.Ic \eN 106*61d06d6bSBaptiste Daroussinescape sequences. 107*61d06d6bSBaptiste Daroussin.Pp 108*61d06d6bSBaptiste DaroussinThe function 109*61d06d6bSBaptiste Daroussin.Fn mchars_num2uc 110*61d06d6bSBaptiste Daroussinconverts a 111*61d06d6bSBaptiste Daroussin.Fa hexadecimal 112*61d06d6bSBaptiste Daroussinstring representation of a Unicode codepoint consisting of 113*61d06d6bSBaptiste Daroussin.Fa sz 114*61d06d6bSBaptiste Daroussindigits into an integer representation. 115*61d06d6bSBaptiste DaroussinIf the input string is non-numeric or represents an ASCII character, 116*61d06d6bSBaptiste Daroussinthe NUL character 117*61d06d6bSBaptiste Daroussin.Pq Sq \e0 118*61d06d6bSBaptiste Daroussinis returned. 119*61d06d6bSBaptiste DaroussinFor example, the 120*61d06d6bSBaptiste Daroussin.Xr mandoc 1 121*61d06d6bSBaptiste Daroussin.Fl Tutf8 122*61d06d6bSBaptiste Daroussinand 123*61d06d6bSBaptiste Daroussin.Fl Thtml 124*61d06d6bSBaptiste Daroussinoutput modules use this function to render 125*61d06d6bSBaptiste Daroussin.Xr roff 7 126*61d06d6bSBaptiste Daroussin.Ic \e[u Ns Ar XXXX Ns Ic \&] 127*61d06d6bSBaptiste Daroussinand 128*61d06d6bSBaptiste Daroussin.Ic \eC\(aqu Ns Ar XXXX Ns Ic \(aq 129*61d06d6bSBaptiste Daroussinescape sequences. 130*61d06d6bSBaptiste Daroussin.Pp 131*61d06d6bSBaptiste DaroussinThe function 132*61d06d6bSBaptiste Daroussin.Fn mchars_alloc 133*61d06d6bSBaptiste Daroussininitializes a static 134*61d06d6bSBaptiste Daroussin.Vt "struct ohash" 135*61d06d6bSBaptiste Daroussinobject for subsequent use by the following two lookup functions. 136*61d06d6bSBaptiste DaroussinWhen no longer needed, this object can be destroyed with 137*61d06d6bSBaptiste Daroussin.Fn mchars_free . 138*61d06d6bSBaptiste Daroussin.Pp 139*61d06d6bSBaptiste DaroussinThe function 140*61d06d6bSBaptiste Daroussin.Fn mchars_spec2cp 141*61d06d6bSBaptiste Daroussinlooks up a 142*61d06d6bSBaptiste Daroussin.Xr roff 7 143*61d06d6bSBaptiste Daroussinspecial character 144*61d06d6bSBaptiste Daroussin.Fa name 145*61d06d6bSBaptiste Daroussinconsisting of 146*61d06d6bSBaptiste Daroussin.Fa sz 147*61d06d6bSBaptiste Daroussincharacters and returns the corresponding Unicode codepoint. 148*61d06d6bSBaptiste DaroussinIf the 149*61d06d6bSBaptiste Daroussin.Ar name 150*61d06d6bSBaptiste Daroussinis not recognized, \-1 is returned. 151*61d06d6bSBaptiste DaroussinFor example, the 152*61d06d6bSBaptiste Daroussin.Xr mandoc 1 153*61d06d6bSBaptiste Daroussin.Fl Tutf8 154*61d06d6bSBaptiste Daroussinand 155*61d06d6bSBaptiste Daroussin.Fl Thtml 156*61d06d6bSBaptiste Daroussinoutput modules use this function to render 157*61d06d6bSBaptiste Daroussin.Xr roff 7 158*61d06d6bSBaptiste Daroussin.Ic \e[ Ns Ar name Ns Ic \&] 159*61d06d6bSBaptiste Daroussinand 160*61d06d6bSBaptiste Daroussin.Ic \eC\(aq Ns Ar name Ns Ic \(aq 161*61d06d6bSBaptiste Daroussinescape sequences. 162*61d06d6bSBaptiste Daroussin.Pp 163*61d06d6bSBaptiste DaroussinThe function 164*61d06d6bSBaptiste Daroussin.Fn mchars_spec2str 165*61d06d6bSBaptiste Daroussinlooks up a 166*61d06d6bSBaptiste Daroussin.Xr roff 7 167*61d06d6bSBaptiste Daroussinspecial character 168*61d06d6bSBaptiste Daroussin.Fa name 169*61d06d6bSBaptiste Daroussinconsisting of 170*61d06d6bSBaptiste Daroussin.Fa sz 171*61d06d6bSBaptiste Daroussincharacters and returns an ASCII string representation. 172*61d06d6bSBaptiste DaroussinThe length of the representation is returned in 173*61d06d6bSBaptiste Daroussin.Fa rsz . 174*61d06d6bSBaptiste DaroussinIn many cases, the meaning of such ASCII representations 175*61d06d6bSBaptiste Daroussinis not quite obvious, so using 176*61d06d6bSBaptiste Daroussin.Xr roff 7 177*61d06d6bSBaptiste Daroussinspecial characters in documents intended for ASCII rendering 178*61d06d6bSBaptiste Daroussinis usually a bad idea. 179*61d06d6bSBaptiste DaroussinIf the 180*61d06d6bSBaptiste Daroussin.Ar name 181*61d06d6bSBaptiste Daroussinis not recognized, 182*61d06d6bSBaptiste Daroussin.Dv NULL 183*61d06d6bSBaptiste Daroussinis returned. 184*61d06d6bSBaptiste DaroussinFor example, 185*61d06d6bSBaptiste Daroussin.Xr makewhatis 8 186*61d06d6bSBaptiste Daroussinand the 187*61d06d6bSBaptiste Daroussin.Xr mandoc 1 188*61d06d6bSBaptiste Daroussin.Fl Tascii 189*61d06d6bSBaptiste Daroussinoutput module use this function to render 190*61d06d6bSBaptiste Daroussin.Xr roff 7 191*61d06d6bSBaptiste Daroussin.Ic \e[ Ns Ar name Ns Ic \&] 192*61d06d6bSBaptiste Daroussinand 193*61d06d6bSBaptiste Daroussin.Ic \eC\(aq Ns Ar name Ns Ic \(aq 194*61d06d6bSBaptiste Daroussinescape sequences. 195*61d06d6bSBaptiste Daroussin.Pp 196*61d06d6bSBaptiste DaroussinThe function 197*61d06d6bSBaptiste Daroussin.Fn mchars_uc2str 198*61d06d6bSBaptiste Daroussinperforms a reverse lookup of the Unicode 199*61d06d6bSBaptiste Daroussin.Fa codepoint 200*61d06d6bSBaptiste Daroussinand returns an ASCII string representation, or the string 201*61d06d6bSBaptiste Daroussin.Qq <?> 202*61d06d6bSBaptiste Daroussinif none is available. 203*61d06d6bSBaptiste Daroussin.Sh FILES 204*61d06d6bSBaptiste DaroussinThese funtions are implemented in the file 205*61d06d6bSBaptiste Daroussin.Pa chars.c . 206*61d06d6bSBaptiste Daroussin.Sh SEE ALSO 207*61d06d6bSBaptiste Daroussin.Xr mandoc 1 , 208*61d06d6bSBaptiste Daroussin.Xr mandoc_escape 3 , 209*61d06d6bSBaptiste Daroussin.Xr ohash_init 3 , 210*61d06d6bSBaptiste Daroussin.Xr mandoc_char 7 , 211*61d06d6bSBaptiste Daroussin.Xr roff 7 212*61d06d6bSBaptiste Daroussin.Sh HISTORY 213*61d06d6bSBaptiste DaroussinThese functions and their predecessors have been available since the 214*61d06d6bSBaptiste Daroussinfollowing mandoc versions: 215*61d06d6bSBaptiste Daroussin.Bl -column "mchars_num2char()" "1.11.3" "chars_num2char()" "1.10.10" 216*61d06d6bSBaptiste Daroussin.It Sy function Ta since Ta Sy predecessor Ta since 217*61d06d6bSBaptiste Daroussin.It Fn mchars_alloc Ta 1.11.3 Ta Fn ascii2htab Ta 1.5.3 218*61d06d6bSBaptiste Daroussin.It Fn mchars_free Ta 1.11.2 Ta Fn asciifree Ta 1.6.0 219*61d06d6bSBaptiste Daroussin.It Fn mchars_num2char Ta 1.11.2 Ta Fn chars_num2char Ta 1.10.10 220*61d06d6bSBaptiste Daroussin.It Fn mchars_num2uc Ta 1.11.3 Ta \(em Ta \(em 221*61d06d6bSBaptiste Daroussin.It Fn mchars_spec2cp Ta 1.11.2 Ta Fn chars_spec2cp Ta 1.10.5 222*61d06d6bSBaptiste Daroussin.It Fn mchars_spec2str Ta 1.11.2 Ta Fn a2ascii Ta 1.5.3 223*61d06d6bSBaptiste Daroussin.It Fn mchars_uc2str Ta 1.13.2 Ta \(em Ta \(em 224*61d06d6bSBaptiste Daroussin.El 225*61d06d6bSBaptiste Daroussin.Sh AUTHORS 226*61d06d6bSBaptiste Daroussin.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv 227*61d06d6bSBaptiste Daroussin.An Ingo Schwarze Aq Mt schwarze@openbsd.org 228