Artifact
aff8b76101956daaae41b9ec80782671ef3f1e24:
Attachment "lreverse.c" to
ticket [1545151fff]
added by
fridolin
2006-08-23 16:25:25.
0000: 2f 2a 20 23 64 65 66 69 6e 65 20 55 53 45 5f 54 /* #define USE_T
0010: 43 4c 5f 53 54 55 42 53 20 2a 2f 0a 23 69 6e 63 CL_STUBS */.#inc
0020: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 75 lude <tcl.h>..#u
0030: 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41 47 45 ndef TCL_STORAGE
0040: 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65 20 54 _CLASS.#define T
0050: 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 CL_STORAGE_CLASS
0060: 20 44 4c 4c 45 58 50 4f 52 54 0a 0a 0a 2f 2a 0a DLLEXPORT.../*.
0070: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00b0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4c 69 73 --. *. * Tcl_Lis
00c0: 74 4f 62 6a 52 65 76 65 72 73 65 0a 20 2a 0a 20 tObjReverse. *.
00d0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
00e0: 69 6f 6e 20 72 65 76 65 72 73 65 73 20 61 20 6c ion reverses a l
00f0: 69 73 74 20 72 65 66 65 72 65 6e 63 65 64 20 62 ist referenced b
0100: 79 20 6c 69 73 74 50 74 72 2e 0a 20 2a 0a 20 2a y listPtr.. *. *
0110: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c 69 73 74 4f /..int.Tcl_ListO
0120: 62 6a 52 65 76 65 72 73 65 28 54 63 6c 5f 49 6e bjReverse(Tcl_In
0130: 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 2f terp * interp, /
0140: 2a 20 55 73 65 64 20 66 6f 72 20 65 72 72 6f 72 * Used for error
0150: 20 72 65 70 6f 72 74 69 6e 68 20 69 66 20 6e 6f reportinh if no
0160: 74 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 t NULL. */.
0170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 Tc
0180: 6c 5f 4f 62 6a 20 2a 20 6c 69 73 74 50 74 72 2c l_Obj * listPtr,
0190: 20 20 2f 2a 20 4c 69 73 74 20 6f 62 6a 65 63 74 /* List object
01a0: 20 74 6f 20 72 65 76 65 72 73 65 20 2a 2f 0a 20 to reverse */.
01b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
01c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 20 72 65 73 Tcl_Obj ** res
01d0: 75 6c 74 50 74 72 29 0a 7b 0a 20 20 69 6e 74 20 ultPtr).{. int
01e0: 65 6c 65 6d 43 6f 75 6e 74 3b 0a 20 20 54 63 6c elemCount;. Tcl
01f0: 5f 4f 62 6a 20 2a 2a 65 6c 65 6d 50 74 72 73 2c _Obj **elemPtrs,
0200: 20 2a 2a 72 65 73 4f 62 6a 76 3b 0a 20 20 69 6e **resObjv;. in
0210: 74 20 72 65 73 75 6c 74 2c 20 69 3b 0a 0a 20 20 t result, i;..
0220: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4c 69 73 result = Tcl_Lis
0230: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
0240: 20 69 6e 74 65 72 70 20 2c 20 6c 69 73 74 50 74 interp , listPt
0250: 72 2c 20 26 65 6c 65 6d 43 6f 75 6e 74 2c 20 26 r, &elemCount, &
0260: 65 6c 65 6d 50 74 72 73 29 3b 0a 20 20 69 66 28 elemPtrs);. if(
0270: 20 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f result != TCL_O
0280: 4b 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 72 K ). return r
0290: 65 73 75 6c 74 3b 0a 0a 20 20 72 65 73 4f 62 6a esult;.. resObj
02a0: 76 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 20 v = (Tcl_Obj**)
02b0: 63 6b 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 ckalloc( sizeof(
02c0: 54 63 6c 5f 4f 62 6a 2a 29 20 2a 20 65 6c 65 6d Tcl_Obj*) * elem
02d0: 43 6f 75 6e 74 20 29 3b 0a 0a 20 20 66 6f 72 28 Count );.. for(
02e0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 65 6c 65 6d i = 0; i < elem
02f0: 43 6f 75 6e 74 3b 20 69 2b 2b 20 29 20 7b 0a 20 Count; i++ ) {.
0300: 20 20 20 72 65 73 4f 62 6a 76 5b 69 5d 20 3d 20 resObjv[i] =
0310: 65 6c 65 6d 50 74 72 73 5b 65 6c 65 6d 43 6f 75 elemPtrs[elemCou
0320: 6e 74 2d 31 2d 69 5d 3b 0a 20 20 20 20 54 63 6c nt-1-i];. Tcl
0330: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 _IncrRefCount(re
0340: 73 4f 62 6a 76 5b 69 5d 29 3b 0a 20 20 7d 0a 0a sObjv[i]);. }..
0350: 20 20 2a 72 65 73 75 6c 74 50 74 72 20 3d 20 54 *resultPtr = T
0360: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 20 65 cl_NewListObj( e
0370: 6c 65 6d 43 6f 75 6e 74 2c 20 72 65 73 4f 62 6a lemCount, resObj
0380: 76 20 29 3b 0a 20 20 63 6b 66 72 65 65 28 20 28 v );. ckfree( (
0390: 76 6f 69 64 2a 29 20 72 65 73 4f 62 6a 76 20 29 void*) resObjv )
03a0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f ;.. return TCL_
03b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2f 0a 0a 69 OK;.}../*. */..i
03c0: 6e 74 0a 54 63 6c 5f 4c 72 65 76 65 72 73 65 4f nt.Tcl_LreverseO
03d0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
03e0: 20 64 75 6d 6d 79 2c 20 54 63 6c 5f 49 6e 74 65 dummy, Tcl_Inte
03f0: 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 69 6e 74 rp * interp, int
0400: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
0410: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 0a 7b 0a CONST objv[]).{.
0420: 20 20 54 63 6c 5f 4f 62 6a 20 2a 20 6c 69 73 74 Tcl_Obj * list
0430: 50 74 72 2c 20 2a 72 65 73 75 6c 74 4c 69 73 74 Ptr, *resultList
0440: 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a ;. int result;.
0450: 0a 20 20 69 66 28 20 6f 62 6a 63 20 21 3d 20 32 . if( objc != 2
0460: 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f ) {. Tcl_Wro
0470: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
0480: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6c 72 65 76 , 1, objv, "lrev
0490: 65 72 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 erse");. retu
04a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
04b0: 7d 0a 0a 20 20 6c 69 73 74 50 74 72 20 3d 20 6f }.. listPtr = o
04c0: 62 6a 76 5b 31 5d 3b 0a 20 20 72 65 73 75 6c 74 bjv[1];. result
04d0: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 52 65 = Tcl_ListObjRe
04e0: 76 65 72 73 65 28 69 6e 74 65 72 70 2c 20 6c 69 verse(interp, li
04f0: 73 74 50 74 72 2c 20 26 72 65 73 75 6c 74 4c 69 stPtr, &resultLi
0500: 73 74 29 3b 0a 0a 20 20 69 66 28 20 72 65 73 75 st);.. if( resu
0510: 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 20 29 20 7b lt != TCL_OK ) {
0520: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 . return resu
0530: 6c 74 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 53 lt;. }.. Tcl_S
0540: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
0550: 72 70 2c 20 72 65 73 75 6c 74 4c 69 73 74 29 3b rp, resultList);
0560: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b . return TCL_OK
0570: 3b 0a 7d 0a 0a 69 6e 74 20 4c 72 65 76 65 72 73 ;.}..int Lrevers
0580: 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 e_Init(Tcl_Inter
0590: 70 2a 20 69 6e 74 65 72 70 29 0a 7b 0a 0a 23 69 p* interp).{..#i
05a0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 54 43 f defined(USE_TC
05b0: 4c 5f 53 54 55 42 53 29 0a 20 20 69 66 28 20 54 L_STUBS). if( T
05c0: 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 20 69 6e cl_InitStubs( in
05d0: 74 65 72 70 2c 20 54 43 4c 5f 56 45 52 53 49 4f terp, TCL_VERSIO
05e0: 4e 2c 20 30 20 29 20 3d 3d 20 4e 55 4c 4c 20 29 N, 0 ) == NULL )
05f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
0600: 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 0a 20 ERROR;.#endif..
0610: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
0620: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6c mmand(interp, "l
0630: 72 65 76 65 72 73 65 22 2c 20 54 63 6c 5f 4c 72 reverse", Tcl_Lr
0640: 65 76 65 72 73 65 4f 62 6a 43 6d 64 2c 20 4e 55 everseObjCmd, NU
0650: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 72 65 LL, NULL);.. re
0660: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..