aboutsummaryrefslogtreecommitdiff
path: root/jim-package.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2009-07-28 15:46:40 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 10:11:02 +1000
commit462954132b1830a7e470436bf751fe8e86291c72 (patch)
treee4a917e94147dda69ecf9b74df2a9f2605edc99c /jim-package.c
parent981bd5980a5f2ef5e1a527dd3bd90d9f6cfaa632 (diff)
downloadjimtcl-462954132b1830a7e470436bf751fe8e86291c72.zip
jimtcl-462954132b1830a7e470436bf751fe8e86291c72.tar.gz
jimtcl-462954132b1830a7e470436bf751fe8e86291c72.tar.bz2
Lots of improvements
jim --- Add a unique id facility to jim (Jim_GetId()) Remove unused jim_vasprintf(), Jim_AppendString_sprintf() Remove duplicate output in Jim_Panic() Add support for catch -signal aio --- Use this for aio handles aio automatically creates stdin, stdout and stderr channels Jim_AioFilehandle() returns the 'FILE *' filehandle for a channel If JIM_TCL_COMPAT is set, create top level open, close, read, puts, etc. load ---- load core command split out into jim-load.c package ------- package core command split out into jim-package.c added 'package list' posix ----- Remove os.sleep, os.usleep, os.sethostname, os.signal, pit, Jpit Most of these are in 'signal'
Diffstat (limited to 'jim-package.c')
-rw-r--r--jim-package.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/jim-package.c b/jim-package.c
index 48976c0..4474381 100644
--- a/jim-package.c
+++ b/jim-package.c
@@ -28,6 +28,24 @@ int Jim_PackageProvide(Jim_Interp *interp, const char *name, const char *ver,
return JIM_OK;
}
+static int Jim_PackageList(Jim_Interp *interp)
+{
+ Jim_HashTableIterator *htiter;
+ Jim_HashEntry *he;
+ Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0);
+
+ htiter = Jim_GetHashTableIterator(&interp->packages);
+ while ((he = Jim_NextHashEntry(htiter)) != NULL) {
+ Jim_ListAppendElement(interp, listObjPtr,
+ Jim_NewStringObj(interp, he->key, -1));
+ }
+ Jim_FreeHashTableIterator(htiter);
+
+ Jim_SetResult(interp, listObjPtr);
+
+ return JIM_OK;
+}
+
static char *JimFindPackage(Jim_Interp *interp, char **prefixes,
int prefixc, const char *pkgName)
{
@@ -135,3 +153,57 @@ const char *Jim_PackageRequire(Jim_Interp *interp, const char *name,
}
}
+/* [package] */
+int Jim_PackageCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ int option;
+ const char *options[] = {
+ "require", "provide", "list", NULL
+ };
+ enum {OPT_REQUIRE, OPT_PROVIDE, OPT_LIST};
+
+ if (argc < 2) {
+ Jim_WrongNumArgs(interp, 1, argv, "option ?arguments ...?");
+ return JIM_ERR;
+ }
+ if (Jim_GetEnum(interp, argv[1], options, &option, "option",
+ JIM_ERRMSG) != JIM_OK)
+ return JIM_ERR;
+
+ if (option == OPT_REQUIRE) {
+ int exact = 0;
+ const char *ver;
+
+ if (Jim_CompareStringImmediate(interp, argv[2], "-exact")) {
+ exact = 1;
+ argv++;
+ argc--;
+ }
+ if (argc != 3 && argc != 4) {
+ Jim_WrongNumArgs(interp, 2, argv, "?-exact? package ?version?");
+ return JIM_ERR;
+ }
+ ver = Jim_PackageRequire(interp, Jim_GetString(argv[2], NULL),
+ argc == 4 ? Jim_GetString(argv[3], NULL) : "",
+ JIM_ERRMSG);
+ if (ver == NULL)
+ return JIM_ERR_ADDSTACK;
+ Jim_SetResultString(interp, ver, -1);
+ } else if (option == OPT_PROVIDE) {
+ if (argc != 4) {
+ Jim_WrongNumArgs(interp, 2, argv, "package version");
+ return JIM_ERR;
+ }
+ return Jim_PackageProvide(interp, Jim_GetString(argv[2], NULL),
+ Jim_GetString(argv[3], NULL), JIM_ERRMSG);
+ } else if (option == OPT_LIST) {
+ return Jim_PackageList(interp);
+ }
+ return JIM_OK;
+}
+
+int Jim_packageInit(Jim_Interp *interp)
+{
+ Jim_CreateCommand(interp, "package", Jim_PackageCoreCommand, NULL, NULL);
+ return JIM_OK;
+}