/* struct::graph - critcl - layer 2 definitions
 *
 * -> Support for the graph methods in layer 3.
 */

#include <methods.h>
#include <objcmd.h>

/*
 *---------------------------------------------------------------------------
 *
 * g_objcmd --
 *
 *	Implementation of graph objects, the main dispatcher function.
 *
 * Results:
 *	A standard Tcl result code.
 *
 * Side effects:
 *	Per the called methods.
 *
 *---------------------------------------------------------------------------
 */

int
g_objcmd (ClientData cd, Tcl_Interp* interp, int objc, Tcl_Obj* CONST* objv)
{
    G*	g = (G*) cd;
    int m;

    static CONST char* methods [] = {
	"-->",	   "=",	    "append",	 "arc",	      "arcs", "deserialize",
	"destroy", "get",   "getall",	 "keyexists", "keys", "lappend",
	"node",	   "nodes", "serialize", "set",	      "swap", "unset",
	"walk",
	NULL
    };
    enum methods {
	M_GSET,	   M_GASSIGN, M_APPEND,	   M_ARC,	M_ARCS, M_DESERIALIZE,
	M_DESTROY, M_GET,     M_GETALL,	   M_KEYEXISTS, M_KEYS, M_LAPPEND,
	M_NODE,	   M_NODES,   M_SERIALIZE, M_SET,	M_SWAP, M_UNSET,
	M_WALK
    };

    static CONST char* a_methods [] = {
	"append",  "attr",   "delete",	    "exists",      "flip",
	"get",     "getall", "insert",      "keyexists",   "keys",
	"lappend", "move",   "move-source", "move-target", "rename",
	"set",     "source", "target",      "unset",
	NULL
    };
    enum a_methods {
	MA_APPEND,  MA_ATTR,   MA_DELETE,      MA_EXISTS,      MA_FLIP,
	MA_GET,     MA_GETALL, MA_INSERT,      MA_KEYEXISTS,   MA_KEYS,
	MA_LAPPEND, MA_MOVE,   MA_MOVE_SOURCE, MA_MOVE_TARGET, MA_RENAME,
	MA_SET,     MA_SOURCE, MA_TARGET,      MA_UNSET
    };

    static CONST char* n_methods [] = {
	"append",  "attr",     "degree", "delete",    "exists",
	"get",	   "getall",   "insert", "keyexists", "keys",
	"lappend", "opposite", "rename", "set",	      "unset",
	NULL
    };
    enum n_methods {
	MN_APPEND,  MN_ATTR,	 MN_DEGREE, MN_DELETE,	  MN_EXISTS,
	MN_GET,	    MN_GETALL,	 MN_INSERT, MN_KEYEXISTS, MN_KEYS,
	MN_LAPPEND, MN_OPPOSITE, MN_RENAME, MN_SET,	  MN_UNSET
    };

    if (objc < 2) {
	Tcl_WrongNumArgs (interp, objc, objv, "option ?arg arg ...?");
	return TCL_ERROR;
    } else if (Tcl_GetIndexFromObj (interp, objv [1], methods, "option",
				    0, &m) != TCL_OK) {
	return TCL_ERROR;
    }

    /* Dispatch to methods. They check the #args in detail before performing
     * the requested functionality
     */

    switch (m) {
    case M_GSET:	return gm_GSET	      (g, interp, objc, objv);
    case M_GASSIGN:	return gm_GASSIGN     (g, interp, objc, objv);
    case M_APPEND:	return gm_APPEND      (g, interp, objc, objv);
    case M_ARC:
	if (objc < 3) {
	    Tcl_WrongNumArgs (interp, objc, objv, "option ?arg arg ...?");
	    return TCL_ERROR;
	} else if (Tcl_GetIndexFromObj (interp, objv [2], a_methods, "option",
					0, &m) != TCL_OK) {
	    return TCL_ERROR;
	}
	switch (m) {
	case MA_APPEND:	     return gm_arc_APPEND    (g, interp, objc, objv);
	case MA_ATTR:	     return gm_arc_ATTR	     (g, interp, objc, objv);
	case MA_DELETE:	     return gm_arc_DELETE    (g, interp, objc, objv);
	case MA_EXISTS:	     return gm_arc_EXISTS    (g, interp, objc, objv);
	case MA_FLIP:        return gm_arc_FLIP      (g, interp, objc, objv);
	case MA_GET:	     return gm_arc_GET	     (g, interp, objc, objv);
	case MA_GETALL:	     return gm_arc_GETALL    (g, interp, objc, objv);
	case MA_INSERT:	     return gm_arc_INSERT    (g, interp, objc, objv);
	case MA_KEYEXISTS:   return gm_arc_KEYEXISTS (g, interp, objc, objv);
	case MA_KEYS:	     return gm_arc_KEYS	     (g, interp, objc, objv);
	case MA_LAPPEND:     return gm_arc_LAPPEND   (g, interp, objc, objv);
	case MA_MOVE:        return gm_arc_MOVE      (g, interp, objc, objv);
	case MA_MOVE_SOURCE: return gm_arc_MOVE_SRC  (g, interp, objc, objv);
	case MA_MOVE_TARGET: return gm_arc_MOVE_TARG (g, interp, objc, objv);
	case MA_RENAME:	     return gm_arc_RENAME    (g, interp, objc, objv);
	case MA_SET:	     return gm_arc_SET	     (g, interp, objc, objv);
	case MA_SOURCE:	     return gm_arc_SOURCE    (g, interp, objc, objv);
	case MA_TARGET:	     return gm_arc_TARGET    (g, interp, objc, objv);
	case MA_UNSET:	     return gm_arc_UNSET     (g, interp, objc, objv);
	}
	break;
    case M_ARCS:	return gm_ARCS	      (g, interp, objc, objv);
    case M_DESERIALIZE: return gm_DESERIALIZE (g, interp, objc, objv);
    case M_DESTROY:	return gm_DESTROY     (g, interp, objc, objv);
    case M_GET:		return gm_GET	      (g, interp, objc, objv);
    case M_GETALL:	return gm_GETALL      (g, interp, objc, objv);
    case M_KEYEXISTS:	return gm_KEYEXISTS   (g, interp, objc, objv);
    case M_KEYS:	return gm_KEYS	      (g, interp, objc, objv);
    case M_LAPPEND:	return gm_LAPPEND     (g, interp, objc, objv);
    case M_NODE:
	if (objc < 3) {
	    Tcl_WrongNumArgs (interp, objc, objv, "option ?arg arg ...?");
	    return TCL_ERROR;
	} else if (Tcl_GetIndexFromObj (interp, objv [2], n_methods, "option",
					0, &m) != TCL_OK) {
	    return TCL_ERROR;
	}
	switch (m) {
	case MN_APPEND:	   return gm_node_APPEND    (g, interp, objc, objv);
	case MN_ATTR:	   return gm_node_ATTR	    (g, interp, objc, objv);
	case MN_DEGREE:	   return gm_node_DEGREE    (g, interp, objc, objv);
	case MN_DELETE:	   return gm_node_DELETE    (g, interp, objc, objv);
	case MN_EXISTS:	   return gm_node_EXISTS    (g, interp, objc, objv);
	case MN_GET:	   return gm_node_GET	    (g, interp, objc, objv);
	case MN_GETALL:	   return gm_node_GETALL    (g, interp, objc, objv);
	case MN_INSERT:	   return gm_node_INSERT    (g, interp, objc, objv);
	case MN_KEYEXISTS: return gm_node_KEYEXISTS (g, interp, objc, objv);
	case MN_KEYS:	   return gm_node_KEYS	    (g, interp, objc, objv);
	case MN_LAPPEND:   return gm_node_LAPPEND   (g, interp, objc, objv);
	case MN_OPPOSITE:  return gm_node_OPPOSITE  (g, interp, objc, objv);
	case MN_RENAME:	   return gm_node_RENAME    (g, interp, objc, objv);
	case MN_SET:	   return gm_node_SET	    (g, interp, objc, objv);
	case MN_UNSET:	   return gm_node_UNSET	    (g, interp, objc, objv);
	}
	break;
    case M_NODES:	return gm_NODES	      (g, interp, objc, objv);
    case M_SERIALIZE:	return gm_SERIALIZE   (g, interp, objc, objv);
    case M_SET:		return gm_SET	      (g, interp, objc, objv);
    case M_SWAP:	return gm_SWAP	      (g, interp, objc, objv);
    case M_UNSET:	return gm_UNSET	      (g, interp, objc, objv);
    case M_WALK:	return gm_WALK	      (g, interp, objc, objv);
    }
    /* Not coming to this place */
}

/*
 * Local Variables:
 * mode: c
 * c-basic-offset: 4
 * fill-column: 78
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1