util-lib: move more locale-related calls to locale-util.[ch]
This commit is contained in:
@@ -19,6 +19,8 @@
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <langinfo.h>
|
||||
#include <locale.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "dirent-util.h"
|
||||
@@ -208,6 +210,88 @@ bool locale_is_valid(const char *name) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void init_gettext(void) {
|
||||
setlocale(LC_ALL, "");
|
||||
textdomain(GETTEXT_PACKAGE);
|
||||
}
|
||||
|
||||
bool is_locale_utf8(void) {
|
||||
const char *set;
|
||||
static int cached_answer = -1;
|
||||
|
||||
/* Note that we default to 'true' here, since today UTF8 is
|
||||
* pretty much supported everywhere. */
|
||||
|
||||
if (cached_answer >= 0)
|
||||
goto out;
|
||||
|
||||
if (!setlocale(LC_ALL, "")) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
set = nl_langinfo(CODESET);
|
||||
if (!set) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (streq(set, "UTF-8")) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* For LC_CTYPE=="C" return true, because CTYPE is effectly
|
||||
* unset and everything can do to UTF-8 nowadays. */
|
||||
set = setlocale(LC_CTYPE, NULL);
|
||||
if (!set) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check result, but ignore the result if C was set
|
||||
* explicitly. */
|
||||
cached_answer =
|
||||
STR_IN_SET(set, "C", "POSIX") &&
|
||||
!getenv("LC_ALL") &&
|
||||
!getenv("LC_CTYPE") &&
|
||||
!getenv("LANG");
|
||||
|
||||
out:
|
||||
return (bool) cached_answer;
|
||||
}
|
||||
|
||||
|
||||
const char *draw_special_char(DrawSpecialChar ch) {
|
||||
|
||||
static const char *draw_table[2][_DRAW_SPECIAL_CHAR_MAX] = {
|
||||
|
||||
/* UTF-8 */ {
|
||||
[DRAW_TREE_VERTICAL] = "\342\224\202 ", /* │ */
|
||||
[DRAW_TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
|
||||
[DRAW_TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
|
||||
[DRAW_TREE_SPACE] = " ", /* */
|
||||
[DRAW_TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
|
||||
[DRAW_BLACK_CIRCLE] = "\342\227\217", /* ● */
|
||||
[DRAW_ARROW] = "\342\206\222", /* → */
|
||||
[DRAW_DASH] = "\342\200\223", /* – */
|
||||
},
|
||||
|
||||
/* ASCII fallback */ {
|
||||
[DRAW_TREE_VERTICAL] = "| ",
|
||||
[DRAW_TREE_BRANCH] = "|-",
|
||||
[DRAW_TREE_RIGHT] = "`-",
|
||||
[DRAW_TREE_SPACE] = " ",
|
||||
[DRAW_TRIANGULAR_BULLET] = ">",
|
||||
[DRAW_BLACK_CIRCLE] = "*",
|
||||
[DRAW_ARROW] = "->",
|
||||
[DRAW_DASH] = "-",
|
||||
}
|
||||
};
|
||||
|
||||
return draw_table[!is_locale_utf8()][ch];
|
||||
}
|
||||
|
||||
static const char * const locale_variable_table[_VARIABLE_LC_MAX] = {
|
||||
[VARIABLE_LANG] = "LANG",
|
||||
[VARIABLE_LANGUAGE] = "LANGUAGE",
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <libintl.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "macro.h"
|
||||
@@ -50,5 +51,25 @@ typedef enum LocaleVariable {
|
||||
int get_locales(char ***l);
|
||||
bool locale_is_valid(const char *name);
|
||||
|
||||
#define _(String) gettext(String)
|
||||
#define N_(String) String
|
||||
void init_gettext(void);
|
||||
|
||||
bool is_locale_utf8(void);
|
||||
|
||||
typedef enum DrawSpecialChar {
|
||||
DRAW_TREE_VERTICAL,
|
||||
DRAW_TREE_BRANCH,
|
||||
DRAW_TREE_RIGHT,
|
||||
DRAW_TREE_SPACE,
|
||||
DRAW_TRIANGULAR_BULLET,
|
||||
DRAW_BLACK_CIRCLE,
|
||||
DRAW_ARROW,
|
||||
DRAW_DASH,
|
||||
_DRAW_SPECIAL_CHAR_MAX
|
||||
} DrawSpecialChar;
|
||||
|
||||
const char *draw_special_char(DrawSpecialChar ch);
|
||||
|
||||
const char* locale_variable_to_string(LocaleVariable i) _const_;
|
||||
LocaleVariable locale_variable_from_string(const char *s) _pure_;
|
||||
|
||||
@@ -810,83 +810,6 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void init_gettext(void) {
|
||||
setlocale(LC_ALL, "");
|
||||
textdomain(GETTEXT_PACKAGE);
|
||||
}
|
||||
|
||||
bool is_locale_utf8(void) {
|
||||
const char *set;
|
||||
static int cached_answer = -1;
|
||||
|
||||
if (cached_answer >= 0)
|
||||
goto out;
|
||||
|
||||
if (!setlocale(LC_ALL, "")) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
set = nl_langinfo(CODESET);
|
||||
if (!set) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (streq(set, "UTF-8")) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* For LC_CTYPE=="C" return true, because CTYPE is effectly
|
||||
* unset and everything can do to UTF-8 nowadays. */
|
||||
set = setlocale(LC_CTYPE, NULL);
|
||||
if (!set) {
|
||||
cached_answer = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check result, but ignore the result if C was set
|
||||
* explicitly. */
|
||||
cached_answer =
|
||||
STR_IN_SET(set, "C", "POSIX") &&
|
||||
!getenv("LC_ALL") &&
|
||||
!getenv("LC_CTYPE") &&
|
||||
!getenv("LANG");
|
||||
|
||||
out:
|
||||
return (bool) cached_answer;
|
||||
}
|
||||
|
||||
const char *draw_special_char(DrawSpecialChar ch) {
|
||||
static const char *draw_table[2][_DRAW_SPECIAL_CHAR_MAX] = {
|
||||
|
||||
/* UTF-8 */ {
|
||||
[DRAW_TREE_VERTICAL] = "\342\224\202 ", /* │ */
|
||||
[DRAW_TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
|
||||
[DRAW_TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
|
||||
[DRAW_TREE_SPACE] = " ", /* */
|
||||
[DRAW_TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
|
||||
[DRAW_BLACK_CIRCLE] = "\342\227\217", /* ● */
|
||||
[DRAW_ARROW] = "\342\206\222", /* → */
|
||||
[DRAW_DASH] = "\342\200\223", /* – */
|
||||
},
|
||||
|
||||
/* ASCII fallback */ {
|
||||
[DRAW_TREE_VERTICAL] = "| ",
|
||||
[DRAW_TREE_BRANCH] = "|-",
|
||||
[DRAW_TREE_RIGHT] = "`-",
|
||||
[DRAW_TREE_SPACE] = " ",
|
||||
[DRAW_TRIANGULAR_BULLET] = ">",
|
||||
[DRAW_BLACK_CIRCLE] = "*",
|
||||
[DRAW_ARROW] = "->",
|
||||
[DRAW_DASH] = "-",
|
||||
}
|
||||
};
|
||||
|
||||
return draw_table[!is_locale_utf8()][ch];
|
||||
}
|
||||
|
||||
int on_ac_power(void) {
|
||||
bool found_offline = false, found_online = false;
|
||||
_cleanup_closedir_ DIR *d = NULL;
|
||||
|
||||
@@ -192,25 +192,6 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
|
||||
int (*compar) (const void *, const void *, void *),
|
||||
void *arg);
|
||||
|
||||
#define _(String) gettext (String)
|
||||
#define N_(String) String
|
||||
void init_gettext(void);
|
||||
bool is_locale_utf8(void);
|
||||
|
||||
typedef enum DrawSpecialChar {
|
||||
DRAW_TREE_VERTICAL,
|
||||
DRAW_TREE_BRANCH,
|
||||
DRAW_TREE_RIGHT,
|
||||
DRAW_TREE_SPACE,
|
||||
DRAW_TRIANGULAR_BULLET,
|
||||
DRAW_BLACK_CIRCLE,
|
||||
DRAW_ARROW,
|
||||
DRAW_DASH,
|
||||
_DRAW_SPECIAL_CHAR_MAX
|
||||
} DrawSpecialChar;
|
||||
|
||||
const char *draw_special_char(DrawSpecialChar ch);
|
||||
|
||||
int on_ac_power(void);
|
||||
|
||||
static inline void *mempset(void *s, int c, size_t n) {
|
||||
|
||||
Reference in New Issue
Block a user