~ubuntu-branches/ubuntu/precise/parted/precise

« back to all changes in this revision

Viewing changes to gnulib/lib/hard-locale.c

  • Committer: Bazaar Package Importer
  • Author(s): Otavio Salvador
  • Date: 2010-02-06 16:39:19 UTC
  • mfrom: (1.1.5 upstream)
  • mto: (7.3.2 experimental)
  • mto: This revision was merged to the branch mainline in revision 48.
  • Revision ID: james.westby@ubuntu.com-20100206163919-nsxr2vtchk0ecabf
Tags: upstream-2.1
ImportĀ upstreamĀ versionĀ 2.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* hard-locale.c -- Determine whether a locale is hard.
2
 
 
3
 
   Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004, 2006, 2007 Free
4
 
   Software Foundation, Inc.
5
 
 
6
 
   This program is free software; you can redistribute it and/or modify
7
 
   it under the terms of the GNU General Public License as published by
8
 
   the Free Software Foundation; either version 2, or (at your option)
9
 
   any later version.
10
 
 
11
 
   This program is distributed in the hope that it will be useful,
12
 
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
   GNU General Public License for more details.
15
 
 
16
 
   You should have received a copy of the GNU General Public License
17
 
   along with this program; if not, write to the Free Software Foundation,
18
 
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
 
 
20
 
#include <config.h>
21
 
 
22
 
#include "hard-locale.h"
23
 
 
24
 
#include <locale.h>
25
 
#include <stdlib.h>
26
 
#include <string.h>
27
 
 
28
 
#ifdef __GLIBC__
29
 
# define GLIBC_VERSION __GLIBC__
30
 
#else
31
 
# define GLIBC_VERSION 0
32
 
#endif
33
 
 
34
 
/* Return true if the current CATEGORY locale is hard, i.e. if you
35
 
   can't get away with assuming traditional C or POSIX behavior.  */
36
 
bool
37
 
hard_locale (int category)
38
 
{
39
 
  bool hard = true;
40
 
  char const *p = setlocale (category, NULL);
41
 
 
42
 
  if (p)
43
 
    {
44
 
      if (2 <= GLIBC_VERSION)
45
 
        {
46
 
          if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
47
 
            hard = false;
48
 
        }
49
 
      else
50
 
        {
51
 
          char *locale = strdup (p);
52
 
          if (locale)
53
 
            {
54
 
              /* Temporarily set the locale to the "C" and "POSIX" locales
55
 
                 to find their names, so that we can determine whether one
56
 
                 or the other is the caller's locale.  */
57
 
              if (((p = setlocale (category, "C"))
58
 
                   && strcmp (p, locale) == 0)
59
 
                  || ((p = setlocale (category, "POSIX"))
60
 
                      && strcmp (p, locale) == 0))
61
 
                hard = false;
62
 
 
63
 
              /* Restore the caller's locale.  */
64
 
              setlocale (category, locale);
65
 
              free (locale);
66
 
            }
67
 
        }
68
 
    }
69
 
 
70
 
  return hard;
71
 
}