/* 
 * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
 * 
 * This software may be freely used, copied, modified, and distributed
 * provided that the above copyright notice is preserved in all copies of the
 * software.
 */

/* -*-C-*-
 *
 * $Revision$
 *     $Date$
 *
 *
 * msgbuild.h - utilities for assembling and interpreting ADP messages
 */

#ifndef angel_msgbuild_h
#define angel_msgbuild_h
#include <stdarg.h>
#include "channels.h"

/*
 * msgbuild
 * --------
 * We use a "varargs" function to enable a description of how the
 * final message should look to be provided. We use a function rather
 * than in-line macros to keep the size of Angel small.
 *
 * The "buffer" pointer is the starting point from where the data will
 * be written. Note: If a NULL pointer is passed then no data will be
 * written, but the size information will be returned. This allows
 * code to call this routine with a NULL "buffer" pointer to ascertain
 * whether the pointer they are passing contains enough space for the
 * message being constructed.
 *
 * The "format" string should contain sequences of the following
 * tokens:
 *      %w - insert 32bit word value
 *      %p - insert 32bit target pointer value
 *      %h - insert 16bit value
 *      %b - insert 8bit byte value
 *
 * The return parameter is the final byte length of the data written.
 */
unsigned int msgbuild(unsigned char *buffer, const char *format, ...);
unsigned int vmsgbuild(unsigned char *buffer, const char *format,
                       va_list args);

/*---------------------------------------------------------------------------*/

/*
 * msgsend
 * -------
 * As for msgbuild except that it allocates a buffer, formats the data as
 * for msgbuild and transmits the packet. Returns 0 if successful non 0 if ot
 * fails.
 * Not for use on cooked channels e.g. debug channels only.
 */
extern int msgsend(ChannelID chan, const char *format, ...);

/*---------------------------------------------------------------------------*/

/*
 * Unpack_message
 * --------------
 *    This basically does the opposite of msg_build, it takes a message, and
 * a scanf type format string (but much cut down functionality) and returns
 * the arguments in the message.
 */
extern unsigned int unpack_message(unsigned char *buffer, const char *format, ...);

#endif /* ndef angel_msgbuild_h */

/* EOF msgbuild.h */
