/*	$NetBSD: sysdep.c,v 1.2 2005/04/27 09:50:26 yamt Exp $	*/

/*-
 * Copyright (c)2004 Citrus Project,
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: sysdep.c,v 1.2 2005/04/27 09:50:26 yamt Exp $");
#endif /* LIBC_SCCS and not lint */

#include <sys/param.h>
#include <sys/types.h>

#include <inttypes.h>
#include <stdlib.h>
#include <string.h>

#include "libintl_local.h"

struct sysdep_pair
{
	const char *tag;
	const char *string;
	size_t len;
};

#define T_(tag)		{ #tag, tag, sizeof (tag)-1 }
#define numof(a)	(sizeof (a) / sizeof ((a)[0]))

const struct sysdep_pair sysdep_pair_table[] = {
	/* this table must be sorted in the dictionary order. */
	T_(PRIX16),
	T_(PRIX32),
	T_(PRIX64),
	T_(PRIX8),
	T_(PRIXFAST16),
	T_(PRIXFAST32),
	T_(PRIXFAST64),
	T_(PRIXFAST8),
	T_(PRIXLEAST16),
	T_(PRIXLEAST32),
	T_(PRIXLEAST64),
	T_(PRIXLEAST8),
	T_(PRIXMAX),
	T_(PRIXPTR),
	T_(PRId16),
	T_(PRId32),
	T_(PRId64),
	T_(PRId8),
	T_(PRIdFAST16),
	T_(PRIdFAST32),
	T_(PRIdFAST64),
	T_(PRIdFAST8),
	T_(PRIdLEAST16),
	T_(PRIdLEAST32),
	T_(PRIdLEAST64),
	T_(PRIdLEAST8),
	T_(PRIdMAX),
	T_(PRIdPTR),
	T_(PRIi16),
	T_(PRIi32),
	T_(PRIi64),
	T_(PRIi8),
	T_(PRIiFAST16),
	T_(PRIiFAST32),
	T_(PRIiFAST64),
	T_(PRIiFAST8),
	T_(PRIiLEAST16),
	T_(PRIiLEAST32),
	T_(PRIiLEAST64),
	T_(PRIiLEAST8),
	T_(PRIiMAX),
	T_(PRIiPTR),
	T_(PRIo16),
	T_(PRIo32),
	T_(PRIo64),
	T_(PRIo8),
	T_(PRIoFAST16),
	T_(PRIoFAST32),
	T_(PRIoFAST64),
	T_(PRIoFAST8),
	T_(PRIoLEAST16),
	T_(PRIoLEAST32),
	T_(PRIoLEAST64),
	T_(PRIoLEAST8),
	T_(PRIoMAX),
	T_(PRIoPTR),
	T_(PRIu16),
	T_(PRIu32),
	T_(PRIu64),
	T_(PRIu8),
	T_(PRIuFAST16),
	T_(PRIuFAST32),
	T_(PRIuFAST64),
	T_(PRIuFAST8),
	T_(PRIuLEAST16),
	T_(PRIuLEAST32),
	T_(PRIuLEAST64),
	T_(PRIuLEAST8),
	T_(PRIuMAX),
	T_(PRIuPTR),
	T_(PRIx16),
	T_(PRIx32),
	T_(PRIx64),
	T_(PRIx8),
	T_(PRIxFAST16),
	T_(PRIxFAST32),
	T_(PRIxFAST64),
	T_(PRIxFAST8),
	T_(PRIxLEAST16),
	T_(PRIxLEAST32),
	T_(PRIxLEAST64),
	T_(PRIxLEAST8),
	T_(PRIxMAX),
	T_(PRIxPTR),
	T_(SCNd16),
	T_(SCNd32),
	T_(SCNd64),
	T_(SCNd8),
	T_(SCNdFAST16),
	T_(SCNdFAST32),
	T_(SCNdFAST64),
	T_(SCNdFAST8),
	T_(SCNdLEAST16),
	T_(SCNdLEAST32),
	T_(SCNdLEAST64),
	T_(SCNdLEAST8),
	T_(SCNdMAX),
	T_(SCNdPTR),
	T_(SCNi16),
	T_(SCNi32),
	T_(SCNi64),
	T_(SCNi8),
	T_(SCNiFAST16),
	T_(SCNiFAST32),
	T_(SCNiFAST64),
	T_(SCNiFAST8),
	T_(SCNiLEAST16),
	T_(SCNiLEAST32),
	T_(SCNiLEAST64),
	T_(SCNiLEAST8),
	T_(SCNiMAX),
	T_(SCNiPTR),
	T_(SCNo16),
	T_(SCNo32),
	T_(SCNo64),
	T_(SCNo8),
	T_(SCNoFAST16),
	T_(SCNoFAST32),
	T_(SCNoFAST64),
	T_(SCNoFAST8),
	T_(SCNoLEAST16),
	T_(SCNoLEAST32),
	T_(SCNoLEAST64),
	T_(SCNoLEAST8),
	T_(SCNoMAX),
	T_(SCNoPTR),
	T_(SCNu16),
	T_(SCNu32),
	T_(SCNu64),
	T_(SCNu8),
	T_(SCNuFAST16),
	T_(SCNuFAST32),
	T_(SCNuFAST64),
	T_(SCNuFAST8),
	T_(SCNuLEAST16),
	T_(SCNuLEAST32),
	T_(SCNuLEAST64),
	T_(SCNuLEAST8),
	T_(SCNuMAX),
	T_(SCNuPTR),
	T_(SCNx16),
	T_(SCNx32),
	T_(SCNx64),
	T_(SCNx8),
	T_(SCNxFAST16),
	T_(SCNxFAST32),
	T_(SCNxFAST64),
	T_(SCNxFAST8),
	T_(SCNxLEAST16),
	T_(SCNxLEAST32),
	T_(SCNxLEAST64),
	T_(SCNxLEAST8),
	T_(SCNxMAX),
	T_(SCNxPTR)
};

static int
cmp_sysdep_tag(const void *tag, const void *elem)
{
	const struct sysdep_pair *pair = elem;

	return strcmp(tag, pair->tag);
}

const char *
__intl_sysdep_get_string_by_tag(const char *tag, size_t *rlen)
{
	const struct sysdep_pair *found;

	found = bsearch(tag, sysdep_pair_table, numof(sysdep_pair_table),
			sizeof(sysdep_pair_table[0]), &cmp_sysdep_tag);

	if (found) {
		if (rlen)
			*rlen = found->len;
		return found->string;
	}

	if (rlen)
		*rlen = 0;
	return "";
}