Additional Options for 'lsearch'Tom WilkasonTom Wilkason$Revision: 1.10 $
This TIP proposes additional options for the lsearch command to return and work with all matching items in the return rather than the first matching item. Additional options are also added.
The lsearch function works well for finding the first item in a list that matches a pattern. However it is often useful to find all of the items in the list that match a pattern. This TIP proposes adding options to return the entire list of matches. With this capability, additional options are proposed to return the data rather than the indices (since you often want to work the the data anyway), and to add an option to return the logical exclusion of the matching items (i.e. those that don't match the search pattern).
I propose the following options be added to lsearch:
Option: -start index
Initiates the list search starting at index, which can be any valid list index (such as 0 , end , end-1 ...)
Option: -all
Returns a list of all indices that match the search condition (rather than the first one). The indices are returned low to high order. For a no match condition, a {} (empty list) is returned. If the the -all or -inline switches are not specified, a -1 is returned for a no match condition just as is done now.
Option: -inline
Returns a single item (or a list of items for -all) of the data that matches the search condition rather than the index (or indices). An empty result or empty list (-all) is returned for a no match condition. The data is returned in original list order. This option is useful when you want to iterate over the returned data anyway. e.g.
ICAgIGZvcmVhY2ggaXRlbSBbbHNlYXJjaCAtYWxsIC1pbmxpbmUgLWdsb2IgJHNvbWVMaXN0ICpzdHVmZl0gew==ICAgICAgICMgZGVhbCB3aXRoIGl0ZW0=ICAgIH0=
Option: -not
Negates the sense of the search condition (i.e. what doesn't match). When used with the -inline or -all options, the return set will be the items that do match. If all items match then a {} is returned. Without the -all option, the first item in the list that does not match will be returned.
These can be combined as needed and yield some powerful capabilities when iterating over sub-lists (esp. with the new lset command).
Changes to the Tcl_LsearchObjCmd command in generic/tclCmdIL.c are needed along with documentation and test code. The changes to the 8.4 head version of tclCmdIL.c are available below.
Lyo=ICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICo=ICogVGNsX0xzZWFyY2hPYmpDbWQgLS0=ICo=ICogICAgICBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIHByb2Nlc3MgdGhlICJsc2VhcmNoIiBUY2wgY29tbWFuZC4=ICogICAgICBTZWUgdGhlIHVzZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB3aGF0IGl0IGRvZXMuICo=ICogUmVzdWx0czo=ICogICAgICBBIHN0YW5kYXJkIFRjbCByZXN1bHQuICo=ICogU2lkZSBlZmZlY3RzOg==ICogICAgICBTZWUgdGhlIHVzZXIgZG9jdW1lbnRhdGlvbi4=ICo=ICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovaW50VGNsX0xzZWFyY2hPYmpDbWQoY2xpZW50RGF0YSwgaW50ZXJwLCBvYmpjLCBvYmp2KQ==ICAgIENsaWVudERhdGEgY2xpZW50RGF0YTsgICAgICAvKiBOb3QgdXNlZC4gKi8=ICAgIFRjbF9JbnRlcnAgKmludGVycDsgICAgICAgICAvKiBDdXJyZW50IGludGVycHJldGVyLiAqLw==ICAgIGludCBvYmpjOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYXJndW1lbnRzLiAqLw==ICAgIFRjbF9PYmogKkNPTlNUIG9ianZbXTsgICAgICAvKiBBcmd1bWVudCB2YWx1ZXMuICovew==ICAgIGNoYXIgKmJ5dGVzLCAqcGF0dGVybkJ5dGVzOw==ICAgIGludCBpLCBtYXRjaCwgbW9kZSwgaW5kZXgsIHJlc3VsdCwgbGlzdGMsIGxlbmd0aCwgZWxlbUxlbjs=ICAgIGludCB1c2VTdGFydD0tMSwgb2Zmc2V0LCBhbGxEYXRhPTAsIHJldHVybklubGluZT0wOw==ICAgIGludCBkYXRhVHlwZSwgaXNJbmNyZWFzaW5nLCBsb3dlciwgdXBwZXIsIHBhdEludCwgb2JqSW50LCBub3RNYXRjaD0wOw==ICAgIGRvdWJsZSBwYXREb3VibGUsIG9iakRvdWJsZTs=ICAgIFRjbF9PYmogKnBhdE9iaiwgKipsaXN0diwgKmxpc3RQdHIsICpzdGFydFB0ciA9IE5VTEw7ICAgIHN0YXRpYyBDT05TVCBjaGFyICpvcHRpb25zW10gPSB7ICAgICAgICAiLWFsbCIsICItYXNjaWkiLCAiLWRlY3JlYXNpbmciLCAiLWRpY3Rpb25hcnkiLA==ICAgICAgICAiLWV4YWN0IiwgIi1nbG9iIiwgIi1pbmNyZWFzaW5nIiwgIi1pbmxpbmUiLA==ICAgICAgICAiLWludGVnZXIiLCAiLW5vdCIsICItcmVhbCIsICItcmVnZXhwIiw=ICAgICAgICAiLXNvcnRlZCIsICItc3RhcnQiLCBOVUxMICAgIH07ICAgIGVudW0gb3B0aW9ucyB7ICAgICAgICBMU0VBUkNIX0FMTCwgTFNFQVJDSF9BU0NJSSwgTFNFQVJDSF9ERUNSRUFTSU5HLCBMU0VBUkNIX0RJQ1RJT05BUlksICAgICAgICBMU0VBUkNIX0VYQUNULCBMU0VBUkNIX0dMT0IsIExTRUFSQ0hfSU5DUkVBU0lORywgTFNFQVJDSF9JTkxJTkUsICAgICAgICBMU0VBUkNIX0lOVEVHRVIsIExTRUFSQ0hfTk9ULCBMU0VBUkNIX1JFQUwsIExTRUFSQ0hfUkVHRVhQLA==ICAgICAgICBMU0VBUkNIX1NPUlRFRCwgTFNFQVJDSF9TVEFSVA==ICAgIH07ICAgIGVudW0gZGF0YXR5cGVzIHs=ICAgICAgICBBU0NJSSwgRElDVElPTkFSWSwgSU5URUdFUiwgUkVBTA==ICAgIH07ICAgIGVudW0gbW9kZXMgew==ICAgICAgICBFWEFDVCwgR0xPQiwgUkVHRVhQLCBTT1JURUQ=ICAgIH07ICAgIG1vZGUgPSBHTE9COw==ICAgIGRhdGFUeXBlID0gQVNDSUk7ICAgIGlzSW5jcmVhc2luZyA9IDE7ICAgIC8qIE5vdGU6IFRoaXMgY291bnRzIG9wdGlvbnMgYXMgcG9zc2libGUgbGlzdHxwYXR0ZXJucyAqLw==ICAgIGlmIChvYmpjIDwgMykgew==ICAgICAgICBUY2xfV3JvbmdOdW1BcmdzKGludGVycCwgMSwgb2JqdiwgIj9vcHRpb25zPyBsaXN0IHBhdHRlcm4iKTs=ICAgICAgICByZXR1cm4gVENMX0VSUk9SOw==ICAgIH0=ICAgIGZvciAoaSA9IDE7IGkgPCBvYmpjLTI7IGkrKykgew==ICAgICAgICBpZiAoVGNsX0dldEluZGV4RnJvbU9iaihpbnRlcnAsIG9ianZbaV0sIG9wdGlvbnMsICJvcHRpb24iLCAwLCAmaW5kZXgpICAgICAgICAgICAgICAgICE9IFRDTF9PSykgew==ICAgICAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjs=ICAgICAgICB9ICAgICAgICBzd2l0Y2ggKChlbnVtIG9wdGlvbnMpIGluZGV4KSB7ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0FTQ0lJOiAgICAgICAgIC8qIC1hc2NpaSAqLw==ICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gQVNDSUk7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX05PVDogICAgICAgICAgIC8qIC1ub3QgKi8=ICAgICAgICAgICAgICAgIG5vdE1hdGNoID0gMTs=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0FMTDogICAgICAgICAgIC8qIC1hbGwgKi8=ICAgICAgICAgICAgICAgIGFsbERhdGEgPSAxOw==ICAgICAgICAgICAgICAgIGxpc3RQdHIgPSBUY2xfTmV3TGlzdE9iaigwLCAoVGNsX09iaiAqKikgTlVMTCk7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0lOTElORTogICAgICAgIC8qIC1pbmxpbmUgKi8=ICAgICAgICAgICAgICAgIHJldHVybklubGluZSA9IDE7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX1NUQVJUOiAgICAgICAgIC8qIC1zdGFydCBpbmRleCAqLw==ICAgICAgICAgICAgICAgIHVzZVN0YXJ0ID0gKytpOyAgICAgICAgIC8qIFVzZSBuZXh0IGFyZyBhcyBvZmZzZXQgaW5kZXggKi8=ICAgICAgICAgICAgICAgIGlmIChvYmpjLWkgPCAyKSB7ICAgICAgICAgICAgICAgICAgICBUY2xfU2V0UmVzdWx0KGludGVycCw=ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nIGFyZ3VtZW50IHRvIC1zdGFydCBvcHRpb24iLCBUQ0xfU1RBVElDKTs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0RFQ1JFQVNJTkc6ICAgIC8qIC1kZWNyZWFzaW5nICovICAgICAgICAgICAgICAgIGlzSW5jcmVhc2luZyA9IDA7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0RJQ1RJT05BUlk6ICAgIC8qIC1kaWN0aW9uYXJ5ICovICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gRElDVElPTkFSWTs=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0VYQUNUOiAgICAgICAgIC8qIC1leGFjdCAqLw==ICAgICAgICAgICAgICAgIG1vZGUgPSBFWEFDVDs=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0lOQ1JFQVNJTkc6ICAgIC8qIC1pbmNyZWFzaW5nICovICAgICAgICAgICAgICAgIGlzSW5jcmVhc2luZyA9IDE7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0lOVEVHRVI6ICAgICAgIC8qIC1pbnRlZ2VyICovICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gSU5URUdFUjs=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX0dMT0I6ICAgICAgICAgIC8qIC1nbG9iICovICAgICAgICAgICAgICAgIG1vZGUgPSBHTE9COw==ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX1JFQUw6ICAgICAgICAgIC8qIC1yZWFsICovICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gUkVBTDs=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX1JFR0VYUDogICAgICAgIC8qIC1yZWdleHAgKi8=ICAgICAgICAgICAgICAgIG1vZGUgPSBSRUdFWFA7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBMU0VBUkNIX1NPUlRFRDogICAgICAgIC8qIC1zb3J0ZWQgKi8=ICAgICAgICAgICAgICAgIG1vZGUgPSBTT1JURUQ7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICB9ICAgIH0=ICAgICA=ICAgIC8qICAgICAqIC1zdGFydCBvcHRpb24gcHJvY2Vzc2luZzo=ICAgICAqIEVuc3VyZSB3ZSBnZXQgYSB1bmlxdWUgY29weSBvZiBjb21tYW5kIGxpbmUgYXJnIGZvciBzdGFydCBpbmRleA==ICAgICAqLw==ICAgIGlmICh1c2VTdGFydCA+IDApIHs=ICAgICAgICBzdGFydFB0ciA9IFRjbF9EdXBsaWNhdGVPYmoob2Jqdlt1c2VTdGFydF0pOw==ICAgIH0=ICAgIC8qICAgICAqIE1ha2Ugc3VyZSB0aGUgbGlzdCBhcmd1bWVudCBpcyBhIGxpc3Qgb2JqZWN0IGFuZCBnZXQgaXRzIGxlbmd0aCBhbmQ=ICAgICAqIGEgcG9pbnRlciB0byBpdHMgYXJyYXkgb2YgZWxlbWVudCBwb2ludGVycy4=ICAgICAqLw==ICAgIHJlc3VsdCA9IFRjbF9MaXN0T2JqR2V0SW5saW5lKGludGVycCwgb2JqdltvYmpjIC0gMl0sICZsaXN0YywgJmxpc3R2KTs=ICAgIGlmIChyZXN1bHQgIT0gVENMX09LKSB7ICAgICAgICByZXR1cm4gcmVzdWx0Ow==ICAgIH0=ICAgIC8qICAgICAqIFJldHJpZXZlIHVzZXIgc3BlY2lmaWVkIHN0YXJ0IG9mZnNldC4=ICAgICAqLw==ICAgIGlmICh1c2VTdGFydCA+IDApIHs=ICAgICAgICByZXN1bHQgPSBUY2xHZXRJbnRGb3JJbmRleChpbnRlcnAsIHN0YXJ0UHRyLCAvKmVuZCovIGxpc3RjLTEsICZvZmZzZXQpOw==ICAgICAgICBUY2xfRGVjclJlZkNvdW50KHN0YXJ0UHRyKTsgLyogZnJlZSB1bm5lZWRlZCBvYmogKi8=ICAgICAgICBpZiAocmVzdWx0ICE9IFRDTF9PSykgew==ICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow==ICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHs=ICAgICAgICAgICBvZmZzZXQgPSAwOw==ICAgICAgICB9ICAgIH0gZWxzZSB7ICAgICAgIG9mZnNldCA9IDA7ICAgIH0=ICAgIC8qICAgICAqIFByb2Nlc3MgdGhlIHBhdHRlcm4=ICAgICAqLw==ICAgIHBhdE9iaiA9IG9ianZbb2JqYyAtIDFdOw==ICAgIHBhdHRlcm5CeXRlcyA9IE5VTEw7ICAgIGlmICgoZW51bSBtb2RlcykgbW9kZSA9PSBFWEFDVCB8fCAoZW51bSBtb2RlcykgbW9kZSA9PSBTT1JURUQpIHs=ICAgICAgICBzd2l0Y2ggKChlbnVtIGRhdGF0eXBlcykgZGF0YVR5cGUpIHs=ICAgICAgICAgICAgY2FzZSBBU0NJSTo=ICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZOg==ICAgICAgICAgICAgICAgIHBhdHRlcm5CeXRlcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHBhdE9iaiwgJmxlbmd0aCk7ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBJTlRFR0VSOg==ICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRjbF9HZXRJbnRGcm9tT2JqKGludGVycCwgcGF0T2JqLCAmcGF0SW50KTs=ICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gVENMX09LKSB7ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow==ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgY2FzZSBSRUFMOg==ICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRjbF9HZXREb3VibGVGcm9tT2JqKGludGVycCwgcGF0T2JqLCAmcGF0RG91YmxlKTs=ICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gVENMX09LKSB7ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow==ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICB9ICAgIH0gZWxzZSB7ICAgICAgICBwYXR0ZXJuQnl0ZXMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihwYXRPYmosICZsZW5ndGgpOw==ICAgIH0=ICAgIC8qICAgICAqIFNldCBkZWZhdWx0IGluZGV4IHZhbHVlIHRvIC0xLCBpbmRpY2F0aW5nIGZhaWx1cmU7IGlmIHdlIGZpbmQgdGhlICAgICAqIGl0ZW0gaW4gdGhlIGNvdXJzZSBvZiBvdXIgc2VhcmNoLCBpbmRleCB3aWxsIGJlIHNldCB0byB0aGUgY29ycmVjdA==ICAgICAqIHZhbHVlLg==ICAgICAqLw==ICAgIGluZGV4ID0gLTE7ICAgIG1hdGNoID0gMDs=ICAgIGlmICgoZW51bSBtb2RlcykgbW9kZSA9PSBTT1JURUQgJiYgYWxsRGF0YSA9PSBGQUxTRSkgew==ICAgICAgICAvKg==ICAgICAgICAgKiBJZiB0aGUgZGF0YSBpcyBzb3J0ZWQsIHdlIGNhbiBkbyBhIG1vcmUgaW50ZWxsaWdlbnQgc2VhcmNoLg==ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gcG9pbnQgaW4gYmVpbmcgc21hcnQgd2hlbiAtYWxsIHdhcw==ICAgICAgICAgKiBzcGVjaWZpZWQ7IGluIHRoYXQgY2FzZSwgd2UgaGF2ZSB0byBsb29rIGF0IGFsbCBpdGVtcyBhbnl3YXkuICAgICAgICAgKi8=ICAgICAgICBsb3dlciA9IG9mZnNldC0xIC8qLTEqLzs=ICAgICAgICB1cHBlciA9IGxpc3RjOw==ICAgICAgICB3aGlsZSAobG93ZXIgKyAxICE9IHVwcGVyKSB7ICAgICAgICAgICAgaSA9IChsb3dlciArIHVwcGVyKS8yOw==ICAgICAgICAgICAgc3dpdGNoICgoZW51bSBkYXRhdHlwZXMpIGRhdGFUeXBlKSB7ICAgICAgICAgICAgICAgIGNhc2UgQVNDSUk6IHs=ICAgICAgICAgICAgICAgICAgICBieXRlcyA9IFRjbF9HZXRTdHJpbmcobGlzdHZbaV0pOw==ICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHN0cmNtcChwYXR0ZXJuQnl0ZXMsIGJ5dGVzKTs=ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGNhc2UgRElDVElPTkFSWTogew==ICAgICAgICAgICAgICAgICAgICBieXRlcyA9IFRjbF9HZXRTdHJpbmcobGlzdHZbaV0pOw==ICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IERpY3Rpb25hcnlDb21wYXJlKHBhdHRlcm5CeXRlcywgYnl0ZXMpOw==ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGNhc2UgSU5URUdFUjogew==ICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUY2xfR2V0SW50RnJvbU9iaihpbnRlcnAsIGxpc3R2W2ldLCAmb2JqSW50KTs=ICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFRDTF9PSykgew==ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDs=ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBpZiAocGF0SW50ID09IG9iakludCkgew==ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAwOw==ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdEludCA8IG9iakludCkgew==ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAtMTs=ICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew==ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOw==ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGNhc2UgUkVBTDogew==ICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUY2xfR2V0RG91YmxlRnJvbU9iaihpbnRlcnAsIGxpc3R2W2ldLA==ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpEb3VibGUpOw==ICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFRDTF9PSykgew==ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDs=ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBpZiAocGF0RG91YmxlID09IG9iakRvdWJsZSkgew==ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAwOw==ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdERvdWJsZSA8IG9iakRvdWJsZSkgew==ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAtMTs=ICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew==ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOw==ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgfQ==ICAgICAgICAgICAgaWYgKG1hdGNoID09IDApIHs=ICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAqIE5vcm1hbGx5LCBiaW5hcnkgc2VhcmNoIGlzIHdyaXR0ZW4gdG8gc3RvcCB3aGVuIGl0ICAgICAgICAgICAgICAgICAqIGZpbmRzIGEgbWF0Y2guICBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBvZiBhbiBlbGVtZW50IGluICAgICAgICAgICAgICAgICAqIHRoZSBsaXN0LCBvdXIgZmlyc3QgbWF0Y2ggbWlnaHQgbm90IGJlIHRoZSBmaXJzdCBvY2N1cmFuY2UuICAgICAgICAgICAgICAgICAqIENvbnNpZGVyOiAgMCAwIDAgMSAxIDEgMiAyIDI=ICAgICAgICAgICAgICAgICAqIFRvIG1haW50YWluIGNvbnNpc3RhbmN5IHdpdGggc3RhbmRhcmQgbHNlYXJjaCBzZW1hbnRpY3MsICAgICAgICAgICAgICAgICAqIHdlIG11c3QgZmluZCB0aGUgbGVmdG1vc3Qgb2NjdXJhbmNlIG9mIHRoZSBwYXR0ZXJuIGluIHRoZQ==ICAgICAgICAgICAgICAgICAqIGxpc3QuICBUaHVzIHdlIGRvbid0IGp1c3Qgc3RvcCBzZWFyY2hpbmcgaGVyZS4gIFRoaXM=ICAgICAgICAgICAgICAgICAqIHZhcmlhdGlvbiBtZWFucyB0aGF0IGEgc2VhcmNoIGFsd2F5cyBtYWtlcyBsb2cgbg==ICAgICAgICAgICAgICAgICAqIGNvbXBhcmlzb25zIChub3JtYWwgYmluYXJ5IHNlYXJjaCBtaWdodCAiZ2V0IGx1Y2t5IiB3aXRoICAgICAgICAgICAgICAgICAqIGFuIGVhcmx5IGNvbXBhcmlzb24pLg==ICAgICAgICAgICAgICAgICAqLw==ICAgICAgICAgICAgICAgIGluZGV4ID0gaTs=ICAgICAgICAgICAgICAgIHVwcGVyID0gaTs=ICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA+IDApIHs=ICAgICAgICAgICAgICAgIGlmIChpc0luY3JlYXNpbmcpIHs=ICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGk7ICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGk7ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgfSBlbHNlIHs=ICAgICAgICAgICAgICAgIGlmIChpc0luY3JlYXNpbmcpIHs=ICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGk7ICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGk7ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgfQ==ICAgICAgICB9ICAgIH0gZWxzZSB7ICAgICAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsaXN0YzsgaSsrKSB7ICAgICAgICAgICAgbWF0Y2ggPSAwOw==ICAgICAgICAgICAgc3dpdGNoICgoZW51bSBtb2RlcykgbW9kZSkgew==ICAgICAgICAgICAgICAgIGNhc2UgU09SVEVEOg==ICAgICAgICAgICAgICAgIGNhc2UgRVhBQ1Q6IHs=ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChlbnVtIGRhdGF0eXBlcykgZGF0YVR5cGUpIHs=ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBU0NJSTogew==ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gVGNsX0dldFN0cmluZ0Zyb21PYmoobGlzdHZbaV0sICZlbGVtTGVuKTs=ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gZWxlbUxlbikgew==ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IChtZW1jbXAoYnl0ZXMsIHBhdHRlcm5CeXRlcyw=ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIGxlbmd0aCkgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgICAgICAgICAgICAgfQ==ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gVGNsX0dldFN0cmluZyhsaXN0dltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0=ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGljdGlvbmFyeUNvbXBhcmUoYnl0ZXMsIHBhdHRlcm5CeXRlcykgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgICAgICAgICAgICAgfQ==ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlRFR0VSOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRjbF9HZXRJbnRGcm9tT2JqKGludGVycCwgbGlzdHZbaV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iakludCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gVENMX09LKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow==ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gKG9iakludCA9PSBwYXRJbnQpOw==ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgICAgICAgICAgICAgfQ==ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUFMOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRjbF9HZXREb3VibGVGcm9tT2JqKGludGVycCwgbGlzdHZbaV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iakRvdWJsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gVENMX09LKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow==ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gKG9iakRvdWJsZSA9PSBwYXREb3VibGUpOw==ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw==ICAgICAgICAgICAgICAgICAgICAgICAgfQ==ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGNhc2UgR0xPQjogew==ICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IFRjbF9TdHJpbmdNYXRjaChUY2xfR2V0U3RyaW5nKGxpc3R2W2ldKSw=ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5CeXRlcyk7ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgICAgIGNhc2UgUkVHRVhQOiB7ICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IFRjbF9SZWdFeHBNYXRjaE9iaihpbnRlcnAsIGxpc3R2W2ldLCBwYXRPYmopOw==ICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjs=ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgfQ==ICAgICAgICAgICAgLyogSW52ZXJ0IG1hdGNoIGNvbmRpdGlvbiBmb3IgLW5vdCAqLw==ICAgICAgICAgICAgaWYgKG5vdE1hdGNoKSB7ICAgICAgICAgICAgICAgIG1hdGNoID0gKG1hdGNoICE9IDAgPyAwIDogMSk7ICAgICAgICAgICAgfQ==ICAgICAgICAgICAgLyogUHJvY2VzcyB0aGUgcG9zc2libGUgbWF0Y2ggZm9yIHRoaXMgZWxlbWVudCAqLw==ICAgICAgICAgICAgaWYgKG1hdGNoICE9IDApIHs=ICAgICAgICAgICAgICAgIGlmIChhbGxEYXRhKSB7ICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuSW5saW5lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQXBwZW5kIGRhdGEgKi8=ICAgICAgICAgICAgICAgICAgICAgICAgVGNsX0xpc3RPYmpBcHBlbmRFbGVtZW50KGludGVycCwgbGlzdFB0cixsaXN0dltpXSk7ICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew==ICAgICAgICAgICAgICAgICAgICAgICAgLyogQXBwZW5kIGluZGV4ICovICAgICAgICAgICAgICAgICAgICAgICAgVGNsX0xpc3RPYmpBcHBlbmRFbGVtZW50KGludGVycCwgbGlzdFB0cixUY2xfTmV3SW50T2JqKGkpKTs=ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7ICAgICAgICAgICAgICAgICAgICBicmVhazs=ICAgICAgICAgICAgICAgIH0=ICAgICAgICAgICAgfQ==ICAgICAgICB9ICAgIH0=ICAgIC8qICAgICAqIFJldHVybiBlaXRoZXIgYSBsaXN0ICgtYWxsKSBvciBhIHNpbmdsZSBlbGVtZW50ICAgICAqLw==ICAgIGlmIChhbGxEYXRhKSB7ICAgICAgICBUY2xfU2V0T2JqUmVzdWx0KGludGVycCxsaXN0UHRyKTs=ICAgIH0gZWxzZSB7ICAgICAgICBpZiAocmV0dXJuSW5saW5lKSB7ICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeyAvKiBSZXR1cm4gYSBudWxsICovICAgICAgICAgICAgICAgIFRjbF9TZXRPYmpSZXN1bHQoaW50ZXJwLFRjbF9OZXdPYmooKSk7ICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAvKiBSZXR1cm4gb25lIGRhdHVtICovICAgICAgICAgICAgICAgIFRjbF9TZXRPYmpSZXN1bHQoaW50ZXJwLGxpc3R2W2luZGV4XSk7ICAgICAgICAgICAgfQ==ICAgICAgICB9IGVsc2Ugew==ICAgICAgICAgICAgVGNsX1NldEludE9iaihUY2xfR2V0T2JqUmVzdWx0KGludGVycCksIGluZGV4KTs=ICAgICAgICB9ICAgIH0=ICAgIHJldHVybiBUQ0xfT0s7fQ==
The changes to lsearch are entirely backward compatible and do no change the behaviour or performance of the command for existing options. Moreover, these changes should not impact any of the other list changes in , or .
This document has been placed in the public domain.
The benchmarks below denote the expected speed increase of using the new options vs. tcl only implementations. Your mileage may vary.
IyM=IyBwZXJmb3JtcyBhIGxzZWFyY2ggLWFsbCAtaW5saW5lIC1nbG9iIHNlYXJjaA==Iw==cHJvYyBsc2VhcmNoX2RhdGFHTE9CIHtsaXN0RGF0YSBwYXR0ZXJufSB7ICAgIHNldCByZXN1bHQgW2xpc3RdICAgIGZvcmVhY2ggaXRlbSAkbGlzdERhdGEgew==ICAgICAgICBpZiB7W3N0cmluZyBtYXRjaCAkcGF0dGVybiAkaXRlbV19IHs=ICAgICAgICAgICAgbGFwcGVuZCByZXN1bHQgJGl0ZW0=ICAgICAgICB9ICAgIH0=ICAgIHJldHVybiAkcmVzdWx0fQ==IyM=IyBwZXJmb3JtcyBhIGxzZWFyY2ggLWFsbCAtaW5saW5lIC1yZWdleHAgc2VhcmNoIw==cHJvYyBsc2VhcmNoX2RhdGFSRSB7bGlzdERhdGEgcGF0dGVybn0gew==ICAgIHNldCByZXN1bHQgW2xpc3RdICAgIGZvcmVhY2ggaXRlbSAkbGlzdERhdGEgew==ICAgICAgICBpZiB7W3JlZ2V4cCAkcGF0dGVybiAkaXRlbV19IHs=ICAgICAgICAgICAgbGFwcGVuZCByZXN1bHQgJGl0ZW0=ICAgICAgICB9ICAgIH0=ICAgIHJldHVybiAkcmVzdWx0fQ==IyM=IyBwZXJmb3JtcyBhIGxzZWFyY2ggLWFsbCAtZ2xvYiBzZWFyY2g=Iw==cHJvYyBsc2VhcmNoX2FsbEdMT0Ige2xpc3REYXRhIHBhdHRlcm59IHs=ICAgIHNldCByZXN1bHQgW2xpc3RdICAgIHNldCBjb3VudCAwICAgIGZvcmVhY2ggaXRlbSAkbGlzdERhdGEgew==ICAgICAgICBpZiB7W3N0cmluZyBtYXRjaCAkcGF0dGVybiAkaXRlbV19IHs=ICAgICAgICAgICAgbGFwcGVuZCByZXN1bHQgJGNvdW50ICAgICAgICB9ICAgICAgICBpbmNyIGNvdW50ICAgIH0=ICAgIHJldHVybiAkcmVzdWx0fQ==IyBCdWlsZCBhIDJLIGxpc3Qgb2YgZGF0YQ==Y2F0Y2gge3Vuc2V0IExJU1R9dGltZSB7bGFwcGVuZCBMSVNUIHNvbWVTdHVmZn0gMTAwMA==dGltZSB7bGFwcGVuZCBMSVNUIG90aGVyU3R1ZmZ9IDEwMDA=IyBDYXNlIHdpdGggYWxsIGRhdGEgbWF0Y2hpbmcgaW4gYSAySyBsaXN0IDIuOHggc3BlZWR1cA==cHV0cyAiI0MgaW1wbGVtZW50YXRpb24gW3RpbWUge2xzZWFyY2ggLWdsb2IgLWFsbCAtaW5saW5lICRMSVNUICpTdHVmZn0gMTAwXSI=Iz0+IEMgaW1wbGVtZW50YXRpb24gMzc2NiBtaWNyb3NlY29uZHMgcGVyIGl0ZXJhdGlvbg==cHV0cyAiI3RjbCBpbXBsZW1lbnRhdGlvbiBbdGltZSB7bHNlYXJjaF9kYXRhR0xPQiAkTElTVCAqU3R1ZmZ9IDEwMF0iIz0+IHRjbCBpbXBsZW1lbnRhdGlvbiAxMDgxNSBtaWNyb3NlY29uZHMgcGVyIGl0ZXJhdGlvbg==IyBDYXNlIHdpdGggYWxsIGRhdGEgbWF0Y2hpbmcgYnV0IHJldHVybmluZyBpbmRpY2llcyAzWCBzcGVlZCB1cA==cHV0cyAiI0MgaW1wbGVtZW50YXRpb24gW3RpbWUge2xzZWFyY2ggLWdsb2IgLWFsbCAkTElTVCAqU3R1ZmZ9IDEwMF0iIz0+IEMgaW1wbGVtZW50YXRpb24gNDMwNSBtaWNyb3NlY29uZHMgcGVyIGl0ZXJhdGlvbg==cHV0cyAiI3RjbCBpbXBsZW1lbnRhdGlvbiBbdGltZSB7bHNlYXJjaF9hbGxHTE9CICRMSVNUICpTdHVmZn0gMTAwXSI=Iz0+IHRjbCBpbXBsZW1lbnRhdGlvbiAxMzI3NyBtaWNyb3NlY29uZHMgcGVyIGl0ZXJhdGlvbg==IyBDYXNlIHdpdGggbm8gbWF0Y2hpbmcgZGF0YSA4WCBzcGVlZCB1cA==cHV0cyAiI0MgaW1wbGVtZW50YXRpb24gW3RpbWUge2xzZWFyY2ggLWdsb2IgLWFsbCAtaW5saW5lICRMSVNUIG5vbmUqfSAxMDBdIg==Iz0+IEMgaW1wbGVtZW50YXRpb24gNjQ2IG1pY3Jvc2Vjb25kcyBwZXIgaXRlcmF0aW9ucHV0cyAiI3RjbCBpbXBsZW1lbnRhdGlvbiBbdGltZSB7bHNlYXJjaF9kYXRhR0xPQiAkTElTVCBub25lKn0gMTAwXSI=Iz0+IHRjbCBpbXBsZW1lbnRhdGlvbiA1MzU0IG1pY3Jvc2Vjb25kcyBwZXIgaXRlcmF0aW9uIyBSZXBlYXQgd2l0aCBSRSwgbm90ZSBtb3JlIHRpbWUgc3BlbnQgaW4gUkUgZW5naW5lIDJYIHNwZWVkdXA=cHV0cyAiI0MgaW1wbGVtZW50YXRpb24gW3RpbWUge2xzZWFyY2ggLXJlZ2V4cCAtYWxsIC1pbmxpbmUgJExJU1QgU3R1ZmZ9IDEwMF0iIz0+IEMgaW1wbGVtZW50YXRpb24gMzUyNjAgbWljcm9zZWNvbmRzIHBlciBpdGVyYXRpb24=cHV0cyAiI3RjbCBpbXBsZW1lbnRhdGlvbiBbdGltZSB7bHNlYXJjaF9kYXRhUkUgJExJU1QgU3R1ZmZ9IDEwMF0iIz0+IHRjbCBpbXBsZW1lbnRhdGlvbiA2MjI5MiBtaWNyb3NlY29uZHMgcGVyIGl0ZXJhdGlvbg==IyBDYXNlIHdpdGggbm8gbWF0Y2hpbmcgZGF0YSAyWCBzcGVlZHVwcHV0cyAiI0MgaW1wbGVtZW50YXRpb24gW3RpbWUge2xzZWFyY2ggLXJlZ2V4cCAtYWxsIC1pbmxpbmUgJExJU1Qgbm9uZSp9IDEwMF0iIz0+IEMgaW1wbGVtZW50YXRpb24gMTQ4MTUgbWljcm9zZWNvbmRzIHBlciBpdGVyYXRpb24=cHV0cyAiI3RjbCBpbXBsZW1lbnRhdGlvbiBbdGltZSB7bHNlYXJjaF9kYXRhUkUgJExJU1Qgbm9uZX0gMTAwXSI=Iz0+IHRjbCBpbXBsZW1lbnRhdGlvbiAzMDU1MyBtaWNyb3NlY29uZHMgcGVyIGl0ZXJhdGlvbg==