1/*
2 * Copyright 2004-2007, Axel D��rfler, axeld@pinc-software.de
3 * Copyright 2010, Oliver Tappe, zooey@hirschkaefer.de
4 * All rights reserved. Distributed under the terms of the MIT License.
5 */
6
7
8#include "LocaleInternal.h"
9
10#include <locale.h>
11#include <stdlib.h>
12#include <strings.h>
13
14#include <Debug.h>
15
16
17namespace BPrivate {
18namespace Libroot {
19
20
21status_t
22GetLocalesFromEnvironment(int category, const char** locales)
23{
24	if (category > LC_LAST) {
25		return B_BAD_VALUE;
26	}
27
28	const char* locale = getenv("LC_ALL");
29	if (locale != NULL && *locale != '\0')
30		locales[category] = locale;
31	else {
32		// the order of the names must match the one specified in locale.h
33		const char* const categoryNames[] = {
34			"LC_ALL",
35			"LC_COLLATE",
36			"LC_CTYPE",
37			"LC_MONETARY",
38			"LC_NUMERIC",
39			"LC_TIME",
40			"LC_MESSAGES"
41		};
42
43		STATIC_ASSERT(B_COUNT_OF(categoryNames) == LC_LAST + 1);
44
45		int from, to;
46		if (category == LC_ALL) {
47			// we need to check each real category if all of them should be set
48			from = 1;
49			to = LC_LAST;
50		} else
51			from = to = category;
52		bool haveDifferentLocales = false;
53		locale = NULL;
54		for (int lc = from; lc <= to; lc++) {
55			const char* lastLocale = locale;
56			locale = getenv(categoryNames[lc]);
57			if (locale == NULL || *locale == '\0')
58				locale = getenv("LANG");
59			if (locale == NULL || *locale == '\0')
60				locale = "POSIX";
61			locales[lc] = locale;
62			if (lastLocale != NULL && strcasecmp(locale, lastLocale) != 0)
63				haveDifferentLocales = true;
64		}
65		if (!haveDifferentLocales) {
66			// we can set all locales at once
67			locales[LC_ALL] = locale;
68		}
69	}
70
71	return B_OK;
72}
73
74}	// namespace Libroot
75}	// namespace BPrivate
76