Posted to tcl by jima at Tue Sep 25 21:46:01 GMT 2018view pretty
static void expand( Tcl_Interp *interp, int lr, unsigned int *R, int lpa, unsigned int *pa, Tcl_Obj *sub, int i, Tcl_Obj *buf ) { int lc; Tcl_ListObjLength( interp, sub, &lc ); lc = lc + 1; unsigned int* cur; cur = malloc( sizeof( unsigned int ) * lc ); Tcl_Obj* r; for( int j = 0; j < lc - 1; j++ ) { Tcl_ListObjIndex( interp, sub, j, &r ); Tcl_GetIntFromObj( interp, r, &cur[j] ); } for( ; i < lpa; i++ ) { cur[lc-1] = pa[i]; for( int j = 0; j < lr; j = j + 3 ) { for( int k1 = 0; k1 < lc; k1++ ) { if( R[j] == cur[k1] ) { for( int k2 = 0; k2 < lc; k2++ ) { if( R[j+1] == cur[k2] ) { for( int k3 = 0; k3 < lc; k3++ ) { if( R[j+2] == cur[k3] ) { return; } } } } } } } r = Tcl_DuplicateObj( sub ); Tcl_ListObjAppendElement( interp, r, Tcl_NewIntObj( pa[i] ) ); Tcl_ListObjAppendElement( interp, buf, r ); expand( interp, lr, R, lpa, pa, r, i+1, buf ); } free( cur ); return; } /* list redux list sortx (or just size_t n), this is pa */ static int TisCExpand_Cmd( ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[] ) { /* R */ /* 0 ... Len-1 */ int lr; Tcl_ListObjLength( interp, objv[1], &lr ); unsigned int* R; R = malloc( sizeof( unsigned int ) * lr ); Tcl_Obj* r; for( int j = 0; j < lr; j++ ) { Tcl_ListObjIndex( interp, objv[1], j, &r ); Tcl_GetIntFromObj( interp, r, &R[j] ); } /* pa */ /* 0 ... Len-1 */ int lpa; Tcl_ListObjLength( interp, objv[2], &lpa ); unsigned int* pa; pa = malloc( sizeof( unsigned int ) * lpa ); for( int k = 0; k < lpa; k++ ) { Tcl_ListObjIndex( interp, objv[2], k, &r ); Tcl_GetIntFromObj( interp, r, &pa[k] ); } /* sub */ Tcl_Obj* sub; sub = Tcl_NewListObj( 0, NULL ); /* i */ int i = 0; /* buf */ Tcl_Obj* buf; buf = Tcl_NewListObj( 0, NULL ); /* expand */ expand( interp, lr, R, lpa, pa, sub, i, buf ); /* bye */ free( R ); free( pa ); /* result */ Tcl_SetObjResult( interp, buf ); return TCL_OK; }