duplocale — duplicate a locale object
#include <locale.h>
locale_t
duplocale( |
locale_t locobj) ; |
Note | ||||||
---|---|---|---|---|---|---|
|
The duplocale
() function
creates a duplicate of the locale object referred to by
locobj
.
If locobj
is
LC_GLOBAL_LOCALE
, duplocale
() creates a locale object
containing a copy of the global locale determined by
setlocale(3).
On success, duplocale
()
returns a handle for the new locale object. On error, it
returns (locale_t) 0,
and sets errno
to indicate the
cause of the error.
Duplicating a locale can serve the following purposes:
To create a copy of a locale object in which one of more categories are to be modified (using newlocale(3)).
To obtain a handle for the current locale which can
used in other functions that employ a locale handle,
such as toupper_l(3). This is
done by applying duplocale
() to the value returned by
the following call:
loc = uselocale((locale_t) 0);
This technique is necessary, because the above
uselocale(3) call may
return the value LC_GLOBAL_LOCALE
, which results in
undefined behavior if passed to functions such as
toupper_l(3). Calling
duplocale
() can be used
to ensure that the LC_GLOBAL_LOCALE
value is converted
into a usable locale object. See EXAMPLE, below.
Each locale object created by duplocale
() should be deallocated using
freelocale(3).
The program below uses uselocale(3) and
duplocale
() to obtain a handle
for the current locale which is then passed to toupper_l(3). The program
takes one command-line argument, a string of characters that
is converted to uppercase and displayed on standard output.
An example of its use is the following:
$ ./a.out abc ABC
#define _XOPEN_SOURCE 700 #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <locale.h> #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) int main(int argc, char *argv[]) { locale_t loc, nloc; char *p; if (argc != 2) { fprintf(stderr, "Usage: %s string\n", argv[0]); exit(EXIT_FAILURE); } /* This sequence is necessary, because uselocale() might return the value LC_GLOBAL_LOCALE, which can't be passed as an argument to toupper_l() */ loc = uselocale((locale_t) 0); if (loc == (locale_t) 0) errExit("uselocale"); nloc = duplocale(loc); if (nloc == (locale_t) 0) errExit("duplocale"); for (p = argv[1]; *p; p++) putchar(toupper_l(*p, nloc)); printf("\n"); freelocale(nloc); exit(EXIT_SUCCESS); }
This page is part of release 4.07 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
t Copyright (C) 2014 Michael Kerrisk <mtk.manpagesgmail.com> %%%LICENSE_START(VERBATIM) Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. %%%LICENSE_END |