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
|
/*
* Smithsonian Astrophysical Observatory, Cambridge, MA, USA
* This code has been modified under the terms listed below and is made
* available under the same terms.
*/
/*
* Copyright 1997-2008 George A Howlett.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <tclInt.h>
#include "bltNsUtil.h"
using namespace Blt;
Tcl_Namespace* Blt::GetCommandNamespace(Tcl_Command cmdToken)
{
Command* cmdPtr = (Command*)cmdToken;
return (Tcl_Namespace *)cmdPtr->nsPtr;
}
int Blt::ParseObjectName(Tcl_Interp* interp, const char *path,
Blt_ObjectName *namePtr, unsigned int flags)
{
namePtr->nsPtr = NULL;
namePtr->name = NULL;
char* colon = NULL;
/* Find the last namespace separator in the qualified name. */
char* last = (char *)(path + strlen(path));
while (--last > path) {
if ((*last == ':') && (*(last - 1) == ':')) {
last++; /* just after the last "::" */
colon = last - 2;
break;
}
}
if (colon == NULL) {
namePtr->name = path;
if ((flags & BLT_NO_DEFAULT_NS) == 0) {
namePtr->nsPtr = Tcl_GetCurrentNamespace(interp);
}
return 1; /* No namespace designated in name. */
}
/* Separate the namespace and the object name. */
*colon = '\0';
if (path[0] == '\0') {
namePtr->nsPtr = Tcl_GetGlobalNamespace(interp);
} else {
namePtr->nsPtr = Tcl_FindNamespace(interp, (char *)path, NULL,
(flags & BLT_NO_ERROR_MSG) ? 0 : TCL_LEAVE_ERR_MSG);
}
/* Repair the string. */ *colon = ':';
if (namePtr->nsPtr == NULL) {
return 0; /* Namespace doesn't exist. */
}
namePtr->name =last;
return 1;
}
char* Blt::MakeQualifiedName(Blt_ObjectName *namePtr, Tcl_DString *resultPtr)
{
Tcl_DStringInit(resultPtr);
if ((namePtr->nsPtr->fullName[0] != ':') ||
(namePtr->nsPtr->fullName[1] != ':') ||
(namePtr->nsPtr->fullName[2] != '\0')) {
Tcl_DStringAppend(resultPtr, namePtr->nsPtr->fullName, -1);
}
Tcl_DStringAppend(resultPtr, "::", -1);
Tcl_DStringAppend(resultPtr, (char *)namePtr->name, -1);
return Tcl_DStringValue(resultPtr);
}
static Tcl_Namespace* NamespaceOfVariable(Var *varPtr)
{
if (varPtr->flags & VAR_IN_HASHTABLE) {
VarInHash *vhashPtr = (VarInHash *)varPtr;
TclVarHashTable *vtablePtr;
vtablePtr = (TclVarHashTable *)vhashPtr->entry.tablePtr;
return (Tcl_Namespace*)(vtablePtr->nsPtr);
}
return NULL;
}
Tcl_Namespace* Blt::GetVariableNamespace(Tcl_Interp* interp, const char *path)
{
Blt_ObjectName objName;
if (!ParseObjectName(interp, path, &objName, BLT_NO_DEFAULT_NS))
return NULL;
if (objName.nsPtr == NULL) {
Var*varPtr = (Var*)Tcl_FindNamespaceVar(interp, (char *)path,
(Tcl_Namespace *)NULL,
TCL_GLOBAL_ONLY);
if (varPtr)
return NamespaceOfVariable(varPtr);
}
return objName.nsPtr;
}
|