/* 
 * Mach Operating System
 * Copyright (c) 1991,1990, 1999 Carnegie Mellon University
 * All Rights Reserved.
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 * 
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 * 
 * Carnegie Mellon requests users of this software to return to
 * 
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 * 
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

#include <mom/libmeta.h>
#include <mom/pres_c.h>

#include "error.h"
#include "global.h"

mig_boolean_t BeQuiet = FALSE;
mig_boolean_t BeVerbose = FALSE;
mig_boolean_t UseMsgRPC = TRUE;
mig_boolean_t GenSymTab = FALSE;

mig_boolean_t IsKernelUser = FALSE;
mig_boolean_t IsKernelServer = FALSE;

const_string_t RCSId = strNULL;

const_string_t SubsystemName = strNULL;
u_int SubsystemBase = 0;

const_string_t MsgOption = strNULL;
const_string_t WaitTime = strNULL;
const_string_t ErrorProc = "MsgError";
const_string_t ServerPrefix = "";
const_string_t UserPrefix = "";
const_string_t ServerDemux = strNULL;
const_string_t SubrPrefix = "";
const_string_t RoutinePrefix = "";

string_t yyinname;

const char LintLib[] = "defined(LINTLIBRARY)";

void
init_global(void)
{
    yyinname = strmake("<no name yet>");
}

string_t UserFilePrefix = strNULL;
string_t UserHeaderFileName = strNULL;
string_t ServerHeaderFileName = strNULL;
string_t InternalHeaderFileName = strNULL;
string_t UserFileName = strNULL;
string_t ServerFileName = strNULL;

void
more_global(void)
{
    if (SubsystemName == strNULL)
	fatal("no SubSystem declaration");

    if (UserHeaderFileName == strNULL)
	UserHeaderFileName = strconcat(SubsystemName, ".h");
    else if (streql(UserHeaderFileName, "/dev/null"))
	UserHeaderFileName = strNULL;

    if (UserFileName == strNULL)
	UserFileName = strconcat(SubsystemName, "User.c");
    else if (streql(UserFileName, "/dev/null"))
	UserFileName = strNULL;

    if (ServerFileName == strNULL)
	ServerFileName = strconcat(SubsystemName, "Server.c");
    else if (streql(ServerFileName, "/dev/null"))
	ServerFileName = strNULL;

    if (ServerDemux == strNULL)
       ServerDemux = strconcat(SubsystemName, "_server");
    if (RoutinePrefix != NULL)
      ServerDemux = strconcat (RoutinePrefix, ServerDemux);
}

io_file_index builtin_file;
io_file_index root_file;
const char *root_filename = 0;

const char *channel_names[MIG_CHANNEL_MAX] = {
	"client",
	"client",
	"server",
	"server"
};

data_channel_index *channel_maps[MIG_CHANNEL_MAX];

void init_channel_maps(pres_c_1 *out_pres)
{
	int lpc;
	
	for( lpc = 0; lpc < MIG_CHANNEL_MAX; lpc++ ) {
		channel_maps[lpc] = (data_channel_index *)
			mustmalloc(sizeof(data_channel_index) *
				   out_pres->meta_data.files.files_len);
	}
}

void map_file_channels(pres_c_1 *out_pres, io_file_index file)
{
	data_channel_index dc;
	int lpc;
	
	for( lpc = 0; lpc < MIG_CHANNEL_MAX; lpc++ ) {
		dc = meta_add_channel(&out_pres->meta_data, file,
				      channel_names[lpc]);
		if( !(lpc % 2) )
			out_pres->meta_data.channels.channels_val[dc].flags |=
				DATA_CHANNEL_DECL;
		else
			out_pres->meta_data.channels.channels_val[dc].flags |=
				DATA_CHANNEL_IMPL;
		channel_maps[lpc][file] = dc;
	}
}


syntax highlighted by Code2HTML, v. 0.9.1