#ifndef RGRAPHVIZ_COMMON_H
#define RGRAPHVIZ_COMMON_H 1

#include <Rinternals.h>
#include <Rdefines.h>
#include <Rmath.h>
#include <R_ext/Rdynload.h>
#include <R_ext/RS.h>		/* CallocCharBuf */

#include <math.h>

#ifndef WIN32
#include <unistd.h>
#endif

#include <gvc.h>
#include <gvplugin.h>
#include <gvcext.h>
#include <gvcjob.h>

/* from libgraph.h, due to overlap with graph.h, cannot #include it */
extern Agdict_t *agdictof(void *);

extern GVC_t *gvc;
extern SEXP Rgraphviz_graph_type_tag;

typedef struct Rgattr_t Rgattr_t;
struct Rgattr_t { char* name; char* value; };

/* these are called by R-functions directly */
SEXP Rgraphviz_agopen(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
SEXP Rgraphviz_agread(SEXP);
SEXP Rgraphviz_agwrite(SEXP, SEXP);
SEXP Rgraphviz_bezier(SEXP, SEXP, SEXP);
SEXP Rgraphviz_buildNodeList(SEXP, SEXP, SEXP, SEXP);
SEXP Rgraphviz_buildEdgeList(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
SEXP Rgraphviz_doLayout(SEXP, SEXP);
SEXP Rgraphviz_graphvizVersion(void);
SEXP Rgraphviz_init(void);

SEXP Rgraphviz_toFile(SEXP, SEXP, SEXP, SEXP);
SEXP Rgraphviz_agopenSimple(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);

SEXP Rgraphviz_getDefAttrsGraph(SEXP);
SEXP Rgraphviz_setDefAttrsGraph(SEXP, SEXP, SEXP);
SEXP Rgraphviz_getAttrsGraph(SEXP, SEXP);
SEXP Rgraphviz_setAttrsGraph(SEXP, SEXP, SEXP, SEXP);

SEXP Rgraphviz_getAttrsCluster(SEXP, SEXP, SEXP);
SEXP Rgraphviz_setAttrsCluster(SEXP, SEXP, SEXP, SEXP, SEXP);

SEXP Rgraphviz_getDefAttrsNode(SEXP);
SEXP Rgraphviz_setDefAttrsNode(SEXP, SEXP, SEXP);
SEXP Rgraphviz_getAttrsNode(SEXP, SEXP, SEXP);
SEXP Rgraphviz_setAttrsNode(SEXP, SEXP, SEXP, SEXP, SEXP);

SEXP Rgraphviz_getDefAttrsEdge(SEXP);
SEXP Rgraphviz_setDefAttrsEdge(SEXP, SEXP, SEXP);
SEXP Rgraphviz_getAttrsEdge(SEXP, SEXP, SEXP, SEXP);
SEXP Rgraphviz_setAttrsEdge(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);

#endif // RGRAPHVIZ_COMMON_H