/* openmath.h                                 Copyright (C) 1998 NAG Ltd. */

#ifndef header_openmath_h
#define header_openmath_h

/*
 * This code may be used and modified, and redistributed in binary
 * or source form, subject to the "CCL Public License", which should
 * accompany it. This license is a variant on the BSD license, and thus
 * permits use of code derived from this in either open and commercial
 * projects: but it does require that updates to this code be made
 * available back to the originators of the package.
 * Before merging other code in with this or linking this code
 * with other packages or libraries please check that the license terms
 * of the other material are compatible with those of this.
 */


/* Signature: 5537ffe6 08-Apr-2002 */


/*
 * OpenMath primitives map to Lisp objects in the following way:
 *
 * OpenMath				Lisp
 * --------				----
 * 32 bit integer		integer
 * big integer			integer
 * 64 bit float			real
 * byte array			vector of bytes
 * variable				symbol
 * string				string
 * symbol				OMS cd:="cdname" name:="symbolname" (Lisp properties).
 * 
 * <OMA>				(OMA ...)
 *   ...
 * </OMA>
 * 
 * <OMATTR>				(OMATTR ...)
 *   <OMATP>			(OMATP ...)
 *   	...
 *   </OMATP>
 *   obj
 * </OMATTR>
 * 
 * <OMBIND>				(OMBIND ...)
 *   binder
 *   <OMBVAR>			(OMBVAR ...)
 *     bvars
 *   </OMBVAR>
 *   obj
 * </OMBIND>
 *
 * <OME>				(OME ...)
 *   ...
 * </OME>
 *
 * <OMOBJ>				(OMOBJ ...)
 *   ...
 * </OMOBJ>
 */


/*
 * OpenMath / Lisp conversion functions.
 */

extern OMdev			om_toDev(Lisp_Object obj);
extern Lisp_Object		om_fromDev(OMdev dev);
extern OMstatus			om_toStatus(Lisp_Object obj);
extern Lisp_Object		om_fromStatus(OMstatus status);
extern OMencodingType	om_toEncodingType(Lisp_Object obj);
extern Lisp_Object		om_fromEncodingType(OMencodingType enc);
extern char *			om_toBigNumStr(Lisp_Object obj);
extern Lisp_Object		om_fromBigNumStr(char *data, int len, int sign, OMbigIntType fmt);
extern OMconn			om_toConn(Lisp_Object obj);
extern Lisp_Object		om_fromConn(OMconn conn);
extern char **			om_toCString(Lisp_Object obj);
extern Lisp_Object		om_fromCString(char **str);
extern Lisp_Object		om_lispStringFromCString(Lisp_Object cstr);
extern Lisp_Object		om_cStringFromLispString(Lisp_Object lstr);

/*
 * OpenMath Device manipulation functions.
 */

extern Lisp_Object MS_CDECL om_openFileDev(Lisp_Object env, int nargs, ...);
extern Lisp_Object om_openStrDev(Lisp_Object env, Lisp_Object lstr, Lisp_Object lenc);
extern Lisp_Object om_closeDev(Lisp_Object env, Lisp_Object dev);


/*
 * OpenMath Connection manipulation functions.
 */

extern Lisp_Object om_makeConn(Lisp_Object nil, Lisp_Object ltimeout);
extern Lisp_Object om_closeConn(Lisp_Object nil, Lisp_Object lconn);
extern Lisp_Object om_getConnInDev(Lisp_Object nil, Lisp_Object lconn);
extern Lisp_Object om_getConnOutDev(Lisp_Object nil, Lisp_Object lconn);


/*
 * OpenMath client/server functions.
 */

extern Lisp_Object MS_CDECL om_connectTCP(Lisp_Object nil, int nargs, ...);
extern Lisp_Object om_bindTCP(Lisp_Object nil, Lisp_Object lconn, Lisp_Object lport);
/* TODO: prototypes for the other functions from OMconn.h */


/*
 * OpenMath Device input / output functions.
 */

extern Lisp_Object om_putApp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndApp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putAtp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndAtp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putAttr(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndAttr(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putBind(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndBind(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putBVar(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndBVar(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putError(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndError(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putObject(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_putEndObject(Lisp_Object nil, Lisp_Object ldev);

extern Lisp_Object om_putInt(Lisp_Object nil, Lisp_Object ldev, Lisp_Object val);
extern Lisp_Object om_putFloat(Lisp_Object nil, Lisp_Object ldev, Lisp_Object val);
extern Lisp_Object om_putByteArray(Lisp_Object nil, Lisp_Object ldev, Lisp_Object val);
extern Lisp_Object om_putVar(Lisp_Object nil, Lisp_Object ldev, Lisp_Object val);
extern Lisp_Object om_putString(Lisp_Object nil, Lisp_Object ldev, Lisp_Object val);
extern Lisp_Object om_putSymbol(Lisp_Object nil, Lisp_Object ldev, Lisp_Object val);
extern Lisp_Object MS_CDECL om_putSymbol2(Lisp_Object nil, int nargs, ...);

extern Lisp_Object om_getApp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndApp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getAtp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndAtp(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getAttr(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndAttr(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getBind(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndBind(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getBVar(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndBVar(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getError(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndError(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getObject(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getEndObject(Lisp_Object nil, Lisp_Object ldev);

extern Lisp_Object om_getInt(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getFloat(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getByteArray(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getVar(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getString(Lisp_Object nil, Lisp_Object ldev);
extern Lisp_Object om_getSymbol(Lisp_Object nil, Lisp_Object ldev);

extern Lisp_Object om_getType(Lisp_Object nil, Lisp_Object ldev);


extern Lisp_Object om_stringToStringPtr(Lisp_Object nil, Lisp_Object lstr);
extern Lisp_Object om_stringPtrToString(Lisp_Object nil, Lisp_Object lpstr);

#endif /* header_openmath_h */

/* end of openmath.h */
