newlocale(3) Créer, modifier et libérer un objet de paramètres

Other Alias

freelocale

SYNOPSIS

#include <locale.h>
locale_t newlocale(int category_mask, const char *locale,
locale_t base);
void freelocale(locale_t locobj);

Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :

newlocale(), freelocale() :

Depuis la glibc 2.10 :
_XOPEN_SOURCE >= 700
Avant la glibc 2.10 :
_GNU_SOURCE

DESCRIPTION

La fonction newlocale() crée un nouvel objet de paramètres régionaux ou modifie un objet existant, en renvoyant une référence vers le nouvel objet ou l’objet modifié comme résultat de la fonction. L’appel crée un nouvel objet ou modifie un objet existant en fonction de la valeur de base :
-
si base est (locale_t) 0, un nouvel objet est créé ;
-
si base indique un objet de paramètres régionaux valable existant (c’est-à-dire un objet renvoyé par un précédent appel de newlocale() ou duplocale(3)), alors cet objet est modifié par l’appel. Si l’appel réussit, le contenu de base n’est pas garanti (en particulier, l’objet indiqué par base pourrait être libéré et un nouvel objet créé). Par conséquent, l’appelant devrait s’assurer de ne plus utiliser base avant l’appel de newlocale() et devrait ensuite se rapporter à l’objet modifié à l’aide de la référence renvoyée comme résultat de la fonction. Si l’appel échoue, le contenu de base reste valable et sans modification.

Si base est l’objet spécial de paramètres régionaux LC_GLOBAL_LOCALE (consultez duplocale(3)), ou n’est pas (locale_t) 0 ni un identifiant d’objet de paramètres régionaux valable, le comportement est non défini.

L’argument category_mask est un masque binaire indiquant les catégories de paramètres régionaux à définir dans un objet de paramètres régionaux nouvellement créé ou modifié dans un objet existant. Le masque est construit avec un OU binaire des constantes LC_CTYPE_MASK, LC_COLLATE_MASK, LC_MESSAGES_MASK, LC_MONETARY_MASK, LC_NUMERIC_MASK et LC_TIME_MASK.

Pour chaque catégorie indiquée dans category_mask, les données de paramètres régionaux de locale seront utilisées dans l’objet renvoyé par newlocale(). Si un nouvel objet de paramètres régionaux est en cours de création, les données de toutes les catégories non indiquées dans category_mask sont prises dans les paramètres régionaux par défaut ("POSIX").

Les valeurs prédéfinies suivantes de locale sont définies pour toutes les catégories qui peuvent être indiquées dans category_mask :

"POSIX"
Un environnement de paramètres régionaux minimal pour les programmes en langage C.
"C"
Équivalent à "POSIX".
""
Un environnement natif défini pour l’implémentation correspondant aux valeurs des variables d’environnement LC_* et LANG (consultez locale(7)).

freelocale()

La fonction freelocale() désalloue les ressources associées à locobj, un objet de paramètres régionaux renvoyé par un appel à newlocale() ou duplocale(3). Si locobj est LC_GLOBAL_LOCALE ou n’est pas un identifiant d’objet valable de paramètres régionaux, le résultat n’est pas défini.

Une fois qu’un objet de paramètres régionaux à été libéré, le programme ne devrait plus l’utiliser.

VALEUR RENVOYÉE

En cas de réussite, newlocale() renvoie un identifiant qui peut être utilisé dans les appels de duplocale(3), freelocale() et d’autres fonctions qui prennent un argument locale_t. En cas d’erreur, newlocale() renvoie (locale_t) 0 et définit errno pour indiquer la cause de l’erreur.

ERREURS

EINVAL
Au moins un bit de category_mask ne correspond pas à une catégorie valable de paramètres régionaux.
EINVAL
locale est NULL.
ENOENT
locale n’est pas un pointeur de chaîne vers des paramètres régionaux valables.
ENOMEM
Pas assez de mémoire pour créer un objet de paramètres régionaux.

VERSIONS

Les fonctions newlocale() et freelocale() sont apparues pour la première fois dans la version 2.3 de la bibliothèque C de GNU.

