summaryrefslogtreecommitdiffstats
path: root/generic/tclPkg.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2016-11-28 13:17:47 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2016-11-28 13:17:47 (GMT)
commite506fbc42c805d0a6dfe2982a6169a0397aeddad (patch)
tree90bcfac74be46fac31536713178714d03a6dd38f /generic/tclPkg.c
parentfabd3e7dc8882faee98b35feb738939c197e23b5 (diff)
downloadtcl-e506fbc42c805d0a6dfe2982a6169a0397aeddad.zip
tcl-e506fbc42c805d0a6dfe2982a6169a0397aeddad.tar.gz
tcl-e506fbc42c805d0a6dfe2982a6169a0397aeddad.tar.bz2
Complete implementation, tests and documentation
Diffstat (limited to 'generic/tclPkg.c')
-rw-r--r--generic/tclPkg.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/generic/tclPkg.c b/generic/tclPkg.c
index c258987..c3cc54e 100644
--- a/generic/tclPkg.c
+++ b/generic/tclPkg.c
@@ -38,7 +38,7 @@ typedef struct PkgName {
} PkgName;
typedef struct PkgFiles {
- PkgName *names; /* Package names being initialized. */
+ PkgName *names; /* Package names being initialized. Must be first field*/
Tcl_HashTable table; /* Table which contains files for each package */
} PkgFiles;
@@ -222,6 +222,19 @@ static void PkgFilesCleanupProc(ClientData clientData,
return;
}
+void *TclInitPkgFiles(Tcl_Interp *interp)
+{
+ /* If assocdata "tclPkgFiles" doesn't exist yet, create it */
+ PkgFiles *pkgFiles = Tcl_GetAssocData(interp, "tclPkgFiles", NULL);
+ if (!pkgFiles) {
+ pkgFiles = ckalloc(sizeof(PkgFiles));
+ pkgFiles->names = NULL;
+ Tcl_InitHashTable(&pkgFiles->table, TCL_STRING_KEYS);
+ Tcl_SetAssocData(interp, "tclPkgFiles", PkgFilesCleanupProc, pkgFiles);
+ }
+ return pkgFiles;
+}
+
void TclPkgFileSeen(Tcl_Interp *interp, const char *fileName)
{
PkgFiles *pkgFiles = (PkgFiles *) Tcl_GetAssocData(interp, "tclPkgFiles", NULL);
@@ -549,14 +562,7 @@ PkgRequireCore(
pkgPtr->clientData = versionToProvide;
Tcl_Preserve(versionToProvide);
Tcl_Preserve(script);
- /* If assocdata "tclPkgFiles" doesn't exist yet, create it */
- pkgFiles = Tcl_GetAssocData(interp, "tclPkgFiles", NULL);
- if (!pkgFiles) {
- pkgFiles = ckalloc(sizeof(PkgFiles));
- pkgFiles->names = NULL;
- Tcl_InitHashTable(&pkgFiles->table, TCL_STRING_KEYS);
- Tcl_SetAssocData(interp, "tclPkgFiles", PkgFilesCleanupProc, pkgFiles);
- }
+ pkgFiles = TclInitPkgFiles(interp);
/* Push "ifneeded" package name in "tclPkgFiles" assocdata. */
pkgName = ckalloc(sizeof(PkgName) + strlen(name));
pkgName->nextPtr = pkgFiles->names;