/* $Id$
 * YASM module loader header file
 *
 *  Copyright (C) 2002-2007  Peter Johnson
 *
 * 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 OTHER 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 OTHER 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.
 */
#ifndef YASM_MODULE_H
#define YASM_MODULE_H

#ifndef YASM_LIB_DECL
#define YASM_LIB_DECL
#endif

typedef enum yasm_module_type {
    YASM_MODULE_ARCH = 0,
    YASM_MODULE_DBGFMT,
    YASM_MODULE_OBJFMT,
    YASM_MODULE_LISTFMT,
    YASM_MODULE_PARSER,
    YASM_MODULE_PREPROC
} yasm_module_type;

YASM_LIB_DECL
/*@dependent@*/ /*@null@*/ void *yasm_load_module
    (yasm_module_type type, const char *keyword);

#define yasm_load_arch(keyword) \
    yasm_load_module(YASM_MODULE_ARCH, keyword)
#define yasm_load_dbgfmt(keyword)       \
    yasm_load_module(YASM_MODULE_DBGFMT, keyword)
#define yasm_load_objfmt(keyword)       \
    yasm_load_module(YASM_MODULE_OBJFMT, keyword)
#define yasm_load_listfmt(keyword)      \
    yasm_load_module(YASM_MODULE_LISTFMT, keyword)
#define yasm_load_parser(keyword)       \
    yasm_load_module(YASM_MODULE_PARSER, keyword)
#define yasm_load_preproc(keyword)      \
    yasm_load_module(YASM_MODULE_PREPROC, keyword)

YASM_LIB_DECL
void yasm_list_modules
    (yasm_module_type type,
     void (*printfunc) (const char *name, const char *keyword));

#define yasm_list_arch(func)            \
    yasm_list_modules(YASM_MODULE_ARCH, func)
#define yasm_list_dbgfmt(func)          \
    yasm_list_modules(YASM_MODULE_DBGFMT, func)
#define yasm_list_objfmt(func)          \
    yasm_list_modules(YASM_MODULE_OBJFMT, func)
#define yasm_list_listfmt(func)         \
    yasm_list_modules(YASM_MODULE_LISTFMT, func)
#define yasm_list_parser(func)          \
    yasm_list_modules(YASM_MODULE_PARSER, func)
#define yasm_list_preproc(func)         \
    yasm_list_modules(YASM_MODULE_PREPROC, func)

YASM_LIB_DECL
void yasm_register_module(yasm_module_type type, const char *keyword,
                          void *data);

#endif
