コード例 #1
0
ファイル: lmonetary.c プロジェクト: aquila/OMF-CONFINE-aggmgr
int
__monetary_load_locale(const char *name)
{
	int ret;

	ret = __part_load_locale(name, &_monetary_using_locale,
		_monetary_locale_buf, "LC_MONETARY",
		LCMONETARY_SIZE_FULL, LCMONETARY_SIZE_MIN,
		(const char **)&_monetary_locale);
	if (ret != _LDP_ERROR)
		__mlocale_changed = 1;
	if (ret == _LDP_LOADED) {
		_monetary_locale.mon_grouping =
		     __fix_locale_grouping_str(_monetary_locale.mon_grouping);

#define M_ASSIGN_CHAR(NAME) (((char *)_monetary_locale.NAME)[0] = \
			     cnv(_monetary_locale.NAME))

		M_ASSIGN_CHAR(int_frac_digits);
		M_ASSIGN_CHAR(frac_digits);
		M_ASSIGN_CHAR(p_cs_precedes);
		M_ASSIGN_CHAR(p_sep_by_space);
		M_ASSIGN_CHAR(n_cs_precedes);
		M_ASSIGN_CHAR(n_sep_by_space);
		M_ASSIGN_CHAR(p_sign_posn);
		M_ASSIGN_CHAR(n_sign_posn);

		/*
		 * The six additional C99 international monetary formatting
		 * parameters default to the national parameters when
		 * reading FreeBSD 4 LC_MONETARY data files.
		 */
#define	M_ASSIGN_ICHAR(NAME)						\
		do {							\
			if (_monetary_locale.int_##NAME == NULL)	\
				_monetary_locale.int_##NAME =		\
				    _monetary_locale.NAME;		\
			else						\
				M_ASSIGN_CHAR(int_##NAME);		\
		} while (0)

		M_ASSIGN_ICHAR(p_cs_precedes);
		M_ASSIGN_ICHAR(n_cs_precedes);
		M_ASSIGN_ICHAR(p_sep_by_space);
		M_ASSIGN_ICHAR(n_sep_by_space);
		M_ASSIGN_ICHAR(p_sign_posn);
		M_ASSIGN_ICHAR(n_sign_posn);
	}
	return (ret);
}
コード例 #2
0
ファイル: lmonetary.c プロジェクト: bahamas10/openzfs
struct locdata *
__lc_monetary_load(const char *name)
{
	int ret;
	int clen;
	struct lc_monetary	*lmon;
	struct locdata		*ldata;

	if ((ldata = __locdata_alloc(name, sizeof (*lmon))) == NULL) {
		return (NULL);
	}
	lmon = ldata->l_data[0];

	ret = __part_load_locale(name, (char **)&ldata->l_data[1],
	    "LC_MONETARY", LCMONETARY_SIZE_FULL, LCMONETARY_SIZE_MIN,
	    (const char **)lmon);

	if (ret != _LDP_LOADED) {
		__locdata_free(ldata);
		errno = EINVAL;
		return (NULL);
	}

	/* special storage for currency string */
	clen = strlen(lmon->currency_symbol) + 2;
	ldata->l_data[2] = libc_malloc(clen);
	lmon->crncystr = ldata->l_data[2];

	lmon->mon_grouping = __fix_locale_grouping_str(lmon->mon_grouping);

#define	M_ASSIGN_CHAR(NAME) \
	(((char *)lmon->NAME)[0] = cnv(lmon->NAME))

	M_ASSIGN_CHAR(int_frac_digits);
	M_ASSIGN_CHAR(frac_digits);
	M_ASSIGN_CHAR(p_cs_precedes);
	M_ASSIGN_CHAR(p_sep_by_space);
	M_ASSIGN_CHAR(n_cs_precedes);
	M_ASSIGN_CHAR(n_sep_by_space);
	M_ASSIGN_CHAR(p_sign_posn);
	M_ASSIGN_CHAR(n_sign_posn);

	/*
	 * The six additional C99 international monetary formatting
	 * parameters default to the national parameters when
	 * reading FreeBSD LC_MONETARY data files.
	 */
#define	M_ASSIGN_ICHAR(NAME)				\
	if (lmon->int_##NAME == NULL)			\
		lmon->int_##NAME = lmon->NAME;		\
	else						\
		M_ASSIGN_CHAR(int_##NAME);

	M_ASSIGN_ICHAR(p_cs_precedes);
	M_ASSIGN_ICHAR(n_cs_precedes);
	M_ASSIGN_ICHAR(p_sep_by_space);
	M_ASSIGN_ICHAR(n_sep_by_space);
	M_ASSIGN_ICHAR(p_sign_posn);
	M_ASSIGN_ICHAR(n_sign_posn);

	/*
	 * Now calculate the currency string (CRNCYSTR) for nl_langinfo.
	 * This is a legacy SUSv2 interface.
	 */
	if ((lmon->p_cs_precedes[0] == lmon->n_cs_precedes[0]) &&
	    (lmon->currency_symbol[0] != '\0')) {
		char sign = '\0';
		switch (lmon->p_cs_precedes[0]) {
		case 0:
			sign = '+';
			break;
		case 1:
			sign = '-';
			break;
		case CHAR_MAX:
			/*
			 * Substitute currency string for radix character.
			 * To the best of my knowledge, no locale uses this.
			 */
			if (strcmp(lmon->mon_decimal_point,
			    lmon->currency_symbol) == 0)
				sign = '.';
			break;
		}
		(void) snprintf(lmon->crncystr, clen, "%c%s", sign,
		    lmon->currency_symbol);
	}

	return (ldata);
}