CONFORMITÉ

POSIX.1-2008.

NOTES

Chaque objet de paramètres régionaux créé par newlocale() devrait être désalloué en utilisant freelocale(3).

EXEMPLE

Le programme suivant prend jusqu’à deux arguments en ligne de commande, identifiant chacun des paramètres régionaux. Le premier argument est nécessaire et sert à définir le catégorie LC_NUMERIC dans un objet de paramètres régionaux créé avec newlocale(). Le second argument est facultatif et sert à définir la catégorie LC_TIME de l’objet de paramètres régionaux s’il est présent.

Après création et initialisation de l’objet de paramètres régionaux, le programme l’applique en utilisant uselocale(3) et teste ensuite l’effet de la modification de paramètres régionaux en :

1.
affichant un nombre à virgule avec une partie décimale. Cette sortie sera affectée par le réglage LC_NUMERIC. Dans de nombreux paramètres régionaux de langues européennes, le partie décimale du nombre est séparée de la partie entière par une virgule, plutôt que par un point ;
2.
affichant la date. Le format et la langue de sortie seront affectés par le réglage LC_TIME.

Les sessions suivantes d’interpréteur de commandes montrent des exemples d’exécution de ce programme.

Définir la catégorie LC_NUMERIC à fr_FR (français) :

$ ./a.out fr_FR
123456,789
Fri Mar  7 00:25:08 2014

Définir la catégorie LC_NUMERIC à fr_FR (français) et la catégorie LC_TIME à it_IT (italien) :

$ ./a.out fr_FR it_IT
123456,789
ven 07 mar 2014 00:26:01 CET

Indiquer un réglage LC_TIME de chaîne vide, ce qui force la valeur à être prise des réglages de la variable d’environnement (qui est ici indiquée par mi_NZ, maori de Nouvelle-Zélande) :

$ LC_ALL=mi_NZ ./a.out fr_FR ""
123456,789
Te Paraire, te 07 o Poutū-te-rangi, 2014 00:38:44 CET

Source du programme

#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)
int
main(int argc, char *argv[])
{
    char buf[100];
    time_t t;
    size_t s;
    struct tm *tm;
    locale_t loc, nloc;
    if (argc < 2) {
        fprintf(stderr, "Utilisation : %s locale1 [locale2]\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    /* Créer un nouvel objet de paramètres régionaux, prenant le réglage
       LC_NUMERIC des paramètres régionaux indiqués par argv[1] */
    loc = newlocale(LC_NUMERIC_MASK, argv[1], (locale_t) 0);
    if (loc == (locale_t) 0)
        errExit("newlocale");
    /* Si un deuxième argument de ligne de commande à été indiqué,
       modifier l’objet de paramètres régionaux pour prendre le
       réglage LC_TIME des paramètres régionaux indiqués par argv[2].
       Assignation du résultat de cet appel à newlocale() a « nloc »
       plutôt que « loc » afin de pouvoir préserver « loc » si cet
       appel échoue. */
    if (argc > 2) {
        nloc = newlocale(LC_TIME_MASK, argv[2], loc);
        if (nloc == (locale_t) 0)
            errExit("newlocale");
        loc = nloc;
    }
    /* Appliquer les paramètres régionaux nouvellement créé à
       ce thread */
    uselocale(loc);
    /* Tester l’effet de LC_NUMERIC */
    printf("%8.3f\n", 123456.789);
    /* Tester l’effet de LC_TIME */
    t = time(NULL);
    tm = localtime(&t);
    if (tm == NULL)
        errExit("time");
    s = strftime(buf, sizeof(buf), "%c", tm);
    if (s == 0)
        errExit("strftime");
    printf("%s\n", buf);
    /* Libérer l’objet de paramètres régionaux */
    freelocale(loc);
    exit(EXIT_SUCCESS);
}

COLOPHON

Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Veuillez signaler toute erreur de traduction en écrivant à <[email protected]> ou par un rapport de bogue sur le paquet manpages-fr.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C <section> <page_de_man> ».