msgcat.c 3.02 KB
Newer Older
Bob Halley's avatar
Bob Halley committed
1
/*
Mark Andrews's avatar
Mark Andrews committed
2
 * Copyright (C) 2004, 2005  Internet Systems Consortium, Inc. ("ISC")
Brian Wellington's avatar
Brian Wellington committed
3
 * Copyright (C) 1999-2001  Internet Software Consortium.
4
 *
Bob Halley's avatar
Bob Halley committed
5 6 7
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
8
 *
Mark Andrews's avatar
Mark Andrews committed
9 10 11 12 13 14 15
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
Bob Halley's avatar
Bob Halley committed
16 17
 */

18
/* $Id: msgcat.c,v 1.16 2005/06/08 02:07:00 marka Exp $ */
David Lawrence's avatar
David Lawrence committed
19

20 21 22
/*! \file msgcat.c
 *
 * \author Principal Author: Bob Halley
Bob Halley's avatar
Bob Halley committed
23 24 25 26
 */

#include <config.h>

27
#include <stddef.h>
Bob Halley's avatar
Bob Halley committed
28 29
#include <stdlib.h>

30
#include <isc/magic.h>
Bob Halley's avatar
Bob Halley committed
31
#include <isc/msgcat.h>
Bob Halley's avatar
Bob Halley committed
32
#include <isc/util.h>
Bob Halley's avatar
Bob Halley committed
33 34

#ifdef HAVE_CATGETS
35
#include <nl_types.h>		/* Required for nl_catd. */
Bob Halley's avatar
Bob Halley committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#endif

/*
 * Implementation Notes:
 *
 *	We use malloc() and free() instead of isc_mem_get() and isc_mem_put()
 *	because we don't want to require a memory context to be specified
 *	in order to use a message catalog.
 */

struct isc_msgcat {
	unsigned int	magic;
#ifdef HAVE_CATGETS
	nl_catd		catalog;
#endif
};

53 54
#define MSGCAT_MAGIC			ISC_MAGIC('M', 'C', 'a', 't')
#define VALID_MSGCAT(m)			ISC_MAGIC_VALID(m, MSGCAT_MAGIC)
Bob Halley's avatar
Bob Halley committed
55 56

void
David Lawrence's avatar
David Lawrence committed
57
isc_msgcat_open(const char *name, isc_msgcat_t **msgcatp) {
Bob Halley's avatar
Bob Halley committed
58 59 60 61 62 63 64 65 66
	isc_msgcat_t *msgcat;

	/*
	 * Open a message catalog.
	 */

	REQUIRE(name != NULL);
	REQUIRE(msgcatp != NULL && *msgcatp == NULL);

Andreas Gustafsson's avatar
Andreas Gustafsson committed
67
	msgcat = malloc(sizeof(*msgcat));
Bob Halley's avatar
Bob Halley committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
	if (msgcat == NULL) {
		*msgcatp = NULL;
		return;
	}

#ifdef HAVE_CATGETS
	/*
	 * We don't check if catopen() fails because we don't care.
	 * If it does fail, then when we call catgets(), it will use
	 * the default string.
	 */
	msgcat->catalog = catopen(name, 0);
#endif
	msgcat->magic = MSGCAT_MAGIC;

	*msgcatp = msgcat;
}

void
isc_msgcat_close(isc_msgcat_t **msgcatp) {
	isc_msgcat_t *msgcat;

	/*
	 * Close a message catalog.
	 */

	REQUIRE(msgcatp != NULL);
	msgcat = *msgcatp;
	REQUIRE(VALID_MSGCAT(msgcat) || msgcat == NULL);

	if (msgcat != NULL) {
#ifdef HAVE_CATGETS
		if (msgcat->catalog != (nl_catd)(-1))
101
			(void)catclose(msgcat->catalog);
Bob Halley's avatar
Bob Halley committed
102 103 104 105 106 107 108 109
#endif
		msgcat->magic = 0;
		free(msgcat);
	}

	*msgcatp = NULL;
}

David Lawrence's avatar
David Lawrence committed
110
const char *
Bob Halley's avatar
Bob Halley committed
111
isc_msgcat_get(isc_msgcat_t *msgcat, int set, int message,
David Lawrence's avatar
David Lawrence committed
112
	       const char *default_text)
Bob Halley's avatar
Bob Halley committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
{
	/*
	 * Get message 'message' from message set 'set' in 'msgcat'.  If it
	 * is not available, use 'default'.
	 */

	REQUIRE(VALID_MSGCAT(msgcat) || msgcat == NULL);
	REQUIRE(set > 0);
	REQUIRE(message > 0);
	REQUIRE(default_text != NULL);

#ifdef HAVE_CATGETS
	if (msgcat == NULL)
		return (default_text);
	return (catgets(msgcat->catalog, set, message, default_text));
#else
	return (default_text);
#endif
}