From owner-freebsd-hackers@freebsd.org Sun Apr 16 14:50:30 2017 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id F0603D40EEA for ; Sun, 16 Apr 2017 14:50:30 +0000 (UTC) (envelope-from kevans91@ksu.edu) Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0063.outbound.protection.outlook.com [104.47.32.63]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client CN "mail.protection.outlook.com", Issuer "Microsoft IT SSL SHA2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 7E05C1C56 for ; Sun, 16 Apr 2017 14:50:29 +0000 (UTC) (envelope-from kevans91@ksu.edu) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ksu.edu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Q7b7A9rtdfhhe0EdgGD173yIs2OrUdofS8XBYKr63OA=; b=XZPm8CmqZ3ivObFDypVVdHD+Zp67/LUzwxQAs9En6l0APbsx508l2UjJjg0YFMYU1OSxE1uknlryZ5fgdy2jjfWpCsBMGjXjiHR4E0mNWD3t+V3n4Vm+NxQhVnCNln+ywGP6qb7cOgmF3p7FaqvRNbCtPk+AA7Loz12N9QawLN0= Received: from BY2PR05CA022.namprd05.prod.outlook.com (10.141.250.12) by CO2PR0501MB1048.namprd05.prod.outlook.com (10.160.7.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1047.6; Sun, 16 Apr 2017 14:50:27 +0000 Received: from CY1NAM02FT063.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::204) by BY2PR05CA022.outlook.office365.com (2a01:111:e400:2c5f::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1047.6 via Frontend Transport; Sun, 16 Apr 2017 14:50:27 +0000 Authentication-Results: spf=pass (sender IP is 129.130.18.151) smtp.mailfrom=ksu.edu; freebsd.org; dkim=none (message not signed) header.d=none;freebsd.org; dmarc=bestguesspass action=none header.from=ksu.edu; Received-SPF: Pass (protection.outlook.com: domain of ksu.edu designates 129.130.18.151 as permitted sender) receiver=protection.outlook.com; client-ip=129.130.18.151; helo=ome-vm-smtp1.campus.ksu.edu; Received: from ome-vm-smtp1.campus.ksu.edu (129.130.18.151) by CY1NAM02FT063.mail.protection.outlook.com (10.152.75.161) with Microsoft SMTP Server id 15.1.1019.14 via Frontend Transport; Sun, 16 Apr 2017 14:50:26 +0000 Received: from calypso.engg.ksu.edu (calypso.engg.ksu.edu [129.130.43.181]) by ome-vm-smtp1.campus.ksu.edu (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id v3GEoQxO023004 for ; Sun, 16 Apr 2017 09:50:26 -0500 Received: by calypso.engg.ksu.edu (Postfix, from userid 110) id 4018F248308; Sun, 16 Apr 2017 09:50:26 -0500 (CDT) Received: from mail-wr0-f174.google.com (mail-wr0-f174.google.com [209.85.128.174]) by calypso.engg.ksu.edu (Postfix) with ESMTPA id 0EFB9248306 for ; Sun, 16 Apr 2017 09:50:24 -0500 (CDT) Received: by mail-wr0-f174.google.com with SMTP id l28so72059979wre.0 for ; Sun, 16 Apr 2017 07:50:23 -0700 (PDT) X-Gm-Message-State: AN3rC/6ebb+1W0xOmI2R7w8+coRn5GnjmPUzjrRUZxZFB9c9rssBqW7W r6KSYn7Do4FFkPFaTmR1rCUT04DfVw== X-Received: by 10.223.151.80 with SMTP id r74mr14845930wrb.6.1492354222015; Sun, 16 Apr 2017 07:50:22 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.39.134 with HTTP; Sun, 16 Apr 2017 07:50:01 -0700 (PDT) In-Reply-To: <20170416134756.GA88424@stack.nl> References: <20170416134756.GA88424@stack.nl> From: Kyle Evans Date: Sun, 16 Apr 2017 09:50:01 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: Replacing libgnuregex To: Jilles Tjoelker CC: X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:129.130.18.151; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(39400400002)(39410400002)(39450400003)(39840400002)(39860400002)(39850400002)(2980300002)(438002)(377454003)(24454002)(189002)(199003)(42186005)(59536001)(221733001)(8676002)(9896002)(8936002)(3480700004)(8576002)(512874002)(55446002)(88552002)(106466001)(61266001)(189998001)(90966002)(84326002)(356003)(53546009)(229853002)(46386002)(38730400002)(6246003)(4326008)(50986999)(6862004)(45336002)(2906002)(98316002)(110136004)(9686003)(93516999)(76176999)(5660300001)(2950100002)(63696999)(75432002)(54356999)(498394004)(236005)(61726006)(305945005)(7116003)(86362001)(55456009)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:CO2PR0501MB1048; H:ome-vm-smtp1.campus.ksu.edu; FPR:; SPF:Pass; MLV:ovrnspm; MX:1; A:1; PTR:ip-18-151.net.ksu.edu; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; CY1NAM02FT063; 1:G2+3VoO16svqBXoFH2i86gp5z15l4Oo6A3jxUDqWnq9iATvOELihwAAJwGUsSuWE5XT1y+dkqUdt1szTKfwUVW9tkkq+BtB7knYdba8io9hdGELml5w6PG4Gq4v6tGfcHp+TWzIimQTQuhfZbA3Rhk+iyk/vlkmJUfrFziz4+4eW+hytOTmZxl5P9pUcXazM2iJtZjrXL2MG9K6GRHNXrNuYZiQYIGfkQHeiLI4OWT6O11e08pQ6gLM08NCvmsdMym8wOfe73W9IbzITDK6tDrwRN/13dBXyw4I4FkaldOZYVE0jzW5tVCMoMT4hZq8qZ8e1m4CNxdYpIFYW+1n6cQLbRPkAYO+JUMykSyMncOoTG4jFs+dzgt/Zd0f2YnxhEvMgYxSU8g1HRij1CFSUtVKcG+DiYyejlA05atGyAlikksCvWZR3AvhK3+BzQCtA3KDfUl1+Uvyvk+KqJQHactQKYl6MYE50rYRgaxZmwPSTIIGEsf2x90dA7V5YWzTrrznfhe1cnsSpwLkD8NzIived/97aWPSICgBNfeALfkussPXMcCKW0oql4g3iaoqth7Nd439kYmX1J4ZBNrP5VA== X-MS-Office365-Filtering-Correlation-Id: 216d00ed-e94d-435f-a5f8-08d484d7ebae X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(8251501002)(2017030254075)(201703131423075)(201703031133081)(201702281549075); SRVR:CO2PR0501MB1048; X-Microsoft-Exchange-Diagnostics: 1; CO2PR0501MB1048; 3:gLRACOIWIyJPzillMKI0wEi6GzckszQV9h5xWTzrXeA2hPRjyTuXhjJry5X/20QVGMYGUm/rG9DhNEo6lNXTflOUV7ZPKAlpLzWi/YIrjvON0TTJIZZWiDd/UZuHdTu0/2usaYCx9Kf1+1cfjJ+almMuUVKRa5tM+E3nFf3QNsaEmh0OTIBov9icfIQLTNXp3+2FscOH2HtLluLrpCKesJtPNzB3D9p4+/UMzLqNO7MiaXZUbqI0S7a1HLaYkRriv0uCnHMtNmIARTNOx5bWTkSm8xkkQItaV+YF8E6Au/Fd/Lrfka57bq5qvGc2lZlzFZ994xT32FDqx6Sp7G4TRZXQMxmMM+jFHFm9f/oEF6pKVgKCaUwlwELW7vyVO5wsXztTB03x8Fn+WY0h6gOHcr3W/M5uRTsFZMVeKgXb0xbMm85so1jUsfz5ARj0aMn6q4D9tG22qnQH972q47j5ePBVlgTdBwTLoCsJqX5gnPYXj9SEs5Hzn4fr2kRXIj8GMQ9fYJhMmXTEEKnKjVk+Kg== X-Microsoft-Exchange-Diagnostics: 1; CO2PR0501MB1048; 25:Of60qjnrnpXoqJh8N0ceEB49IJU7pNxh2Kxq13z4oO97LgWBDmerjyi8Z9f2t+0ZMX72T63QARDTjWyxSAYJ9dFt3wRsSpn1Ml93nPdAkJvI/hNY+7U53Af/T5EU7sq2851UlsxEy5stE+vUrv9rmEqA6Qhqr7QNZ9VWY4lbrOUkAc0Bp163WCOSfKHUNlLKWGpmvJU83Iox4p9+YW9ICW5AKYh/33hEHJ+hfeE6vU+B/zCQmbCmFn1uFgyLPVwJcUR3egV3BxO0rXtsVztOldgsWokTYzfOrotP6ewOKooGUW3DHPscPqAIoWTXuj2T+/E4/P8Wwjw5hQq8OIBifdldMolrVA7yCYEhUCjKlTiDRbu7V3PrZl3j+Y7vA2ftnraaF6gE1xDKs8QWVBIzMsJblyMKLLXU7xXu1CrxGz918wpV2Xsac71gMUigkOtzaHF2JNaxR5JX89tDF5a2VFo8hcdbi3lirE/bBSjo6k0=; 31:95N/CIeXwFFp8gtS6cN4kiWVXoO6PuXUamZc8hb+8CEPvmZ1MAkb4TnJqLrV/B5gwjmV/REIyTcuVkd1otMFns4ZVgBGqlIPT5fKjhiiRXSlRJsDAbys9LptKtMX/36axz/QbaqObZddJNmBcD3Oy71oPB+O5BbnMTaEEjquPn2VMa4xzla5bA5EzaBjXv1CfXGAOR9NKEjUeT0aHk+XhmChBMniwE/Dslo+r/0fYmq/5u/H3a+XPScJgr8ZMzijRJ0moKxdK1bQWuP2cEFJ2A== X-Microsoft-Exchange-Diagnostics: 1; CO2PR0501MB1048; 20:X2Y7mE2wFOvEN9U0sbZYKx4LaP+pWg5noQq1VI2cvUmBZ34ij9qhYxjlYRxnQVo9PGf0SIgunD7FEOrVkB8mXc8jBPdx37MUxIkL1QlNbF9cw65q9tpYYaygJEqZbNlKCAazf0ZZ57bxkBMCagh7pvDbV/tiRbjFA0A7BXLK1VFlVKECc8qRk1irI9xeoTgfkPYDHRCrThAz2ijLFerk0lGalO5kh5RIN3xW0mqa7YvNfVbD46z7zCxAnAnauO0MV836Mtf11tiQKz1ku0CXOk3Zat0jRwMCYru/wE3lS8mPNNwGVNEeS0KkA89xci3yuXPuFhTHN8TPxlzZIxVMLSAxFLPugkyjmgFfknxIQGPWu1lO0DE5IUtkHBvYVAiGG3jw7PGrMKgI6PjWFE3jBkmOqt3UaaBHmnUHzlyDoObGPrYIHrknFWvU35SPDstPHdt4kZt96b2S0TsuB02B3pYtDxgyT0/2bU2zEHRXhd5tTwiAnjY6nMjKtNNWAf2x X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(13024025)(13023025)(13018025)(13015025)(13017025)(5005006)(8121501046)(10201501046)(93006095)(93004095)(3002001)(6041248)(20161123555025)(20161123564025)(20161123562025)(20161123560025)(201703131423075)(201702281529075)(201702281528075)(201703061421075)(6072148); SRVR:CO2PR0501MB1048; BCL:0; PCL:0; RULEID:; SRVR:CO2PR0501MB1048; X-Microsoft-Exchange-Diagnostics: 1; CO2PR0501MB1048; 4:tFvPZb85cLDclCG2Cd3nZWKRBqAXDoOiDpHA130EopzZg2ZN6Unrb620Xg9ckQoAGJoxUemTmwadP5MLr2Ve26IIgrxypTGweFefhVL0stfoIuZeJIBunokxQ1yfI1U48NMuHoC1BkYiKGfEKGEIWK2PlYz1V556l9GVuqmwsKJNwJ1YcoFoPNsLdCILUrHEouCI1Vi6XYUq7b2BW+NF21lLnZ4Ydc6KNlMDaVYYMOyNM/1B7I+sbynKMXNjNKg+NMLDAKnn6SEGBp/IfuuJgZ4ypSAH3fujc7lilyG7G9KlcUUu6keJJ2hg8OB0GPymnjR0GfG3tXT3h+SMguFjW0FI7fvLvQNdg69MN10HaeSREdNthkKKdtPRN/bPOoK41XBx985er4O4q5nieKF0LFWWfcWdUsBIoubcGo9vPb6cDlpMXiWboNFQ/OZ+ZBqW1Hy2crSLZd7dPJCnMLhL1zgy/fZXrd8WY2C7MbRDjtOsQbyGV6Tv2fHSEGnzfs7AFwB62FtWiVRESkJSRJhVEf9ULwavJG29PII5UGUv0qaRrSQ5BMXoI1faNPVH70DMOtY5zUk+AWbhXkQvEY6VxvSGHNTr+4ZqhuhQm5K43G2pjzxlbM22rpuj7wEvjoWBty+d9Jkc00J4IPH2OEM0Qe6rJUW4m+MLd8s3GFeYWnuZdX0Snncp1NiXGW7GA8SsQuLoDYVsdW/V0TP9+IZ/SGQWkO9AVqiGaDYV08S2uZkTo5WtmWPBV0QvMN54keefVTSx5ngZ+wiwKf8fdI4RhgCiw5FcEDVv4EhEkDo6ohaoYXIduFpi/WMpqpFlmM8Y3oivt7AciYczf2lnThHTgQ== X-Forefront-PRVS: 0279B3DD0D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CO2PR0501MB1048; 23:4HdVBhD/GxacBfZSfdwSctoLAYqwoeUt67ZwhwG?= =?us-ascii?Q?Yp8vsD+n4avSp6FyMrZVKvdu8u65wiqoNWnrSaT/oHsTFISCiXV+xtsbHmfA?= =?us-ascii?Q?DkUD7ONOaUFl/mCqsOkNp/tYZVKz07l3Sc9ZoEdtCzMMcNbDLMZuROPlm2KZ?= =?us-ascii?Q?LRPeDkrcQCMBsmdAQyDZHTCaQheCvZMFubsziLvYkBi6HN+3TUhdlv0GTzae?= =?us-ascii?Q?z91ik8F58m3W+LzBnRNVrN6pntdhWCYNqu31rgVelud4FWpJllSDC/lkLLxN?= =?us-ascii?Q?XBHbaL/7CTLKlCTE8RkJRWh+1/r9Z4C5AXaKR6TOdDat/ps5PH8elJ2FN737?= =?us-ascii?Q?Sk+L4wppCTVPfwQI0KVMmRKLOQpwfTDzM1oE+c6g6iCktVhvri6lypvlENT2?= =?us-ascii?Q?syEs8JBJRnqlYzsIXvrUipuwnd8VZoMxomGWiHTymbwBwkoO/KKcK8AZnVHo?= =?us-ascii?Q?UJsDEq96dopS+nQB6nCLfI/Eg9hP/ucIvKWU9qgChX1+3l0I3y4GlhPCfR7n?= =?us-ascii?Q?C+iIa891brutgTLIVoYUuxoKIi1I8QZkBae8FZMhQaqrn8M2BZHphOSjaVCj?= =?us-ascii?Q?NsdQJe13noWn2gb3DivGOgbgxErA00/ZKvqafk42FfPvPYOeC82wY+APW6zd?= =?us-ascii?Q?gE7JkrkZNhZMxSJc3Q9DhGX38OmZhIGH+QnbTJ58wayqJ74SzSgWHNJWrE62?= =?us-ascii?Q?liR6nULua59XGOJFmgn+cKe+YGHLuPH1lpDJIUUdW4L95TYGpaSm7XVzUM6H?= =?us-ascii?Q?QX7Q2n66TMUy4Ecweey82iPcDVxuS3AdS01N1I5cm3qWCpgEVQD9MUs6T5pL?= =?us-ascii?Q?+zoKlC0qeqGPmGCeg5Iyhvt3l2QSBCqIInMbhZt8dypctGJ7237toH0GmZr6?= =?us-ascii?Q?urWVFxKURcrhdX+lIRtmtRpGo4k+hEJVfDCXZR4z72/4DLC3M7eurVPlRV2+?= =?us-ascii?Q?8+DulLVLU9vWk/HAcSWJvJebmfwZ0MBygWhKd9D1+RqRDaxbUALBgtHXF7Sp?= =?us-ascii?Q?lsLJ/K+jlPdFp1OJ4MxC6Y+wgeH8DE8ApzbaCc88efGiauQd0HiaqMJjzUlY?= =?us-ascii?Q?YoU+A9gIXRvDOoRYBElWI0jExT3xqEIgxQuHjvfz1bS0hnU7g1B1aubCCw0n?= =?us-ascii?Q?skmRjwQSslqRReDUTHfAisuGXF6A1H0Nq4UYkJITWY9/CGTJDmYjJO1liBQb?= =?us-ascii?Q?jIpXF5sZW/k80YESFjAWVFfzNZnS1MWKvIipubsQh0sMAnbHekPYFrGwARKS?= =?us-ascii?Q?+7UBjcQbMkXbxO3PzhBKw+3op9HEJwfir+uXbYhAFzEscT7SPPNZHoZMy2p3?= =?us-ascii?Q?coSpYIyb6BoisrM3ybrqzb6VL6S8UaWoOuljEwW2IOOf8BSYuRo+7bB+Garg?= =?us-ascii?Q?KAFXYh8/q5VyWDqb2DRXUrBGSuCy1vJVzU0TmicWHKU3ftTOC5gSNiiEiaTj?= =?us-ascii?Q?mWWvbe3lI1RZ7oNVYtUWnpAD7s4TSmfM=3D?= X-Microsoft-Exchange-Diagnostics: 1; CO2PR0501MB1048; 6:YLWww4enNBcP7QDQWJcC6102Aiz49JZzLdb3to1Sr8vnVJ1F5ez5zsv88IChdpAPpPlevNhy09791Eeshw1xxqU6cJYvwJvtC+jmhsW7bs3475sUMJs+G6WhESF6Op343wg9fUsvCGxToice02ZXMzUalbDLNRaZLUNtAmhx0hSShncM7gA3Rmm4dl+O9mUP0wN7ecu4nLghejgHepDOqfPyM7qkuLpozkTBptceinADxmmvRKI1FvKnVcj293DFyrvxtxlQg5l4AW6FF6F4nyn6ITktSVaPd8bLBGtilTChw+RvsI44fw4jQvOamQ380u0STkjW7Ul2fbrAdp22uPosPKF4bsQtE2W9rTgcsCc352UdOLZ7yRN9yO0W2CjjEcXvRCysqsJ1wGA7VPhOH06rkj3NUdqmMch37D3udPN+B5unxOILsG7RmWiQY/FYrKW3YO+AL3yLbB+29M+SxA==; 5:06OhdUeMWxoJVyOakpfOQWmnHfk8T2XwB9GEHcqmRE4Mfj1Q8qjqeFNwe4UNEN6u+bICUdL46IEcN1WRlDLhcotf694JAg3RN82HqtGupN3i1axV6q+YewURsiYkdlnTXL1aREwCfmuJ4/gz3d/zVA==; 24:d9h4+mExs2VAGUYEzOiYGD8W4AMemZJjh4hPrjjOU1L1m+E3ZFDJTNNgetlJrpkvbNgo9E/JPtZlCbJ88l+hv4i1emFi0LXogjC69etoI2w= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CO2PR0501MB1048; 7:e0Bl36j/sRWqVfl+FaZtoVDRyADE09JJSW9rZUx5LYTZAs1HCgMs7+a3zFrGfaUpqHUIiyJhZ0FyTTlMC06R2dW8hSndzMrQWIZjvPCshd3gIlWRitNEbdb32tXssgw8F39ln71mYWZF3g52XRW8DgeR1i2FvMFvpL+PK04XQDy83fH3t+CENXl6/ro4Wb+bq74c5//tByI1gI13ELRlwp1qnYnvRnKP9MfMDcSj7Qr3jv1mF21hyP0YZBjE3Kny2Ry7RIwyb1Y93cFAAmpovN+FslRmojFaAA2h7H/kHAaybu/nyeykbsjhD6PSNaNyZ6Ed8pRaLT8+QlTOkGLn5g==; 20:uzhse8HO5HBm2VqH76qDtXkNVGmhYXxFfGd4KmYbe7Vzf1btd51jvgYAdLt3mOPecWBPZnUSm1hRDCRw/4TV+nOy5fZje+ZLCA8ijTNb8Ngyj/P5bnDnQV22G+zYQZBkq20g1P0BRbX6kszlDXeqmqX+V1Or/OO2qXPTsqqx7CM= X-OriginatorOrg: ksu.edu X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2017 14:50:26.8790 (UTC) X-MS-Exchange-CrossTenant-Id: d9a2fa71-d67d-4cb6-b541-06ccaa8013fb X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d9a2fa71-d67d-4cb6-b541-06ccaa8013fb; Ip=[129.130.18.151]; Helo=[ome-vm-smtp1.campus.ksu.edu] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR0501MB1048 Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Apr 2017 14:50:31 -0000 On Sun, Apr 16, 2017 at 8:47 AM, Jilles Tjoelker wrote: > On Tue, Apr 11, 2017 at 03:20:58PM -0500, Kyle Evans wrote: > > On the other hand, I think I could fairly easily implement most of these > > into libc/regex. Here's a summary of what this option entails adding to > > libc/regex, from what I've found: > > > [snip] > > * Add backreferences (\1 through \9) to EREs > > [snip] > > Adding this enforces that EREs, like BREs, may sometimes require > exponential time to match. I would prefer to avoid that. > > -- > Jilles Tjoelker > I played with it a little bit more, and it looks like I could lib'ify what I have and have libc include a POSIX-strict version of the lib source fairly easily to keep the default implementation clean as it is now. Would this be acceptable? OTOH, one doesn't need to actually use backreferences in EREs and the matcher works the same as it does now. I kind of like the look of the 'lib' implementation now that I've seen it, though.