Пример #1
0
static void
revert_to_default(int category)
{
  switch (category) {
  case LC_CTYPE:
#ifdef WITH_RUNE
    (void)_xpg4_setrunelocale("C");
    (void)__runetable_to_netbsd_ctype("C");
#else
    if (_cClass != _C_CharClassTable) {
      /* LINTED const castaway */
      free((void *)_cClass);
      _cClass = _C_CharClassTable;
    }
    if (_uConvT != _C_ToUpperTable) {
      /* LINTED const castaway */
      free((void *)_uConvT);
      _uConvT = _C_ToUpperTable;
    }
    if (_lConvT != _C_ToLowerTable) {
      /* LINTED const castaway */
      free((void *)_lConvT);
      _lConvT = _C_ToLowerTable;
    }
#endif
    break;
  case LC_MESSAGES:
  case LC_COLLATE:
  case LC_MONETARY:
  case LC_NUMERIC:
  case LC_TIME:
    break;
  }
}
Пример #2
0
static int
load_locale_sub(int category, const char *locname, int isspecial)
{
	/* check for the default locales */
	if (!strcmp(new_categories[category], "C") ||
	    !strcmp(new_categories[category], "POSIX")) {
		revert_to_default(category);
		return 0;
	}

	/* sanity check */
	if (strchr(locname, '/') != NULL)
		return -1;

	switch (category) {
	case LC_CTYPE:
		if (_xpg4_setrunelocale(locname))
			return -1;
		__install_currentrunelocale_ctype();
		break;

	case LC_MESSAGES:
	case LC_COLLATE:
	case LC_MONETARY:
	case LC_NUMERIC:
	case LC_TIME:
		return -1;
	}

	return 0;
}
Пример #3
0
static int
load_ctype(const char *locale)
{
	if (_xpg4_setrunelocale(locale))
		return(-1);
	if (__runetable_to_netbsd_ctype(locale)) {
		/* very unfortunate, but need to go to "C" locale */
		revert_ctype();
		return(-1);
	}

	return(0);
}
Пример #4
0
static void
revert_to_default(int category)
{
	switch (category) {
	case LC_CTYPE:
		(void)_xpg4_setrunelocale("C");
		__install_currentrunelocale_ctype();
		break;
	case LC_MESSAGES:
	case LC_COLLATE:
	case LC_MONETARY:
	case LC_NUMERIC:
	case LC_TIME:
		break;
	}
}
Пример #5
0
static int
load_locale_sub(int category, const char *locname, int isspecial)
{
	char name[PATH_MAX];
	int len;

	/* check for the default locales */
	if (!strcmp(new_categories[category], "C") ||
	    !strcmp(new_categories[category], "POSIX")) {
		revert_to_default(category);
		return 0;
	}

	/* sanity check */
	if (strchr(locname, '/') != NULL)
		return -1;

	len = snprintf(name, sizeof(name), "%s/%s/%s",
		       _PathLocale, locname, categories[category]);
	if (len < 0 || len >= sizeof(name))
		return -1;

	switch (category) {
	case LC_CTYPE:
		if (_xpg4_setrunelocale(locname))
			return -1;
		__install_currentrunelocale_ctype();
		break;

	case LC_MESSAGES:
	case LC_COLLATE:
	case LC_MONETARY:
	case LC_NUMERIC:
	case LC_TIME:
		return -1;
	}

	return 0;
}
Пример #6
0
static void
revert_ctype(void)
{
	_xpg4_setrunelocale("C");
	__runetable_to_netbsd_ctype("C");
}
Пример #7
0
static int
load_locale_sub(
  int category,
  const char *locname,
  int isspecial
  )
{
  char name[PATH_MAX];

  /* check for the default locales */
  if (!strcmp(new_categories[category], "C") ||
      !strcmp(new_categories[category], "POSIX")) {
    revert_to_default(category);
    return 0;
  }

  /* check whether special symbol */
  if (isspecial && _bcs_strcasecmp(locname, _LOCALE_SYM_FORCE) == 0)
    return force_locale_enable(category);

  /* sanity check */
  if (strchr(locname, '/') != NULL)
    return -1;

  (void)snprintf(name, sizeof(name), "%s/%s/%s",
           _PathLocale, locname, categories[category]);

  switch (category) {
  case LC_CTYPE:
#ifdef WITH_RUNE
    if (_xpg4_setrunelocale(__UNCONST(locname)))
      return -1;
    if (__runetable_to_netbsd_ctype(locname)) {
      /* very unfortunate, but need to go to "C" locale */
      revert_to_default(category);
      return -1;
    }
#else
    if (!__loadctype(name))
      return -1;
#endif
    break;

  case LC_MESSAGES:
    /*
     * XXX we don't have LC_MESSAGES support yet,
     * but catopen may use the value of LC_MESSAGES category.
     * so return successfully if locale directory is present.
     */
    (void)snprintf(name, sizeof(name), "%s/%s",
      _PathLocale, locname);
    /* local */
    {
      struct stat st;
      if (stat(name, &st) < 0)
        return -1;
      if (!S_ISDIR(st.st_mode))
        return -1;
    }
    break;

  case LC_COLLATE:
  case LC_MONETARY:
  case LC_NUMERIC:
  case LC_TIME:
    return -1;
  }

  return 0;
}