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 2013 Garrett D'Amore <garrett@damore.org>
  14  * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
  15  */
  16 
  17 /*
  18  * LC_MESSAGES database generation routines for localedef.
  19  */
  20 
  21 #include <stdio.h>
  22 #include <stdlib.h>
  23 #include <errno.h>
  24 #include <sys/types.h>
  25 #include <string.h>
  26 #include <unistd.h>
  27 #include <alloca.h>
  28 #include "localedef.h"
  29 #include "parser.tab.h"
  30 #include "lmessages.h"
  31 
  32 static struct lc_messages msgs;
  33 
  34 void
  35 init_messages(void)
  36 {
  37         (void) memset(&msgs, 0, sizeof (msgs));
  38 }
  39 
  40 void
  41 add_message(wchar_t *wcs)
  42 {
  43         char *str;
  44 
  45         if ((str = to_mb_string(wcs)) == NULL) {
  46                 INTERR;
  47                 return;
  48         }
  49         free(wcs);
  50 
  51         switch (last_kw) {
  52         case T_YESSTR:
  53                 msgs.yesstr = str;
  54                 break;
  55         case T_NOSTR:
  56                 msgs.nostr = str;
  57                 break;
  58         case T_YESEXPR:
  59                 msgs.yesexpr = str;
  60                 break;
  61         case T_NOEXPR:
  62                 msgs.noexpr = str;
  63                 break;
  64         default:
  65                 free(str);
  66                 INTERR;
  67                 break;
  68         }
  69 }
  70 
  71 void
  72 dump_messages(void)
  73 {
  74         FILE *f;
  75         char *ptr;
  76 
  77         if (msgs.yesstr == NULL) {
  78                 warn(_("missing field 'yesstr'"));
  79                 msgs.yesstr = "";
  80         }
  81         if (msgs.nostr == NULL) {
  82                 warn(_("missing field 'nostr'"));
  83                 msgs.nostr = "";
  84         }
  85 
  86         /*
  87          * CLDR likes to add : separated lists for yesstr and nostr.
  88          * Legacy Solaris code does not seem to grok this.  Fix it.
  89          */
  90         if ((ptr = strchr(msgs.yesstr, ':')) != NULL)
  91                 *ptr = 0;
  92         if ((ptr = strchr(msgs.nostr, ':')) != NULL)
  93                 *ptr = 0;
  94 
  95         if ((f = open_category()) == NULL) {
  96                 return;
  97         }
  98 
  99         if ((putl_category(msgs.yesexpr, f) == EOF) ||
 100             (putl_category(msgs.noexpr, f) == EOF) ||
 101             (putl_category(msgs.yesstr, f) == EOF) ||
 102             (putl_category(msgs.nostr, f) == EOF)) {
 103                 return;
 104         }
 105         close_category(f);
 106 }