File: objcmd.c

package info (click to toggle)
tcllib 2.0%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 83,560 kB
  • sloc: tcl: 306,798; ansic: 14,272; sh: 3,035; xml: 1,766; yacc: 1,157; pascal: 881; makefile: 124; perl: 84; f90: 84; python: 33; ruby: 13; php: 11
file content (178 lines) | stat: -rw-r--r-- 7,583 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/* 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, Tcl_Size 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", "getunweighted", "getweight",     "hasweight", "insert",
	"keyexists",   "keys",   "lappend",       "move",          "move-source",
	"move-target", "nodes",	 "rename",	  "set",           "setunweighted", "setweight",
	"source",      "target", "unset",         "unsetweight",   "weights",
	NULL
    };
    enum a_methods {
	MA_APPEND,      MA_ATTR,        MA_DELETE,        MA_EXISTS,    MA_FLIP,
	MA_GET,         MA_GETALL,      MA_GETUNWEIGHTED, MA_GETWEIGHT, MA_HASWEIGHT,
	MA_INSERT,      MA_KEYEXISTS,   MA_KEYS,          MA_LAPPEND,   MA_MOVE,
	MA_MOVE_SOURCE, MA_MOVE_TARGET, MA_NODES,	  MA_RENAME,    MA_SET,       MA_SETUNWEIGHTED,
	MA_SETWEIGHT,	MA_SOURCE,      MA_TARGET,        MA_UNSET,     MA_UNSETWEIGHT,
	MA_WEIGHTS
    };

    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 ...?"); /* OK tcl9 */
	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 ...?"); /* OK tcl9 */
	    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_GETUNWEIGHTED: return gm_arc_GETUNWEIGH (g, interp, objc, objv);
	case MA_GETWEIGHT:     return gm_arc_GETWEIGHT  (g, interp, objc, objv);
	case MA_HASWEIGHT:     return gm_arc_HASWEIGHT  (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_NODES:         return gm_arc_NODES      (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_SETUNWEIGHTED: return gm_arc_SETUNWEIGH (g, interp, objc, objv);
	case MA_SETWEIGHT:     return gm_arc_SETWEIGHT  (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);
	case MA_UNSETWEIGHT:   return gm_arc_UNSETWEIGH (g, interp, objc, objv);
	case MA_WEIGHTS:       return gm_arc_WEIGHTS    (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 ...?"); /* OK tcl9 */
	    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:
 */