1 /* $OpenBSD: uselocale.c,v 1.1 2017/09/05 03:16:13 schwarze Exp $ */ 2 /* 3 * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <errno.h> 19 #include <locale.h> 20 #include <tib.h> 21 22 #include "rune.h" 23 24 locale_t 25 uselocale(locale_t newloc) 26 { 27 struct tib *tib; 28 _RuneLocale *oldrunes; 29 30 tib = TIB_GET(); 31 oldrunes = tib->tib_locale; 32 33 if (newloc == _LOCALE_UTF8 && _Utf8RuneLocale != NULL) 34 tib->tib_locale = _Utf8RuneLocale; 35 else if (newloc == _LOCALE_C) 36 tib->tib_locale = &_DefaultRuneLocale; 37 else if (newloc == LC_GLOBAL_LOCALE) 38 tib->tib_locale = NULL; 39 else if (newloc != _LOCALE_NONE) { 40 errno = EINVAL; 41 return _LOCALE_NONE; 42 } 43 return oldrunes == NULL ? LC_GLOBAL_LOCALE : 44 oldrunes == _Utf8RuneLocale ? _LOCALE_UTF8 : _LOCALE_C; 45 } 46