diff options
author | antirez <antirez> | 2005-03-06 08:31:42 +0000 |
---|---|---|
committer | antirez <antirez> | 2005-03-06 08:31:42 +0000 |
commit | e896ba05fb50b19501b67c244357adc1ecfae4b6 (patch) | |
tree | 68876d6c39ac1e536a20a9899511d13360b8b2cf | |
parent | b54a13021a55c4d608999ac8d02d9c6714746f5e (diff) | |
download | jimtcl-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-- | ChangeLog | 9 | ||||
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | jim-aio.c | 30 | ||||
-rw-r--r-- | jim.c | 69 | ||||
-rw-r--r-- | jim.h | 5 |
6 files changed, 88 insertions, 30 deletions
@@ -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. @@ -85,6 +85,9 @@ wc: wc -l jim.[ch] wc -l *.[ch] +clog: + cvs2cl + commit: cvs2cl cvs commit @@ -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 @@ -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, @@ -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; } @@ -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); } |