1/* Language code of current locale. 2 Copyright (C) 2009-2010 Free Software Foundation, Inc. 3 Written by Bruno Haible <bruno@clisp.org>, 2009. 4 5 This program is free software: you can redistribute it and/or modify it 6 under the terms of the GNU Lesser General Public License as published 7 by the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18#include <config.h> 19 20/* Specification. */ 21#include "unicase.h" 22 23#include <locale.h> 24#include <string.h> 25 26#include "localename.h" 27 28#include "unicase/locale-languages.h" 29 30const char * 31uc_locale_language (void) 32{ 33 const char *locale_name = gl_locale_name (LC_CTYPE, "LC_CTYPE"); 34 const char *p; 35 36 /* Find the end of the language portion. */ 37 p = locale_name; 38 while (*p != '\0' && *p != '_' && *p != '.' && *p != '@') 39 p++; 40 41 /* Return a statically allocated pointer to the language portion, so that the 42 caller of this function does not need to free() the result. 43 We could use a dynamically built unification table. But given that the 44 set of possible languages is small, it is easier (and excludes ENOMEM 45 error conditions) to allocate the unification table statically. */ 46 if (p != locale_name) 47 { 48 const char *language = 49 uc_locale_languages_lookup (locale_name, p - locale_name); 50 if (language != NULL) 51 return language; 52 } 53 54 return ""; 55} 56