/***************************************************************************
 *
 * messages.cpp
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 2000-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#define _RWSTD_LIB_SRC
#include <rw/_defs.h>

#include <new>         // for placement new

#include <string.h>    // for memcpy, size_t

#include <loc/_locale.h>
#include <loc/_messages.h>

#include <rw/_mutex.h>


#if !defined (_RWSTD_NO_NL_TYPES_H) && !defined (_RWSTD_NO_CATOPEN_CATGETS)
#  include <nl_types.h>
#else   // _RWSTD_NO_NL_TYPES_H || _RWSTD_NO_CATOPEN_CATGETS
#  include "catalog.h"
#endif   // !_RWSTD_NO_NL_TYPES_H && !_RWSTD_NO_CATOPEN_CATGETS


#define _RWSTD_BAD_CATD ((nl_catd)-1)


_RWSTD_NAMESPACE (__rw) { 


// Implementation structure private to this module -- __rw_open_cat_data.
// Keeps track of the association between an open message catalog (as
// identified by the nl_catd handle returned by the C library catopen
// function) and the locale specified by the user for character translation
// in the call to messages<_CharT>::open.
// 
// Also used as a parameter to rw_get_static_mutex to ensure uniqueness
// of the mutex object used in sync'ing the threads using __rw_cat...
// (see RWSTD_MT_STATIC_GUARD below)
struct __rw_open_cat_data
{
    nl_catd catd;
    union {
        void *_C_align;
        char _C_data [sizeof (_STD::locale)];
    } loc;
};


// manages a global, per-process repository of open catalogs according
// to the following table:

//        cat   _rw_open_cat_data     algorithm
//        -1         0                invalid
//        -1       non-0              append the struct into the repository and 
//                                    return a pointer to a struct containing
//                                    the new catalog and locale
//      > -1       0                  return the a pointer to a struct
//                                    containing the locale associated with
//                                    this catalog
//      > -1     non-0                find the struct containg  the locale and
//                                    catalog in the repository and invalidate
//                                    it.
//                                    Return a pointer to the struct

static __rw_open_cat_data*
__rw_manage_cat_data (int &cat,  __rw_open_cat_data *pcat_data)
{
    // a per-process array of catalog data structs
    static __rw_open_cat_data  catalog_buf [8];
    static __rw_open_cat_data* catalogs = catalog_buf;

    static size_t n_catalogs      = 0;
    static size_t catalog_bufsize = sizeof catalog_buf / sizeof *catalog_buf;
    static size_t largest_cat     = 0;
    static int    init            = 0;

 
    if (0 == init) {
        for (size_t i = 0; i < catalog_bufsize; ++i) {
	    catalogs [i].catd = _RWSTD_BAD_CATD;
	}
	init = 1;
    }

    if (-1 == cat) {
        _RWSTD_ASSERT (0 != pcat_data);

        // append the locale and return a struct with the associated catalog

        if (pcat_data) {
             if (n_catalogs == catalog_bufsize) {

                // reallocate buffer of facet pointers
	         __rw_open_cat_data* const tmp =
		     new __rw_open_cat_data[n_catalogs * 2];
		 
		 memcpy (tmp, catalogs, n_catalogs * sizeof *tmp);
		 
		 if (catalogs != catalog_buf)
		     delete[] catalogs;
		 
		 catalogs         = tmp;
		 catalog_bufsize *= 2;

		 for (size_t i = n_catalogs; i < catalog_bufsize; ++i) {
		      catalogs [i].catd = _RWSTD_BAD_CATD;
		 }

		 cat = int (n_catalogs);
                 memcpy (&catalogs [cat].loc, &pcat_data->loc,
                         sizeof (_STD::locale));

		 catalogs [cat].catd = pcat_data->catd;

		 if (size_t (cat) > largest_cat)
		     largest_cat = size_t (cat);

		 ++n_catalogs;
	     }
	     else {
                 // find the first open slot and use it.
                 cat = 0;
                 while (catalogs [cat].catd != _RWSTD_BAD_CATD) {
                     ++cat;
                 }

		 if (size_t (cat) > largest_cat)
		     largest_cat = size_t (cat);

                 memcpy (&catalogs [cat].loc, &pcat_data->loc,
                         sizeof (_STD::locale));

                 catalogs [cat].catd = pcat_data->catd;
                 ++n_catalogs;
	     }
	}
    }
    else {
        if (0 == pcat_data) {
	    // find struct and return it
	    if (size_t (cat) < catalog_bufsize)
                return catalogs + cat;

	    return 0;
        }

        // initialize the struct to an invalid state
        --n_catalogs;
        catalogs [cat].catd = _RWSTD_BAD_CATD;
        if (size_t (cat) == largest_cat) {

            // find the next smallest valid slot
            for (int i = cat; i >= 0; --i) {
                if (catalogs [i].catd != _RWSTD_BAD_CATD) {
                    largest_cat = size_t (i);
                    break;
                }
            }

            static const size_t bufsize =
                sizeof catalog_buf / sizeof *catalog_buf;

            if ((largest_cat < bufsize / 2) && (catalogs != catalog_buf)) {

                // when there are no more open catalogs indexed beyond
                // second half of the statically allocated repository, copy
                // the open catalogs back into the statically allocated
                // repository.
		    
                catalog_bufsize = bufsize;

                memcpy (catalog_buf, catalogs,
                        catalog_bufsize * sizeof (*catalogs));

                delete[] catalogs;
                catalogs = catalog_buf;
            }
        }
    }

    return pcat_data;
}



// Open a message catalog and assign and return a handle for it.

int
__rw_cat_open (const _STD::string &cat_name, const _STD::locale &loc)
{
    _RWSTD_MT_STATIC_GUARD (__rw_open_cat_data);

    const nl_catd catd = catopen (cat_name.c_str (), NL_CAT_LOCALE);
    if (_RWSTD_BAD_CATD == catd)
        return -1;

    __rw_open_cat_data cat_data;
    cat_data.catd = catd;
    new (&cat_data.loc) _STD::locale (loc);

    int cat = -1;
    __rw_manage_cat_data (cat, &cat_data);

    _RWSTD_ASSERT (0 <= cat);

    return cat;
}


// Get message text from catalog.
const char*
__rw_get_message (int cat, int set_num, int msg_num)
{
    if (cat < 0)
        return 0;

    _RWSTD_MT_STATIC_GUARD (__rw_open_cat_data);

    __rw_open_cat_data *const pcat_data = __rw_manage_cat_data (cat, 0);

    if (pcat_data && _RWSTD_BAD_CATD != pcat_data->catd) {
        // 22.2.7.1.2, p3: `catalog' must be valid

        const char dflt[] = "";

	const nl_catd catd = pcat_data->catd;

        const char* const text = catgets (catd, set_num, msg_num, dflt);

        if (text != dflt)
            return text;
    }

    return 0;
}


// Get locale to be used for character translation for this message catalog.
const _STD::locale&
__rw_get_locale (int cat)
{
    _RWSTD_MT_STATIC_GUARD (__rw_open_cat_data);

    _RWSTD_ASSERT (0 <= cat);
    __rw_open_cat_data* const pcat_data = __rw_manage_cat_data (cat, 0);

    _RWSTD_ASSERT (0 != pcat_data);

    return *(_RWSTD_REINTERPRET_CAST (_STD::locale*, &(pcat_data->loc)));
}


// Close a catalog and release its handle.
void
__rw_cat_close (int cat)
{
    _RWSTD_MT_STATIC_GUARD (__rw_open_cat_data);
    
    __rw_open_cat_data* const pcat_data =
        cat < 0 ? 0 : __rw_manage_cat_data (cat, 0);

    // 22.2.7.1.2, p5: `catalog' must be valid
    if (pcat_data && pcat_data->catd != _RWSTD_BAD_CATD) {

	catclose (pcat_data->catd);

	_STD::locale* const ploc =
            _RWSTD_REINTERPRET_CAST (_STD::locale*, &pcat_data->loc);

	ploc->~locale ();

	__rw_manage_cat_data (cat, pcat_data);
    }
    else {
        _RWSTD_REQUIRES (0, (_RWSTD_ERROR_INVALID_ARGUMENT,
                             _RWSTD_FUNC ("__rw_cat_close (int cat)")));
    }
}


}   // namespace __rw
