aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez>2005-03-06 08:31:42 +0000
committerantirez <antirez>2005-03-06 08:31:42 +0000
commite896ba05fb50b19501b67c244357adc1ecfae4b6 (patch)
tree68876d6c39ac1e536a20a9899511d13360b8b2cf
parentb54a13021a55c4d608999ac8d02d9c6714746f5e (diff)
downloadjimtcl-e896ba05fb50b19501b67c244357adc1ecfae4b6.zip
jimtcl-e896ba05fb50b19501b67c244357adc1ecfae4b6.tar.gz
jimtcl-e896ba05fb50b19501b67c244357adc1ecfae4b6.tar.bz2
Added Jim_GetEnum() API function. StringCoreCommand and AIO extension
modified to use this API. There are plenty of other places where this will work better than the raw CompareStringImmediate(). Original idea from Tcl, Original implementation from Pat Thoyts, I changed the implementationto use CSI and for automatic error generation with all the valid options listed.
-rw-r--r--ChangeLog9
-rw-r--r--Makefile3
-rw-r--r--TODO2
-rw-r--r--jim-aio.c30
-rw-r--r--jim.c69
-rw-r--r--jim.h5
6 files changed, 88 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index 9dca210..ca89bd2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-03-05 23:06 patthoyts
+
+ * jim.c: Free an objects internal representation before freeing the
+ string rep.
+
+2005-03-05 22:11 antirez
+
+ * ChangeLog, jim-aio.c: more AIO file methods.
+
2005-03-05 19:51 antirez
* ChangeLog, jim-aio.c: ANSI I/O seek method implemented.
diff --git a/Makefile b/Makefile
index a657c4d..b61b60f 100644
--- a/Makefile
+++ b/Makefile
@@ -85,6 +85,9 @@ wc:
wc -l jim.[ch]
wc -l *.[ch]
+clog:
+ cvs2cl
+
commit:
cvs2cl
cvs commit
diff --git a/TODO b/TODO
index 905cc4f..9d3fc84 100644
--- a/TODO
+++ b/TODO
@@ -36,7 +36,7 @@ IMPLEMENTATION ISSUES
- Objects lazy free.
- [split $string {}] should generate a list with Jim_Obj of chars shared.
- [closure] command to set/get procedures-specific closure variables.
- For example:
+- Rewrite all the commands accepting a set of options to use Jim_GetEnum().
ERROR MESSAGES
diff --git a/jim-aio.c b/jim-aio.c
index d0b0c3e..917d218 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -1,7 +1,7 @@
/* Jim - ANSI I/O extension
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim-aio.c,v 1.3 2005/03/05 21:11:24 antirez Exp $
+ * $Id: jim-aio.c,v 1.4 2005/03/06 08:31:42 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
typedef struct AioFile {
FILE *fp;
+ int keepOpen; /* If set, the file is not fclosed on cleanup (stdin, ...) */
} AioFile;
static void JimAioSetError(Jim_Interp *interp)
@@ -52,20 +53,28 @@ static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
{
AioFile *af = Jim_CmdPrivData(interp);
+ int option;
+ const char *options[] = {
+ "close", "seek", "tell", "gets", "puts", "flush", NULL
+ };
+ enum {OPT_CLOSE, OPT_SEEK, OPT_TELL, OPT_GETS, OPT_PUTS, OPT_FLUSH};
if (argc < 2) {
Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?");
return JIM_ERR;
}
+ if (Jim_GetEnum(interp, argv[1], options, &option, "AIO method",
+ JIM_ERRMSG) != JIM_OK)
+ return JIM_ERR;
/* CLOSE */
- if (Jim_CompareStringImmediate(interp, argv[1], "close")) {
+ if (option == OPT_CLOSE) {
if (argc != 2) {
Jim_WrongNumArgs(interp, 2, argv, "");
return JIM_ERR;
}
Jim_DeleteCommand(interp, Jim_GetString(argv[0], NULL));
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "seek")) {
+ } else if (option == OPT_SEEK) {
/* SEEK */
int orig = SEEK_SET;
long offset;
@@ -96,7 +105,7 @@ static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
}
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "tell")) {
+ } else if (option == OPT_TELL) {
/* TELL */
long position;
@@ -107,7 +116,7 @@ static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
position = ftell(af->fp);
Jim_SetResult(interp, Jim_NewIntObj(interp, position));
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "gets")) {
+ } else if (option == OPT_GETS) {
/* GETS */
char buf[AIO_BUF_LEN];
Jim_Obj *objPtr;
@@ -162,7 +171,7 @@ static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
Jim_SetResult(interp, objPtr);
}
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "puts")) {
+ } else if (option == OPT_PUTS) {
/* PUTS */
unsigned int wlen;
const char *wdata;
@@ -179,7 +188,7 @@ static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
}
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "flush")) {
+ } else if (option == OPT_FLUSH) {
/* FLUSH */
if (argc != 2) {
Jim_WrongNumArgs(interp, 2, argv, "");
@@ -190,13 +199,8 @@ static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
}
return JIM_OK;
- } else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "Invalid option for AIO file, should be: "
- "close, flush, gets, read, puts, seek, tell", NULL);
- return JIM_ERR;
}
+ return JIM_OK;
}
static int JimAioOpenCommand(Jim_Interp *interp, int argc,
diff --git a/jim.c b/jim.c
index ed901db..e101b61 100644
--- a/jim.c
+++ b/jim.c
@@ -1,7 +1,7 @@
/* Jim - A small embeddable Tcl interpreter
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim.c,v 1.67 2005/03/05 22:06:51 patthoyts Exp $
+ * $Id: jim.c,v 1.68 2005/03/06 08:31:42 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -2041,6 +2041,38 @@ int Jim_CompareStringImmediate(Jim_Interp *interp, Jim_Obj *objPtr,
}
}
+int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
+ const char **tablePtr, int *indexPtr, const char *name, int flags)
+{
+ const char **entryPtr = NULL;
+ int i, count = 0;
+
+ *indexPtr = -1;
+ for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) {
+ if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) {
+ *indexPtr = i;
+ return JIM_OK;
+ }
+ count++; /* If nothing matches, this will reach the len of tablePtr */
+ }
+ if (flags & JIM_ERRMSG) {
+ if (name == NULL)
+ name = "option";
+ Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings(interp, Jim_GetResult(interp),
+ "bad ", name, " \"", Jim_GetString(objPtr, NULL), "\": must be ",
+ NULL);
+ for (i = 0; i < count; i++) {
+ if (i+1 == count && count > 1)
+ Jim_AppendString(interp, Jim_GetResult(interp), "or ", -1);
+ Jim_AppendString(interp, Jim_GetResult(interp), tablePtr[i], -1);
+ if (i+1 != count)
+ Jim_AppendString(interp, Jim_GetResult(interp), ", ", -1);
+ }
+ }
+ return JIM_ERR;
+}
+
/* -----------------------------------------------------------------------------
* Source Object
*
@@ -7111,6 +7143,7 @@ void JimRegisterCoreApi(Jim_Interp *interp)
JIM_REGISTER_API(GetAssocData);
JIM_REGISTER_API(SetAssocData);
JIM_REGISTER_API(DeleteAssocData);
+ JIM_REGISTER_API(GetEnum);
}
/* -----------------------------------------------------------------------------
@@ -8338,11 +8371,24 @@ static Jim_Obj *JimStringMap(Jim_Interp *interp, Jim_Obj *mapListObjPtr,
static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
{
+ int option;
+ const char *options[] = {
+ "length", "compare", "match", "equal", "range", "map", "repeat", NULL
+ };
+ enum {
+ OPT_LENGTH, OPT_COMPARE, OPT_MATCH, OPT_EQUAL, OPT_RANGE,
+ OPT_MAP, OPT_REPEAT
+ };
+
if (argc < 2) {
Jim_WrongNumArgs(interp, 1, argv, "option ?arguments ...?");
return JIM_ERR;
}
- if (Jim_CompareStringImmediate(interp, argv[1], "length")) {
+ if (Jim_GetEnum(interp, argv[1], options, &option, "option",
+ JIM_ERRMSG) != JIM_OK)
+ return JIM_ERR;
+
+ if (option == OPT_LENGTH) {
int len;
if (argc != 3) {
@@ -8352,7 +8398,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
Jim_GetString(argv[2], &len);
Jim_SetResult(interp, Jim_NewIntObj(interp, len));
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "compare")) {
+ } else if (option == OPT_COMPARE) {
int nocase = 0;
if ((argc != 4 && argc != 5) ||
(argc == 5 && Jim_CompareStringImmediate(interp,
@@ -8368,7 +8414,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
Jim_StringCompareObj(argv[2],
argv[3], nocase)));
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "match")) {
+ } else if (option == OPT_MATCH) {
int nocase = 0;
if ((argc != 4 && argc != 5) ||
(argc == 5 && Jim_CompareStringImmediate(interp,
@@ -8385,7 +8431,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
Jim_NewIntObj(interp, Jim_StringMatchObj(argv[2],
argv[3], nocase)));
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "equal")) {
+ } else if (option == OPT_EQUAL) {
if (argc != 4) {
Jim_WrongNumArgs(interp, 2, argv, "string1 string2");
return JIM_ERR;
@@ -8394,7 +8440,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
Jim_NewIntObj(interp, Jim_StringEqObj(argv[2],
argv[3], 0)));
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "range")) {
+ } else if (option == OPT_RANGE) {
Jim_Obj *objPtr;
if (argc != 5) {
@@ -8406,7 +8452,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
Jim_SetResult(interp, objPtr);
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "map")) {
+ } else if (option == OPT_MAP) {
int nocase = 0;
Jim_Obj *objPtr;
@@ -8426,7 +8472,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
Jim_SetResult(interp, objPtr);
return JIM_OK;
- } else if (Jim_CompareStringImmediate(interp, argv[1], "repeat")) {
+ } else if (option == OPT_REPEAT) {
Jim_Obj *objPtr;
jim_wide count;
@@ -8442,13 +8488,6 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
}
Jim_SetResult(interp, objPtr);
return JIM_OK;
- } else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad option \"", Jim_GetString(argv[1], NULL), "\":",
- " must be length, compare, match, equal, range, repeat",
- NULL);
- return JIM_ERR;
}
return JIM_OK;
}
diff --git a/jim.h b/jim.h
index 65f0a62..893e7f8 100644
--- a/jim.h
+++ b/jim.h
@@ -1,7 +1,7 @@
/* Jim - A small embeddable Tcl interpreter
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim.h,v 1.38 2005/03/05 15:04:14 antirez Exp $
+ * $Id: jim.h,v 1.39 2005/03/06 08:31:42 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -684,6 +684,8 @@ JIM_STATIC void JIM_API(Jim_ReleaseSharedString) (Jim_Interp *interp,
/* commands utilities */
JIM_STATIC void JIM_API(Jim_WrongNumArgs) (Jim_Interp *interp, int argc,
Jim_Obj *const *argv, const char *msg);
+JIM_STATIC int JIM_API(Jim_GetEnum) (Jim_Interp *interp, Jim_Obj *objPtr,
+ const char **tablePtr, int *indexPtr, const char *name, int flags);
/* package utilities */
typedef void (Jim_InterpDeleteProc)(Jim_Interp *interp, void *data);
@@ -804,6 +806,7 @@ static void Jim_InitExtension(Jim_Interp *interp, const char *version)
JIM_GET_API(GetAssocData);
JIM_GET_API(SetAssocData);
JIM_GET_API(DeleteAssocData);
+ JIM_GET_API(GetEnum);
Jim_SetResultString(interp, version, -1);
}