NetBSD/lib/libintl/sysdep.c

237 lines
4.8 KiB
C

/* $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 "";
}