6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * This file and its contents are supplied under the terms of the
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * Common Development and Distribution License ("CDDL"), version 1.0.
5aec55eb0591d2fcdd38d7dd5408a6ff3456e596Garrett D'Amore * You may only use this file in accordance with the terms of version
5aec55eb0591d2fcdd38d7dd5408a6ff3456e596Garrett D'Amore * 1.0 of the CDDL.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore *
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * A full copy of the text of the CDDL should have accompanied this
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * source. A copy of the CDDL is also available via the Internet at
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * http://www.illumos.org/license/CDDL.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
2d08521bd15501c8370ba2153b9cca4f094979d0Garrett D'Amore * Copyright 2013 Garrett D'Amore <garrett@damore.org>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * LC_MESSAGES database generation routines for localedef.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <stdio.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <stdlib.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <errno.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <sys/types.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <string.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <unistd.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <alloca.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include "localedef.h"
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include "parser.tab.h"
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include "lmessages.h"
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
2d08521bd15501c8370ba2153b9cca4f094979d0Garrett D'Amorestatic struct lc_messages msgs;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorevoid
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreinit_messages(void)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) memset(&msgs, 0, sizeof (msgs));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorevoid
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreadd_message(wchar_t *wcs)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore char *str;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((str = to_mb_string(wcs)) == NULL) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore INTERR;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore free(wcs);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore switch (last_kw) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_YESSTR:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore msgs.yesstr = str;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_NOSTR:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore msgs.nostr = str;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_YESEXPR:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore msgs.yesexpr = str;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_NOEXPR:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore msgs.noexpr = str;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore default:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore free(str);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore INTERR;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorevoid
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoredump_messages(void)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore FILE *f;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore char *ptr;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (msgs.yesstr == NULL) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore warn(_("missing field 'yesstr'"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore msgs.yesstr = "";
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (msgs.nostr == NULL) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore warn(_("missing field 'nostr'"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore msgs.nostr = "";
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore /*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * CLDR likes to add : separated lists for yesstr and nostr.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * Legacy Solaris code does not seem to grok this. Fix it.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((ptr = strchr(msgs.yesstr, ':')) != NULL)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore *ptr = 0;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((ptr = strchr(msgs.nostr, ':')) != NULL)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore *ptr = 0;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((f = open_category()) == NULL) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((putl_category(msgs.yesexpr, f) == EOF) ||
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (putl_category(msgs.noexpr, f) == EOF) ||
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (putl_category(msgs.yesstr, f) == EOF) ||
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (putl_category(msgs.nostr, f) == EOF)) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore close_category(f);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}