1 @node Function Portability
2 @section Portability of Standard Functions
5 Many standard library functions have portability limitations, although
6 they are specified in the
7 @uref{http://www.opengroup.org/susv3, Posix standard}. In this section,
8 we mention only functions that behave differently than specified; we don't
9 mention functions that are not implemented at all on some platforms, or
10 that are implemented but not declared on some platforms. Many of the
11 portability problems have a solution in @ref{Gnulib}.
15 This function was not correctly implemented in glibc versions before 2.2.5.
18 Some systems don't have a @code{socklen_t} type; in this case this function's
19 third argument type is @samp{int *}.
22 This function may overflow its internal buffer if an invalid year is passed.
25 This function may put more than 26 bytes into the argument buffer if an
26 invalid year is passed.
29 glibc has two different functions @code{basename}: the POSIX version and
32 @code{basename} assumes file names in POSIX syntax; it does not work with file
33 names in Windows syntax.
36 This function is marked as ``legacy'' in POSIX. Better use @code{memcmp}
40 This function is marked as ``legacy'' in POSIX. Better use @code{memcpy}
41 or @code{memmove} instead.
44 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
45 accommodate all Unicode characters.
48 This function is marked as ``legacy'' in POSIX. Better use @code{memset}
52 When applied to a symbolic link, some implementations don't dereference
53 the symlink, i.e.@: they behave like @code{lchown}.
58 The glibc implementation is or was broken.
61 On Windows, this function returns a file handle in @code{O_TEXT} mode. If you
62 need a file handle in @code{O_BINARY} mode, you need to use the function
65 On platforms where @code{off_t} is a 32-bit type, @code{creat} may not work
66 correctly to create files larger than 2 GB. The fix is to use the
67 @code{AC_SYS_LARGEFILE} macro.
70 This function may overflow its internal buffer if an invalid year is passed.
73 This function may put more than 26 bytes into the argument buffer if an
74 invalid year is passed.
77 @code{dirname} assumes file names in POSIX syntax; it does not work with file
78 names in Windows syntax.
81 If the file name argument is not absolute, the file is searched for. The
82 search algorithm is system specific.
85 The visibility of symbols loaded in dependent shared libraries or present
86 in the main executable is system dependent.
89 This function is marked as ``legacy'' in POSIX. Better use @code{sprintf}
93 On Windows, the socket functions don't set @code{errno}; their error code is
94 available through @code{WSAGetLastError()} instead.
97 On Windows systems (excluding Cygwin), this function does not set @code{errno}
101 This function is marked as ``legacy'' in POSIX. Better use @code{sprintf}
106 On Windows systems (excluding Cygwin), these functions do not set @code{errno}
111 On Windows systems (excluding Cygwin), these functions do not set @code{errno}
116 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
117 accommodate all Unicode characters.
120 This function is broken in some version of Solaris or glibc.
123 On Windows systems (excluding Cygwin), this function does not set @code{errno}
126 On Windows, this function returns a file stream in ``text'' mode by default;
127 this means that it translates @code{'\n'} to CR/LF by default. Use the
128 @code{"b"} flag if you need reliable binary I/O.
131 On some systems, @code{fork} followed by a call of the @code{exec} family
132 (@code{execl}, @code{execlp}, @code{execle}, @code{execv}, @code{execvp},
133 or @code{execve}) is less efficient than @code{vfork} followed by the same
134 call. @code{vfork} is a variant of @code{fork} that has been introduced to
135 optimize the @code{fork}/@code{exec} pattern.
137 On Windows systems (excluding Cygwin), this function is not implemented; use
138 @code{spawnvp} instead.
141 On NetBSD and Windows, this function doesn't support format directives that
142 access arguments in an arbitrary order, such as @code{"%2$s"}. The fix is to
143 include @file{<libintl.h>} from GNU gettext; it redefines this function so that
144 it is POSIX compliant.
146 On Windows, this function doesn't support the @code{'} flag and the @code{hh},
147 @code{ll}, @code{j}, @code{t}, @code{z} size specifiers.
151 On Windows systems (excluding Cygwin), these functions do not set @code{errno}
156 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
157 accommodate all Unicode characters.
160 On Windows systems (excluding Cygwin), this function does not set @code{errno}
164 On old systems, @code{free (NULL)} is not allowed.
167 On Windows systems (excluding Cygwin), this function does not set @code{errno}
171 On Windows systems (excluding Cygwin), this function does not set @code{errno}
174 On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
175 @code{t}, @code{z} size specifiers.
178 On Windows systems (excluding Cygwin), this function does not set @code{errno}
182 On platforms where @code{off_t} is a 32-bit type, @code{stat} may not correctly
183 report the size of files or block devices larger than 2 GB. The fix is to
184 use the @code{AC_SYS_LARGEFILE} macro.
186 On Cygwin, @code{fstat} applied to the file descriptors 0 and 1, returns
187 different @code{st_ino} values, even if standard input and standard output
188 are not redirected and refer to the same terminal.
191 This function is marked as ``legacy'' in POSIX. Better use @code{gettimeofday}
192 or @code{clock_gettime} instead, and use @code{ftime} only as a fallback for
193 portability to Windows systems.
196 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
197 accommodate all Unicode characters.
199 @code{fwide} is not guaranteed to be able to change a file stream's mode
200 to a different mode than the current one.
203 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
204 accommodate all Unicode characters.
207 On Windows systems (excluding Cygwin), this function does not set @code{errno}
211 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
212 accommodate all Unicode characters.
215 This function is marked as ``legacy'' in POSIX. Better use @code{sprintf}
219 On Windows, this function is declared in @code{<ws2tcpip.h>} rather than in
224 On Windows systems (excluding Cygwin), these functions do not set @code{errno}
228 On glibc systems, @code{getcwd (NULL, n)} allocates memory for the result.
229 On other systems, this call is not allowed.
232 On Ultrix 4.3, @code{getgroups (0, 0)} always fails. See macro
233 @samp{AC_FUNC_GETGROUPS}.
236 If the given buffer is too small for the host name, some implementations
237 fail with @code{EINVAL}, instead of returning a truncated host name.
240 The default behaviour of the glibc implementation of @code{getopt} allows
241 mixing option and non-option arguments on the command line in any order.
242 Other implementations, such as the one in Cygwin, enforce strict POSIX
243 compliance: they require that the option arguments precede the non-option
244 arguments. This is something to watch out in your program's testsuite.
247 Some systems don't have a @code{socklen_t} type; in this case this function's
248 third argument type is @samp{int *}.
251 Many systems don't fill in all the fields of @code{struct rusage} with
255 This function should never be used, because it can overflow any given buffer.
257 On Windows systems (excluding Cygwin), this function does not set @code{errno}
261 Some systems don't have a @code{socklen_t} type; in this case this function's
262 third argument type is @samp{int *}.
265 Some systems don't have a @code{socklen_t} type; in this case this function's
266 fifth argument type is @samp{int *}.
268 Many socket options are not available on all systems.
270 BeOS has the @code{setsockopt} function, but not the @code{getsockopt}
274 On some systems, @code{gettimeofday} clobbers the buffer in which
275 @code{localtime} returns its result.
279 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
280 accommodate all Unicode characters.
283 The size of the buffer required for this function is not a compile-time
284 constant. Also, the function truncates a result that would be larger than
285 the minimum buffer size. For these reasons, this function is marked as
286 ``legacy'' in POSIX. Better use the @code{getcwd} function instead.
289 Some systems may store additional flags in the @code{gl_flags} field.
292 Some systems define a function of this name that is incompatible to POSIX.
295 This function was not correctly implemented in glibc versions before 2.2.
297 When @code{iconv} encounters an input character that is valid but that can
298 not be converted to the output character set, glibc's and GNU libiconv's
299 @code{iconv} stop the conversion. Some other implementations put an
300 implementation-defined character into the output buffer.
303 The set of supported encodings and conversions is system dependent.
306 This function is marked as ``legacy'' in POSIX. Better use @code{strchr}
310 On some old systems, this function returns a @samp{struct in_addr} rather
311 than a scalar type such as @samp{unsigned int} or @samp{unsigned long}.
314 Most @code{ioctl} requests are platform and hardware specific.
317 On Windows, @code{isatty} also returns true for character devices such as
333 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
334 accommodate all Unicode characters.
337 This function was not correctly implemented in glibc versions before 2.2.5.
340 Some systems define a function of this name that is incompatible to POSIX.
343 The effects of this call are system and compiler optimization dependent,
344 since it restores the contents of register-allocated variables but not
345 the contents of stack-allocated variables.
347 When longjumping out of a signal handler that was being executed on an
348 alternate stack (installed through @code{sigaltstack}), on FreeBSD, NetBSD,
349 OpenBSD, you need to clear the @code{SS_ONSTACK} flag in the @code{stack_t}
350 structure managed by the kernel.
353 POSIX does not specify which file descriptors support seeking and which don't.
354 In practice, regular files and block devices support seeking, and ttys, pipes,
355 and most character devices don't support it.
357 On platforms where @code{off_t} is a 32-bit type, @code{lseek} does not work
358 correctly with files larger than 2 GB. The fix is to use the
359 @code{AC_SYS_LARGEFILE} macro.
362 When the argument ends in a slash, some systems don't dereference the
365 On platforms where @code{off_t} is a 32-bit type, @code{lstat} may not
366 correctly report the size of files or block devices larger than 2 GB. The fix
367 is to use the @code{AC_SYS_LARGEFILE} macro.
373 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
374 accommodate all Unicode characters.
377 When the argument ends in a slash, the function call fails on some systems.
379 On Windows systems (excluding Cygwin), this function is called @code{_mkdir}
380 and takes only one argument. The fix is to define a macro like this:
382 #define mkdir ((int (*)()) _mkdir)
386 #define mkdir(path,mode) _mkdir (path)
390 On some systems (HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a silly
391 limit that it can create no more than 26 files from a given template. On
392 OSF/1 4.0f, it can create only 32 files per process.
394 On systems other than glibc 2.0.7 or newer, @code{mkstemp} can create a
395 world or group writable or readable file, if you haven't set the process
396 umask to 077. This is a security risk.
399 This function is not appropriate for creating temporary files. (It has
400 security risks.) Therefore it is marked as ``legacy'' in POSIX. Better use
401 @code{mkstemp} instead.
404 Some implementations of @code{mktime} may go into an endless loop.
407 To get anonymous memory, on some systems, you can use the flags
408 @code{MAP_ANONYMOUS | MAP_PRIVATE} and @code{-1} instead of a file descriptor;
409 on others you have to use a read-only file descriptor of @file{/dev/zero}.
411 On HP-UX, passing a non-NULL first argument, as a hint for the address (even
412 without @code{MAP_FIXED}, often causes @code{mmap} to fail. Better pass NULL
415 On HP-UX, @code{MAP_FIXED} basically never works. On other systems, it depends
416 on the circumstances whether memory can be returned at a given address.
419 On AIX, it is not possible to use @code{mprotect} on memory regions allocated
423 On NetBSD, @code{msync} takes only two arguments.
428 In glibc before glibc 2.2.4, @code{nice} returned 0 upon success.
431 Some older versions of glibc had @code{nl_langinfo} but not the @code{CODESET}
434 On Cygwin, which doesn't have locales, @code{nl_langinfo(CODESET)} always
435 returns @code{"US-ASCII"}.
438 On Windows, this function returns a file handle in @code{O_TEXT} mode by
439 default; this means that it translates '\n' to CR/LF by default. Use the
440 @code{O_BINARY} flag if you need reliable binary I/O.
442 On platforms where @code{off_t} is a 32-bit type, @code{open} may not work
443 correctly with files larger than 2 GB. The fix is to use the
444 @code{AC_SYS_LARGEFILE} macro.
447 On MacOS X 10.4.0 and AIX 5.3, this function doesn't work on special files
448 like @file{/dev/null} and ttys like @file{/dev/tty}.
451 On NetBSD and Windows, this function doesn't support format directives that
452 access arguments in an arbitrary order, such as @code{"%2$s"}. The fix is to
453 include @file{<libintl.h>} from GNU gettext; it redefines this function so that
454 it is POSIX compliant.
456 On Windows, this function doesn't support the @code{'} flag and the @code{hh},
457 @code{ll}, @code{j}, @code{t}, @code{z} size specifiers.
460 On Linux/glibc systems before the advent of NPTL, signals could only be
461 sent to one particular thread. In POSIX, signals are sent to the entire
462 process and executed by any thread of the process that happens to have the
463 particular signal currently unblocked.
468 On Windows systems (excluding Cygwin), these functions do not set @code{errno}
473 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
474 accommodate all Unicode characters.
477 When @code{readlink} is called on a directory: In the case of NFS mounted
478 directories, Cygwin sets @code{errno} to @code{ENOENT} or @code{EIO} instead of
479 @code{EINVAL}. To avoid this problem, check for a directory before calling
482 When @code{readlink} is called on a file that is not a symbolic link:
483 Irix may set @code{errno} to @code{ENXIO} instead of @code{EINVAL}. Cygwin
484 may set errno to @code{EACCES} instead of {EINVAL}.
487 This function does not allow to determine the required size of output buffer;
488 PATH_MAX --- if it is defined --- is nothing more than a guess.
491 Some systems don't have a @code{socklen_t} type; in this case this function's
492 sixth argument type is @samp{int *}.
496 Many regular expression implementations have bugs.
499 This function does not work on SunOS 4.1 when the source file name ends in a
503 On Windows systems (excluding Cygwin), this function does not set @code{errno}
507 This function is marked as ``legacy'' in POSIX. Better use @code{strrchr}
511 When @code{rmdir} fails because the specified directory is not empty, the
512 @code{errno} value is system dependent.
515 On Windows systems (excluding Cygwin), this function does not set @code{errno}
518 On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
519 @code{t}, @code{z} size specifiers.
522 When you call @code{select} with a timeout, some implementations modify the
523 timeout parameter so that upon return from the function, it contains the
524 amount of time not slept. Other implementations leave the timeout parameter
527 On Windows systems (excluding Cygwin) and on BeOS, @code{select} can only be
528 called on descriptors created by the @code{socket} function, not on regular
531 On Linux, when some file descriptor refers to a regular file, @code{select}
532 may fail, setting @code{errno} to @code{EBADF}.
535 The effects of this call are system and compiler optimization dependent,
536 since it restores the contents of register-allocated variables but not
537 the contents of stack-allocated variables.
540 In some versions of glibc (e.g.@: 2.3.3), @code{setenv} doesn't fail if the
541 first argument contains a @samp{=} character.
544 POSIX does not specify whether @code{setjmp} saves the signal mask in the
545 @code{jmp_buf}. It does on BSD systems, and on glibc systems when
546 @code{_BSD_SOURCE} is defined; in this case @code{setjmp} behaves like
547 @code{sigsetjmp}, and functions @code{_setjmp} and @code{_longjmp} are
548 available that don't save or restore the signal mask. On System V systems,
549 and on glibc systems by default, @code{setjmp} doesn't save the signal mask.
552 On Cygwin, which doesn't have locales, @code{setlocale(LC_ALL,NULL)} always
556 Many socket options are not available on all systems.
559 On Windows systems (excluding Cygwin), this function does not set @code{errno}
563 Attempts to @code{shmat} into a previously malloc-ed region fail on SunOS 4,
564 with @code{errno} set to @code{EINVAL}, even if there is an @code{munmap} call
567 On Linux, the flag @code{SHM_REMAP} is needed in order to force @code{shmat}
568 to replace existing memory mappings in the specify address range. On other
569 systems, it is not needed.
572 On many systems (not Linux), SHMMAX is so small that it is unusable for
573 reasonable applications, and/or @code{shmget} requires superuser privileges.
576 The symbolic value @code{SIG_IGN} for the @code{SIGCHLD} signal is equivalent
579 void handle_child (int sigchld)
581 while (waitpid (-1, NULL, WNOHANG) > 0)
585 except that @code{SIG_IGN} for @code{SIGCHLD} has the effect that the children
586 execution times are not accounted in the @code{times} function.
587 On some systems (BSD? SystemV? Linux?), you need to use the @code{sigaction}
588 flag @code{SA_NOCLDWAIT} in order to obtain this behaviour.
591 @code{sigaltstack} doesn't work on HP-UX 11/IA-64 and OpenBSD 3.6/Sparc64.
594 On System V systems, when the signal is triggered, the kernel uninstalls the
595 handler (i.e.@: resets the signal's action to SIG_DFL) before invoking the
596 handler. This opens the door to race conditions: undesired things happen
597 if the signal is triggered twice and the signal handler was not quick enough
598 reinstalling itself as a handler. On BSD systems and glibc systems, on the
599 other hand, when the signal is triggered, the kernel blocks the signal
600 before invoking the handler. This is saner, but POSIX still allows either
601 behaviour. To avoid this problem, use @code{sigaction} instead of
605 Linux implements the meaning of NULL timeout by doing what @code{sigwaitinfo}
606 does; other systems may not do the same.
609 On Linux/glibc systems before the advent of NPTL, signals could only be
610 sent to one particular thread. In POSIX, signals are sent to the entire
611 process and executed by any thread of the process that happens to have the
612 particular signal currently unblocked.
615 According to POSIX, the @code{sleep} function may interfere with the program's
616 use of the @code{SIGALRM} signal. On Linux, it doesn't; on other platforms,
620 On NetBSD and Windows, this function doesn't support format directives that
621 access arguments in an arbitrary order, such as @code{"%2$s"}. The fix is to
622 include @file{<libintl.h>} from GNU gettext; it redefines this function so that
623 it is POSIX compliant.
625 On Windows, this function doesn't support the @code{'} flag and the @code{hh},
626 @code{ll}, @code{j}, @code{t}, @code{z} size specifiers.
629 On BeOS, the descriptors returned by the @code{socket} function can not be used
630 in calls to @code{read}, @code{write}, and @code{close}; you have to use
631 @code{recv}, @code{send}, @code{closesocket} in these cases instead.
634 On NetBSD and Windows, this function doesn't support format directives that
635 access arguments in an arbitrary order, such as @code{"%2$s"}. The fix is to
636 include @file{<libintl.h>} from GNU gettext; it redefines this function so that
637 it is POSIX compliant.
639 On Windows, this function doesn't support the @code{'} flag and the @code{hh},
640 @code{ll}, @code{j}, @code{t}, @code{z} size specifiers.
643 On Windows systems (excluding Cygwin), this function does not set @code{errno}
646 On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
647 @code{t}, @code{z} size specifiers.
650 On platforms where @code{off_t} is a 32-bit type, @code{stat} may not correctly
651 report the size of files or block devices larger than 2 GB. The fix is to
652 use the @code{AC_SYS_LARGEFILE} macro.
654 Cygwin's @code{stat} function sometimes sets @code{errno} to @code{EACCES} when
655 @code{ENOENT} would be more appropriate.
659 As of 2006, no system is known that implements these functions correctly in
663 glibc has an incompatible version of this function. The POSIX compliant code
665 char *s = (strerror_r (err, buf, buflen) == 0 ? buf : NULL);
667 is essentially equivalent to this code using the glibc function:
669 char *s = strerror_r (err, buf, buflen);
673 As of 2006, no system is known that implements this function correctly in
677 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
678 accommodate all Unicode characters.
680 On Windows, this function does not take a buffer size as second argument.
683 On Windows systems (excluding Cygwin), the command processor used by the
684 @code{system} function is @file{cmd.exe}, not @file{/bin/sh}. Accordingly,
685 the rules for quoting shell arguments containing spaces, quote or other special
686 characters are different.
689 On some systems, @code{tcdrain} on a non-tty fails with @code{errno} set to
690 @code{EINVAL} or, on MacOS X, also @code{EOPNOTSUPP} or @code{ENODEV}, rather
694 On some systems, @code{tcflush} of @code{TCIFLUSH} on a non-tty fails with
695 errno set to @code{EINVAL} rather than @code{ENOTTY}.
697 On some systems, @code{tcflush} of @code{TCOFLUSH} on a non-tty fails with
698 errno set to @code{EINVAL} or, on IRIX, also @code{ENOSYS}, or, on MacOS X,
699 also @code{EOPNOTSUPP} or @code{ENODEV}, rather than @code{ENOTTY}.
702 This function is not appropriate for creating temporary files. (It has
703 security risks.) Better use @code{mkstemp} instead.
706 This function is not appropriate for creating temporary files. (It has
707 security risks.) Better use @code{mkstemp} instead.
712 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
713 accommodate all Unicode characters.
716 On Windows systems (excluding Cygwin), this function does not set @code{errno}
720 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
721 accommodate all Unicode characters.
724 Removing an open file is non-portable: On Unix this allows the programs that
725 have the file already open to continue working with it; the file's storage
726 is only freed when the no process has the file open any more. On Windows,
727 the attempt to remove an open file fails.
730 According to POSIX, the @code{usleep} function may interfere with the program's
731 use of the @code{SIGALRM} signal. On Linux, it doesn't; on other platforms,
735 On some systems, @code{utime (file, NULL)} fails to set the file's timestamp
739 This function is marked as ``legacy'' in POSIX. Better use @code{utime}
743 The second argument of @code{va_arg} must be a type that is invariant under
744 the ``default argument promotions'' (ISO C 99 6.5.2.2 paragraph 6). This
745 means that the following are not valid here:
748 Use @samp{double} instead.
750 Use @samp{int} instead.
751 @item Integer types smaller than @samp{int}.
752 Use @samp{int} or @samp{unsigned int} instead.
755 This is a portability problem because you don't know the width of some
756 abstract types like @code{uid_t}, @code{gid_t}, @code{mode_t}. So, instead of
758 mode = va_arg (ap, mode_t);
762 mode = (sizeof (mode_t) < sizeof (int)
764 : va_arg (ap, mode_t));
768 Some platforms don't provide this macro. You can use __va_copy where
769 available instead, or otherwise an assignment or @code{memcpy} call.
772 On NetBSD and Windows, this function doesn't support format directives that
773 access arguments in an arbitrary order, such as @code{"%2$s"}. The fix is to
774 include @file{<libintl.h>} from GNU gettext; it redefines this function so that
775 it is POSIX compliant.
777 On Windows, this function doesn't support the @code{'} flag and the @code{hh},
778 @code{ll}, @code{j}, @code{t}, @code{z} size specifiers.
781 On Windows systems (excluding Cygwin), this function does not set @code{errno}
784 On Windows, this function doesn't support the @code{hh}, @code{ll}, @code{j},
785 @code{t}, @code{z} size specifiers.
790 On NetBSD and Windows, these functions don't support format directives that
791 access arguments in an arbitrary order, such as @code{"%2$s"}. The fix is to
792 include @file{<libintl.h>} from GNU gettext; it redefines these functions so
793 that they are POSIX compliant.
795 On Windows, these functions don't support the @code{'} flag and the @code{hh},
796 @code{ll}, @code{j}, @code{t}, @code{z} size specifiers.
800 On Windows systems (excluding Cygwin), these functions do not set @code{errno}
803 On Windows, these functions don't support the @code{hh}, @code{ll}, @code{j},
804 @code{t}, @code{z} size specifiers.
807 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
808 accommodate all Unicode characters.
810 On Windows, this function does not take a buffer size as second argument.
813 As of 2005, no system is known on which @code{waitid} with flag @code{WNOWAIT}
844 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
845 accommodate all Unicode characters.
848 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
849 accommodate all Unicode characters.
851 This function is marked as ``legacy'' in POSIX. Better use @code{wcsstr}
868 On Windows systems, @code{wchar_t} is a 16-bit type and therefore cannot
869 accommodate all Unicode characters.