TD X-Window numero 2: graphe.h


/*****************************************************************************\
*                                                                             *
* 			   mini-afficheur de graphes                           *
*                                                                             *
\*****************************************************************************/

/*****************************************************************************\
* 			     graph file structure                             *
\*****************************************************************************/
/* Syntaxe:
 * Une entite par ligne, chaque champ separe par un blanc.
 * Syntaxe volontairement rigide pour simplifier le parsing
 * Title: T string
 * Node: N id x y label
 * Edge: E id from_id to_id
 */


/*****************************************************************************\
* 				  data types                                  *
\*****************************************************************************/

/* La structure d'un noeud */

typedef struct _Node {
    int id;				/* unique identifier (number) */

    int x;				/* position */
    int y;
    int width;				/* to be calculated */
    int height;				/* to be calculated */

    char *label;			/* text to be displayed */
    int baseline_x;
    int baseline_y;

    struct _Node *next;			/* next node in graph */
} *Node;

/* la structure d'un arc */

typedef struct _Edge {
    int id;				/* unique identifier (number) */

    int from_id;			/* nodes connected by id */
    int to_id;

    Node from;				/* the nodes themselves */
    Node to;

    struct _Edge *next;			/* next edge in graph */
} *Edge;

/* un graphe */

typedef struct _Graph {
    char *title;			/* symbolic */
    Node nodes;				/* null-terminated list */
    Edge edges;				/* null-terminated list */
} *Graph;

/*****************************************************************************\
* 			      provided functions                              *
\*****************************************************************************/


/* read a graph from file */
Graph ReadGraph(/*
		  FILE *stream;
		  */);

/* writes textual representation */
void PrintGraph(/*
		  Graph graph;
		  FILE *stream;
		  */);

/* retourne la liste des edges liees au node donne */
Edge RelatedEdges(/*
		Graph graph;
		Node node;
		*/);

/* free une liste de edges */
FreeEdges(/*
	    Edge edge;
	    */);

/* affiche une liste de nodes */
DisplayNodes(/*
	       Node nodes;
	       Display *dpy;
	       Window window;
	       GC draw_gc;
	       GC fill_gc;
	       */);

/* affiche une liste de edges */
DisplayEdges(/*
	       edges, dpy, window, gc)
	       Edge edges;
	       Display *dpy;
	       Window window;
	       GC gc;
	       */);

/*****************************************************************************\
* 			    functions to be coded                             *
\*****************************************************************************/


/* affiche un graph */
void DisplayGraph(/*
		    Display *dpy;
		    Window window;
		    Graph graph;
		    GC draw_gc;		foreground: black
		    GC fill_gc;		background: white
		    */);

/* affiche un node */
DisplayNode(/*
	      Node node;
	      Display *dpy;
	      Window window;
	      GC draw_gc;
	      GC fill_gc;
	      */);

/* affiche une edge */
DisplayEdge(/*
	      Edge edge;
	      Display *dpy;
	      Window window;
	      GC gc;
	      */);

/* retourne le premier node dont la bounding box contient le point (x,y) */
Node FindNode(/*
		Graph graph;
		int x;
		int y;
		*/);

/* a appeller apres avoir lu le graphe pour calculer les tailles des boites */
void FixGraphLabelDimensions(/*
			       Graph graph;
			       Font font;
			       */);



michel.buffa@essi.fr