/* File: courier.h - Last Edit: */
/* arvani Thu Feb 8 11:33:01 1990 */
/* Copyright (C) by Xerox Corporation, 1990. All rights reserved. */
/** courier.h 1.2, last change 11/10/88 **/
/* $Header: courier.h,v 3.2 87/05/11 09:27:36 ed Exp $ */
/*
$Log: courier.h,v $
* Revision 3.2 87/05/11 09:27:36 ed
* Added MAX←SEQUENCE←LENGTH.
*
* Revision 3.1 87/03/17 09:30:33 ed
* changes from webster: Sequence←of←Unspecified, mc68xxx conditionals
*
* Revision 3.1 87/03/17 09:30:33 ed
* Added conditions for mc68000 family
*
* Revision 3.0 87/01/14 14:40:39 ed
* release containing Xerox (Webster Research Center) modifications
*
* Revision 2.0 85/11/21 07:22:05 jqj
* 4.3BSD standard release
*
* Revision 1.3 85/10/23 16:43:30 root
* Probably correct versions of basic conversion operators for the Gould.
*
* Revision 1.2 85/10/21 12:49:15 root
* Gould version: definitions for MoveLong, etc. (the MoveLong routine is in misc.c)
*
* Revision 1.2 85/10/17 16:46:55 jqj
* first Gould version: definitions for MoveLong etc.
*
* Revision 1.5 85/05/23 06:18:06 jqj
* Public Beta-test version, released 24 May 1985
*
* Revision 1.3 85/03/11 16:36:54 jqj
* Public alpha-test version, released 11 March 1985
*
* Revision 1.2 85/01/27 07:37:18 jqj
* finished but undebugged version
*
*/
#ifndef COURIERVERSION
#define COURIERVERSION 3 /* the version of Courier we support */
/* Predefined Courier types */
typedef char Boolean;
typedef unsigned short Cardinal;
typedef unsigned long LongCardinal;
typedef short Integer;
typedef long LongInteger;
typedef char *String;
typedef unsigned short Unspecified;
typedef unsigned long LongUnspecified;
typedef int NilRecord;
#ifndef ←COMMON←
typedef int (*pfi←t)();
#endif
/*
* Low-level byte moving, with byte-swapping.
* Use these definitions for VAX and other low-enders.
*/
#if vax || i80x86 || i386 || M←I286 || M←I86
#define externalize←Boolean(p, buf) (*(short*)(buf) = *((char*)(p))<<8, 1)
#define internalize←Boolean(p, buf) (*(char*)(p) = *((char*)(buf)+1), 1)
#define MoveShort(a, b) (*(char*)(b) = *((char*)(a)+1),\
*((char*)(b)+1) = *(char*)(a),1)
#define MoveLong(a, b) (*(char*)(b) = *((char*)(a)+3),\
*((char*)(b)+1) = *((char*)(a)+2),\
*((char*)(b)+2) = *((char*)(a)+1),\
*((char*)(b)+3) = *(char*)(a), 2)
#endif
/*
* Low-level byte moving, without byte-swapping.
* Use these definitions for SUN and other high-enders.
*/
#if sun || mc68000 || mc68010 || mc68020 || m68 || m68k || M68020 || sparc
#define externalize←Boolean(p, buf) (*(Unspecified*)(buf) = 1&*(char*)(p), 1)
#define internalize←Boolean(p, buf) (*(char*)(p) = 1&*(Unspecified*)(buf), 1)
#define MoveShort(a, b) (*(short *)(b) = *(short *)(a),1)
#if sparc
#define MoveLong(a, b) (*(short *)(b) = *((short *)(a)),\
*((short *)(b)+1) = *((short *)(a)+1), 2)
#else
#define MoveLong(a, b) (*(long *)(b) = *(long *)(a),2)
#endif
#endif
/*
* Low-level byte moving, without byte-swapping.
* Use these definitions for sel and other high-enders that require
* longword alignment.
*/
#if sel
#define externalize←Boolean(p, buf) (*(Unspecified*)(buf) = 1&*(char*)(p), 1)
#define internalize←Boolean(p, buf) (*(p) = 1&*(Unspecified*)(buf), 1)
#define MoveShort(a, b) (*(short *)(b) = *(short *)(a),1)
int MoveLong();
#endif
/*
* sizeof←Foo(p) is a function that returns the externalized size of
* the variable specified as argument (assumed to be of type Foo).
* clear←Foo(p) is a function that deallocates any components of Foo.
* externalize←Foo translates a variable from C form to external
* serialized form.
* internalize←Foo translates a variable from external serializedform
* to internal C form
*/
#define sizeof←NilRecord(p) 0
#define clear←NilRecord(p)
#define externalize←NilRecord(p, buf) 0
#define internalize←NilRecord(p, buf) 0
#define sizeof←Boolean(p) 1
#define clear←Boolean(p)
#define sizeof←Cardinal(p) 1
#define clear←Cardinal(p)
#define externalize←Cardinal(p, buf) MoveShort(p, buf)
#define internalize←Cardinal(p, buf) MoveShort(buf, p)
#define sizeof←LongCardinal(p) 2
#define clear←LongCardinal(p)
#define externalize←LongCardinal(p, buf) MoveLong(p, buf)
#define internalize←LongCardinal(p, buf) MoveLong(buf, p)
#define sizeof←Integer(p) 1
#define clear←Integer(p)
#define externalize←Integer(p, buf) MoveShort(p, buf)
#define internalize←Integer(p, buf) MoveShort(buf, p)
#define sizeof←LongInteger(p) 2
#define clear←LongInteger(p)
#define externalize←LongInteger(p, buf) MoveLong(p, buf)
#define internalize←LongInteger(p, buf) MoveLong(buf, p)
#define sizeof←Unspecified(p) 1
#define clear←Unspecified(p)
#define externalize←Unspecified(p, buf) MoveShort(p, buf)
#define internalize←Unspecified(p, buf) MoveShort(buf, p)
#define sizeof←LongUnspecified(p) 2
#define clear←LongUnspecified(p)
#define externalize←LongUnspecified(p, buf) MoveLong(p, buf)
#define internalize←LongUnspecified(p, buf) MoveLong(buf, p)
#ifndef MAXWORDS
#define MAXWORDS 267
#endif
#ifndef SPPMAXDATA
#define SPPMAXDATA (MAXWORDS*2)
#endif
/* For streams */
typedef enum {
nextSegment = 0,
lastSegment = 1
} StreamEnumerator;
#define sizeof←StreamEnumerator sizeof←enumeration
#define clear←StreamEnumerator clear←enumeration
#define externalize←StreamEnumerator externalize←enumeration
#define internalize←StreamEnumerator internalize←enumeration
/* miscellaneous structures and values used by Courier runtimes */
#ifdef BSD
/*
* define Berkeley specific COURIERFD
*/
#define COURIERFD int*
#else
/*
* define System V (Mentat) specific COURIERFD
*/
#define COURIERFD int
#endif
#define MAX←SEQUENCE←LENGTH 65535
typedef struct {
Cardinal length;
Unspecified *sequence;
} Sequence←of←Unspecified;
/*
* message types for Courier messages
* (should only be of interest to the runtimes)
*/
#define CALL 0
#define REJECT 1
#define RETURN 2
#define ABORT 3
/* components of Courier error messages */
typedef struct {
Cardinal lowest;
Cardinal highest;
} ImplementedVersionNumbers;
typedef struct {
enum {
unspecifiedError = 65535,
invalidArgument = 3,
noSuchProcedureValue = 2,
noSuchVersionNumber = 1,
noSuchProgramNumber = 0
} designator;
union {
NilRecord u←noSuchProgramNumber;
#define noSuchProgramNumber←case u.u←noSuchProgramNumber
ImplementedVersionNumbers u←noSuchVersionNumber;
#define noSuchVersionNumber←case u.u←noSuchVersionNumber
NilRecord u←noSuchProcedureValue;
#define noSuchProcedureValue←case u.u←noSuchProcedureValue
NilRecord u←invalidArgument;
#define invalidArgument←case u.u←invalidArgument
NilRecord u←unspecifiedError;
#define unspecifiedError←case u.u←unspecifiedError
} u;
} rejectionDetails;
/* Macro for unpacking error arguments given a typedef and a field name */
#define CourierErrArgs(type,field) \
(((type *)Exception.Message)->field)
/* miscellaneous constants */
#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef NULL
#define NULL ((char*) 0)
#endif
/* return values for Bulk Data routines */
#define BDT←WRITE←ABORT 1
#define BDT←WRITE←FINISHED 2
#define BDT←READ←ABORT 3
#define BDT←READ←FINISHED 4
/* exceptions defined in Courier */
#define REJECT←ERROR 65535
#define SYSTEM←ERROR 65534
#define PROTOCOL←VIOLATION 65533
/* External declarations */
extern Unspecified * Allocate();
extern void cour←finish←bdt();
extern Unspecified * cour←get←ret();
extern int cour←send←call();
extern Unspecified * cour←send←call←get←ret();
extern COURIERFD cour←establish←conn();
extern int cour←close←conn();
/* Address types */
#define COUR←DEF←ADDR←TYPE 1
#define COUR←ISO←ADDR←TYPE 2
#define COUR←TCP←ADDR←TYPE 3
#define COUR←XNS←ADDR←TYPE 4
typedef struct cour←err←report←s {
int cer←tag;
int cer←size;
pfi←t cer←internalize;
} COUR←ERR←REPORT;
#include <courier/os←port.h>
#endif