Posted to tcl by jima at Tue Sep 25 21:46:01 GMT 2018view raw
- 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;
- }