1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
  14  */
  15 
  16 /*
  17  * LC_MESSAGES database generation routines for localedef.
  18  */
  19 
  20 #include <stdio.h>
  21 #include <stdlib.h>
  22 #include <errno.h>
  23 #include <sys/types.h>
  24 #include <string.h>
  25 #include <unistd.h>
  26 #include <alloca.h>
  27 #include "localedef.h"
  28 #include "parser.tab.h"
  29 #include "lmessages.h"
  30 
  31 static struct lc_messages_T msgs;
  32 
  33 void
  34 init_messages(void)
  35 {
  36         (void) memset(&msgs, 0, sizeof (msgs));
  37 }
  38 
  39 void
  40 add_message(wchar_t *wcs)
  41 {
  42         char *str;
  43 
  44         if ((str = to_mb_string(wcs)) == NULL) {
  45                 INTERR;
  46                 return;
  47         }
  48         free(wcs);
  49 
  50         switch (last_kw) {
  51         case T_YESSTR:
  52                 msgs.yesstr = str;
  53                 break;
  54         case T_NOSTR:
  55                 msgs.nostr = str;
  56                 break;
  57         case T_YESEXPR:
  58                 msgs.yesexpr = str;
  59                 break;
  60         case T_NOEXPR:
  61                 msgs.noexpr = str;
  62                 break;
  63         default:
  64                 free(str);
  65                 INTERR;
  66                 break;
  67         }
  68 }
  69 
  70 void
  71 dump_messages(void)
  72 {
  73         FILE *f;
  74         char *ptr;
  75 
  76         if (msgs.yesstr == NULL) {
  77                 warn(_("missing field 'yesstr'"));
  78                 msgs.yesstr = "";
  79         }
  80         if (msgs.nostr == NULL) {
  81                 warn(_("missing field 'nostr'"));
  82                 msgs.nostr = "";
  83         }
  84 
  85         /*
  86          * CLDR likes to add : separated lists for yesstr and nostr.
  87          * Legacy Solaris code does not seem to grok this.  Fix it.
  88          */
  89         if ((ptr = strchr(msgs.yesstr, ':')) != NULL)
  90                 *ptr = 0;
  91         if ((ptr = strchr(msgs.nostr, ':')) != NULL)
  92                 *ptr = 0;
  93 
  94         if ((f = open_category()) == NULL) {
  95                 return;
  96         }
  97 
  98         if ((putl_category(msgs.yesexpr, f) == EOF) ||
  99             (putl_category(msgs.noexpr, f) == EOF) ||
 100             (putl_category(msgs.yesstr, f) == EOF) ||
 101             (putl_category(msgs.nostr, f) == EOF)) {
 102                 return;
 103         }
 104         close_category(f);
 105 }