int cmd_r_set()

in tcl_cmds.c [1407:1474]


int cmd_r_set(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	char *xx, *yy;
	r_table *r_table_ptr, key;
	
	switch (objc) {
	  default:
	  case 3: yy = Tcl_GetString(objv[2]);
	  case 2: xx = Tcl_GetString(objv[1]);	break;
	  case 1:
		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 ?variables?");
			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 ?variables?");
			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;
	}
	
	if (r_table_ptr->wr_func) {
		return r_table_ptr->wr_func(objc, objv);
	}
	else {
		Tcl_AddObjErrorInfo(interp, "this variable is not writable", -1);
		return TCL_ERROR;
	}
}