Tcl Source Code

Attachment Details
Login
Overview

Artifact ID: c49b48b5b04c0bb682cd30d27e47c91d31a88f41
Ticket: 1545151fffffffffffffffffffffffffffffffff
Date: 2006-08-23 16:25:25
User: fridolin
Artifact Attached: aff8b76101956daaae41b9ec80782671ef3f1e24
Filename:lreverse.c
Description:
Content Appended
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
/* #define USE_TCL_STUBS */
#include <tcl.h>

#undef TCL_STORAGE_CLASS
#define TCL_STORAGE_CLASS DLLEXPORT


/*
 *----------------------------------------------------------------
 *
 * Tcl_ListObjReverse
 *
 *     This function reverses a list referenced by listPtr.
 *
 */

int
Tcl_ListObjReverse(Tcl_Interp * interp, /* Used for error reportinh if not NULL. */
                   Tcl_Obj * listPtr,  /* List object to reverse */
                   Tcl_Obj ** resultPtr)
{
  int elemCount;
  Tcl_Obj **elemPtrs, **resObjv;
  int result, i;

  result = Tcl_ListObjGetElements( interp , listPtr, &elemCount, &elemPtrs);
  if( result != TCL_OK )
    return result;

  resObjv = (Tcl_Obj**) ckalloc( sizeof(Tcl_Obj*) * elemCount );

  for( i = 0; i < elemCount; i++ ) {
    resObjv[i] = elemPtrs[elemCount-1-i];
    Tcl_IncrRefCount(resObjv[i]);
  }

  *resultPtr = Tcl_NewListObj( elemCount, resObjv );
  ckfree( (void*) resObjv );

  return TCL_OK;
}

/*
 */

int
Tcl_LreverseObjCmd(ClientData dummy, Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[])
{
  Tcl_Obj * listPtr, *resultList;
  int result;

  if( objc != 2 ) {
    Tcl_WrongNumArgs(interp, 1, objv, "lreverse");
    return TCL_ERROR;
  }

  listPtr = objv[1];
  result = Tcl_ListObjReverse(interp, listPtr, &resultList);

  if( result != TCL_OK ) {
    return result;
  }

  Tcl_SetObjResult(interp, resultList);
  return TCL_OK;
}

int Lreverse_Init(Tcl_Interp* interp)
{

#if defined(USE_TCL_STUBS)
  if( Tcl_InitStubs( interp, TCL_VERSION, 0 ) == NULL )
    return TCL_ERROR;
#endif

  Tcl_CreateObjCommand(interp, "lreverse", Tcl_LreverseObjCmd, NULL, NULL);

  return TCL_OK;
}