root/lib/libintl/sysdep.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 "";
}