]> git.ipfire.org Git - thirdparty/glibc.git/blame - manual/charset.texi
Fix errno values
[thirdparty/glibc.git] / manual / charset.texi
CommitLineData
0b2b18a2
UD
1@node Character Set Handling, Locales, String and Array Utilities, Top
2@c %MENU% Support for extended character sets
3@chapter Character Set Handling
4
5@ifnottex
6@macro cal{text}
7\text\
8@end macro
9@end ifnottex
10
11Character sets used in the early days of computing had only six, seven,
12or eight bits for each character: there was never a case where more than
13eight bits (one byte) were used to represent a single character. The
14limitations of this approach became more apparent as more people
15grappled with non-Roman character sets, where not all the characters
16that make up a language's character set can be represented by @math{2^8}
17choices. This chapter shows the functionality that was added to the C
18library to support multiple character sets.
19
20@menu
21* Extended Char Intro:: Introduction to Extended Characters.
22* Charset Function Overview:: Overview about Character Handling
23 Functions.
24* Restartable multibyte conversion:: Restartable multibyte conversion
25 Functions.
26* Non-reentrant Conversion:: Non-reentrant Conversion Function.
27* Generic Charset Conversion:: Generic Charset Conversion.
28@end menu
29
30
31@node Extended Char Intro
32@section Introduction to Extended Characters
33
d987d219 34A variety of solutions are available to overcome the differences between
0b2b18a2
UD
35character sets with a 1:1 relation between bytes and characters and
36character sets with ratios of 2:1 or 4:1. The remainder of this
37section gives a few examples to help understand the design decisions
38made while developing the functionality of the @w{C library}.
39
40@cindex internal representation
41A distinction we have to make right away is between internal and
42external representation. @dfn{Internal representation} means the
43representation used by a program while keeping the text in memory.
44External representations are used when text is stored or transmitted
45through some communication channel. Examples of external
46representations include files waiting in a directory to be
47read and parsed.
48
49Traditionally there has been no difference between the two representations.
50It was equally comfortable and useful to use the same single-byte
51representation internally and externally. This comfort level decreases
52with more and larger character sets.
53
54One of the problems to overcome with the internal representation is
55handling text that is externally encoded using different character
56sets. Assume a program that reads two texts and compares them using
57some metric. The comparison can be usefully done only if the texts are
58internally kept in a common format.
59
60@cindex wide character
61For such a common format (@math{=} character set) eight bits are certainly
62no longer enough. So the smallest entity will have to grow: @dfn{wide
63characters} will now be used. Instead of one byte per character, two or
64four will be used instead. (Three are not good to address in memory and
65more than four bytes seem not to be necessary).
66
67@cindex Unicode
68@cindex ISO 10646
69As shown in some other part of this manual,
70@c !!! Ahem, wide char string functions are not yet covered -- drepper
71a completely new family has been created of functions that can handle wide
72character texts in memory. The most commonly used character sets for such
73internal wide character representations are Unicode and @w{ISO 10646}
74(also known as UCS for Universal Character Set). Unicode was originally
75planned as a 16-bit character set; whereas, @w{ISO 10646} was designed to
76be a 31-bit large code space. The two standards are practically identical.
77They have the same character repertoire and code table, but Unicode specifies
78added semantics. At the moment, only characters in the first @code{0x10000}
79code positions (the so-called Basic Multilingual Plane, BMP) have been
80assigned, but the assignment of more specialized characters outside this
8116-bit space is already in progress. A number of encodings have been
82defined for Unicode and @w{ISO 10646} characters:
83@cindex UCS-2
84@cindex UCS-4
85@cindex UTF-8
86@cindex UTF-16
87UCS-2 is a 16-bit word that can only represent characters
88from the BMP, UCS-4 is a 32-bit word than can represent any Unicode
89and @w{ISO 10646} character, UTF-8 is an ASCII compatible encoding where
90ASCII characters are represented by ASCII bytes and non-ASCII characters
91by sequences of 2-6 non-ASCII bytes, and finally UTF-16 is an extension
92of UCS-2 in which pairs of certain UCS-2 words can be used to encode
93non-BMP characters up to @code{0x10ffff}.
94
95To represent wide characters the @code{char} type is not suitable. For
96this reason the @w{ISO C} standard introduces a new type that is
97designed to keep one character of a wide character string. To maintain
98the similarity there is also a type corresponding to @code{int} for
99those functions that take a single wide character.
100
0b2b18a2 101@deftp {Data type} wchar_t
d08a7e4c 102@standards{ISO, stddef.h}
0b2b18a2 103This data type is used as the base type for wide character strings.
bd3916e8
UD
104In other words, arrays of objects of this type are the equivalent of
105@code{char[]} for multibyte character strings. The type is defined in
0b2b18a2
UD
106@file{stddef.h}.
107
108The @w{ISO C90} standard, where @code{wchar_t} was introduced, does not
109say anything specific about the representation. It only requires that
110this type is capable of storing all elements of the basic character set.
111Therefore it would be legitimate to define @code{wchar_t} as @code{char},
112which might make sense for embedded systems.
113
a7a93d50 114But in @theglibc{} @code{wchar_t} is always 32 bits wide and, therefore,
0b2b18a2
UD
115capable of representing all UCS-4 values and, therefore, covering all of
116@w{ISO 10646}. Some Unix systems define @code{wchar_t} as a 16-bit type
117and thereby follow Unicode very strictly. This definition is perfectly
118fine with the standard, but it also means that to represent all
119characters from Unicode and @w{ISO 10646} one has to use UTF-16 surrogate
120characters, which is in fact a multi-wide-character encoding. But
121resorting to multi-wide-character encoding contradicts the purpose of the
122@code{wchar_t} type.
123@end deftp
124
0b2b18a2 125@deftp {Data type} wint_t
d08a7e4c 126@standards{ISO, wchar.h}
0b2b18a2
UD
127@code{wint_t} is a data type used for parameters and variables that
128contain a single wide character. As the name suggests this type is the
129equivalent of @code{int} when using the normal @code{char} strings. The
130types @code{wchar_t} and @code{wint_t} often have the same
131representation if their size is 32 bits wide but if @code{wchar_t} is
132defined as @code{char} the type @code{wint_t} must be defined as
133@code{int} due to the parameter promotion.
134
135@pindex wchar.h
136This type is defined in @file{wchar.h} and was introduced in
137@w{Amendment 1} to @w{ISO C90}.
138@end deftp
139
140As there are for the @code{char} data type macros are available for
141specifying the minimum and maximum value representable in an object of
142type @code{wchar_t}.
143
0b2b18a2 144@deftypevr Macro wint_t WCHAR_MIN
d08a7e4c 145@standards{ISO, wchar.h}
0b2b18a2
UD
146The macro @code{WCHAR_MIN} evaluates to the minimum value representable
147by an object of type @code{wint_t}.
148
149This macro was introduced in @w{Amendment 1} to @w{ISO C90}.
150@end deftypevr
151
0b2b18a2 152@deftypevr Macro wint_t WCHAR_MAX
d08a7e4c 153@standards{ISO, wchar.h}
0b2b18a2
UD
154The macro @code{WCHAR_MAX} evaluates to the maximum value representable
155by an object of type @code{wint_t}.
156
157This macro was introduced in @w{Amendment 1} to @w{ISO C90}.
158@end deftypevr
159
160Another special wide character value is the equivalent to @code{EOF}.
161
0b2b18a2 162@deftypevr Macro wint_t WEOF
d08a7e4c 163@standards{ISO, wchar.h}
0b2b18a2
UD
164The macro @code{WEOF} evaluates to a constant expression of type
165@code{wint_t} whose value is different from any member of the extended
166character set.
167
168@code{WEOF} need not be the same value as @code{EOF} and unlike
bd3916e8 169@code{EOF} it also need @emph{not} be negative. In other words, sloppy
0b2b18a2
UD
170code like
171
172@smallexample
173@{
174 int c;
95fdc6a0 175 @dots{}
0b2b18a2 176 while ((c = getc (fp)) < 0)
95fdc6a0 177 @dots{}
0b2b18a2
UD
178@}
179@end smallexample
180
181@noindent
182has to be rewritten to use @code{WEOF} explicitly when wide characters
183are used:
184
185@smallexample
186@{
187 wint_t c;
95fdc6a0 188 @dots{}
0b2b18a2 189 while ((c = wgetc (fp)) != WEOF)
95fdc6a0 190 @dots{}
0b2b18a2
UD
191@}
192@end smallexample
193
194@pindex wchar.h
195This macro was introduced in @w{Amendment 1} to @w{ISO C90} and is
196defined in @file{wchar.h}.
197@end deftypevr
198
199
d987d219 200These internal representations present problems when it comes to storage
0b2b18a2 201and transmittal. Because each single wide character consists of more
6c55cda3 202than one byte, they are affected by byte-ordering. Thus, machines with
0b2b18a2
UD
203different endianesses would see different values when accessing the same
204data. This byte ordering concern also applies for communication protocols
11bf311e 205that are all byte-based and therefore require that the sender has to
0b2b18a2
UD
206decide about splitting the wide character in bytes. A last (but not least
207important) point is that wide characters often require more storage space
208than a customized byte-oriented character set.
209
210@cindex multibyte character
211@cindex EBCDIC
bd3916e8
UD
212For all the above reasons, an external encoding that is different from
213the internal encoding is often used if the latter is UCS-2 or UCS-4.
0b2b18a2
UD
214The external encoding is byte-based and can be chosen appropriately for
215the environment and for the texts to be handled. A variety of different
216character sets can be used for this external encoding (information that
217will not be exhaustively presented here--instead, a description of the
218major groups will suffice). All of the ASCII-based character sets
bd3916e8
UD
219fulfill one requirement: they are "filesystem safe." This means that
220the character @code{'/'} is used in the encoding @emph{only} to
0b2b18a2
UD
221represent itself. Things are a bit different for character sets like
222EBCDIC (Extended Binary Coded Decimal Interchange Code, a character set
6c55cda3 223family used by IBM), but if the operating system does not understand
bd3916e8
UD
224EBCDIC directly the parameters-to-system calls have to be converted
225first anyhow.
0b2b18a2
UD
226
227@itemize @bullet
bd3916e8
UD
228@item
229The simplest character sets are single-byte character sets. There can
230be only up to 256 characters (for @w{8 bit} character sets), which is
231not sufficient to cover all languages but might be sufficient to handle
232a specific text. Handling of a @w{8 bit} character sets is simple. This
233is not true for other kinds presented later, and therefore, the
0b2b18a2
UD
234application one uses might require the use of @w{8 bit} character sets.
235
236@cindex ISO 2022
237@item
238The @w{ISO 2022} standard defines a mechanism for extended character
239sets where one character @emph{can} be represented by more than one
240byte. This is achieved by associating a state with the text.
241Characters that can be used to change the state can be embedded in the
242text. Each byte in the text might have a different interpretation in each
243state. The state might even influence whether a given byte stands for a
244character on its own or whether it has to be combined with some more
245bytes.
246
247@cindex EUC
248@cindex Shift_JIS
249@cindex SJIS
250In most uses of @w{ISO 2022} the defined character sets do not allow
251state changes that cover more than the next character. This has the
252big advantage that whenever one can identify the beginning of the byte
253sequence of a character one can interpret a text correctly. Examples of
254character sets using this policy are the various EUC character sets
6c55cda3 255(used by Sun's operating systems, EUC-JP, EUC-KR, EUC-TW, and EUC-CN)
0b2b18a2
UD
256or Shift_JIS (SJIS, a Japanese encoding).
257
258But there are also character sets using a state that is valid for more
259than one character and has to be changed by another byte sequence.
260Examples for this are ISO-2022-JP, ISO-2022-KR, and ISO-2022-CN.
261
262@item
263@cindex ISO 6937
264Early attempts to fix 8 bit character sets for other languages using the
265Roman alphabet lead to character sets like @w{ISO 6937}. Here bytes
266representing characters like the acute accent do not produce output
267themselves: one has to combine them with other characters to get the
268desired result. For example, the byte sequence @code{0xc2 0x61}
269(non-spacing acute accent, followed by lower-case `a') to get the ``small
270a with acute'' character. To get the acute accent character on its own,
271one has to write @code{0xc2 0x20} (the non-spacing acute followed by a
272space).
273
bd3916e8 274Character sets like @w{ISO 6937} are used in some embedded systems such
0b2b18a2
UD
275as teletex.
276
277@item
278@cindex UTF-8
279Instead of converting the Unicode or @w{ISO 10646} text used internally,
280it is often also sufficient to simply use an encoding different than
281UCS-2/UCS-4. The Unicode and @w{ISO 10646} standards even specify such an
282encoding: UTF-8. This encoding is able to represent all of @w{ISO
28310646} 31 bits in a byte string of length one to six.
284
285@cindex UTF-7
286There were a few other attempts to encode @w{ISO 10646} such as UTF-7,
287but UTF-8 is today the only encoding that should be used. In fact, with
288any luck UTF-8 will soon be the only external encoding that has to be
289supported. It proves to be universally usable and its only disadvantage
290is that it favors Roman languages by making the byte string
291representation of other scripts (Cyrillic, Greek, Asian scripts) longer
292than necessary if using a specific character set for these scripts.
293Methods like the Unicode compression scheme can alleviate these
294problems.
295@end itemize
296
297The question remaining is: how to select the character set or encoding
298to use. The answer: you cannot decide about it yourself, it is decided
299by the developers of the system or the majority of the users. Since the
300goal is interoperability one has to use whatever the other people one
301works with use. If there are no constraints, the selection is based on
302the requirements the expected circle of users will have. In other words,
303if a project is expected to be used in only, say, Russia it is fine to use
304KOI8-R or a similar character set. But if at the same time people from,
305say, Greece are participating one should use a character set that allows
306all people to collaborate.
307
308The most widely useful solution seems to be: go with the most general
309character set, namely @w{ISO 10646}. Use UTF-8 as the external encoding
310and problems about users not being able to use their own language
311adequately are a thing of the past.
312
313One final comment about the choice of the wide character representation
314is necessary at this point. We have said above that the natural choice
315is using Unicode or @w{ISO 10646}. This is not required, but at least
316encouraged, by the @w{ISO C} standard. The standard defines at least a
317macro @code{__STDC_ISO_10646__} that is only defined on systems where
318the @code{wchar_t} type encodes @w{ISO 10646} characters. If this
319symbol is not defined one should avoid making assumptions about the wide
320character representation. If the programmer uses only the functions
321provided by the C library to handle wide character strings there should
322be no compatibility problems with other systems.
323
324@node Charset Function Overview
325@section Overview about Character Handling Functions
326
bd3916e8
UD
327A Unix @w{C library} contains three different sets of functions in two
328families to handle character set conversion. One of the function families
329(the most commonly used) is specified in the @w{ISO C90} standard and,
330therefore, is portable even beyond the Unix world. Unfortunately this
331family is the least useful one. These functions should be avoided
332whenever possible, especially when developing libraries (as opposed to
333applications).
0b2b18a2
UD
334
335The second family of functions got introduced in the early Unix standards
336(XPG2) and is still part of the latest and greatest Unix standard:
337@w{Unix 98}. It is also the most powerful and useful set of functions.
338But we will start with the functions defined in @w{Amendment 1} to
339@w{ISO C90}.
340
341@node Restartable multibyte conversion
342@section Restartable Multibyte Conversion Functions
343
344The @w{ISO C} standard defines functions to convert strings from a
345multibyte representation to wide character strings. There are a number
346of peculiarities:
347
348@itemize @bullet
349@item
350The character set assumed for the multibyte encoding is not specified
351as an argument to the functions. Instead the character set specified by
352the @code{LC_CTYPE} category of the current locale is used; see
353@ref{Locale Categories}.
354
355@item
356The functions handling more than one character at a time require NUL
357terminated strings as the argument (i.e., converting blocks of text
bd3916e8 358does not work unless one can add a NUL byte at an appropriate place).
1f77f049 359@Theglibc{} contains some extensions to the standard that allow
0b2b18a2
UD
360specifying a size, but basically they also expect terminated strings.
361@end itemize
362
363Despite these limitations the @w{ISO C} functions can be used in many
364contexts. In graphical user interfaces, for instance, it is not
365uncommon to have functions that require text to be displayed in a wide
bd3916e8 366character string if the text is not simple ASCII. The text itself might
0b2b18a2
UD
367come from a file with translations and the user should decide about the
368current locale, which determines the translation and therefore also the
369external encoding used. In such a situation (and many others) the
370functions described here are perfect. If more freedom while performing
371the conversion is necessary take a look at the @code{iconv} functions
372(@pxref{Generic Charset Conversion}).
373
374@menu
375* Selecting the Conversion:: Selecting the conversion and its properties.
376* Keeping the state:: Representing the state of the conversion.
377* Converting a Character:: Converting Single Characters.
378* Converting Strings:: Converting Multibyte and Wide Character
379 Strings.
380* Multibyte Conversion Example:: A Complete Multibyte Conversion Example.
381@end menu
382
383@node Selecting the Conversion
384@subsection Selecting the conversion and its properties
385
386We already said above that the currently selected locale for the
d987d219 387@code{LC_CTYPE} category decides the conversion that is performed
0b2b18a2
UD
388by the functions we are about to describe. Each locale uses its own
389character set (given as an argument to @code{localedef}) and this is the
390one assumed as the external multibyte encoding. The wide character
a7a93d50 391set is always UCS-4 in @theglibc{}.
0b2b18a2
UD
392
393A characteristic of each multibyte character set is the maximum number
394of bytes that can be necessary to represent one character. This
395information is quite important when writing code that uses the
396conversion functions (as shown in the examples below).
397The @w{ISO C} standard defines two macros that provide this information.
398
399
0b2b18a2 400@deftypevr Macro int MB_LEN_MAX
d08a7e4c 401@standards{ISO, limits.h}
0b2b18a2
UD
402@code{MB_LEN_MAX} specifies the maximum number of bytes in the multibyte
403sequence for a single character in any of the supported locales. It is
404a compile-time constant and is defined in @file{limits.h}.
405@pindex limits.h
406@end deftypevr
407
0b2b18a2 408@deftypevr Macro int MB_CUR_MAX
d08a7e4c 409@standards{ISO, stdlib.h}
0b2b18a2
UD
410@code{MB_CUR_MAX} expands into a positive integer expression that is the
411maximum number of bytes in a multibyte character in the current locale.
412The value is never greater than @code{MB_LEN_MAX}. Unlike
bd3916e8 413@code{MB_LEN_MAX} this macro need not be a compile-time constant, and in
1f77f049 414@theglibc{} it is not.
0b2b18a2
UD
415
416@pindex stdlib.h
417@code{MB_CUR_MAX} is defined in @file{stdlib.h}.
418@end deftypevr
419
420Two different macros are necessary since strictly @w{ISO C90} compilers
421do not allow variable length array definitions, but still it is desirable
422to avoid dynamic allocation. This incomplete piece of code shows the
423problem:
424
425@smallexample
426@{
427 char buf[MB_LEN_MAX];
428 ssize_t len = 0;
429
430 while (! feof (fp))
431 @{
432 fread (&buf[len], 1, MB_CUR_MAX - len, fp);
95fdc6a0 433 /* @r{@dots{} process} buf */
0b2b18a2
UD
434 len -= used;
435 @}
436@}
437@end smallexample
438
439The code in the inner loop is expected to have always enough bytes in
440the array @var{buf} to convert one multibyte character. The array
441@var{buf} has to be sized statically since many compilers do not allow a
bd3916e8 442variable size. The @code{fread} call makes sure that @code{MB_CUR_MAX}
0b2b18a2
UD
443bytes are always available in @var{buf}. Note that it isn't
444a problem if @code{MB_CUR_MAX} is not a compile-time constant.
445
446
447@node Keeping the state
448@subsection Representing the state of the conversion
449
450@cindex stateful
451In the introduction of this chapter it was said that certain character
bd3916e8 452sets use a @dfn{stateful} encoding. That is, the encoded values depend
0b2b18a2
UD
453in some way on the previous bytes in the text.
454
455Since the conversion functions allow converting a text in more than one
456step we must have a way to pass this information from one call of the
457functions to another.
458
0b2b18a2 459@deftp {Data type} mbstate_t
d08a7e4c 460@standards{ISO, wchar.h}
0b2b18a2
UD
461@cindex shift state
462A variable of type @code{mbstate_t} can contain all the information
463about the @dfn{shift state} needed from one call to a conversion
464function to another.
465
466@pindex wchar.h
467@code{mbstate_t} is defined in @file{wchar.h}. It was introduced in
468@w{Amendment 1} to @w{ISO C90}.
469@end deftp
470
bd3916e8
UD
471To use objects of type @code{mbstate_t} the programmer has to define such
472objects (normally as local variables on the stack) and pass a pointer to
0b2b18a2
UD
473the object to the conversion functions. This way the conversion function
474can update the object if the current multibyte character set is stateful.
475
476There is no specific function or initializer to put the state object in
477any specific state. The rules are that the object should always
478represent the initial state before the first use, and this is achieved by
479clearing the whole variable with code such as follows:
480
481@smallexample
482@{
483 mbstate_t state;
484 memset (&state, '\0', sizeof (state));
485 /* @r{from now on @var{state} can be used.} */
95fdc6a0 486 @dots{}
0b2b18a2
UD
487@}
488@end smallexample
489
490When using the conversion functions to generate output it is often
491necessary to test whether the current state corresponds to the initial
492state. This is necessary, for example, to decide whether to emit
493escape sequences to set the state to the initial state at certain
494sequence points. Communication protocols often require this.
495
0b2b18a2 496@deftypefun int mbsinit (const mbstate_t *@var{ps})
d08a7e4c 497@standards{ISO, wchar.h}
86e60666
AO
498@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
499@c ps is dereferenced once, unguarded. This would call for @mtsrace:ps,
500@c but since a single word-sized field is (atomically) accessed, any
501@c race here would be harmless. Other functions that take an optional
502@c mbstate_t* argument named ps are marked with @mtasurace:<func>/!ps,
503@c to indicate that the function uses a static buffer if ps is NULL.
504@c These could also have been marked with @mtsrace:ps, but we'll omit
505@c that for brevity, for it's somewhat redundant with the @mtasurace.
bd3916e8
UD
506The @code{mbsinit} function determines whether the state object pointed
507to by @var{ps} is in the initial state. If @var{ps} is a null pointer or
508the object is in the initial state the return value is nonzero. Otherwise
0b2b18a2
UD
509it is zero.
510
511@pindex wchar.h
bd3916e8 512@code{mbsinit} was introduced in @w{Amendment 1} to @w{ISO C90} and is
0b2b18a2
UD
513declared in @file{wchar.h}.
514@end deftypefun
515
bd3916e8 516Code using @code{mbsinit} often looks similar to this:
0b2b18a2
UD
517
518@c Fix the example to explicitly say how to generate the escape sequence
519@c to restore the initial state.
520@smallexample
521@{
522 mbstate_t state;
523 memset (&state, '\0', sizeof (state));
524 /* @r{Use @var{state}.} */
95fdc6a0 525 @dots{}
0b2b18a2
UD
526 if (! mbsinit (&state))
527 @{
528 /* @r{Emit code to return to initial state.} */
529 const wchar_t empty[] = L"";
530 const wchar_t *srcp = empty;
531 wcsrtombs (outbuf, &srcp, outbuflen, &state);
532 @}
95fdc6a0 533 @dots{}
0b2b18a2
UD
534@}
535@end smallexample
536
537The code to emit the escape sequence to get back to the initial state is
538interesting. The @code{wcsrtombs} function can be used to determine the
a7a93d50
JM
539necessary output code (@pxref{Converting Strings}). Please note that with
540@theglibc{} it is not necessary to perform this extra action for the
0b2b18a2
UD
541conversion from multibyte text to wide character text since the wide
542character encoding is not stateful. But there is nothing mentioned in
d987d219 543any standard that prohibits making @code{wchar_t} use a stateful
0b2b18a2
UD
544encoding.
545
546@node Converting a Character
547@subsection Converting Single Characters
548
549The most fundamental of the conversion functions are those dealing with
550single characters. Please note that this does not always mean single
551bytes. But since there is very often a subset of the multibyte
552character set that consists of single byte sequences, there are
d987d219 553functions to help with converting bytes. Frequently, ASCII is a subset
bd3916e8
UD
554of the multibyte character set. In such a scenario, each ASCII character
555stands for itself, and all other characters have at least a first byte
0b2b18a2
UD
556that is beyond the range @math{0} to @math{127}.
557
0b2b18a2 558@deftypefun wint_t btowc (int @var{c})
d08a7e4c 559@standards{ISO, wchar.h}
86e60666
AO
560@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
561@c Calls btowc_fct or __fct; reads from locale, and from the
562@c get_gconv_fcts result multiple times. get_gconv_fcts calls
563@c __wcsmbs_load_conv to initialize the ctype if it's null.
564@c wcsmbs_load_conv takes a non-recursive wrlock before allocating
565@c memory for the fcts structure, initializing it, and then storing it
566@c in the locale object. The initialization involves dlopening and a
567@c lot more.
0b2b18a2
UD
568The @code{btowc} function (``byte to wide character'') converts a valid
569single byte character @var{c} in the initial shift state into the wide
570character equivalent using the conversion rules from the currently
571selected locale of the @code{LC_CTYPE} category.
572
573If @code{(unsigned char) @var{c}} is no valid single byte multibyte
574character or if @var{c} is @code{EOF}, the function returns @code{WEOF}.
575
576Please note the restriction of @var{c} being tested for validity only in
577the initial shift state. No @code{mbstate_t} object is used from
578which the state information is taken, and the function also does not use
579any static state.
580
581@pindex wchar.h
bd3916e8 582The @code{btowc} function was introduced in @w{Amendment 1} to @w{ISO C90}
0b2b18a2
UD
583and is declared in @file{wchar.h}.
584@end deftypefun
585
82acaacb
JM
586Despite the limitation that the single byte value is always interpreted
587in the initial state, this function is actually useful most of the time.
0b2b18a2 588Most characters are either entirely single-byte character sets or they
d987d219 589are extensions to ASCII. But then it is possible to write code like this
0b2b18a2
UD
590(not that this specific example is very useful):
591
592@smallexample
593wchar_t *
594itow (unsigned long int val)
595@{
596 static wchar_t buf[30];
597 wchar_t *wcp = &buf[29];
598 *wcp = L'\0';
599 while (val != 0)
600 @{
601 *--wcp = btowc ('0' + val % 10);
602 val /= 10;
603 @}
604 if (wcp == &buf[29])
605 *--wcp = L'0';
606 return wcp;
607@}
608@end smallexample
609
610Why is it necessary to use such a complicated implementation and not
611simply cast @code{'0' + val % 10} to a wide character? The answer is
612that there is no guarantee that one can perform this kind of arithmetic
613on the character of the character set used for @code{wchar_t}
614representation. In other situations the bytes are not constant at
615compile time and so the compiler cannot do the work. In situations like
82acaacb 616this, using @code{btowc} is required.
0b2b18a2
UD
617
618@noindent
82acaacb 619There is also a function for the conversion in the other direction.
0b2b18a2 620
0b2b18a2 621@deftypefun int wctob (wint_t @var{c})
d08a7e4c 622@standards{ISO, wchar.h}
86e60666 623@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
624The @code{wctob} function (``wide character to byte'') takes as the
625parameter a valid wide character. If the multibyte representation for
626this character in the initial state is exactly one byte long, the return
627value of this function is this character. Otherwise the return value is
628@code{EOF}.
629
630@pindex wchar.h
631@code{wctob} was introduced in @w{Amendment 1} to @w{ISO C90} and
632is declared in @file{wchar.h}.
633@end deftypefun
634
d987d219 635There are more general functions to convert single characters from
0b2b18a2
UD
636multibyte representation to wide characters and vice versa. These
637functions pose no limit on the length of the multibyte representation
638and they also do not require it to be in the initial state.
639
0b2b18a2 640@deftypefun size_t mbrtowc (wchar_t *restrict @var{pwc}, const char *restrict @var{s}, size_t @var{n}, mbstate_t *restrict @var{ps})
d08a7e4c 641@standards{ISO, wchar.h}
86e60666 642@safety{@prelim{}@mtunsafe{@mtasurace{:mbrtowc/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
643@cindex stateful
644The @code{mbrtowc} function (``multibyte restartable to wide
645character'') converts the next multibyte character in the string pointed
646to by @var{s} into a wide character and stores it in the wide character
647string pointed to by @var{pwc}. The conversion is performed according
648to the locale currently selected for the @code{LC_CTYPE} category. If
649the conversion for the character set used in the locale requires a state,
650the multibyte string is interpreted in the state represented by the
651object pointed to by @var{ps}. If @var{ps} is a null pointer, a static,
652internal state variable used only by the @code{mbrtowc} function is
653used.
654
655If the next multibyte character corresponds to the NUL wide character,
656the return value of the function is @math{0} and the state object is
657afterwards in the initial state. If the next @var{n} or fewer bytes
658form a correct multibyte character, the return value is the number of
659bytes starting from @var{s} that form the multibyte character. The
660conversion state is updated according to the bytes consumed in the
661conversion. In both cases the wide character (either the @code{L'\0'}
662or the one found in the conversion) is stored in the string pointed to
663by @var{pwc} if @var{pwc} is not null.
664
665If the first @var{n} bytes of the multibyte string possibly form a valid
666multibyte character but there are more than @var{n} bytes needed to
667complete it, the return value of the function is @code{(size_t) -2} and
668no value is stored. Please note that this can happen even if @var{n}
bd3916e8 669has a value greater than or equal to @code{MB_CUR_MAX} since the input
0b2b18a2
UD
670might contain redundant shift sequences.
671
672If the first @code{n} bytes of the multibyte string cannot possibly form
673a valid multibyte character, no value is stored, the global variable
674@code{errno} is set to the value @code{EILSEQ}, and the function returns
675@code{(size_t) -1}. The conversion state is afterwards undefined.
676
677@pindex wchar.h
678@code{mbrtowc} was introduced in @w{Amendment 1} to @w{ISO C90} and
679is declared in @file{wchar.h}.
680@end deftypefun
681
682Use of @code{mbrtowc} is straightforward. A function that copies a
683multibyte string into a wide character string while at the same time
684converting all lowercase characters into uppercase could look like this
685(this is not the final version, just an example; it has no error
686checking, and sometimes leaks memory):
687
688@smallexample
689wchar_t *
690mbstouwcs (const char *s)
691@{
692 size_t len = strlen (s);
693 wchar_t *result = malloc ((len + 1) * sizeof (wchar_t));
694 wchar_t *wcp = result;
695 wchar_t tmp[1];
696 mbstate_t state;
697 size_t nbytes;
698
699 memset (&state, '\0', sizeof (state));
700 while ((nbytes = mbrtowc (tmp, s, len, &state)) > 0)
701 @{
702 if (nbytes >= (size_t) -2)
703 /* Invalid input string. */
704 return NULL;
cfba1942 705 *wcp++ = towupper (tmp[0]);
0b2b18a2
UD
706 len -= nbytes;
707 s += nbytes;
708 @}
709 return result;
710@}
711@end smallexample
712
713The use of @code{mbrtowc} should be clear. A single wide character is
714stored in @code{@var{tmp}[0]}, and the number of consumed bytes is stored
bd3916e8
UD
715in the variable @var{nbytes}. If the conversion is successful, the
716uppercase variant of the wide character is stored in the @var{result}
717array and the pointer to the input string and the number of available
0b2b18a2
UD
718bytes is adjusted.
719
bd3916e8
UD
720The only non-obvious thing about @code{mbrtowc} might be the way memory
721is allocated for the result. The above code uses the fact that there
d987d219 722can never be more wide characters in the converted result than there are
bd3916e8
UD
723bytes in the multibyte input string. This method yields a pessimistic
724guess about the size of the result, and if many wide character strings
725have to be constructed this way or if the strings are long, the extra
726memory required to be allocated because the input string contains
727multibyte characters might be significant. The allocated memory block can
728be resized to the correct size before returning it, but a better solution
729might be to allocate just the right amount of space for the result right
730away. Unfortunately there is no function to compute the length of the wide
731character string directly from the multibyte string. There is, however, a
0b2b18a2
UD
732function that does part of the work.
733
0b2b18a2 734@deftypefun size_t mbrlen (const char *restrict @var{s}, size_t @var{n}, mbstate_t *@var{ps})
d08a7e4c 735@standards{ISO, wchar.h}
86e60666 736@safety{@prelim{}@mtunsafe{@mtasurace{:mbrlen/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
737The @code{mbrlen} function (``multibyte restartable length'') computes
738the number of at most @var{n} bytes starting at @var{s}, which form the
739next valid and complete multibyte character.
740
741If the next multibyte character corresponds to the NUL wide character,
742the return value is @math{0}. If the next @var{n} bytes form a valid
743multibyte character, the number of bytes belonging to this multibyte
744character byte sequence is returned.
745
11bf311e 746If the first @var{n} bytes possibly form a valid multibyte
bd3916e8
UD
747character but the character is incomplete, the return value is
748@code{(size_t) -2}. Otherwise the multibyte character sequence is invalid
0b2b18a2
UD
749and the return value is @code{(size_t) -1}.
750
751The multibyte sequence is interpreted in the state represented by the
752object pointed to by @var{ps}. If @var{ps} is a null pointer, a state
753object local to @code{mbrlen} is used.
754
755@pindex wchar.h
756@code{mbrlen} was introduced in @w{Amendment 1} to @w{ISO C90} and
757is declared in @file{wchar.h}.
758@end deftypefun
759
bd3916e8 760The attentive reader now will note that @code{mbrlen} can be implemented
0b2b18a2
UD
761as
762
763@smallexample
764mbrtowc (NULL, s, n, ps != NULL ? ps : &internal)
765@end smallexample
766
767This is true and in fact is mentioned in the official specification.
768How can this function be used to determine the length of the wide
769character string created from a multibyte character string? It is not
770directly usable, but we can define a function @code{mbslen} using it:
771
772@smallexample
773size_t
774mbslen (const char *s)
775@{
776 mbstate_t state;
777 size_t result = 0;
778 size_t nbytes;
779 memset (&state, '\0', sizeof (state));
780 while ((nbytes = mbrlen (s, MB_LEN_MAX, &state)) > 0)
781 @{
782 if (nbytes >= (size_t) -2)
783 /* @r{Something is wrong.} */
784 return (size_t) -1;
785 s += nbytes;
786 ++result;
787 @}
788 return result;
789@}
790@end smallexample
791
792This function simply calls @code{mbrlen} for each multibyte character
793in the string and counts the number of function calls. Please note that
794we here use @code{MB_LEN_MAX} as the size argument in the @code{mbrlen}
f24a6d08 795call. This is acceptable since a) this value is larger than the length of
bd3916e8
UD
796the longest multibyte character sequence and b) we know that the string
797@var{s} ends with a NUL byte, which cannot be part of any other multibyte
798character sequence but the one representing the NUL wide character.
0b2b18a2
UD
799Therefore, the @code{mbrlen} function will never read invalid memory.
800
801Now that this function is available (just to make this clear, this
1f77f049 802function is @emph{not} part of @theglibc{}) we can compute the
d987d219 803number of wide characters required to store the converted multibyte
0b2b18a2
UD
804character string @var{s} using
805
806@smallexample
807wcs_bytes = (mbslen (s) + 1) * sizeof (wchar_t);
808@end smallexample
809
810Please note that the @code{mbslen} function is quite inefficient. The
bd3916e8
UD
811implementation of @code{mbstouwcs} with @code{mbslen} would have to
812perform the conversion of the multibyte character input string twice, and
813this conversion might be quite expensive. So it is necessary to think
814about the consequences of using the easier but imprecise method before
0b2b18a2
UD
815doing the work twice.
816
0b2b18a2 817@deftypefun size_t wcrtomb (char *restrict @var{s}, wchar_t @var{wc}, mbstate_t *restrict @var{ps})
d08a7e4c 818@standards{ISO, wchar.h}
86e60666
AO
819@safety{@prelim{}@mtunsafe{@mtasurace{:wcrtomb/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
820@c wcrtomb uses a static, non-thread-local unguarded state variable when
821@c PS is NULL. When a state is passed in, and it's not used
822@c concurrently in other threads, this function behaves safely as long
823@c as gconv modules don't bring MT safety issues of their own.
824@c Attempting to load gconv modules or to build conversion chains in
825@c signal handlers may encounter gconv databases or caches in a
826@c partially-updated state, and asynchronous cancellation may leave them
827@c in such states, besides leaking the lock that guards them.
828@c get_gconv_fcts ok
829@c wcsmbs_load_conv ok
830@c norm_add_slashes ok
831@c wcsmbs_getfct ok
832@c gconv_find_transform ok
833@c gconv_read_conf (libc_once)
834@c gconv_lookup_cache ok
835@c find_module_idx ok
836@c find_module ok
837@c gconv_find_shlib (ok)
838@c ->init_fct (assumed ok)
839@c gconv_get_builtin_trans ok
840@c gconv_release_step ok
841@c do_lookup_alias ok
842@c find_derivation ok
843@c derivation_lookup ok
844@c increment_counter ok
845@c gconv_find_shlib ok
846@c step->init_fct (assumed ok)
847@c gen_steps ok
848@c gconv_find_shlib ok
849@c dlopen (presumed ok)
850@c dlsym (presumed ok)
851@c step->init_fct (assumed ok)
852@c step->end_fct (assumed ok)
853@c gconv_get_builtin_trans ok
854@c gconv_release_step ok
855@c add_derivation ok
856@c gconv_close_transform ok
857@c gconv_release_step ok
858@c step->end_fct (assumed ok)
859@c gconv_release_shlib ok
860@c dlclose (presumed ok)
861@c gconv_release_cache ok
862@c ->tomb->__fct (assumed ok)
0b2b18a2
UD
863The @code{wcrtomb} function (``wide character restartable to
864multibyte'') converts a single wide character into a multibyte string
865corresponding to that wide character.
866
867If @var{s} is a null pointer, the function resets the state stored in
d987d219 868the object pointed to by @var{ps} (or the internal @code{mbstate_t}
0b2b18a2
UD
869object) to the initial state. This can also be achieved by a call like
870this:
871
872@smallexample
873wcrtombs (temp_buf, L'\0', ps)
874@end smallexample
875
876@noindent
877since, if @var{s} is a null pointer, @code{wcrtomb} performs as if it
878writes into an internal buffer, which is guaranteed to be large enough.
879
880If @var{wc} is the NUL wide character, @code{wcrtomb} emits, if
881necessary, a shift sequence to get the state @var{ps} into the initial
bd3916e8 882state followed by a single NUL byte, which is stored in the string
0b2b18a2
UD
883@var{s}.
884
bd3916e8
UD
885Otherwise a byte sequence (possibly including shift sequences) is written
886into the string @var{s}. This only happens if @var{wc} is a valid wide
887character (i.e., it has a multibyte representation in the character set
888selected by locale of the @code{LC_CTYPE} category). If @var{wc} is no
889valid wide character, nothing is stored in the strings @var{s},
890@code{errno} is set to @code{EILSEQ}, the conversion state in @var{ps}
0b2b18a2
UD
891is undefined and the return value is @code{(size_t) -1}.
892
893If no error occurred the function returns the number of bytes stored in
894the string @var{s}. This includes all bytes representing shift
895sequences.
896
897One word about the interface of the function: there is no parameter
898specifying the length of the array @var{s}. Instead the function
899assumes that there are at least @code{MB_CUR_MAX} bytes available since
900this is the maximum length of any byte sequence representing a single
901character. So the caller has to make sure that there is enough space
902available, otherwise buffer overruns can occur.
903
904@pindex wchar.h
905@code{wcrtomb} was introduced in @w{Amendment 1} to @w{ISO C90} and is
906declared in @file{wchar.h}.
907@end deftypefun
908
909Using @code{wcrtomb} is as easy as using @code{mbrtowc}. The following
910example appends a wide character string to a multibyte character string.
911Again, the code is not really useful (or correct), it is simply here to
912demonstrate the use and some problems.
913
914@smallexample
915char *
916mbscatwcs (char *s, size_t len, const wchar_t *ws)
917@{
918 mbstate_t state;
919 /* @r{Find the end of the existing string.} */
920 char *wp = strchr (s, '\0');
921 len -= wp - s;
922 memset (&state, '\0', sizeof (state));
923 do
924 @{
925 size_t nbytes;
926 if (len < MB_CUR_LEN)
927 @{
928 /* @r{We cannot guarantee that the next}
929 @r{character fits into the buffer, so}
930 @r{return an error.} */
931 errno = E2BIG;
932 return NULL;
933 @}
934 nbytes = wcrtomb (wp, *ws, &state);
935 if (nbytes == (size_t) -1)
936 /* @r{Error in the conversion.} */
937 return NULL;
938 len -= nbytes;
939 wp += nbytes;
940 @}
941 while (*ws++ != L'\0');
942 return s;
943@}
944@end smallexample
945
946First the function has to find the end of the string currently in the
947array @var{s}. The @code{strchr} call does this very efficiently since a
948requirement for multibyte character representations is that the NUL byte
949is never used except to represent itself (and in this context, the end
950of the string).
951
952After initializing the state object the loop is entered where the first
953task is to make sure there is enough room in the array @var{s}. We
954abort if there are not at least @code{MB_CUR_LEN} bytes available. This
955is not always optimal but we have no other choice. We might have less
956than @code{MB_CUR_LEN} bytes available but the next multibyte character
957might also be only one byte long. At the time the @code{wcrtomb} call
bd3916e8
UD
958returns it is too late to decide whether the buffer was large enough. If
959this solution is unsuitable, there is a very slow but more accurate
0b2b18a2
UD
960solution.
961
962@smallexample
95fdc6a0 963 @dots{}
0b2b18a2
UD
964 if (len < MB_CUR_LEN)
965 @{
966 mbstate_t temp_state;
967 memcpy (&temp_state, &state, sizeof (state));
968 if (wcrtomb (NULL, *ws, &temp_state) > len)
969 @{
970 /* @r{We cannot guarantee that the next}
971 @r{character fits into the buffer, so}
972 @r{return an error.} */
973 errno = E2BIG;
974 return NULL;
975 @}
976 @}
95fdc6a0 977 @dots{}
0b2b18a2
UD
978@end smallexample
979
bd3916e8
UD
980Here we perform the conversion that might overflow the buffer so that
981we are afterwards in the position to make an exact decision about the
982buffer size. Please note the @code{NULL} argument for the destination
983buffer in the new @code{wcrtomb} call; since we are not interested in the
984converted text at this point, this is a nice way to express this. The
985most unusual thing about this piece of code certainly is the duplication
986of the conversion state object, but if a change of the state is necessary
987to emit the next multibyte character, we want to have the same shift state
988change performed in the real conversion. Therefore, we have to preserve
0b2b18a2
UD
989the initial shift state information.
990
991There are certainly many more and even better solutions to this problem.
992This example is only provided for educational purposes.
993
994@node Converting Strings
995@subsection Converting Multibyte and Wide Character Strings
996
997The functions described in the previous section only convert a single
998character at a time. Most operations to be performed in real-world
999programs include strings and therefore the @w{ISO C} standard also
1000defines conversions on entire strings. However, the defined set of
1f77f049 1001functions is quite limited; therefore, @theglibc{} contains a few
0b2b18a2
UD
1002extensions that can help in some important situations.
1003
0b2b18a2 1004@deftypefun size_t mbsrtowcs (wchar_t *restrict @var{dst}, const char **restrict @var{src}, size_t @var{len}, mbstate_t *restrict @var{ps})
d08a7e4c 1005@standards{ISO, wchar.h}
86e60666 1006@safety{@prelim{}@mtunsafe{@mtasurace{:mbsrtowcs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2 1007The @code{mbsrtowcs} function (``multibyte string restartable to wide
d987d219 1008character string'') converts the NUL-terminated multibyte character
0b2b18a2
UD
1009string at @code{*@var{src}} into an equivalent wide character string,
1010including the NUL wide character at the end. The conversion is started
1011using the state information from the object pointed to by @var{ps} or
1012from an internal object of @code{mbsrtowcs} if @var{ps} is a null
bd3916e8 1013pointer. Before returning, the state object is updated to match the state
0b2b18a2
UD
1014after the last converted character. The state is the initial state if the
1015terminating NUL byte is reached and converted.
1016
1017If @var{dst} is not a null pointer, the result is stored in the array
1018pointed to by @var{dst}; otherwise, the conversion result is not
1019available since it is stored in an internal buffer.
1020
1021If @var{len} wide characters are stored in the array @var{dst} before
1022reaching the end of the input string, the conversion stops and @var{len}
1023is returned. If @var{dst} is a null pointer, @var{len} is never checked.
1024
1025Another reason for a premature return from the function call is if the
1026input string contains an invalid multibyte sequence. In this case the
1027global variable @code{errno} is set to @code{EILSEQ} and the function
1028returns @code{(size_t) -1}.
1029
1030@c XXX The ISO C9x draft seems to have a problem here. It says that PS
1031@c is not updated if DST is NULL. This is not said straightforward and
1032@c none of the other functions is described like this. It would make sense
1033@c to define the function this way but I don't think it is meant like this.
1034
1035In all other cases the function returns the number of wide characters
1036converted during this call. If @var{dst} is not null, @code{mbsrtowcs}
bd3916e8 1037stores in the pointer pointed to by @var{src} either a null pointer (if
0b2b18a2
UD
1038the NUL byte in the input string was reached) or the address of the byte
1039following the last converted multibyte character.
1040
1041@pindex wchar.h
1042@code{mbsrtowcs} was introduced in @w{Amendment 1} to @w{ISO C90} and is
1043declared in @file{wchar.h}.
1044@end deftypefun
1045
bd3916e8
UD
1046The definition of the @code{mbsrtowcs} function has one important
1047limitation. The requirement that @var{dst} has to be a NUL-terminated
0b2b18a2 1048string provides problems if one wants to convert buffers with text. A
d987d219 1049buffer is not normally a collection of NUL-terminated strings but instead a
0b2b18a2
UD
1050continuous collection of lines, separated by newline characters. Now
1051assume that a function to convert one line from a buffer is needed. Since
1052the line is not NUL-terminated, the source pointer cannot directly point
1053into the unmodified text buffer. This means, either one inserts the NUL
1054byte at the appropriate place for the time of the @code{mbsrtowcs}
1055function call (which is not doable for a read-only buffer or in a
1056multi-threaded application) or one copies the line in an extra buffer
bd3916e8
UD
1057where it can be terminated by a NUL byte. Note that it is not in general
1058possible to limit the number of characters to convert by setting the
1059parameter @var{len} to any specific value. Since it is not known how
1060many bytes each multibyte character sequence is in length, one can only
0b2b18a2
UD
1061guess.
1062
1063@cindex stateful
1064There is still a problem with the method of NUL-terminating a line right
1065after the newline character, which could lead to very strange results.
d987d219 1066As said in the description of the @code{mbsrtowcs} function above, the
0b2b18a2
UD
1067conversion state is guaranteed to be in the initial shift state after
1068processing the NUL byte at the end of the input string. But this NUL
1069byte is not really part of the text (i.e., the conversion state after
1070the newline in the original text could be something different than the
1071initial shift state and therefore the first character of the next line
1072is encoded using this state). But the state in question is never
1073accessible to the user since the conversion stops after the NUL byte
1074(which resets the state). Most stateful character sets in use today
1075require that the shift state after a newline be the initial state--but
1076this is not a strict guarantee. Therefore, simply NUL-terminating a
bd3916e8 1077piece of a running text is not always an adequate solution and,
0b2b18a2
UD
1078therefore, should never be used in generally used code.
1079
1080The generic conversion interface (@pxref{Generic Charset Conversion})
1081does not have this limitation (it simply works on buffers, not
1f77f049 1082strings), and @theglibc{} contains a set of functions that take
0b2b18a2
UD
1083additional parameters specifying the maximal number of bytes that are
1084consumed from the input string. This way the problem of
1085@code{mbsrtowcs}'s example above could be solved by determining the line
1086length and passing this length to the function.
1087
0b2b18a2 1088@deftypefun size_t wcsrtombs (char *restrict @var{dst}, const wchar_t **restrict @var{src}, size_t @var{len}, mbstate_t *restrict @var{ps})
d08a7e4c 1089@standards{ISO, wchar.h}
86e60666 1090@safety{@prelim{}@mtunsafe{@mtasurace{:wcsrtombs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1091The @code{wcsrtombs} function (``wide character string restartable to
1092multibyte string'') converts the NUL-terminated wide character string at
bd3916e8 1093@code{*@var{src}} into an equivalent multibyte character string and
0b2b18a2
UD
1094stores the result in the array pointed to by @var{dst}. The NUL wide
1095character is also converted. The conversion starts in the state
1096described in the object pointed to by @var{ps} or by a state object
d987d219 1097local to @code{wcsrtombs} in case @var{ps} is a null pointer. If
0b2b18a2
UD
1098@var{dst} is a null pointer, the conversion is performed as usual but the
1099result is not available. If all characters of the input string were
bd3916e8 1100successfully converted and if @var{dst} is not a null pointer, the
0b2b18a2
UD
1101pointer pointed to by @var{src} gets assigned a null pointer.
1102
1103If one of the wide characters in the input string has no valid multibyte
1104character equivalent, the conversion stops early, sets the global
1105variable @code{errno} to @code{EILSEQ}, and returns @code{(size_t) -1}.
1106
1107Another reason for a premature stop is if @var{dst} is not a null
1108pointer and the next converted character would require more than
1109@var{len} bytes in total to the array @var{dst}. In this case (and if
d987d219 1110@var{dst} is not a null pointer) the pointer pointed to by @var{src} is
0b2b18a2
UD
1111assigned a value pointing to the wide character right after the last one
1112successfully converted.
1113
bd3916e8
UD
1114Except in the case of an encoding error the return value of the
1115@code{wcsrtombs} function is the number of bytes in all the multibyte
d987d219 1116character sequences stored in @var{dst}. Before returning, the state in
bd3916e8
UD
1117the object pointed to by @var{ps} (or the internal object in case
1118@var{ps} is a null pointer) is updated to reflect the state after the
1119last conversion. The state is the initial shift state in case the
0b2b18a2
UD
1120terminating NUL wide character was converted.
1121
1122@pindex wchar.h
bd3916e8 1123The @code{wcsrtombs} function was introduced in @w{Amendment 1} to
0b2b18a2
UD
1124@w{ISO C90} and is declared in @file{wchar.h}.
1125@end deftypefun
1126
1127The restriction mentioned above for the @code{mbsrtowcs} function applies
1128here also. There is no possibility of directly controlling the number of
bd3916e8
UD
1129input characters. One has to place the NUL wide character at the correct
1130place or control the consumed input indirectly via the available output
0b2b18a2
UD
1131array size (the @var{len} parameter).
1132
0b2b18a2 1133@deftypefun size_t mbsnrtowcs (wchar_t *restrict @var{dst}, const char **restrict @var{src}, size_t @var{nmc}, size_t @var{len}, mbstate_t *restrict @var{ps})
d08a7e4c 1134@standards{GNU, wchar.h}
86e60666 1135@safety{@prelim{}@mtunsafe{@mtasurace{:mbsnrtowcs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1136The @code{mbsnrtowcs} function is very similar to the @code{mbsrtowcs}
1137function. All the parameters are the same except for @var{nmc}, which is
1138new. The return value is the same as for @code{mbsrtowcs}.
1139
1140This new parameter specifies how many bytes at most can be used from the
bd3916e8
UD
1141multibyte character string. In other words, the multibyte character
1142string @code{*@var{src}} need not be NUL-terminated. But if a NUL byte
1143is found within the @var{nmc} first bytes of the string, the conversion
d987d219 1144stops there.
0b2b18a2
UD
1145
1146This function is a GNU extension. It is meant to work around the
1147problems mentioned above. Now it is possible to convert a buffer with
d987d219 1148multibyte character text piece by piece without having to care about
0b2b18a2
UD
1149inserting NUL bytes and the effect of NUL bytes on the conversion state.
1150@end deftypefun
1151
1152A function to convert a multibyte string into a wide character string
1153and display it could be written like this (this is not a really useful
1154example):
1155
1156@smallexample
1157void
1158showmbs (const char *src, FILE *fp)
1159@{
1160 mbstate_t state;
1161 int cnt = 0;
1162 memset (&state, '\0', sizeof (state));
1163 while (1)
1164 @{
1165 wchar_t linebuf[100];
1166 const char *endp = strchr (src, '\n');
1167 size_t n;
1168
1169 /* @r{Exit if there is no more line.} */
1170 if (endp == NULL)
1171 break;
1172
1173 n = mbsnrtowcs (linebuf, &src, endp - src, 99, &state);
1174 linebuf[n] = L'\0';
1175 fprintf (fp, "line %d: \"%S\"\n", linebuf);
1176 @}
1177@}
1178@end smallexample
1179
1180There is no problem with the state after a call to @code{mbsnrtowcs}.
1181Since we don't insert characters in the strings that were not in there
1182right from the beginning and we use @var{state} only for the conversion
1183of the given buffer, there is no problem with altering the state.
1184
0b2b18a2 1185@deftypefun size_t wcsnrtombs (char *restrict @var{dst}, const wchar_t **restrict @var{src}, size_t @var{nwc}, size_t @var{len}, mbstate_t *restrict @var{ps})
d08a7e4c 1186@standards{GNU, wchar.h}
86e60666 1187@safety{@prelim{}@mtunsafe{@mtasurace{:wcsnrtombs/!ps}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1188The @code{wcsnrtombs} function implements the conversion from wide
1189character strings to multibyte character strings. It is similar to
1190@code{wcsrtombs} but, just like @code{mbsnrtowcs}, it takes an extra
1191parameter, which specifies the length of the input string.
1192
1193No more than @var{nwc} wide characters from the input string
1194@code{*@var{src}} are converted. If the input string contains a NUL
1195wide character in the first @var{nwc} characters, the conversion stops at
1196this place.
1197
bd3916e8
UD
1198The @code{wcsnrtombs} function is a GNU extension and just like
1199@code{mbsnrtowcs} helps in situations where no NUL-terminated input
0b2b18a2
UD
1200strings are available.
1201@end deftypefun
1202
1203
1204@node Multibyte Conversion Example
1205@subsection A Complete Multibyte Conversion Example
1206
1207The example programs given in the last sections are only brief and do
1208not contain all the error checking, etc. Presented here is a complete
1209and documented example. It features the @code{mbrtowc} function but it
1210should be easy to derive versions using the other functions.
1211
1212@smallexample
1213int
1214file_mbsrtowcs (int input, int output)
1215@{
1216 /* @r{Note the use of @code{MB_LEN_MAX}.}
1217 @r{@code{MB_CUR_MAX} cannot portably be used here.} */
1218 char buffer[BUFSIZ + MB_LEN_MAX];
1219 mbstate_t state;
1220 int filled = 0;
1221 int eof = 0;
1222
1223 /* @r{Initialize the state.} */
1224 memset (&state, '\0', sizeof (state));
1225
1226 while (!eof)
1227 @{
1228 ssize_t nread;
1229 ssize_t nwrite;
1230 char *inp = buffer;
1231 wchar_t outbuf[BUFSIZ];
1232 wchar_t *outp = outbuf;
1233
1234 /* @r{Fill up the buffer from the input file.} */
1235 nread = read (input, buffer + filled, BUFSIZ);
1236 if (nread < 0)
1237 @{
1238 perror ("read");
1239 return 0;
1240 @}
1241 /* @r{If we reach end of file, make a note to read no more.} */
1242 if (nread == 0)
1243 eof = 1;
1244
1245 /* @r{@code{filled} is now the number of bytes in @code{buffer}.} */
1246 filled += nread;
1247
1248 /* @r{Convert those bytes to wide characters--as many as we can.} */
1249 while (1)
1250 @{
1251 size_t thislen = mbrtowc (outp, inp, filled, &state);
1252 /* @r{Stop converting at invalid character;}
1253 @r{this can mean we have read just the first part}
1254 @r{of a valid character.} */
1255 if (thislen == (size_t) -1)
1256 break;
1257 /* @r{We want to handle embedded NUL bytes}
1258 @r{but the return value is 0. Correct this.} */
1259 if (thislen == 0)
1260 thislen = 1;
1261 /* @r{Advance past this character.} */
1262 inp += thislen;
1263 filled -= thislen;
1264 ++outp;
1265 @}
1266
1267 /* @r{Write the wide characters we just made.} */
1268 nwrite = write (output, outbuf,
1269 (outp - outbuf) * sizeof (wchar_t));
1270 if (nwrite < 0)
1271 @{
1272 perror ("write");
1273 return 0;
1274 @}
1275
1276 /* @r{See if we have a @emph{real} invalid character.} */
1277 if ((eof && filled > 0) || filled >= MB_CUR_MAX)
1278 @{
1279 error (0, 0, "invalid multibyte character");
1280 return 0;
1281 @}
1282
1283 /* @r{If any characters must be carried forward,}
1284 @r{put them at the beginning of @code{buffer}.} */
1285 if (filled > 0)
21e66bc5 1286 memmove (buffer, inp, filled);
0b2b18a2
UD
1287 @}
1288
1289 return 1;
1290@}
1291@end smallexample
1292
1293
1294@node Non-reentrant Conversion
1295@section Non-reentrant Conversion Function
1296
1297The functions described in the previous chapter are defined in
bd3916e8
UD
1298@w{Amendment 1} to @w{ISO C90}, but the original @w{ISO C90} standard
1299also contained functions for character set conversion. The reason that
1300these original functions are not described first is that they are almost
0b2b18a2
UD
1301entirely useless.
1302
bd3916e8
UD
1303The problem is that all the conversion functions described in the
1304original @w{ISO C90} use a local state. Using a local state implies that
1305multiple conversions at the same time (not only when using threads)
1306cannot be done, and that you cannot first convert single characters and
1307then strings since you cannot tell the conversion functions which state
0b2b18a2
UD
1308to use.
1309
bd3916e8 1310These original functions are therefore usable only in a very limited set
0b2b18a2
UD
1311of situations. One must complete converting the entire string before
1312starting a new one, and each string/text must be converted with the same
1313function (there is no problem with the library itself; it is guaranteed
1314that no library function changes the state of any of these functions).
1315@strong{For the above reasons it is highly requested that the functions
bd3916e8 1316described in the previous section be used in place of non-reentrant
0b2b18a2
UD
1317conversion functions.}
1318
1319@menu
1320* Non-reentrant Character Conversion:: Non-reentrant Conversion of Single
1321 Characters.
1322* Non-reentrant String Conversion:: Non-reentrant Conversion of Strings.
1323* Shift State:: States in Non-reentrant Functions.
1324@end menu
1325
1326@node Non-reentrant Character Conversion
1327@subsection Non-reentrant Conversion of Single Characters
1328
0b2b18a2 1329@deftypefun int mbtowc (wchar_t *restrict @var{result}, const char *restrict @var{string}, size_t @var{size})
d08a7e4c 1330@standards{ISO, stdlib.h}
86e60666 1331@safety{@prelim{}@mtunsafe{@mtasurace{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1332The @code{mbtowc} (``multibyte to wide character'') function when called
1333with non-null @var{string} converts the first multibyte character
1334beginning at @var{string} to its corresponding wide character code. It
1335stores the result in @code{*@var{result}}.
1336
1337@code{mbtowc} never examines more than @var{size} bytes. (The idea is
1338to supply for @var{size} the number of bytes of data you have in hand.)
1339
1340@code{mbtowc} with non-null @var{string} distinguishes three
1341possibilities: the first @var{size} bytes at @var{string} start with
1342valid multibyte characters, they start with an invalid byte sequence or
1343just part of a character, or @var{string} points to an empty string (a
1344null character).
1345
1346For a valid multibyte character, @code{mbtowc} converts it to a wide
1347character and stores that in @code{*@var{result}}, and returns the
1348number of bytes in that character (always at least @math{1} and never
1349more than @var{size}).
1350
1351For an invalid byte sequence, @code{mbtowc} returns @math{-1}. For an
1352empty string, it returns @math{0}, also storing @code{'\0'} in
1353@code{*@var{result}}.
1354
1355If the multibyte character code uses shift characters, then
1356@code{mbtowc} maintains and updates a shift state as it scans. If you
1357call @code{mbtowc} with a null pointer for @var{string}, that
1358initializes the shift state to its standard initial value. It also
1359returns nonzero if the multibyte character code in use actually has a
1360shift state. @xref{Shift State}.
1361@end deftypefun
1362
0b2b18a2 1363@deftypefun int wctomb (char *@var{string}, wchar_t @var{wchar})
d08a7e4c 1364@standards{ISO, stdlib.h}
86e60666 1365@safety{@prelim{}@mtunsafe{@mtasurace{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1366The @code{wctomb} (``wide character to multibyte'') function converts
1367the wide character code @var{wchar} to its corresponding multibyte
1368character sequence, and stores the result in bytes starting at
1369@var{string}. At most @code{MB_CUR_MAX} characters are stored.
1370
1371@code{wctomb} with non-null @var{string} distinguishes three
1372possibilities for @var{wchar}: a valid wide character code (one that can
bd3916e8 1373be translated to a multibyte character), an invalid code, and
0b2b18a2
UD
1374@code{L'\0'}.
1375
1376Given a valid code, @code{wctomb} converts it to a multibyte character,
1377storing the bytes starting at @var{string}. Then it returns the number
1378of bytes in that character (always at least @math{1} and never more
1379than @code{MB_CUR_MAX}).
1380
1381If @var{wchar} is an invalid wide character code, @code{wctomb} returns
1382@math{-1}. If @var{wchar} is @code{L'\0'}, it returns @code{0}, also
1383storing @code{'\0'} in @code{*@var{string}}.
1384
1385If the multibyte character code uses shift characters, then
1386@code{wctomb} maintains and updates a shift state as it scans. If you
1387call @code{wctomb} with a null pointer for @var{string}, that
1388initializes the shift state to its standard initial value. It also
1389returns nonzero if the multibyte character code in use actually has a
1390shift state. @xref{Shift State}.
1391
1392Calling this function with a @var{wchar} argument of zero when
1393@var{string} is not null has the side-effect of reinitializing the
1394stored shift state @emph{as well as} storing the multibyte character
1395@code{'\0'} and returning @math{0}.
1396@end deftypefun
1397
1398Similar to @code{mbrlen} there is also a non-reentrant function that
1399computes the length of a multibyte character. It can be defined in
1400terms of @code{mbtowc}.
1401
0b2b18a2 1402@deftypefun int mblen (const char *@var{string}, size_t @var{size})
d08a7e4c 1403@standards{ISO, stdlib.h}
86e60666 1404@safety{@prelim{}@mtunsafe{@mtasurace{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1405The @code{mblen} function with a non-null @var{string} argument returns
1406the number of bytes that make up the multibyte character beginning at
1407@var{string}, never examining more than @var{size} bytes. (The idea is
1408to supply for @var{size} the number of bytes of data you have in hand.)
1409
1410The return value of @code{mblen} distinguishes three possibilities: the
1411first @var{size} bytes at @var{string} start with valid multibyte
1412characters, they start with an invalid byte sequence or just part of a
1413character, or @var{string} points to an empty string (a null character).
1414
1415For a valid multibyte character, @code{mblen} returns the number of
1416bytes in that character (always at least @code{1} and never more than
bd3916e8 1417@var{size}). For an invalid byte sequence, @code{mblen} returns
0b2b18a2
UD
1418@math{-1}. For an empty string, it returns @math{0}.
1419
1420If the multibyte character code uses shift characters, then @code{mblen}
1421maintains and updates a shift state as it scans. If you call
1422@code{mblen} with a null pointer for @var{string}, that initializes the
1423shift state to its standard initial value. It also returns a nonzero
1424value if the multibyte character code in use actually has a shift state.
1425@xref{Shift State}.
1426
1427@pindex stdlib.h
1428The function @code{mblen} is declared in @file{stdlib.h}.
1429@end deftypefun
1430
1431
1432@node Non-reentrant String Conversion
1433@subsection Non-reentrant Conversion of Strings
1434
bd3916e8 1435For convenience the @w{ISO C90} standard also defines functions to
0b2b18a2
UD
1436convert entire strings instead of single characters. These functions
1437suffer from the same problems as their reentrant counterparts from
1438@w{Amendment 1} to @w{ISO C90}; see @ref{Converting Strings}.
1439
0b2b18a2 1440@deftypefun size_t mbstowcs (wchar_t *@var{wstring}, const char *@var{string}, size_t @var{size})
d08a7e4c 1441@standards{ISO, stdlib.h}
86e60666
AO
1442@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
1443@c Odd... Although this was supposed to be non-reentrant, the internal
1444@c state is not a static buffer, but an automatic variable.
0b2b18a2
UD
1445The @code{mbstowcs} (``multibyte string to wide character string'')
1446function converts the null-terminated string of multibyte characters
1447@var{string} to an array of wide character codes, storing not more than
1448@var{size} wide characters into the array beginning at @var{wstring}.
1449The terminating null character counts towards the size, so if @var{size}
1450is less than the actual number of wide characters resulting from
1451@var{string}, no terminating null character is stored.
1452
1453The conversion of characters from @var{string} begins in the initial
1454shift state.
1455
bd3916e8
UD
1456If an invalid multibyte character sequence is found, the @code{mbstowcs}
1457function returns a value of @math{-1}. Otherwise, it returns the number
1458of wide characters stored in the array @var{wstring}. This number does
1459not include the terminating null character, which is present if the
0b2b18a2
UD
1460number is less than @var{size}.
1461
1462Here is an example showing how to convert a string of multibyte
1463characters, allocating enough space for the result.
1464
1465@smallexample
1466wchar_t *
1467mbstowcs_alloc (const char *string)
1468@{
1469 size_t size = strlen (string) + 1;
1470 wchar_t *buf = xmalloc (size * sizeof (wchar_t));
1471
1472 size = mbstowcs (buf, string, size);
1473 if (size == (size_t) -1)
1474 return NULL;
1475 buf = xrealloc (buf, (size + 1) * sizeof (wchar_t));
1476 return buf;
1477@}
1478@end smallexample
1479
1480@end deftypefun
1481
0b2b18a2 1482@deftypefun size_t wcstombs (char *@var{string}, const wchar_t *@var{wstring}, size_t @var{size})
d08a7e4c 1483@standards{ISO, stdlib.h}
86e60666 1484@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
0b2b18a2
UD
1485The @code{wcstombs} (``wide character string to multibyte string'')
1486function converts the null-terminated wide character array @var{wstring}
1487into a string containing multibyte characters, storing not more than
1488@var{size} bytes starting at @var{string}, followed by a terminating
1489null character if there is room. The conversion of characters begins in
1490the initial shift state.
1491
1492The terminating null character counts towards the size, so if @var{size}
1493is less than or equal to the number of bytes needed in @var{wstring}, no
1494terminating null character is stored.
1495
1496If a code that does not correspond to a valid multibyte character is
bd3916e8
UD
1497found, the @code{wcstombs} function returns a value of @math{-1}.
1498Otherwise, the return value is the number of bytes stored in the array
1499@var{string}. This number does not include the terminating null character,
0b2b18a2
UD
1500which is present if the number is less than @var{size}.
1501@end deftypefun
1502
1503@node Shift State
1504@subsection States in Non-reentrant Functions
1505
1506In some multibyte character codes, the @emph{meaning} of any particular
1507byte sequence is not fixed; it depends on what other sequences have come
bd3916e8
UD
1508earlier in the same string. Typically there are just a few sequences that
1509can change the meaning of other sequences; these few are called
0b2b18a2
UD
1510@dfn{shift sequences} and we say that they set the @dfn{shift state} for
1511other sequences that follow.
1512
1513To illustrate shift state and shift sequences, suppose we decide that
1514the sequence @code{0200} (just one byte) enters Japanese mode, in which
1515pairs of bytes in the range from @code{0240} to @code{0377} are single
1516characters, while @code{0201} enters Latin-1 mode, in which single bytes
1517in the range from @code{0240} to @code{0377} are characters, and
1518interpreted according to the ISO Latin-1 character set. This is a
1519multibyte code that has two alternative shift states (``Japanese mode''
1520and ``Latin-1 mode''), and two shift sequences that specify particular
1521shift states.
1522
1523When the multibyte character code in use has shift states, then
1524@code{mblen}, @code{mbtowc}, and @code{wctomb} must maintain and update
1525the current shift state as they scan the string. To make this work
1526properly, you must follow these rules:
1527
1528@itemize @bullet
1529@item
1530Before starting to scan a string, call the function with a null pointer
1531for the multibyte character address---for example, @code{mblen (NULL,
15320)}. This initializes the shift state to its standard initial value.
1533
1534@item
1535Scan the string one character at a time, in order. Do not ``back up''
1536and rescan characters already scanned, and do not intersperse the
1537processing of different strings.
1538@end itemize
1539
1540Here is an example of using @code{mblen} following these rules:
1541
1542@smallexample
1543void
1544scan_string (char *s)
1545@{
1546 int length = strlen (s);
1547
1548 /* @r{Initialize shift state.} */
1549 mblen (NULL, 0);
1550
1551 while (1)
1552 @{
1553 int thischar = mblen (s, length);
1554 /* @r{Deal with end of string and invalid characters.} */
1555 if (thischar == 0)
1556 break;
1557 if (thischar == -1)
1558 @{
1559 error ("invalid multibyte character");
1560 break;
1561 @}
1562 /* @r{Advance past this character.} */
1563 s += thischar;
1564 length -= thischar;
1565 @}
1566@}
1567@end smallexample
1568
1569The functions @code{mblen}, @code{mbtowc} and @code{wctomb} are not
1570reentrant when using a multibyte code that uses a shift state. However,
1571no other library functions call these functions, so you don't have to
1572worry that the shift state will be changed mysteriously.
1573
1574
1575@node Generic Charset Conversion
1576@section Generic Charset Conversion
1577
1578The conversion functions mentioned so far in this chapter all had in
1579common that they operate on character sets that are not directly
1580specified by the functions. The multibyte encoding used is specified by
1581the currently selected locale for the @code{LC_CTYPE} category. The
1f77f049 1582wide character set is fixed by the implementation (in the case of @theglibc{}
d987d219 1583it is always UCS-4 encoded @w{ISO 10646}).
0b2b18a2
UD
1584
1585This has of course several problems when it comes to general character
1586conversion:
1587
1588@itemize @bullet
1589@item
bd3916e8
UD
1590For every conversion where neither the source nor the destination
1591character set is the character set of the locale for the @code{LC_CTYPE}
1592category, one has to change the @code{LC_CTYPE} locale using
0b2b18a2
UD
1593@code{setlocale}.
1594
79c6869c 1595Changing the @code{LC_CTYPE} locale introduces major problems for the rest
bd3916e8
UD
1596of the programs since several more functions (e.g., the character
1597classification functions, @pxref{Classification of Characters}) use the
0b2b18a2
UD
1598@code{LC_CTYPE} category.
1599
1600@item
1601Parallel conversions to and from different character sets are not
1602possible since the @code{LC_CTYPE} selection is global and shared by all
1603threads.
1604
1605@item
1606If neither the source nor the destination character set is the character
1607set used for @code{wchar_t} representation, there is at least a two-step
bd3916e8
UD
1608process necessary to convert a text using the functions above. One would
1609have to select the source character set as the multibyte encoding,
0b2b18a2
UD
1610convert the text into a @code{wchar_t} text, select the destination
1611character set as the multibyte encoding, and convert the wide character
1612text to the multibyte (@math{=} destination) character set.
1613
1614Even if this is possible (which is not guaranteed) it is a very tiring
1615work. Plus it suffers from the other two raised points even more due to
1616the steady changing of the locale.
1617@end itemize
1618
1619The XPG2 standard defines a completely new set of functions, which has
1620none of these limitations. They are not at all coupled to the selected
1621locales, and they have no constraints on the character sets selected for
bd3916e8
UD
1622source and destination. Only the set of available conversions limits
1623them. The standard does not specify that any conversion at all must be
1624available. Such availability is a measure of the quality of the
0b2b18a2
UD
1625implementation.
1626
1627In the following text first the interface to @code{iconv} and then the
1628conversion function, will be described. Comparisons with other
1629implementations will show what obstacles stand in the way of portable
bd3916e8 1630applications. Finally, the implementation is described in so far as might
0b2b18a2
UD
1631interest the advanced user who wants to extend conversion capabilities.
1632
1633@menu
1634* Generic Conversion Interface:: Generic Character Set Conversion Interface.
1635* iconv Examples:: A complete @code{iconv} example.
1636* Other iconv Implementations:: Some Details about other @code{iconv}
1637 Implementations.
1638* glibc iconv Implementation:: The @code{iconv} Implementation in the GNU C
1639 library.
1640@end menu
1641
1642@node Generic Conversion Interface
1643@subsection Generic Character Set Conversion Interface
1644
1645This set of functions follows the traditional cycle of using a resource:
1646open--use--close. The interface consists of three functions, each of
1647which implements one step.
1648
1649Before the interfaces are described it is necessary to introduce a
1650data type. Just like other open--use--close interfaces the functions
1651introduced here work using handles and the @file{iconv.h} header
1652defines a special type for the handles used.
1653
0b2b18a2 1654@deftp {Data Type} iconv_t
d08a7e4c 1655@standards{XPG2, iconv.h}
0b2b18a2
UD
1656This data type is an abstract type defined in @file{iconv.h}. The user
1657must not assume anything about the definition of this type; it must be
1658completely opaque.
1659
d987d219 1660Objects of this type can be assigned handles for the conversions using
0b2b18a2
UD
1661the @code{iconv} functions. The objects themselves need not be freed, but
1662the conversions for which the handles stand for have to.
1663@end deftp
1664
1665@noindent
1666The first step is the function to create a handle.
1667
0b2b18a2 1668@deftypefun iconv_t iconv_open (const char *@var{tocode}, const char *@var{fromcode})
d08a7e4c 1669@standards{XPG2, iconv.h}
86e60666
AO
1670@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
1671@c Calls malloc if tocode and/or fromcode are too big for alloca. Calls
1672@c strip and upstr on both, then gconv_open. strip and upstr call
1673@c isalnum_l and toupper_l with the C locale. gconv_open may MT-safely
1674@c tokenize toset, replace unspecified codesets with the current locale
1675@c (possibly two different accesses), and finally it calls
1676@c gconv_find_transform and initializes the gconv_t result with all the
1677@c steps in the conversion sequence, running each one's initializer,
1678@c destructing and releasing them all if anything fails.
1679
0b2b18a2
UD
1680The @code{iconv_open} function has to be used before starting a
1681conversion. The two parameters this function takes determine the
1682source and destination character set for the conversion, and if the
1683implementation has the possibility to perform such a conversion, the
1684function returns a handle.
1685
bd3916e8 1686If the wanted conversion is not available, the @code{iconv_open} function
cf822e3c 1687returns @code{(iconv_t) -1}. In this case the global variable
0b2b18a2
UD
1688@code{errno} can have the following values:
1689
1690@table @code
1691@item EMFILE
1692The process already has @code{OPEN_MAX} file descriptors open.
1693@item ENFILE
d987d219 1694The system limit of open files is reached.
0b2b18a2
UD
1695@item ENOMEM
1696Not enough memory to carry out the operation.
1697@item EINVAL
1698The conversion from @var{fromcode} to @var{tocode} is not supported.
1699@end table
1700
1701It is not possible to use the same descriptor in different threads to
1702perform independent conversions. The data structures associated
1703with the descriptor include information about the conversion state.
1704This must not be messed up by using it in different conversions.
1705
1706An @code{iconv} descriptor is like a file descriptor as for every use a
1707new descriptor must be created. The descriptor does not stand for all
1708of the conversions from @var{fromset} to @var{toset}.
1709
1f77f049 1710The @glibcadj{} implementation of @code{iconv_open} has one
0b2b18a2
UD
1711significant extension to other implementations. To ease the extension
1712of the set of available conversions, the implementation allows storing
bd3916e8 1713the necessary files with data and code in an arbitrary number of
0b2b18a2
UD
1714directories. How this extension must be written will be explained below
1715(@pxref{glibc iconv Implementation}). Here it is only important to say
1716that all directories mentioned in the @code{GCONV_PATH} environment
1717variable are considered only if they contain a file @file{gconv-modules}.
1718These directories need not necessarily be created by the system
1719administrator. In fact, this extension is introduced to help users
bd3916e8 1720writing and using their own, new conversions. Of course, this does not
0b2b18a2 1721work for security reasons in SUID binaries; in this case only the system
bd3916e8
UD
1722directory is considered and this normally is
1723@file{@var{prefix}/lib/gconv}. The @code{GCONV_PATH} environment
1724variable is examined exactly once at the first call of the
1725@code{iconv_open} function. Later modifications of the variable have no
0b2b18a2
UD
1726effect.
1727
1728@pindex iconv.h
bd3916e8
UD
1729The @code{iconv_open} function was introduced early in the X/Open
1730Portability Guide, @w{version 2}. It is supported by all commercial
1731Unices as it is required for the Unix branding. However, the quality and
1732completeness of the implementation varies widely. The @code{iconv_open}
0b2b18a2
UD
1733function is declared in @file{iconv.h}.
1734@end deftypefun
1735
1736The @code{iconv} implementation can associate large data structure with
bd3916e8
UD
1737the handle returned by @code{iconv_open}. Therefore, it is crucial to
1738free all the resources once all conversions are carried out and the
0b2b18a2
UD
1739conversion is not needed anymore.
1740
0b2b18a2 1741@deftypefun int iconv_close (iconv_t @var{cd})
d08a7e4c 1742@standards{XPG2, iconv.h}
86e60666
AO
1743@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
1744@c Calls gconv_close to destruct and release each of the conversion
1745@c steps, release the gconv_t object, then call gconv_close_transform.
1746@c Access to the gconv_t object is not guarded, but calling iconv_close
1747@c concurrently with any other use is undefined.
1748
0b2b18a2
UD
1749The @code{iconv_close} function frees all resources associated with the
1750handle @var{cd}, which must have been returned by a successful call to
1751the @code{iconv_open} function.
1752
1753If the function call was successful the return value is @math{0}.
1754Otherwise it is @math{-1} and @code{errno} is set appropriately.
d987d219 1755Defined errors are:
0b2b18a2
UD
1756
1757@table @code
1758@item EBADF
1759The conversion descriptor is invalid.
1760@end table
1761
1762@pindex iconv.h
bd3916e8 1763The @code{iconv_close} function was introduced together with the rest
0b2b18a2
UD
1764of the @code{iconv} functions in XPG2 and is declared in @file{iconv.h}.
1765@end deftypefun
1766
1767The standard defines only one actual conversion function. This has,
1768therefore, the most general interface: it allows conversion from one
1769buffer to another. Conversion from a file to a buffer, vice versa, or
1770even file to file can be implemented on top of it.
1771
0b2b18a2 1772@deftypefun size_t iconv (iconv_t @var{cd}, char **@var{inbuf}, size_t *@var{inbytesleft}, char **@var{outbuf}, size_t *@var{outbytesleft})
d08a7e4c 1773@standards{XPG2, iconv.h}
86e60666
AO
1774@safety{@prelim{}@mtsafe{@mtsrace{:cd}}@assafe{}@acunsafe{@acucorrupt{}}}
1775@c Without guarding access to the iconv_t object pointed to by cd, call
1776@c the conversion function to convert inbuf or flush the internal
1777@c conversion state.
0b2b18a2
UD
1778@cindex stateful
1779The @code{iconv} function converts the text in the input buffer
1780according to the rules associated with the descriptor @var{cd} and
1781stores the result in the output buffer. It is possible to call the
1782function for the same text several times in a row since for stateful
1783character sets the necessary state information is kept in the data
1784structures associated with the descriptor.
1785
1786The input buffer is specified by @code{*@var{inbuf}} and it contains
1787@code{*@var{inbytesleft}} bytes. The extra indirection is necessary for
1788communicating the used input back to the caller (see below). It is
1789important to note that the buffer pointer is of type @code{char} and the
1790length is measured in bytes even if the input text is encoded in wide
1791characters.
1792
1793The output buffer is specified in a similar way. @code{*@var{outbuf}}
1794points to the beginning of the buffer with at least
1795@code{*@var{outbytesleft}} bytes room for the result. The buffer
1796pointer again is of type @code{char} and the length is measured in
1797bytes. If @var{outbuf} or @code{*@var{outbuf}} is a null pointer, the
1798conversion is performed but no output is available.
1799
1800If @var{inbuf} is a null pointer, the @code{iconv} function performs the
1801necessary action to put the state of the conversion into the initial
1802state. This is obviously a no-op for non-stateful encodings, but if the
1803encoding has a state, such a function call might put some byte sequences
1804in the output buffer, which perform the necessary state changes. The
1805next call with @var{inbuf} not being a null pointer then simply goes on
1806from the initial state. It is important that the programmer never makes
bd3916e8
UD
1807any assumption as to whether the conversion has to deal with states.
1808Even if the input and output character sets are not stateful, the
0b2b18a2 1809implementation might still have to keep states. This is due to the
1f77f049 1810implementation chosen for @theglibc{} as it is described below.
0b2b18a2
UD
1811Therefore an @code{iconv} call to reset the state should always be
1812performed if some protocol requires this for the output text.
1813
cf822e3c 1814The conversion stops for one of three reasons. The first is that all
0b2b18a2
UD
1815characters from the input buffer are converted. This actually can mean
1816two things: either all bytes from the input buffer are consumed or
1817there are some bytes at the end of the buffer that possibly can form a
1818complete character but the input is incomplete. The second reason for a
1819stop is that the output buffer is full. And the third reason is that
1820the input contains invalid characters.
1821
1822In all of these cases the buffer pointers after the last successful
d987d219 1823conversion, for the input and output buffers, are stored in @var{inbuf} and
0b2b18a2
UD
1824@var{outbuf}, and the available room in each buffer is stored in
1825@var{inbytesleft} and @var{outbytesleft}.
1826
1827Since the character sets selected in the @code{iconv_open} call can be
1828almost arbitrary, there can be situations where the input buffer contains
1829valid characters, which have no identical representation in the output
1830character set. The behavior in this situation is undefined. The
1f77f049 1831@emph{current} behavior of @theglibc{} in this situation is to
0b2b18a2
UD
1832return with an error immediately. This certainly is not the most
1833desirable solution; therefore, future versions will provide better ones,
1834but they are not yet finished.
1835
1836If all input from the input buffer is successfully converted and stored
1837in the output buffer, the function returns the number of non-reversible
1838conversions performed. In all other cases the return value is
1839@code{(size_t) -1} and @code{errno} is set appropriately. In such cases
1840the value pointed to by @var{inbytesleft} is nonzero.
1841
1842@table @code
1843@item EILSEQ
1844The conversion stopped because of an invalid byte sequence in the input.
1845After the call, @code{*@var{inbuf}} points at the first byte of the
1846invalid byte sequence.
1847
1848@item E2BIG
1849The conversion stopped because it ran out of space in the output buffer.
1850
1851@item EINVAL
1852The conversion stopped because of an incomplete byte sequence at the end
1853of the input buffer.
1854
1855@item EBADF
1856The @var{cd} argument is invalid.
1857@end table
1858
1859@pindex iconv.h
bd3916e8 1860The @code{iconv} function was introduced in the XPG2 standard and is
0b2b18a2
UD
1861declared in the @file{iconv.h} header.
1862@end deftypefun
1863
1864The definition of the @code{iconv} function is quite good overall. It
1865provides quite flexible functionality. The only problems lie in the
1866boundary cases, which are incomplete byte sequences at the end of the
1867input buffer and invalid input. A third problem, which is not really
1868a design problem, is the way conversions are selected. The standard
1869does not say anything about the legitimate names, a minimal set of
1870available conversions. We will see how this negatively impacts other
1871implementations, as demonstrated below.
1872
1873@node iconv Examples
1874@subsection A complete @code{iconv} example
1875
1876The example below features a solution for a common problem. Given that
1877one knows the internal encoding used by the system for @code{wchar_t}
1878strings, one often is in the position to read text from a file and store
1879it in wide character buffers. One can do this using @code{mbsrtowcs},
1880but then we run into the problems discussed above.
1881
1882@smallexample
1883int
1884file2wcs (int fd, const char *charset, wchar_t *outbuf, size_t avail)
1885@{
1886 char inbuf[BUFSIZ];
1887 size_t insize = 0;
1888 char *wrptr = (char *) outbuf;
1889 int result = 0;
1890 iconv_t cd;
1891
1892 cd = iconv_open ("WCHAR_T", charset);
1893 if (cd == (iconv_t) -1)
1894 @{
1895 /* @r{Something went wrong.} */
1896 if (errno == EINVAL)
1897 error (0, 0, "conversion from '%s' to wchar_t not available",
1898 charset);
1899 else
1900 perror ("iconv_open");
1901
1902 /* @r{Terminate the output string.} */
1903 *outbuf = L'\0';
1904
1905 return -1;
1906 @}
1907
1908 while (avail > 0)
1909 @{
1910 size_t nread;
1911 size_t nconv;
1912 char *inptr = inbuf;
1913
1914 /* @r{Read more input.} */
1915 nread = read (fd, inbuf + insize, sizeof (inbuf) - insize);
1916 if (nread == 0)
1917 @{
1918 /* @r{When we come here the file is completely read.}
1919 @r{This still could mean there are some unused}
1920 @r{characters in the @code{inbuf}. Put them back.} */
1921 if (lseek (fd, -insize, SEEK_CUR) == -1)
1922 result = -1;
1923
1924 /* @r{Now write out the byte sequence to get into the}
1925 @r{initial state if this is necessary.} */
1926 iconv (cd, NULL, NULL, &wrptr, &avail);
1927
1928 break;
1929 @}
1930 insize += nread;
1931
1932 /* @r{Do the conversion.} */
1933 nconv = iconv (cd, &inptr, &insize, &wrptr, &avail);
1934 if (nconv == (size_t) -1)
1935 @{
1936 /* @r{Not everything went right. It might only be}
1937 @r{an unfinished byte sequence at the end of the}
1938 @r{buffer. Or it is a real problem.} */
1939 if (errno == EINVAL)
1940 /* @r{This is harmless. Simply move the unused}
1941 @r{bytes to the beginning of the buffer so that}
1942 @r{they can be used in the next round.} */
1943 memmove (inbuf, inptr, insize);
1944 else
1945 @{
1946 /* @r{It is a real problem. Maybe we ran out of}
1947 @r{space in the output buffer or we have invalid}
1948 @r{input. In any case back the file pointer to}
1949 @r{the position of the last processed byte.} */
1950 lseek (fd, -insize, SEEK_CUR);
1951 result = -1;
1952 break;
1953 @}
1954 @}
1955 @}
1956
1957 /* @r{Terminate the output string.} */
1958 if (avail >= sizeof (wchar_t))
1959 *((wchar_t *) wrptr) = L'\0';
1960
1961 if (iconv_close (cd) != 0)
1962 perror ("iconv_close");
1963
1964 return (wchar_t *) wrptr - outbuf;
1965@}
1966@end smallexample
1967
1968@cindex stateful
1969This example shows the most important aspects of using the @code{iconv}
1970functions. It shows how successive calls to @code{iconv} can be used to
1971convert large amounts of text. The user does not have to care about
1972stateful encodings as the functions take care of everything.
1973
1974An interesting point is the case where @code{iconv} returns an error and
bd3916e8
UD
1975@code{errno} is set to @code{EINVAL}. This is not really an error in the
1976transformation. It can happen whenever the input character set contains
1977byte sequences of more than one byte for some character and texts are not
1978processed in one piece. In this case there is a chance that a multibyte
1979sequence is cut. The caller can then simply read the remainder of the
1980takes and feed the offending bytes together with new character from the
1981input to @code{iconv} and continue the work. The internal state kept in
1982the descriptor is @emph{not} unspecified after such an event as is the
0b2b18a2
UD
1983case with the conversion functions from the @w{ISO C} standard.
1984
1985The example also shows the problem of using wide character strings with
1986@code{iconv}. As explained in the description of the @code{iconv}
1987function above, the function always takes a pointer to a @code{char}
1988array and the available space is measured in bytes. In the example, the
1989output buffer is a wide character buffer; therefore, we use a local
1990variable @var{wrptr} of type @code{char *}, which is used in the
1991@code{iconv} calls.
1992
1993This looks rather innocent but can lead to problems on platforms that
bd3916e8
UD
1994have tight restriction on alignment. Therefore the caller of @code{iconv}
1995has to make sure that the pointers passed are suitable for access of
0b2b18a2
UD
1996characters from the appropriate character set. Since, in the
1997above case, the input parameter to the function is a @code{wchar_t}
1998pointer, this is the case (unless the user violates alignment when
1999computing the parameter). But in other situations, especially when
2000writing generic functions where one does not know what type of character
2001set one uses and, therefore, treats text as a sequence of bytes, it might
2002become tricky.
2003
2004@node Other iconv Implementations
2005@subsection Some Details about other @code{iconv} Implementations
2006
2007This is not really the place to discuss the @code{iconv} implementation
2008of other systems but it is necessary to know a bit about them to write
2009portable programs. The above mentioned problems with the specification
2010of the @code{iconv} functions can lead to portability issues.
2011
2012The first thing to notice is that, due to the large number of character
2013sets in use, it is certainly not practical to encode the conversions
2014directly in the C library. Therefore, the conversion information must
2015come from files outside the C library. This is usually done in one or
2016both of the following ways:
2017
2018@itemize @bullet
2019@item
2020The C library contains a set of generic conversion functions that can
2021read the needed conversion tables and other information from data files.
2022These files get loaded when necessary.
2023
2024This solution is problematic as it requires a great deal of effort to
bd3916e8 2025apply to all character sets (potentially an infinite set). The
0b2b18a2
UD
2026differences in the structure of the different character sets is so large
2027that many different variants of the table-processing functions must be
bd3916e8 2028developed. In addition, the generic nature of these functions make them
0b2b18a2
UD
2029slower than specifically implemented functions.
2030
2031@item
2032The C library only contains a framework that can dynamically load
2033object files and execute the conversion functions contained therein.
2034
2035This solution provides much more flexibility. The C library itself
2036contains only very little code and therefore reduces the general memory
2037footprint. Also, with a documented interface between the C library and
2038the loadable modules it is possible for third parties to extend the set
2039of available conversion modules. A drawback of this solution is that
2040dynamic loading must be available.
2041@end itemize
2042
bd3916e8
UD
2043Some implementations in commercial Unices implement a mixture of these
2044possibilities; the majority implement only the second solution. Using
2045loadable modules moves the code out of the library itself and keeps
0b2b18a2
UD
2046the door open for extensions and improvements, but this design is also
2047limiting on some platforms since not many platforms support dynamic
2048loading in statically linked programs. On platforms without this
2049capability it is therefore not possible to use this interface in
1f77f049 2050statically linked programs. @Theglibc{} has, on ELF platforms, no
0b2b18a2 2051problems with dynamic loading in these situations; therefore, this
bd3916e8 2052point is moot. The danger is that one gets acquainted with this
0b2b18a2
UD
2053situation and forgets about the restrictions on other systems.
2054
2055A second thing to know about other @code{iconv} implementations is that
2056the number of available conversions is often very limited. Some
2057implementations provide, in the standard release (not special
2058international or developer releases), at most 100 to 200 conversion
2059possibilities. This does not mean 200 different character sets are
bd3916e8 2060supported; for example, conversions from one character set to a set of 10
0b2b18a2 2061others might count as 10 conversions. Together with the other direction
bd3916e8 2062this makes 20 conversion possibilities used up by one character set. One
d987d219 2063can imagine the thin coverage these platforms provide. Some Unix vendors
bd3916e8 2064even provide only a handful of conversions, which renders them useless for
0b2b18a2
UD
2065almost all uses.
2066
2067This directly leads to a third and probably the most problematic point.
2068The way the @code{iconv} conversion functions are implemented on all
2069known Unix systems and the availability of the conversion functions from
2070character set @math{@cal{A}} to @math{@cal{B}} and the conversion from
2071@math{@cal{B}} to @math{@cal{C}} does @emph{not} imply that the
2072conversion from @math{@cal{A}} to @math{@cal{C}} is available.
2073
2074This might not seem unreasonable and problematic at first, but it is a
2075quite big problem as one will notice shortly after hitting it. To show
2076the problem we assume to write a program that has to convert from
2077@math{@cal{A}} to @math{@cal{C}}. A call like
2078
2079@smallexample
2080cd = iconv_open ("@math{@cal{C}}", "@math{@cal{A}}");
2081@end smallexample
2082
2083@noindent
2084fails according to the assumption above. But what does the program
2085do now? The conversion is necessary; therefore, simply giving up is not
2086an option.
2087
2088This is a nuisance. The @code{iconv} function should take care of this.
bd3916e8 2089But how should the program proceed from here on? If it tries to convert
0b2b18a2
UD
2090to character set @math{@cal{B}}, first the two @code{iconv_open}
2091calls
2092
2093@smallexample
2094cd1 = iconv_open ("@math{@cal{B}}", "@math{@cal{A}}");
2095@end smallexample
2096
2097@noindent
2098and
2099
2100@smallexample
2101cd2 = iconv_open ("@math{@cal{C}}", "@math{@cal{B}}");
2102@end smallexample
2103
2104@noindent
2105will succeed, but how to find @math{@cal{B}}?
2106
2107Unfortunately, the answer is: there is no general solution. On some
2108systems guessing might help. On those systems most character sets can
d987d219 2109convert to and from UTF-8 encoded @w{ISO 10646} or Unicode text. Besides
bd3916e8 2110this only some very system-specific methods can help. Since the
0b2b18a2
UD
2111conversion functions come from loadable modules and these modules must
2112be stored somewhere in the filesystem, one @emph{could} try to find them
2113and determine from the available file which conversions are available
2114and whether there is an indirect route from @math{@cal{A}} to
2115@math{@cal{C}}.
2116
bd3916e8 2117This example shows one of the design errors of @code{iconv} mentioned
0b2b18a2 2118above. It should at least be possible to determine the list of available
d987d219 2119conversions programmatically so that if @code{iconv_open} says there is no
0b2b18a2
UD
2120such conversion, one could make sure this also is true for indirect
2121routes.
2122
2123@node glibc iconv Implementation
1f77f049 2124@subsection The @code{iconv} Implementation in @theglibc{}
0b2b18a2
UD
2125
2126After reading about the problems of @code{iconv} implementations in the
2127last section it is certainly good to note that the implementation in
1f77f049 2128@theglibc{} has none of the problems mentioned above. What
0b2b18a2
UD
2129follows is a step-by-step analysis of the points raised above. The
2130evaluation is based on the current state of the development (as of
2131January 1999). The development of the @code{iconv} functions is not
2132complete, but basic functionality has solidified.
2133
1f77f049 2134@Theglibc{}'s @code{iconv} implementation uses shared loadable
0b2b18a2
UD
2135modules to implement the conversions. A very small number of
2136conversions are built into the library itself but these are only rather
2137trivial conversions.
2138
1f77f049 2139All the benefits of loadable modules are available in the @glibcadj{}
0b2b18a2
UD
2140implementation. This is especially appealing since the interface is
2141well documented (see below), and it, therefore, is easy to write new
2142conversion modules. The drawback of using loadable objects is not a
1f77f049 2143problem in @theglibc{}, at least on ELF systems. Since the
0b2b18a2 2144library is able to load shared objects even in statically linked
bd3916e8 2145binaries, static linking need not be forbidden in case one wants to use
0b2b18a2
UD
2146@code{iconv}.
2147
2148The second mentioned problem is the number of supported conversions.
1f77f049 2149Currently, @theglibc{} supports more than 150 character sets. The
0b2b18a2
UD
2150way the implementation is designed the number of supported conversions
2151is greater than 22350 (@math{150} times @math{149}). If any conversion
2152from or to a character set is missing, it can be added easily.
2153
2154Particularly impressive as it may be, this high number is due to the
1f77f049 2155fact that the @glibcadj{} implementation of @code{iconv} does not have
0b2b18a2
UD
2156the third problem mentioned above (i.e., whenever there is a conversion
2157from a character set @math{@cal{A}} to @math{@cal{B}} and from
2158@math{@cal{B}} to @math{@cal{C}} it is always possible to convert from
2159@math{@cal{A}} to @math{@cal{C}} directly). If the @code{iconv_open}
bd3916e8 2160returns an error and sets @code{errno} to @code{EINVAL}, there is no
0b2b18a2
UD
2161known way, directly or indirectly, to perform the wanted conversion.
2162
2163@cindex triangulation
bd3916e8
UD
2164Triangulation is achieved by providing for each character set a
2165conversion from and to UCS-4 encoded @w{ISO 10646}. Using @w{ISO 10646}
0b2b18a2
UD
2166as an intermediate representation it is possible to @dfn{triangulate}
2167(i.e., convert with an intermediate representation).
2168
2169There is no inherent requirement to provide a conversion to @w{ISO
217010646} for a new character set, and it is also possible to provide other
2171conversions where neither source nor destination character set is @w{ISO
bd3916e8 217210646}. The existing set of conversions is simply meant to cover all
0b2b18a2
UD
2173conversions that might be of interest.
2174
2175@cindex ISO-2022-JP
2176@cindex EUC-JP
2177All currently available conversions use the triangulation method above,
bd3916e8 2178making conversion run unnecessarily slow. If, for example, somebody
0b2b18a2
UD
2179often needs the conversion from ISO-2022-JP to EUC-JP, a quicker solution
2180would involve direct conversion between the two character sets, skipping
2181the input to @w{ISO 10646} first. The two character sets of interest
2182are much more similar to each other than to @w{ISO 10646}.
2183
2184In such a situation one easily can write a new conversion and provide it
1f77f049 2185as a better alternative. The @glibcadj{} @code{iconv} implementation
0b2b18a2
UD
2186would automatically use the module implementing the conversion if it is
2187specified to be more efficient.
2188
2189@subsubsection Format of @file{gconv-modules} files
2190
2191All information about the available conversions comes from a file named
2192@file{gconv-modules}, which can be found in any of the directories along
2193the @code{GCONV_PATH}. The @file{gconv-modules} files are line-oriented
2194text files, where each of the lines has one of the following formats:
2195
2196@itemize @bullet
2197@item
bd3916e8 2198If the first non-whitespace character is a @kbd{#} the line contains only
0b2b18a2
UD
2199comments and is ignored.
2200
2201@item
bd3916e8
UD
2202Lines starting with @code{alias} define an alias name for a character
2203set. Two more words are expected on the line. The first word
0b2b18a2
UD
2204defines the alias name, and the second defines the original name of the
2205character set. The effect is that it is possible to use the alias name
2206in the @var{fromset} or @var{toset} parameters of @code{iconv_open} and
2207achieve the same result as when using the real character set name.
2208
2209This is quite important as a character set has often many different
bd3916e8 2210names. There is normally an official name but this need not correspond to
d987d219 2211the most popular name. Besides this many character sets have special
bd3916e8
UD
2212names that are somehow constructed. For example, all character sets
2213specified by the ISO have an alias of the form @code{ISO-IR-@var{nnn}}
2214where @var{nnn} is the registration number. This allows programs that
2215know about the registration number to construct character set names and
2216use them in @code{iconv_open} calls. More on the available names and
0b2b18a2
UD
2217aliases follows below.
2218
2219@item
2220Lines starting with @code{module} introduce an available conversion
2221module. These lines must contain three or four more words.
2222
2223The first word specifies the source character set, the second word the
bd3916e8 2224destination character set of conversion implemented in this module, and
0b2b18a2
UD
2225the third word is the name of the loadable module. The filename is
2226constructed by appending the usual shared object suffix (normally
2227@file{.so}) and this file is then supposed to be found in the same
bd3916e8 2228directory the @file{gconv-modules} file is in. The last word on the line,
0b2b18a2
UD
2229which is optional, is a numeric value representing the cost of the
2230conversion. If this word is missing, a cost of @math{1} is assumed. The
2231numeric value itself does not matter that much; what counts are the
2232relative values of the sums of costs for all possible conversion paths.
2233Below is a more precise description of the use of the cost value.
2234@end itemize
2235
2236Returning to the example above where one has written a module to directly
2237convert from ISO-2022-JP to EUC-JP and back. All that has to be done is
2238to put the new module, let its name be ISO2022JP-EUCJP.so, in a directory
2239and add a file @file{gconv-modules} with the following content in the
2240same directory:
2241
2242@smallexample
2243module ISO-2022-JP// EUC-JP// ISO2022JP-EUCJP 1
2244module EUC-JP// ISO-2022-JP// ISO2022JP-EUCJP 1
2245@end smallexample
2246
2247To see why this is sufficient, it is necessary to understand how the
2248conversion used by @code{iconv} (and described in the descriptor) is
2249selected. The approach to this problem is quite simple.
2250
2251At the first call of the @code{iconv_open} function the program reads
2252all available @file{gconv-modules} files and builds up two tables: one
2253containing all the known aliases and another that contains the
2254information about the conversions and which shared object implements
2255them.
2256
2257@subsubsection Finding the conversion path in @code{iconv}
2258
2259The set of available conversions form a directed graph with weighted
2260edges. The weights on the edges are the costs specified in the
2261@file{gconv-modules} files. The @code{iconv_open} function uses an
2262algorithm suitable for search for the best path in such a graph and so
2263constructs a list of conversions that must be performed in succession
2264to get the transformation from the source to the destination character
2265set.
2266
2267Explaining why the above @file{gconv-modules} files allows the
2268@code{iconv} implementation to resolve the specific ISO-2022-JP to
2269EUC-JP conversion module instead of the conversion coming with the
2270library itself is straightforward. Since the latter conversion takes two
2271steps (from ISO-2022-JP to @w{ISO 10646} and then from @w{ISO 10646} to
2272EUC-JP), the cost is @math{1+1 = 2}. The above @file{gconv-modules}
2273file, however, specifies that the new conversion modules can perform this
2274conversion with only the cost of @math{1}.
2275
2276A mysterious item about the @file{gconv-modules} file above (and also
1f77f049 2277the file coming with @theglibc{}) are the names of the character
0b2b18a2
UD
2278sets specified in the @code{module} lines. Why do almost all the names
2279end in @code{//}? And this is not all: the names can actually be
2280regular expressions. At this point in time this mystery should not be
2281revealed, unless you have the relevant spell-casting materials: ashes
2282from an original @w{DOS 6.2} boot disk burnt in effigy, a crucifix
2283blessed by St.@: Emacs, assorted herbal roots from Central America, sand
2284from Cebu, etc. Sorry! @strong{The part of the implementation where
2285this is used is not yet finished. For now please simply follow the
2286existing examples. It'll become clearer once it is. --drepper}
2287
2288A last remark about the @file{gconv-modules} is about the names not
bd3916e8
UD
2289ending with @code{//}. A character set named @code{INTERNAL} is often
2290mentioned. From the discussion above and the chosen name it should have
2291become clear that this is the name for the representation used in the
2292intermediate step of the triangulation. We have said that this is UCS-4
2293but actually that is not quite right. The UCS-4 specification also
2294includes the specification of the byte ordering used. Since a UCS-4 value
6c55cda3 2295consists of four bytes, a stored value is affected by byte ordering. The
bd3916e8
UD
2296internal representation is @emph{not} the same as UCS-4 in case the byte
2297ordering of the processor (or at least the running process) is not the
2298same as the one required for UCS-4. This is done for performance reasons
2299as one does not want to perform unnecessary byte-swapping operations if
2300one is not interested in actually seeing the result in UCS-4. To avoid
11bf311e 2301trouble with endianness, the internal representation consistently is named
bd3916e8 2302@code{INTERNAL} even on big-endian systems where the representations are
0b2b18a2
UD
2303identical.
2304
2305@subsubsection @code{iconv} module data structures
2306
bd3916e8 2307So far this section has described how modules are located and considered
0b2b18a2 2308to be used. What remains to be described is the interface of the modules
cf822e3c 2309so that one can write new ones. This section describes the interface as
bd3916e8 2310it is in use in January 1999. The interface will change a bit in the
0b2b18a2
UD
2311future but, with luck, only in an upwardly compatible way.
2312
2313The definitions necessary to write new modules are publicly available
2314in the non-standard header @file{gconv.h}. The following text,
bd3916e8 2315therefore, describes the definitions from this header file. First,
0b2b18a2
UD
2316however, it is necessary to get an overview.
2317
2318From the perspective of the user of @code{iconv} the interface is quite
bd3916e8
UD
2319simple: the @code{iconv_open} function returns a handle that can be used
2320in calls to @code{iconv}, and finally the handle is freed with a call to
0b2b18a2
UD
2321@code{iconv_close}. The problem is that the handle has to be able to
2322represent the possibly long sequences of conversion steps and also the
2323state of each conversion since the handle is all that is passed to the
2324@code{iconv} function. Therefore, the data structures are really the
2325elements necessary to understanding the implementation.
2326
2327We need two different kinds of data structures. The first describes the
2328conversion and the second describes the state etc. There are really two
2329type definitions like this in @file{gconv.h}.
2330@pindex gconv.h
2331
0b2b18a2 2332@deftp {Data type} {struct __gconv_step}
d08a7e4c 2333@standards{GNU, gconv.h}
0b2b18a2
UD
2334This data structure describes one conversion a module can perform. For
2335each function in a loaded module with conversion functions there is
2336exactly one object of this type. This object is shared by all users of
2337the conversion (i.e., this object does not contain any information
2338corresponding to an actual conversion; it only describes the conversion
2339itself).
2340
2341@table @code
2342@item struct __gconv_loaded_object *__shlib_handle
2343@itemx const char *__modname
2344@itemx int __counter
2345All these elements of the structure are used internally in the C library
d987d219 2346to coordinate loading and unloading the shared object. One must not expect any
0b2b18a2
UD
2347of the other elements to be available or initialized.
2348
2349@item const char *__from_name
2350@itemx const char *__to_name
2351@code{__from_name} and @code{__to_name} contain the names of the source and
2352destination character sets. They can be used to identify the actual
bd3916e8 2353conversion to be carried out since one module might implement conversions
0b2b18a2
UD
2354for more than one character set and/or direction.
2355
2356@item gconv_fct __fct
2357@itemx gconv_init_fct __init_fct
2358@itemx gconv_end_fct __end_fct
2359These elements contain pointers to the functions in the loadable module.
2360The interface will be explained below.
2361
2362@item int __min_needed_from
2363@itemx int __max_needed_from
2364@itemx int __min_needed_to
2365@itemx int __max_needed_to;
2366These values have to be supplied in the init function of the module. The
2367@code{__min_needed_from} value specifies how many bytes a character of
2368the source character set at least needs. The @code{__max_needed_from}
2369specifies the maximum value that also includes possible shift sequences.
2370
2371The @code{__min_needed_to} and @code{__max_needed_to} values serve the
bd3916e8 2372same purpose as @code{__min_needed_from} and @code{__max_needed_from} but
0b2b18a2
UD
2373this time for the destination character set.
2374
2375It is crucial that these values be accurate since otherwise the
2376conversion functions will have problems or not work at all.
2377
2378@item int __stateful
bd3916e8
UD
2379This element must also be initialized by the init function.
2380@code{int __stateful} is nonzero if the source character set is stateful.
0b2b18a2
UD
2381Otherwise it is zero.
2382
2383@item void *__data
2384This element can be used freely by the conversion functions in the
bd3916e8
UD
2385module. @code{void *__data} can be used to communicate extra information
2386from one call to another. @code{void *__data} need not be initialized if
2387not needed at all. If @code{void *__data} element is assigned a pointer
2388to dynamically allocated memory (presumably in the init function) it has
2389to be made sure that the end function deallocates the memory. Otherwise
0b2b18a2
UD
2390the application will leak memory.
2391
2392It is important to be aware that this data structure is shared by all
2393users of this specification conversion and therefore the @code{__data}
2394element must not contain data specific to one specific use of the
2395conversion function.
2396@end table
2397@end deftp
2398
0b2b18a2 2399@deftp {Data type} {struct __gconv_step_data}
d08a7e4c 2400@standards{GNU, gconv.h}
0b2b18a2
UD
2401This is the data structure that contains the information specific to
2402each use of the conversion functions.
2403
2404
2405@table @code
2406@item char *__outbuf
2407@itemx char *__outbufend
2408These elements specify the output buffer for the conversion step. The
2409@code{__outbuf} element points to the beginning of the buffer, and
2410@code{__outbufend} points to the byte following the last byte in the
2411buffer. The conversion function must not assume anything about the size
d987d219 2412of the buffer but it can be safely assumed there is room for at
0b2b18a2
UD
2413least one complete character in the output buffer.
2414
2415Once the conversion is finished, if the conversion is the last step, the
2416@code{__outbuf} element must be modified to point after the last byte
2417written into the buffer to signal how much output is available. If this
2418conversion step is not the last one, the element must not be modified.
2419The @code{__outbufend} element must not be modified.
2420
2421@item int __is_last
2422This element is nonzero if this conversion step is the last one. This
2423information is necessary for the recursion. See the description of the
2424conversion function internals below. This element must never be
2425modified.
2426
2427@item int __invocation_counter
bd3916e8
UD
2428The conversion function can use this element to see how many calls of
2429the conversion function already happened. Some character sets require a
0b2b18a2 2430certain prolog when generating output, and by comparing this value with
bd3916e8
UD
2431zero, one can find out whether it is the first call and whether,
2432therefore, the prolog should be emitted. This element must never be
0b2b18a2
UD
2433modified.
2434
2435@item int __internal_use
2436This element is another one rarely used but needed in certain
2437situations. It is assigned a nonzero value in case the conversion
2438functions are used to implement @code{mbsrtowcs} et.al.@: (i.e., the
2439function is not used directly through the @code{iconv} interface).
2440
2441This sometimes makes a difference as it is expected that the
2442@code{iconv} functions are used to translate entire texts while the
2443@code{mbsrtowcs} functions are normally used only to convert single
2444strings and might be used multiple times to convert entire texts.
2445
2446But in this situation we would have problem complying with some rules of
2447the character set specification. Some character sets require a prolog,
2448which must appear exactly once for an entire text. If a number of
2449@code{mbsrtowcs} calls are used to convert the text, only the first call
2450must add the prolog. However, because there is no communication between the
2451different calls of @code{mbsrtowcs}, the conversion functions have no
2452possibility to find this out. The situation is different for sequences
2453of @code{iconv} calls since the handle allows access to the needed
2454information.
2455
bd3916e8 2456The @code{int __internal_use} element is mostly used together with
0b2b18a2
UD
2457@code{__invocation_counter} as follows:
2458
2459@smallexample
2460if (!data->__internal_use
2461 && data->__invocation_counter == 0)
2462 /* @r{Emit prolog.} */
95fdc6a0 2463 @dots{}
0b2b18a2
UD
2464@end smallexample
2465
2466This element must never be modified.
2467
2468@item mbstate_t *__statep
2469The @code{__statep} element points to an object of type @code{mbstate_t}
2470(@pxref{Keeping the state}). The conversion of a stateful character
bd3916e8
UD
2471set must use the object pointed to by @code{__statep} to store
2472information about the conversion state. The @code{__statep} element
0b2b18a2
UD
2473itself must never be modified.
2474
2475@item mbstate_t __state
2476This element must @emph{never} be used directly. It is only part of
2477this structure to have the needed space allocated.
2478@end table
2479@end deftp
2480
2481@subsubsection @code{iconv} module interfaces
2482
2483With the knowledge about the data structures we now can describe the
2484conversion function itself. To understand the interface a bit of
bd3916e8 2485knowledge is necessary about the functionality in the C library that
0b2b18a2
UD
2486loads the objects with the conversions.
2487
2488It is often the case that one conversion is used more than once (i.e.,
2489there are several @code{iconv_open} calls for the same set of character
2490sets during one program run). The @code{mbsrtowcs} et.al.@: functions in
1f77f049 2491@theglibc{} also use the @code{iconv} functionality, which
0b2b18a2
UD
2492increases the number of uses of the same functions even more.
2493
bd3916e8
UD
2494Because of this multiple use of conversions, the modules do not get
2495loaded exclusively for one conversion. Instead a module once loaded can
2496be used by an arbitrary number of @code{iconv} or @code{mbsrtowcs} calls
0b2b18a2 2497at the same time. The splitting of the information between conversion-
bd3916e8 2498function-specific information and conversion data makes this possible.
0b2b18a2
UD
2499The last section showed the two data structures used to do this.
2500
2501This is of course also reflected in the interface and semantics of the
2502functions that the modules must provide. There are three functions that
2503must have the following names:
2504
2505@table @code
2506@item gconv_init
2507The @code{gconv_init} function initializes the conversion function
2508specific data structure. This very same object is shared by all
2509conversions that use this conversion and, therefore, no state information
bd3916e8
UD
2510about the conversion itself must be stored in here. If a module
2511implements more than one conversion, the @code{gconv_init} function will
0b2b18a2
UD
2512be called multiple times.
2513
2514@item gconv_end
2515The @code{gconv_end} function is responsible for freeing all resources
2516allocated by the @code{gconv_init} function. If there is nothing to do,
2517this function can be missing. Special care must be taken if the module
2518implements more than one conversion and the @code{gconv_init} function
2519does not allocate the same resources for all conversions.
2520
2521@item gconv
2522This is the actual conversion function. It is called to convert one
2523block of text. It gets passed the conversion step information
2524initialized by @code{gconv_init} and the conversion data, specific to
2525this use of the conversion functions.
2526@end table
2527
2528There are three data types defined for the three module interface
2529functions and these define the interface.
2530
0b2b18a2 2531@deftypevr {Data type} int {(*__gconv_init_fct)} (struct __gconv_step *)
d08a7e4c 2532@standards{GNU, gconv.h}
0b2b18a2
UD
2533This specifies the interface of the initialization function of the
2534module. It is called exactly once for each conversion the module
2535implements.
2536
2537As explained in the description of the @code{struct __gconv_step} data
2538structure above the initialization function has to initialize parts of
2539it.
2540
2541@table @code
2542@item __min_needed_from
2543@itemx __max_needed_from
2544@itemx __min_needed_to
2545@itemx __max_needed_to
2546These elements must be initialized to the exact numbers of the minimum
2547and maximum number of bytes used by one character in the source and
2548destination character sets, respectively. If the characters all have the
2549same size, the minimum and maximum values are the same.
2550
2551@item __stateful
9dcc8f11 2552This element must be initialized to a nonzero value if the source
0b2b18a2
UD
2553character set is stateful. Otherwise it must be zero.
2554@end table
2555
2556If the initialization function needs to communicate some information
bd3916e8
UD
2557to the conversion function, this communication can happen using the
2558@code{__data} element of the @code{__gconv_step} structure. But since
2559this data is shared by all the conversions, it must not be modified by
0b2b18a2
UD
2560the conversion function. The example below shows how this can be used.
2561
2562@smallexample
2563#define MIN_NEEDED_FROM 1
2564#define MAX_NEEDED_FROM 4
2565#define MIN_NEEDED_TO 4
2566#define MAX_NEEDED_TO 4
2567
2568int
2569gconv_init (struct __gconv_step *step)
2570@{
2571 /* @r{Determine which direction.} */
2572 struct iso2022jp_data *new_data;
2573 enum direction dir = illegal_dir;
2574 enum variant var = illegal_var;
2575 int result;
2576
2577 if (__strcasecmp (step->__from_name, "ISO-2022-JP//") == 0)
2578 @{
2579 dir = from_iso2022jp;
2580 var = iso2022jp;
2581 @}
2582 else if (__strcasecmp (step->__to_name, "ISO-2022-JP//") == 0)
2583 @{
2584 dir = to_iso2022jp;
2585 var = iso2022jp;
2586 @}
2587 else if (__strcasecmp (step->__from_name, "ISO-2022-JP-2//") == 0)
2588 @{
2589 dir = from_iso2022jp;
2590 var = iso2022jp2;
2591 @}
2592 else if (__strcasecmp (step->__to_name, "ISO-2022-JP-2//") == 0)
2593 @{
2594 dir = to_iso2022jp;
2595 var = iso2022jp2;
2596 @}
2597
2598 result = __GCONV_NOCONV;
2599 if (dir != illegal_dir)
2600 @{
2601 new_data = (struct iso2022jp_data *)
2602 malloc (sizeof (struct iso2022jp_data));
2603
2604 result = __GCONV_NOMEM;
2605 if (new_data != NULL)
2606 @{
2607 new_data->dir = dir;
2608 new_data->var = var;
2609 step->__data = new_data;
2610
2611 if (dir == from_iso2022jp)
2612 @{
2613 step->__min_needed_from = MIN_NEEDED_FROM;
2614 step->__max_needed_from = MAX_NEEDED_FROM;
2615 step->__min_needed_to = MIN_NEEDED_TO;
2616 step->__max_needed_to = MAX_NEEDED_TO;
2617 @}
2618 else
2619 @{
2620 step->__min_needed_from = MIN_NEEDED_TO;
2621 step->__max_needed_from = MAX_NEEDED_TO;
2622 step->__min_needed_to = MIN_NEEDED_FROM;
2623 step->__max_needed_to = MAX_NEEDED_FROM + 2;
2624 @}
2625
2626 /* @r{Yes, this is a stateful encoding.} */
2627 step->__stateful = 1;
2628
2629 result = __GCONV_OK;
2630 @}
2631 @}
2632
2633 return result;
2634@}
2635@end smallexample
2636
2637The function first checks which conversion is wanted. The module from
bd3916e8 2638which this function is taken implements four different conversions;
0b2b18a2
UD
2639which one is selected can be determined by comparing the names. The
2640comparison should always be done without paying attention to the case.
2641
bd3916e8 2642Next, a data structure, which contains the necessary information about
0b2b18a2 2643which conversion is selected, is allocated. The data structure
bd3916e8
UD
2644@code{struct iso2022jp_data} is locally defined since, outside the
2645module, this data is not used at all. Please note that if all four
d987d219 2646conversions this module supports are requested there are four data
0b2b18a2
UD
2647blocks.
2648
2649One interesting thing is the initialization of the @code{__min_} and
2650@code{__max_} elements of the step data object. A single ISO-2022-JP
2651character can consist of one to four bytes. Therefore the
2652@code{MIN_NEEDED_FROM} and @code{MAX_NEEDED_FROM} macros are defined
2653this way. The output is always the @code{INTERNAL} character set (aka
2654UCS-4) and therefore each character consists of exactly four bytes. For
2655the conversion from @code{INTERNAL} to ISO-2022-JP we have to take into
2656account that escape sequences might be necessary to switch the character
2657sets. Therefore the @code{__max_needed_to} element for this direction
2658gets assigned @code{MAX_NEEDED_FROM + 2}. This takes into account the
d987d219 2659two bytes needed for the escape sequences to signal the switching. The
0b2b18a2
UD
2660asymmetry in the maximum values for the two directions can be explained
2661easily: when reading ISO-2022-JP text, escape sequences can be handled
2662alone (i.e., it is not necessary to process a real character since the
2663effect of the escape sequence can be recorded in the state information).
2664The situation is different for the other direction. Since it is in
2665general not known which character comes next, one cannot emit escape
2666sequences to change the state in advance. This means the escape
d987d219 2667sequences have to be emitted together with the next character.
0b2b18a2
UD
2668Therefore one needs more room than only for the character itself.
2669
2670The possible return values of the initialization function are:
2671
2672@table @code
2673@item __GCONV_OK
2674The initialization succeeded
2675@item __GCONV_NOCONV
2676The requested conversion is not supported in the module. This can
2677happen if the @file{gconv-modules} file has errors.
2678@item __GCONV_NOMEM
2679Memory required to store additional information could not be allocated.
2680@end table
2681@end deftypevr
2682
2683The function called before the module is unloaded is significantly
2684easier. It often has nothing at all to do; in which case it can be left
2685out completely.
2686
0b2b18a2 2687@deftypevr {Data type} void {(*__gconv_end_fct)} (struct gconv_step *)
d08a7e4c 2688@standards{GNU, gconv.h}
0b2b18a2
UD
2689The task of this function is to free all resources allocated in the
2690initialization function. Therefore only the @code{__data} element of
2691the object pointed to by the argument is of interest. Continuing the
2692example from the initialization function, the finalization function
2693looks like this:
2694
2695@smallexample
2696void
2697gconv_end (struct __gconv_step *data)
2698@{
2699 free (data->__data);
2700@}
2701@end smallexample
2702@end deftypevr
2703
2704The most important function is the conversion function itself, which can
2705get quite complicated for complex character sets. But since this is not
2706of interest here, we will only describe a possible skeleton for the
2707conversion function.
2708
0b2b18a2 2709@deftypevr {Data type} int {(*__gconv_fct)} (struct __gconv_step *, struct __gconv_step_data *, const char **, const char *, size_t *, int)
d08a7e4c 2710@standards{GNU, gconv.h}
d987d219 2711The conversion function can be called for two basic reasons: to convert
0b2b18a2
UD
2712text or to reset the state. From the description of the @code{iconv}
2713function it can be seen why the flushing mode is necessary. What mode
bd3916e8 2714is selected is determined by the sixth argument, an integer. This
0b2b18a2
UD
2715argument being nonzero means that flushing is selected.
2716
2717Common to both modes is where the output buffer can be found. The
2718information about this buffer is stored in the conversion step data. A
bd3916e8
UD
2719pointer to this information is passed as the second argument to this
2720function. The description of the @code{struct __gconv_step_data}
0b2b18a2
UD
2721structure has more information on the conversion step data.
2722
2723@cindex stateful
2724What has to be done for flushing depends on the source character set.
bd3916e8
UD
2725If the source character set is not stateful, nothing has to be done.
2726Otherwise the function has to emit a byte sequence to bring the state
2727object into the initial state. Once this all happened the other
2728conversion modules in the chain of conversions have to get the same
2729chance. Whether another step follows can be determined from the
2730@code{__is_last} element of the step data structure to which the first
0b2b18a2
UD
2731parameter points.
2732
bd3916e8
UD
2733The more interesting mode is when actual text has to be converted. The
2734first step in this case is to convert as much text as possible from the
2735input buffer and store the result in the output buffer. The start of the
2736input buffer is determined by the third argument, which is a pointer to a
2737pointer variable referencing the beginning of the buffer. The fourth
0b2b18a2
UD
2738argument is a pointer to the byte right after the last byte in the buffer.
2739
2740The conversion has to be performed according to the current state if the
2741character set is stateful. The state is stored in an object pointed to
2742by the @code{__statep} element of the step data (second argument). Once
2743either the input buffer is empty or the output buffer is full the
2744conversion stops. At this point, the pointer variable referenced by the
2745third parameter must point to the byte following the last processed
2746byte (i.e., if all of the input is consumed, this pointer and the fourth
2747parameter have the same value).
2748
bd3916e8
UD
2749What now happens depends on whether this step is the last one. If it is
2750the last step, the only thing that has to be done is to update the
0b2b18a2 2751@code{__outbuf} element of the step data structure to point after the
bd3916e8 2752last written byte. This update gives the caller the information on how
0b2b18a2
UD
2753much text is available in the output buffer. In addition, the variable
2754pointed to by the fifth parameter, which is of type @code{size_t}, must
2755be incremented by the number of characters (@emph{not bytes}) that were
2756converted in a non-reversible way. Then, the function can return.
2757
2758In case the step is not the last one, the later conversion functions have
2759to get a chance to do their work. Therefore, the appropriate conversion
2760function has to be called. The information about the functions is
2761stored in the conversion data structures, passed as the first parameter.
2762This information and the step data are stored in arrays, so the next
2763element in both cases can be found by simple pointer arithmetic:
2764
2765@smallexample
2766int
2767gconv (struct __gconv_step *step, struct __gconv_step_data *data,
2768 const char **inbuf, const char *inbufend, size_t *written,
2769 int do_flush)
2770@{
2771 struct __gconv_step *next_step = step + 1;
2772 struct __gconv_step_data *next_data = data + 1;
95fdc6a0 2773 @dots{}
0b2b18a2
UD
2774@end smallexample
2775
2776The @code{next_step} pointer references the next step information and
2777@code{next_data} the next data record. The call of the next function
2778therefore will look similar to this:
2779
2780@smallexample
2781 next_step->__fct (next_step, next_data, &outerr, outbuf,
2782 written, 0)
2783@end smallexample
2784
2785But this is not yet all. Once the function call returns the conversion
bd3916e8
UD
2786function might have some more to do. If the return value of the function
2787is @code{__GCONV_EMPTY_INPUT}, more room is available in the output
d987d219 2788buffer. Unless the input buffer is empty, the conversion functions start
bd3916e8
UD
2789all over again and process the rest of the input buffer. If the return
2790value is not @code{__GCONV_EMPTY_INPUT}, something went wrong and we have
0b2b18a2
UD
2791to recover from this.
2792
2793A requirement for the conversion function is that the input buffer
2794pointer (the third argument) always point to the last character that
2795was put in converted form into the output buffer. This is trivially
2796true after the conversion performed in the current step, but if the
2797conversion functions deeper downstream stop prematurely, not all
2798characters from the output buffer are consumed and, therefore, the input
2799buffer pointers must be backed off to the right position.
2800
bd3916e8
UD
2801Correcting the input buffers is easy to do if the input and output
2802character sets have a fixed width for all characters. In this situation
2803we can compute how many characters are left in the output buffer and,
2804therefore, can correct the input buffer pointer appropriately with a
2805similar computation. Things are getting tricky if either character set
2806has characters represented with variable length byte sequences, and it
2807gets even more complicated if the conversion has to take care of the
2808state. In these cases the conversion has to be performed once again, from
2809the known state before the initial conversion (i.e., if necessary the
2810state of the conversion has to be reset and the conversion loop has to be
2811executed again). The difference now is that it is known how much input
2812must be created, and the conversion can stop before converting the first
2813unused character. Once this is done the input buffer pointers must be
0b2b18a2
UD
2814updated again and the function can return.
2815
2816One final thing should be mentioned. If it is necessary for the
2817conversion to know whether it is the first invocation (in case a prolog
bd3916e8
UD
2818has to be emitted), the conversion function should increment the
2819@code{__invocation_counter} element of the step data structure just
0b2b18a2
UD
2820before returning to the caller. See the description of the @code{struct
2821__gconv_step_data} structure above for more information on how this can
2822be used.
2823
2824The return value must be one of the following values:
2825
2826@table @code
2827@item __GCONV_EMPTY_INPUT
2828All input was consumed and there is room left in the output buffer.
2829@item __GCONV_FULL_OUTPUT
2830No more room in the output buffer. In case this is not the last step
2831this value is propagated down from the call of the next conversion
bd3916e8 2832function in the chain.
0b2b18a2
UD
2833@item __GCONV_INCOMPLETE_INPUT
2834The input buffer is not entirely empty since it contains an incomplete
2835character sequence.
2836@end table
2837
2838The following example provides a framework for a conversion function.
2839In case a new conversion has to be written the holes in this
2840implementation have to be filled and that is it.
2841
2842@smallexample
2843int
2844gconv (struct __gconv_step *step, struct __gconv_step_data *data,
2845 const char **inbuf, const char *inbufend, size_t *written,
2846 int do_flush)
2847@{
2848 struct __gconv_step *next_step = step + 1;
2849 struct __gconv_step_data *next_data = data + 1;
2850 gconv_fct fct = next_step->__fct;
2851 int status;
2852
2853 /* @r{If the function is called with no input this means we have}
2854 @r{to reset to the initial state. The possibly partly}
2855 @r{converted input is dropped.} */
2856 if (do_flush)
2857 @{
2858 status = __GCONV_OK;
2859
2860 /* @r{Possible emit a byte sequence which put the state object}
2861 @r{into the initial state.} */
2862
2863 /* @r{Call the steps down the chain if there are any but only}
2864 @r{if we successfully emitted the escape sequence.} */
2865 if (status == __GCONV_OK && ! data->__is_last)
2866 status = fct (next_step, next_data, NULL, NULL,
2867 written, 1);
2868 @}
2869 else
2870 @{
2871 /* @r{We preserve the initial values of the pointer variables.} */
2872 const char *inptr = *inbuf;
2873 char *outbuf = data->__outbuf;
2874 char *outend = data->__outbufend;
2875 char *outptr;
2876
2877 do
2878 @{
2879 /* @r{Remember the start value for this round.} */
2880 inptr = *inbuf;
2881 /* @r{The outbuf buffer is empty.} */
2882 outptr = outbuf;
2883
2884 /* @r{For stateful encodings the state must be safe here.} */
2885
2886 /* @r{Run the conversion loop. @code{status} is set}
2887 @r{appropriately afterwards.} */
2888
cf822e3c 2889 /* @r{If this is the last step, leave the loop. There is}
0b2b18a2
UD
2890 @r{nothing we can do.} */
2891 if (data->__is_last)
2892 @{
2893 /* @r{Store information about how many bytes are}
2894 @r{available.} */
2895 data->__outbuf = outbuf;
2896
2897 /* @r{If any non-reversible conversions were performed,}
2898 @r{add the number to @code{*written}.} */
2899
2900 break;
2901 @}
2902
2903 /* @r{Write out all output that was produced.} */
2904 if (outbuf > outptr)
2905 @{
2906 const char *outerr = data->__outbuf;
2907 int result;
2908
2909 result = fct (next_step, next_data, &outerr,
2910 outbuf, written, 0);
2911
2912 if (result != __GCONV_EMPTY_INPUT)
2913 @{
2914 if (outerr != outbuf)
2915 @{
2916 /* @r{Reset the input buffer pointer. We}
2917 @r{document here the complex case.} */
2918 size_t nstatus;
2919
2920 /* @r{Reload the pointers.} */
2921 *inbuf = inptr;
2922 outbuf = outptr;
2923
2924 /* @r{Possibly reset the state.} */
2925
2926 /* @r{Redo the conversion, but this time}
2927 @r{the end of the output buffer is at}
2928 @r{@code{outerr}.} */
2929 @}
2930
2931 /* @r{Change the status.} */
2932 status = result;
2933 @}
2934 else
2935 /* @r{All the output is consumed, we can make}
2936 @r{ another run if everything was ok.} */
2937 if (status == __GCONV_FULL_OUTPUT)
2938 status = __GCONV_OK;
2939 @}
2940 @}
2941 while (status == __GCONV_OK);
2942
2943 /* @r{We finished one use of this step.} */
2944 ++data->__invocation_counter;
2945 @}
2946
2947 return status;
2948@}
2949@end smallexample
2950@end deftypevr
2951
2952This information should be sufficient to write new modules. Anybody
1f77f049
JM
2953doing so should also take a look at the available source code in the
2954@glibcadj{} sources. It contains many examples of working and optimized
0b2b18a2
UD
2955modules.
2956
bd3916e8 2957@c File charset.texi edited October 2001 by Dennis Grace, IBM Corporation