|
From: Stephen D. <sd...@us...> - 2005-03-26 14:25:35
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3873/nsd Modified Files: nsd.h tclcmds.c tclinit.c tclobj.c tclobjv.c Log Message: * include/ns.h: * nsd/nsd.h: * nsd/tclobjv.c: * nsd/tclcmds.c: * tests/ns_parseargs.test: Change the signature of Ns_ObjvProc()s to return either TCL_OK, TCL_ERROR or TCL_BREAK. Fixes a bug where options were being double-counted as args. Also simplified the Ns_ObjvProc interface by passing the Ns_ObjvSpec directly. Added a new Tcl command: ns_parseargs specification args. It parses options, args and handles defaults. * nsd/tclobj.c: Added some wrapper procs for handling Tcl obj types. * nsd/tclinit.c: Added Ns_TclPrintfResult() as a convenience for writing ints into a formatted string result. Index: tclobj.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclobj.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** tclobj.c 16 Feb 2005 08:40:34 -0000 1.1.1.1 --- tclobj.c 26 Mar 2005 14:25:25 -0000 1.2 *************** *** 61,64 **** --- 61,65 ---- static Tcl_ObjType *intTypePtr; + /* *************** *** 100,103 **** --- 101,214 ---- *---------------------------------------------------------------------- * + * Ns_TclResetObjType -- + * + * Reset the given Tcl_Obj type, freeing any type specific + * internal representation. + * + * Results: + * None. + * + * Side effects: + * Depends on object type. + * + *---------------------------------------------------------------------- + */ + + void + Ns_TclResetObjType(Tcl_Obj *objPtr, Tcl_ObjType *newTypePtr) + { + Tcl_ObjType *typePtr = objPtr->typePtr; + + if (typePtr != NULL && typePtr->freeIntRepProc != NULL) { + (typePtr->freeIntRepProc)(objPtr); + } + objPtr->typePtr = newTypePtr; + } + + + /* + *---------------------------------------------------------------------- + * + * Ns_TclSetTwoPtrValue -- + * + * Reset the given objects type and values, freeing any existing + * internal rep. + * + * Results: + * None. + * + * Side effects: + * Depends on object type. + * + *---------------------------------------------------------------------- + */ + + void + Ns_TclSetTwoPtrValue(Tcl_Obj *objPtr, Tcl_ObjType *newTypePtr, + void *ptr1, void *ptr2) + { + Ns_TclResetObjType(objPtr, newTypePtr); + objPtr->internalRep.twoPtrValue.ptr1 = ptr1; + objPtr->internalRep.twoPtrValue.ptr2 = ptr2; + } + + + /* + *---------------------------------------------------------------------- + * + * Ns_TclSetOtherValuePtr -- + * + * Reset the given objects type and value, freeing any existing + * internal rep. + * + * Results: + * None. + * + * Side effects: + * Depends on object type. + * + *---------------------------------------------------------------------- + */ + + void + Ns_TclSetOtherValuePtr(Tcl_Obj *objPtr, Tcl_ObjType *newTypePtr, void *value) + { + Ns_TclResetObjType(objPtr, newTypePtr); + objPtr->internalRep.otherValuePtr = value; + } + + + /* + *---------------------------------------------------------------------- + * + * Ns_TclSetStringRep -- + * + * Copy length bytes and set objects string rep. The objects + * existing string rep *must* have already been freed. + * + * Results: + * None. + * + * Side effects: + * Memory is allocated. + * + *---------------------------------------------------------------------- + */ + + void + Ns_TclSetStringRep(Tcl_Obj *objPtr, char *bytes, int length) + { + if (length < 1) { + length = strlen(bytes); + } + objPtr->length = length; + objPtr->bytes = ckalloc((size_t) length + 1); + memcpy(objPtr->bytes, bytes, (size_t) length + 1); + } + + + /* + *---------------------------------------------------------------------- + * * Ns_TclSetTimeObj -- * *************** *** 179,183 **** { Ns_Time *timePtr = (Ns_Time *) &objPtr->internalRep; ! size_t len; char buf[100]; --- 290,294 ---- { Ns_Time *timePtr = (Ns_Time *) &objPtr->internalRep; ! int len; char buf[100]; *************** *** 188,194 **** len = sprintf(buf, "%ld:%ld", timePtr->sec, timePtr->usec); } ! objPtr->length = len; ! objPtr->bytes = ckalloc(len + 1); ! memcpy(objPtr->bytes, buf, len + 1); } --- 299,303 ---- len = sprintf(buf, "%ld:%ld", timePtr->sec, timePtr->usec); } ! Ns_TclSetStringRep(objPtr, buf, len); } *************** *** 264,273 **** SetTimeInternalRep(Tcl_Obj *objPtr, Ns_Time *timePtr) { ! Tcl_ObjType *typePtr = objPtr->typePtr; ! ! if (typePtr != NULL && typePtr->freeIntRepProc != NULL) { ! (*typePtr->freeIntRepProc)(objPtr); ! } ! objPtr->typePtr = &timeType; *((Ns_Time *) &objPtr->internalRep) = *timePtr; Tcl_InvalidateStringRep(objPtr); --- 373,377 ---- SetTimeInternalRep(Tcl_Obj *objPtr, Ns_Time *timePtr) { ! Ns_TclResetObjType(objPtr, &timeType); *((Ns_Time *) &objPtr->internalRep) = *timePtr; Tcl_InvalidateStringRep(objPtr); Index: tclcmds.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclcmds.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** tclcmds.c 6 Mar 2005 22:48:27 -0000 1.4 --- tclcmds.c 26 Mar 2005 14:25:25 -0000 1.5 *************** *** 109,112 **** --- 109,113 ---- NsTclNsvSetObjCmd, NsTclNsvUnsetObjCmd, + NsTclParseArgsObjCmd, NsTclParseHttpTimeObjCmd, NsTclParseQueryObjCmd, *************** *** 408,411 **** --- 409,418 ---- /* + * tclobjv.c + */ + + {"ns_parseargs", NULL, NsTclParseArgsObjCmd}, + + /* * Add more basic Tcl commands here. */ Index: tclinit.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclinit.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** tclinit.c 16 Feb 2005 08:40:05 -0000 1.1.1.1 --- tclinit.c 26 Mar 2005 14:25:25 -0000 1.2 *************** *** 157,160 **** --- 157,190 ---- *---------------------------------------------------------------------- * + * Ns_TclPrintfResult -- + * + * Leave a formatted message in the given Tcl interps result. + * + * Results: + * None. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + void + Ns_TclPrintfResult(Tcl_Interp *interp, char *fmt, ...) + { + va_list ap; + Tcl_DString ds; + + Tcl_DStringInit(&ds); + va_start(ap, fmt); + Ns_DStringVPrintf(&ds, fmt, ap); + va_end(ap); + Tcl_DStringResult(interp, &ds); + } + + + /* + *---------------------------------------------------------------------- + * * Ns_TclInitInterps -- * *************** *** 1148,1151 **** --- 1178,1182 ---- NsTclInitAddrType(); NsTclInitTimeType(); + NsTclInitSpecType(); initialized = 1; } Index: nsd.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/nsd.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** nsd.h 18 Mar 2005 08:21:06 -0000 1.4 --- nsd.h 26 Mar 2005 14:25:25 -0000 1.5 *************** *** 923,926 **** --- 923,927 ---- extern void NsTclInitAddrType(void); extern void NsTclInitTimeType(void); + extern void NsTclInitSpecType(void); /* Index: tclobjv.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/tclobjv.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** tclobjv.c 4 Mar 2005 09:24:14 -0000 1.3 --- tclobjv.c 26 Mar 2005 14:25:25 -0000 1.4 *************** *** 35,46 **** /* * Static functions defined in this file. */ ! static void WrongNumArgs(Ns_ObjvSpec *optSpec, Ns_ObjvSpec *argSpec, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); [...1209 lines suppressed...] ! } else if (specPtr->proc == &Ns_ObjvBool && specPtr->arg != NULL) { ! Ns_DStringPrintf(&ds, "?%s? ", specPtr->key); ! } else { ! p = specPtr->key; ! if (*specPtr->key == '-') { ! ++p; ! } ! Ns_DStringPrintf(&ds, "?%s %s? ", specPtr->key, p); } } } ! if (argSpec != NULL) { ! for (specPtr = argSpec; specPtr->key != NULL; ++specPtr) { ! Ns_DStringPrintf(&ds, "%s%s ", specPtr->key, ! (*specPtr->key == '?') ? "?" : ""); ! } } + Ns_DStringTrunc(&ds, Ns_DStringLength(&ds) - 1); Tcl_WrongNumArgs(interp, objc, objv, ds.string); Ns_DStringFree(&ds); |