1 .\" Copyright (C) 2014 Michael Kerrisk <mtk.manpages@gmail.com>
3 .\" SPDX-License-Identifier: Linux-man-pages-copyleft
5 .TH DUPLOCALE 3 2021-03-22 "Linux" "Linux Programmer's Manual"
7 duplocale \- duplicate a locale object
10 .RI ( libc ", " \-lc )
13 .B #include <locale.h>
15 .BI "locale_t duplocale(locale_t " locobj );
19 Feature Test Macro Requirements for glibc (see
20 .BR feature_test_macros (7)):
33 function creates a duplicate of the locale object referred to by
39 .BR LC_GLOBAL_LOCALE ,
41 creates a locale object containing a copy of the global locale
47 returns a handle for the new locale object.
52 to indicate the error.
56 Insufficient memory to create the duplicate locale object.
60 function first appeared in version 2.3 of the GNU C library.
64 Duplicating a locale can serve the following purposes:
66 To create a copy of a locale object in which one of more categories
67 are to be modified (using
70 To obtain a handle for the current locale which can used in
71 other functions that employ a locale handle, such as
73 This is done by applying
75 to the value returned by the following call:
79 loc = uselocale((locale_t) 0);
83 This technique is necessary, because the above
85 call may return the value
86 .BR LC_GLOBAL_LOCALE ,
87 which results in undefined behavior if passed to functions such as
91 can be used to ensure that the
93 value is converted into a usable locale object.
96 Each locale object created by
98 should be deallocated using
101 The program below uses
105 to obtain a handle for the current locale which is then passed to
107 The program takes one command-line argument,
108 a string of characters that is converted to uppercase and
109 displayed on standard output.
110 An example of its use is the following:
121 #define _XOPEN_SOURCE 700
127 #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e
131 main(int argc, char *argv[])
136 fprintf(stderr, "Usage: %s string\en", argv[0]);
140 /* This sequence is necessary, because uselocale() might return
141 the value LC_GLOBAL_LOCALE, which can\(aqt be passed as an
142 argument to toupper_l(). */
144 loc = uselocale((locale_t) 0);
145 if (loc == (locale_t) 0)
146 errExit("uselocale");
148 nloc = duplocale(loc);
149 if (nloc == (locale_t) 0)
150 errExit("duplocale");
152 for (char *p = argv[1]; *p; p++)
153 putchar(toupper_l(*p, nloc));