intl.c 2.87 KB
Newer Older
1
/* Message translation utilities.
2 3
   Copyright (C) 2001, 2003, 2004, 2005, 2007, 2008
   Free Software Foundation, Inc.
Jeff Law committed
4

5 6 7 8
This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 3, or (at your option) any later
10 11 12 13 14 15 16 17
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
18 19
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
20 21 22

#include "config.h"
#include "system.h"
23 24
#include "coretypes.h"
#include "tm.h"
Jeff Law committed
25 26
#include "intl.h"

27 28 29 30 31 32 33 34 35 36
#ifdef HAVE_LANGINFO_CODESET
#include <langinfo.h>
#endif

/* Opening quotation mark for diagnostics.  */
const char *open_quote = "'";

/* Closing quotation mark for diagnostics.  */
const char *close_quote = "'";

37 38 39 40 41 42 43 44
#ifdef ENABLE_NLS

/* Initialize the translation library for GCC.  This performs the
   appropriate sequence of calls - setlocale, bindtextdomain,
   textdomain.  LC_CTYPE determines the character set used by the
   terminal, so it has be set to output messages correctly.  */

void
45
gcc_init_libintl (void)
46 47 48 49 50 51 52 53
{
#ifdef HAVE_LC_MESSAGES
  setlocale (LC_CTYPE, "");
  setlocale (LC_MESSAGES, "");
#else
  setlocale (LC_ALL, "");
#endif

Zack Weinberg committed
54 55
  (void) bindtextdomain ("gcc", LOCALEDIR);
  (void) textdomain ("gcc");
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

  /* Opening quotation mark.  */
  open_quote = _("`");

  /* Closing quotation mark.  */
  close_quote = _("'");

  if (!strcmp (open_quote, "`") && !strcmp (close_quote, "'"))
    {
#if defined HAVE_LANGINFO_CODESET
      const char *encoding;
#endif
      /* Untranslated quotes that it may be possible to replace with
	 U+2018 and U+2019; but otherwise use "'" instead of "`" as
	 opening quote.  */
      open_quote = "'";
#if defined HAVE_LANGINFO_CODESET
      encoding = nl_langinfo (CODESET);
      if (encoding != NULL
	  && (!strcasecmp (encoding, "utf-8")
	      || !strcasecmp (encoding, "utf8")))
	{
	  open_quote = "\xe2\x80\x98";
	  close_quote = "\xe2\x80\x99";
	}
#endif
    }
83 84
}

85
#if defined HAVE_WCHAR_H && defined HAVE_WORKING_MBSTOWCS && defined HAVE_WCSWIDTH
86 87 88 89 90 91
#include <wchar.h>

/* Returns the width in columns of MSGSTR, which came from gettext.
   This is for indenting subsequent output.  */

size_t
92
gcc_gettext_width (const char *msgstr)
93 94
{
  size_t nwcs = mbstowcs (0, msgstr, 0);
95
  wchar_t *wmsgstr = XALLOCAVEC (wchar_t, nwcs + 1);
96 97 98 99 100 101 102 103 104 105 106

  mbstowcs (wmsgstr, msgstr, nwcs + 1);
  return wcswidth (wmsgstr, nwcs);
}

#else  /* no wcswidth */

/* We don't have any way of knowing how wide the string is.  Guess
   the length of the string.  */

size_t
107
gcc_gettext_width (const char *msgstr)
108 109 110 111
{
  return strlen (msgstr);
}

112
#endif
113 114

#endif /* ENABLE_NLS */