1 /*
2  * Copyright (c) 2001 Alexey Zelkin <phantom@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #include <sys/cdefs.h>
28 
29 #include <stddef.h>
30 #include "setlocale.h"
31 
32 #define LCMESSAGES_SIZE_FULL (sizeof(struct lc_messages_T) / sizeof(char *))
33 #define LCMESSAGES_SIZE_MIN \
34 		(offsetof(struct lc_messages_T, yesstr) / sizeof(char *))
35 
36 const struct lc_messages_T _C_messages_locale = {
37 	"^[yY]" ,	/* yesexpr */
38 	"^[nN]" ,	/* noexpr */
39 	"yes" , 	/* yesstr */
40 	"no"		/* nostr */
41 #ifdef __HAVE_LOCALE_INFO_EXTENDED__
42 	, "ASCII" ,	/* codeset */
43 	L"^[yY]" ,	/* wyesexpr */
44 	L"^[nN]" ,	/* wnoexpr */
45 	L"yes" , 	/* wyesstr */
46 	L"no"		/* wnostr */
47 #endif
48 };
49 
50 #ifdef __CYGWIN__
51 int
__messages_load_locale(struct __locale_t * locale,const char * name,void * f_wctomb,const char * charset)52 __messages_load_locale (struct __locale_t *locale, const char *name,
53 			void *f_wctomb, const char *charset)
54 {
55   int ret;
56   struct lc_messages_T me;
57   char *bufp = NULL;
58 
59   extern int __set_lc_messages_from_win (const char *,
60 					 const struct lc_messages_T *,
61 					 struct lc_messages_T *, char **,
62 					 void *, const char *);
63 
64   ret = __set_lc_messages_from_win (name, &_C_messages_locale, &me, &bufp,
65 				    f_wctomb, charset);
66   /* ret == -1: error, ret == 0: C/POSIX, ret > 0: valid */
67   if (ret >= 0)
68     {
69       struct lc_messages_T *mep = NULL;
70 
71       if (ret > 0)
72 	{
73 	  mep = (struct lc_messages_T *) calloc (1, sizeof *mep);
74 	  if (!mep)
75 	    {
76 	      free (bufp);
77 	      return -1;
78 	    }
79 	  *mep = me;
80 	}
81       struct __lc_cats tmp = locale->lc_cat[LC_MESSAGES];
82       locale->lc_cat[LC_MESSAGES].ptr = ret == 0 ? &_C_messages_locale : mep;
83       locale->lc_cat[LC_MESSAGES].buf = bufp;
84       /* If buf is not NULL, both pointers have been alloc'ed */
85       if (tmp.buf)
86 	{
87 	  free ((void *) tmp.ptr);
88 	  free (tmp.buf);
89 	}
90       ret = 0;
91     }
92   return ret;
93 }
94 #endif
95