#ifndef _HASKELL2C_H
#define _HASKELL2C_H
#include "mutlib.h"
#include "cinterface.h"
#define INTEGER1(haskellName,cName) \
C_HEADER(haskellName) \
{ \
NodePtr nodeptr; \
MP_INT *a; \
nodeptr = C_GETARG1(1); \
IND_REMOVE(nodeptr); \
C_CHECK_STMT(1+(Int)CONINFO_LARGESIZEU(*nodeptr)+EXTRA,nodeptr = C_GETARG1(1);); \
a = (MP_INT*)nodeptr; \
nodeptr = C_HP; \
C_HP = cName ((MP_INT *)nodeptr, a); \
C_RETURN(nodeptr); \
}
#define INTEGER1_C(haskellName,cName) \
NodePtr haskellName (NodePtr x) \
{ \
NodePtr result; \
MP_INT *a; \
a = (MP_INT*)x; \
C_CHECK(1+(Int)CONINFO_LARGESIZEU(*x)+EXTRA); \
result = C_HP; \
C_HP = cName ((MP_INT *)result, a); \
return (result); \
}
#define INTEGER2(haskellName,cName,need) \
C_HEADER(haskellName) \
{ \
NodePtr nodeptr; \
MP_INT *u,*v; \
Int size; \
nodeptr = C_GETARG1(1); \
IND_REMOVE(nodeptr); \
u = (MP_INT*)nodeptr; \
nodeptr = C_GETARG1(2); \
IND_REMOVE(nodeptr); \
v = (MP_INT*)nodeptr; \
size = need(u,v); \
C_CHECK_STMT(size,u = (MP_INT*)C_GETARG1(1);v = (MP_INT*)C_GETARG1(2);); \
nodeptr = C_HP; \
C_HP = cName ((MP_INT *)nodeptr, u, v); \
C_RETURN(nodeptr); \
}
#define INTEGER2_C(haskellName,cName,need) \
NodePtr haskellName (NodePtr x, NodePtr y) \
{ \
NodePtr result; \
MP_INT *u,*v; \
Int size; \
u = (MP_INT*)x; \
v = (MP_INT*)y; \
size = need(u,v); \
C_CHECK(size); \
result = C_HP; \
C_HP = cName ((MP_INT *)result, u, v); \
return (result); \
}
#define INTEGER2CMP(haskellName,cOp) \
C_HEADER(haskellName) \
{ \
NodePtr nodeptr; \
MP_INT *a,*b; \
nodeptr = C_GETARG1(1); \
IND_REMOVE(nodeptr); \
a = (MP_INT*)nodeptr; \
nodeptr = C_GETARG1(2); \
IND_REMOVE(nodeptr); \
b = (MP_INT*)nodeptr; \
C_RETURN(GET_BOOL(cOp)); \
}
#define INTEGER2CMP_C(haskellName,cOp) \
int haskellName (NodePtr x, NodePtr y) \
{ \
MP_INT *a,*b; \
a = (MP_INT*)x; \
b = (MP_INT*)y; \
return (cOp); \
}
#endif
|