in tcl_cmds.c [1343:1405]
int cmd_r(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
char *xx = NULL, *yy = NULL;
r_table *r_table_ptr, key;
switch (objc) {
case 3: yy = Tcl_GetString(objv[2]);
case 2: xx = Tcl_GetString(objv[1]); break;
default:
Tcl_WrongNumArgs(interp, 1, objv, "variable");
return TCL_ERROR;
}
if (!sorted) {
for (; r_tbl[r_size].var != NULL; r_size++);
for (; r_connection_tbl[connection_size].var != NULL; connection_size++);
for (; r_server_tbl[server_size].var != NULL; server_size++);
qsort(r_tbl, r_size, sizeof(r_table), r_find);
qsort(r_connection_tbl, connection_size, sizeof(r_table), r_find);
qsort(r_server_tbl, server_size, sizeof(r_table), r_find);
sorted = 1;
}
if (!strcmp(xx, "server")) {
if (!yy) {
Tcl_WrongNumArgs(interp, 2, objv, "variable");
return TCL_ERROR;
}
key.var = yy;
r_table_ptr = (r_table*) bsearch(&key, r_server_tbl, server_size, sizeof(r_table), r_find);
}
else if (!strcmp(xx, "connection")) {
if (!yy) {
Tcl_WrongNumArgs(interp, 2, objv, "variable");
return TCL_ERROR;
}
key.var = yy;
r_table_ptr = (r_table*) bsearch(&key, r_connection_tbl, connection_size, sizeof(r_table), r_find);
}
else {
key.var = xx;
r_table_ptr = (r_table*) bsearch(&key, r_tbl, r_size, sizeof(r_table), r_find);
}
if (!r_table_ptr) {
char *p;
asprintf(&p, "%s is not known in structure.", xx);
Tcl_AddObjErrorInfo(interp, p, -1);
free(p);
return TCL_ERROR;
}
Tcl_SetObjResult(interp, r_table_ptr->rd_func());
return TCL_OK;
}