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