Tcl Source Code

Hex Artifact Content
Login

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;.}..