From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 30587 invoked from network); 20 Feb 2023 16:07:13 -0000 Received: from tb-ob1.topicbox.com (64.147.108.173) by inbox.vuxu.org with ESMTPUTF8; 20 Feb 2023 16:07:13 -0000 Received: from tb-mx1.topicbox.com (tb-mx1.nyi.icgroup.com [10.90.30.61]) by tb-ob1.topicbox.com (Postfix) with ESMTP id DDC8E29130 for ; Mon, 20 Feb 2023 11:07:11 -0500 (EST) (envelope-from bounce.mM502a002b31fde997a5913efb.r522be890-2105-11eb-b15e-8d699134e1fa@9fans.bounce.topicbox.com) Received: by tb-mx1.topicbox.com (Postfix, from userid 1132) id D72E4CE6730; Mon, 20 Feb 2023 11:07:11 -0500 (EST) ARC-Authentication-Results: i=2; topicbox.com; arc=pass; dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; spf=pass smtp.mailfrom=adr@sdf.org smtp.helo=mx.sdf.org; x-internal-arc=fail (as.1.topicbox.com=pass, ams.1.topicbox.com=fail (message has been altered)) (Message modified while forwarding at Topicbox) ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d= topicbox.com; h=date:from:to:message-id:mime-version :content-type:list-help:list-id:list-post:list-subscribe :reply-to:subject:content-transfer-encoding:list-unsubscribe; s= sysmsg-1; t=1676909231; bh=M9FGpfFuCGUu4m0OOWbdrllRsS/GCRe12mkD0 wT/yAI=; b=IHMMreBetSui1twOAduUnvQj+iHwrl6YH73cVPtcKQ1CwTTGC3so/ MtFSrxnWG+dufvpKjNiaNv8Me7/DmrDIclFO6chBDJRemAxY+YKwZpvOtm60PkZ/ g7KNmIIZ/FatBt6jb2g7bdO95bud6nn91fI9M5U53YR+1ELsURvVJo= ARC-Seal: i=2; a=rsa-sha256; cv=pass; d=topicbox.com; s=sysmsg-1; t= 1676909231; b=YIjQ8Ou9n8Um1/tByOPVEg2cD5pmpuCfKhAFjXjmXOBDzctsYD omCpXdQxh8RwMb/TN5AnwcWfShr72de1iyj37lR2U4Z+oY6Y+LfzY3bFt0F6O4vK 7+m4ilrx16cVy485Cj63Q0ziYtZXcvFvDXfFdFl+NLbLaYuZQFpo4vi1c= Authentication-Results: topicbox.com; arc=pass; dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; spf=pass smtp.mailfrom=adr@sdf.org smtp.helo=mx.sdf.org; x-internal-arc=fail (as.1.topicbox.com=pass, ams.1.topicbox.com=fail (message has been altered)) (Message modified while forwarding at Topicbox) X-Received-Authentication-Results: tb-mx0.topicbox.com; arc=none (no signatures found); bimi=skipped (DMARC Policy is not at enforcement); dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; iprev=pass smtp.remote-ip=205.166.94.24 (mx.sdf.org); spf=pass smtp.mailfrom=adr@sdf.org smtp.helo=mx.sdf.org; x-aligned-from=pass (Address match); x-me-sender=none; x-ptr=pass smtp.helo=mx.sdf.org policy.ptr=mx.sdf.org; x-return-mx=pass header.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-return-mx=pass smtp.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-tls=pass smtp.version=TLSv1.2 smtp.cipher=ECDHE-RSA-AES256-GCM-SHA384 smtp.bits=256/256; x-vs=clean score=0 state=0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; d=9fans.net; h=date:from :to:message-id:mime-version:content-type:list-help:list-id :list-post:list-subscribe:reply-to:subject :content-transfer-encoding:list-unsubscribe; s=dkim-1; t= 1676909231; x=1676995631; bh=+a+VskrHJw7K1OMSK04napOWpuPc329yTBb oVd4Fc9c=; b=YwocUlJYsKEz+aWwTXX/Er7/xmf2GSBkPJJWD/NUHUX+ej7gXEJ Lk7ipmmO+FSEtoOUrZSjfkit0sJ/x9oFJSpSgR0YEEGflKId/GmQrJGQom3Ykkzp 523lw2HUlgDvK6jZsUWyvdyok11KTQyhdL869T9mIRqmH2kOh0+piu+s= Received: from tb-mx0.topicbox.com (localhost.local [127.0.0.1]) by tb-mx0.topicbox.com (Postfix) with ESMTP id 2E428F54587 for <9fans@9fans.net>; Mon, 20 Feb 2023 11:06:54 -0500 (EST) (envelope-from adr@sdf.org) Received: from tb-mx0.topicbox.com (localhost [127.0.0.1]) by tb-mx0.topicbox.com (Authentication Milter) with ESMTP id 0CDEC5727AD; Mon, 20 Feb 2023 11:06:54 -0500 ARC-Seal: i=1; a=rsa-sha256; cv=none; d=topicbox.com; s=arcseal; t= 1676909214; b=pmV4VKVEbc5XarKtWH9058gZCT58mdVaQSHm+Uccgo/LcDiPEy o1eVDDydAv1ReYdDC5k5I75kAhPE7/41IBMpu3nntmsv0VOHOd89GKP6gCETxTsy Hiqfd/vkQB23mkvukxNC7mmWTwBZXtqnrHqnv49VeREddZosy4V7wnRCiX4P7aBT ThIPNDuXzb1mUAs88AVyw9YVWBb6e2YJCiO/0pgGk1we4oL0paNbTQJK7RvrapxO tZAhKv5I17Aj52uOr/XLQACmTQYkql/CC6v6bhX1sumx+FsK7QmcasaiTAtqAq1G qA4qgLGrfkZev0xK6INzU8JvtnfPoYQjlR9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= topicbox.com; h=date:from:to:subject:message-id:mime-version :content-type; s=arcseal; t=1676909214; bh=QAUfTY3Zn1+QjUOzjF62r 61M9Tfr6BySTltXkaaSxds=; b=sX87BiUUo4fNs8WtTaFwZEC0fg1YoWW2LM9Tm DNlQQNeu/2Vg0pWYYrId6ud1zppgKONimwyIP2JAcgYoZNA01Ulc4ur0mWIXTXUm Igj5ymayvHY0eYtJjeloDc5cl91zVOJ4l4X8GnGcBVCh7cmOxQy2l94JFp0Y7cxn 2zpFtOgoDjvalhQlCt0Gv0fgl/ruHTHyoLgGvuweLgCncgeebBh53YYdXD036oo4 RxzBRkaXCUITBQeG/Nfi/Hezk+k+jXCJ5HX5E4oRDmOPD5oRFgZrHhD/X67tj6AN uuFhEATpuqL/1g3wCnoVjU6q0AZQ5Ee5LlrEroe98hT+yOmzg== ARC-Authentication-Results: i=1; tb-mx0.topicbox.com; arc=none (no signatures found); bimi=skipped (DMARC Policy is not at enforcement); dkim=none (no signatures found); dmarc=pass policy.published-domain-policy=none policy.published-subdomain-policy=none policy.applied-disposition=none policy.evaluated-disposition=none (p=none,sp=none,d=none,d.eval=none) policy.policy-from=p header.from=sdf.org; iprev=pass smtp.remote-ip=205.166.94.24 (mx.sdf.org); spf=pass smtp.mailfrom=adr@sdf.org smtp.helo=mx.sdf.org; x-aligned-from=pass (Address match); x-me-sender=none; x-ptr=pass smtp.helo=mx.sdf.org policy.ptr=mx.sdf.org; x-return-mx=pass header.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-return-mx=pass smtp.domain=sdf.org policy.is_org=yes (MX Records found: mx.sdf.org); x-tls=pass smtp.version=TLSv1.2 smtp.cipher=ECDHE-RSA-AES256-GCM-SHA384 smtp.bits=256/256; x-vs=clean score=0 state=0 X-ME-VSCause: gggruggvucftvghtrhhoucdtuddrgedvhedrudejhedgjeekucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggvpdfu rfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucenucfjughrpeffhffvuf fkgggtsehmtderhidttddvnecuhfhrohhmpegrughruceorggurhesshgufhdrohhrgheq necuggftrfgrthhtvghrnhepheffudejiefgjeffteejleeuvdeiiedtheefheeggfektd fhleelfeefhedvveehnecukfhppedvtdehrdduieeirdelgedrvdegpddvtdehrdduieei rdelgedrudeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvd dthedrudeiiedrleegrddvgedphhgvlhhopehmgidrshgufhdrohhrghdpmhgrihhlfhhr ohhmpeeorggurhesshgufhdrohhrgheq X-ME-VSScore: 0 X-ME-VSCategory: clean Received-SPF: pass (sdf.org: 205.166.94.24 is authorized to use 'adr@sdf.org' in 'mfrom' identity (mechanism 'ip4:205.166.94.0/24' matched)) receiver=tb-mx0.topicbox.com; identity=mailfrom; envelope-from="adr@sdf.org"; helo=mx.sdf.org; client-ip=205.166.94.24 Received: from mx.sdf.org (mx.sdf.org [205.166.94.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by tb-mx0.topicbox.com (Postfix) with ESMTPS for <9fans@9fans.net>; Mon, 20 Feb 2023 11:06:52 -0500 (EST) (envelope-from adr@sdf.org) Received: from sdf.org (IDENT:adr@sdf.org [205.166.94.16]) by mx.sdf.org (8.16.1/8.14.5) with ESMTPS id 31KG6p6Y018470 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits) verified NO) for <9fans@9fans.net>; Mon, 20 Feb 2023 16:06:52 GMT Received: from localhost (adr@localhost) by sdf.org (8.16.1/8.12.8/Submit) with ESMTP id 31KG6oJr028483 for <9fans@9fans.net>; Mon, 20 Feb 2023 16:06:50 GMT Date: Mon, 20 Feb 2023 16:06:50 +0000 (UTC) From: adr To: 9fans@9fans.net Message-ID: <5032d5dd-7583-64f5-b3ab-284d2c4c8290@sdf.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1218188679-1676909210=:9879" Topicbox-Policy-Reasoning: allow: sender is a member Topicbox-Message-UUID: 9aff9be6-b138-11ed-b3b9-a5e1c02ae62a Archived-At: =?UTF-8?B?PGh0dHBzOi8vOWZhbnMudG9waWNib3guY29tL2dyb3Vwcy85?= =?UTF-8?B?ZmFucy9UYzFkOWQ5Y2EzYTk0ZTI4NS1NNTAyYTAwMmIzMWZkZTk5N2E1OTEz?= =?UTF-8?B?ZWZiPg==?= List-Help: List-Id: "9fans" <9fans.9fans.net> List-Post: List-Software: Topicbox v0 List-Subscribe: Precedence: list Reply-To: 9fans <9fans@9fans.net> Subject: [9fans] Acme: support spaces in file|dir names Content-Transfer-Encoding: 7bit List-Unsubscribe: , Topicbox-Delivery-ID: 2:9fans:437d30aa-c441-11e9-8a57-d036212d11b0:522be890-2105-11eb-b15e-8d699134e1fa:M502a002b31fde997a5913efb:1:Ivt0WS0c2mrQHsdON0KqB_wywoVR9AFHsY8z2SqvZJQ --0-1218188679-1676909210=:9879 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Content-ID: <16769092220.1E6c0B.851362@tb-mx1> Hi, this patch adds code from p9p to support spaces in file or dir names. I use the 9front version because it has been mantained, but there are more fixes in p9p to be imported. adr diff -Nur /n/9front/sys/src/cmd/acme/fns.h /sys/src/cmd/acme/fns.h --- /n/9front/sys/src/cmd/acme/fns.h Mon Jul 11 20:01:08 2022 +++ /sys/src/cmd/acme/fns.h Mon Feb 20 15:23:42 2023 @@ -90,6 +90,7 @@ void flushwarnings(void); long nlcount(Text*, long, long, long*); long nlcounttopos(Text*, long, long, long); +Rune* parsetag(Window*, int, int*); #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune)) #define runerealloc(a, b) (Rune*)erealloc((a), (b)*sizeof(Run= e)) diff -Nur /n/9front/sys/src/cmd/acme/look.c /sys/src/cmd/acme/look.c --- /n/9front/sys/src/cmd/acme/look.c Mon Jul 11 20:01:08 2022 +++ /sys/src/cmd/acme/look.c Mon Feb 20 15:47:24 2023 @@ -397,9 +397,9 @@ Runestr dirname(Text *t, Rune *r, int n) { - Rune *b, c; - uint m, nt; - int slash; + Rune *b; + uint nt; + int slash, i; Runestr tmp; b =3D nil; @@ -410,15 +410,13 @@ goto Rescue; if(n>=3D1 && r[0]=3D=3D'/') goto Rescue; - b =3D runemalloc(nt+n+1); - bufread(t->w->tag.file, 0, b, nt); + b =3D parsetag(t->w, n, &i); slash =3D -1; - for(m=3D0; m=3D 0; i--){ + if(b[i] =3D=3D '/'){ + slash =3D i; break; + } } if(slash < 0) goto Rescue; @@ -502,7 +500,7 @@ if(nname =3D=3D -1) nname =3D n; for(i=3D0; i, and turn that into an include diff -Nur /n/9front/sys/src/cmd/acme/wind.c /sys/src/cmd/acme/wind.c --- /n/9front/sys/src/cmd/acme/wind.c Mon Jul 11 20:01:08 2022 +++ /sys/src/cmd/acme/wind.c Mon Feb 20 15:20:37 2023 @@ -109,14 +109,26 @@ return rr - r; } +int +delrunepos(Window *w) +{ + Rune *r; + int i; + + r =3D parsetag(w, 0, &i); + free(r); + i +=3D 2; + if(i >=3D w->tag.file->nc) + return -1; + return i; +} + void movetodel(Window *w) { int n; -=20 - n =3D tagrunepos(w, delcmd); - free(delcmd); - delcmd =3D nil; + + n =3D delrunepos(w); if(n < 0) return; moveto(mousectl, addpt(frptofchar(&w->tag, n), Pt(4, w->tag.font->h= eight-4))); @@ -141,7 +153,7 @@ if(!w->tagexpand) { /* use just as many lines as needed to show the Del */ - n =3D tagrunepos(w, delcmd); + n =3D delrunepos(w); if(n < 0) return 1; p =3D subpt(frptofchar(&w->tag, n), w->tag.r.min); @@ -412,11 +424,7 @@ /* w must be committed */ n =3D w->tag.file->nc; - r =3D runemalloc(n); - bufread(w->tag.file, 0, r, n); - for(i=3D0; itag, w->tag.q0, w->tag.q1); } +Rune* +parsetag(Window *w, int extra, int *len) +{ + static Rune Ldelsnarf[] =3D { ' ', 'D', 'e', 'l', ' ', 'S', 'n', 'a= ', 'r', 'f', 0 }; + static Rune Lspacepipe[] =3D { ' ', '|', 0 }; + static Rune Ltabpipe[] =3D { '\t', '|', 0 }; + int i; + Rune *r, *p, *pipe; + + r =3D runemalloc(w->tag.file->nc+extra+1); + bufread(w->tag.file, 0, r, w->tag.file->nc); + r[w->tag.file->nc] =3D '\0'; + + /* + * " |" or "\t|" ends left half of tag + * If we find " Del Snarf" in the left half of the tag + * (before the pipe), that ends the file name. + */ + pipe =3D runestrstr(r, Lspacepipe); + if((p =3D runestrstr(r, Ltabpipe)) !=3D nil && (pipe =3D=3D nil || = p < pipe)) + pipe =3D p; + if((p =3D runestrstr(r, Ldelsnarf)) !=3D nil && (pipe =3D=3D nil ||= p < pipe)) + i =3D p - r; + else { + for(i=3D0; itag.file->nc; i++) + if(r[i]=3D=3D' ' || r[i]=3D=3D'\t') + break; + } + *len =3D i; + return r; +} + void winsettag1(Window *w) { @@ -445,12 +485,7 @@ /* there are races that get us here with stuff in the tag cache, so= we take extra care to sync it */ if(w->tag.ncache!=3D0 || w->tag.file->mod) wincommit(w, &w->tag); /* check file name; also guarantees= we can modify tag contents */ - old =3D runemalloc(w->tag.file->nc+1); - bufread(w->tag.file, 0, old, w->tag.file->nc); - old[w->tag.file->nc] =3D '\0'; - for(i=3D0; itag.file->nc; i++) - if(old[i]=3D=3D' ' || old[i]=3D=3D'\t') - break; + old =3D parsetag(w, 0, &i); if(runeeq(old, i, w->body.file->name, w->body.file->nname) =3D=3D F= ALSE){ textdelete(&w->tag, 0, i, TRUE); textinsert(&w->tag, 0, w->body.file->name, w->body.file->nn= ame, TRUE); @@ -458,7 +493,6 @@ old =3D runemalloc(w->tag.file->nc+1); bufread(w->tag.file, 0, old, w->tag.file->nc); old[w->tag.file->nc] =3D '\0'; - w->tagsafe =3D FALSE; } new =3D runemalloc(w->body.file->nname+100); i =3D 0; @@ -572,11 +606,7 @@ textcommit(f->text[i], FALSE); /* no-op for t */ if(t->what =3D=3D Body) return; - r =3D runemalloc(w->tag.file->nc); - bufread(w->tag.file, 0, r, w->tag.file->nc); - for(i=3D0; itag.file->nc; i++) - if(r[i]=3D=3D' ' || r[i]=3D=3D'\t') - break; + r =3D parsetag(w, 0, &i); if(runeeq(r, i, w->body.file->name, w->body.file->nname) =3D=3D FAL= SE){ seq++; filemark(w->body.file); @@ -611,11 +641,11 @@ r =3D runerealloc(r, n+1); r[n] =3D 0; } + free(a); if((d->qid.type&QTDIR) =3D=3D 0){ free(d); warning(nil, "%s: not a directory\n", a); free(r); - free(a); return; } free(a); ------------------------------------------ 9fans: 9fans Permalink: https://9fans.topicbox.com/groups/9fans/Tc1d9d9ca3a94e285-M502a0= 02b31fde997a5913efb Delivery options: https://9fans.topicbox.com/groups/9fans/subscription --0-1218188679-1676909210=:9879 Content-Type: text/plain; name=acme_spaces_in_files_or_dirs.diff Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=acme_spaces_in_files_or_dirs.diff ZGlmZiAtTnVyIC9uLzlmcm9udC9zeXMvc3JjL2NtZC9hY21lL2Zucy5oIC9z eXMvc3JjL2NtZC9hY21lL2Zucy5oDQotLS0gL24vOWZyb250L3N5cy9zcmMv Y21kL2FjbWUvZm5zLmgJTW9uIEp1bCAxMSAyMDowMTowOCAyMDIyDQorKysg L3N5cy9zcmMvY21kL2FjbWUvZm5zLmgJTW9uIEZlYiAyMCAxNToyMzo0MiAy MDIzDQpAQCAtOTAsNiArOTAsNyBAQA0KIHZvaWQJCWZsdXNod2FybmluZ3Mo dm9pZCk7DQogbG9uZwlubGNvdW50KFRleHQqLCBsb25nLCBsb25nLCBsb25n Kik7DQogbG9uZwlubGNvdW50dG9wb3MoVGV4dCosIGxvbmcsIGxvbmcsIGxv bmcpOw0KK1J1bmUqCXBhcnNldGFnKFdpbmRvdyosIGludCwgaW50Kik7DQog DQogI2RlZmluZQlydW5lbWFsbG9jKGEpCQkoUnVuZSopZW1hbGxvYygoYSkq c2l6ZW9mKFJ1bmUpKQ0KICNkZWZpbmUJcnVuZXJlYWxsb2MoYSwgYikJKFJ1 bmUqKWVyZWFsbG9jKChhKSwgKGIpKnNpemVvZihSdW5lKSkNCmRpZmYgLU51 ciAvbi85ZnJvbnQvc3lzL3NyYy9jbWQvYWNtZS9sb29rLmMgL3N5cy9zcmMv Y21kL2FjbWUvbG9vay5jDQotLS0gL24vOWZyb250L3N5cy9zcmMvY21kL2Fj bWUvbG9vay5jCU1vbiBKdWwgMTEgMjA6MDE6MDggMjAyMg0KKysrIC9zeXMv c3JjL2NtZC9hY21lL2xvb2suYwlNb24gRmViIDIwIDE1OjQ3OjI0IDIwMjMN CkBAIC0zOTcsOSArMzk3LDkgQEANCiBSdW5lc3RyDQogZGlybmFtZShUZXh0 ICp0LCBSdW5lICpyLCBpbnQgbikNCiB7DQotCVJ1bmUgKmIsIGM7DQotCXVp bnQgbSwgbnQ7DQotCWludCBzbGFzaDsNCisJUnVuZSAqYjsNCisJdWludCBu dDsNCisJaW50IHNsYXNoLCBpOw0KIAlSdW5lc3RyIHRtcDsNCiANCiAJYiA9 IG5pbDsNCkBAIC00MTAsMTUgKzQxMCwxMyBAQA0KIAkJZ290byBSZXNjdWU7 DQogCWlmKG4+PTEgJiYgclswXT09Jy8nKQ0KIAkJZ290byBSZXNjdWU7DQot CWIgPSBydW5lbWFsbG9jKG50K24rMSk7DQotCWJ1ZnJlYWQodC0+dy0+dGFn LmZpbGUsIDAsIGIsIG50KTsNCisJYiA9IHBhcnNldGFnKHQtPncsIG4sICZp KTsNCiAJc2xhc2ggPSAtMTsNCi0JZm9yKG09MDsgbTxudDsgbSsrKXsNCi0J CWMgPSBiW21dOw0KLQkJaWYoYyA9PSAnLycpDQotCQkJc2xhc2ggPSBtOw0K LQkJaWYoYz09JyAnIHx8IGM9PSdcdCcpDQorCWZvcihpLS07IGkgPj0gMDsg aS0tKXsNCisJCWlmKGJbaV0gPT0gJy8nKXsNCisJCQlzbGFzaCA9IGk7DQog CQkJYnJlYWs7DQorCQl9DQogCX0NCiAJaWYoc2xhc2ggPCAwKQ0KIAkJZ290 byBSZXNjdWU7DQpAQCAtNTAyLDcgKzUwMCw3IEBADQogCWlmKG5uYW1lID09 IC0xKQ0KIAkJbm5hbWUgPSBuOw0KIAlmb3IoaT0wOyBpPG5uYW1lOyBpKysp DQotCQlpZighaXNmaWxlYyhyW2ldKSkNCisJCWlmKCFpc2ZpbGVjKHJbaV0p ICYmIHJbaV0gIT0gJyAnKQ0KIAkJCWdvdG8gSXNudGZpbGU7DQogCS8qDQog CSAqIFNlZSBpZiBpdCdzIGEgZmlsZSBuYW1lIGluIDw+LCBhbmQgdHVybiB0 aGF0IGludG8gYW4gaW5jbHVkZQ0KZGlmZiAtTnVyIC9uLzlmcm9udC9zeXMv c3JjL2NtZC9hY21lL3dpbmQuYyAvc3lzL3NyYy9jbWQvYWNtZS93aW5kLmMN Ci0tLSAvbi85ZnJvbnQvc3lzL3NyYy9jbWQvYWNtZS93aW5kLmMJTW9uIEp1 bCAxMSAyMDowMTowOCAyMDIyDQorKysgL3N5cy9zcmMvY21kL2FjbWUvd2lu ZC5jCU1vbiBGZWIgMjAgMTU6MjA6MzcgMjAyMw0KQEAgLTEwOSwxNCArMTA5 LDI2IEBADQogCXJldHVybiByciAtIHI7DQogfQ0KIA0KK2ludA0KK2RlbHJ1 bmVwb3MoV2luZG93ICp3KQ0KK3sNCisJUnVuZSAqcjsNCisJaW50IGk7DQor DQorCXIgPSBwYXJzZXRhZyh3LCAwLCAmaSk7DQorCWZyZWUocik7DQorCWkg Kz0gMjsNCisJaWYoaSA+PSB3LT50YWcuZmlsZS0+bmMpDQorCQlyZXR1cm4g LTE7DQorCXJldHVybiBpOw0KK30NCisNCiB2b2lkDQogbW92ZXRvZGVsKFdp bmRvdyAqdykNCiB7DQogCWludCBuOw0KLQkNCi0JbiA9IHRhZ3J1bmVwb3Mo dywgZGVsY21kKTsNCi0JZnJlZShkZWxjbWQpOw0KLQlkZWxjbWQgPSBuaWw7 DQorDQorCW4gPSBkZWxydW5lcG9zKHcpOw0KIAlpZihuIDwgMCkNCiAJCXJl dHVybjsNCiAJbW92ZXRvKG1vdXNlY3RsLCBhZGRwdChmcnB0b2ZjaGFyKCZ3 LT50YWcsIG4pLCBQdCg0LCB3LT50YWcuZm9udC0+aGVpZ2h0LTQpKSk7DQpA QCAtMTQxLDcgKzE1Myw3IEBADQogCQ0KIAlpZighdy0+dGFnZXhwYW5kKSB7 DQogCQkvKiB1c2UganVzdCBhcyBtYW55IGxpbmVzIGFzIG5lZWRlZCB0byBz aG93IHRoZSBEZWwgKi8NCi0JCW4gPSB0YWdydW5lcG9zKHcsIGRlbGNtZCk7 DQorCQluID0gZGVscnVuZXBvcyh3KTsNCiAJCWlmKG4gPCAwKQ0KIAkJCXJl dHVybiAxOw0KIAkJcCA9IHN1YnB0KGZycHRvZmNoYXIoJnctPnRhZywgbiks IHctPnRhZy5yLm1pbik7DQpAQCAtNDEyLDExICs0MjQsNyBAQA0KIA0KIAkv KiB3IG11c3QgYmUgY29tbWl0dGVkICovDQogCW4gPSB3LT50YWcuZmlsZS0+ bmM7DQotCXIgPSBydW5lbWFsbG9jKG4pOw0KLQlidWZyZWFkKHctPnRhZy5m aWxlLCAwLCByLCBuKTsNCi0JZm9yKGk9MDsgaTxuOyBpKyspDQotCQlpZihy W2ldPT0nICcgfHwgcltpXT09J1x0JykNCi0JCQlicmVhazsNCisJciA9IHBh cnNldGFnKHcsIDAsICZpKTsNCiAJZm9yKDsgaTxuOyBpKyspDQogCQlpZihy W2ldID09ICd8JykNCiAJCQlicmVhazsNCkBAIC00MzMsNiArNDQxLDM4IEBA DQogCXRleHRzZXRzZWxlY3QoJnctPnRhZywgdy0+dGFnLnEwLCB3LT50YWcu cTEpOw0KIH0NCiANCitSdW5lKg0KK3BhcnNldGFnKFdpbmRvdyAqdywgaW50 IGV4dHJhLCBpbnQgKmxlbikNCit7DQorCXN0YXRpYyBSdW5lIExkZWxzbmFy ZltdID0geyAnICcsICdEJywgJ2UnLCAnbCcsICcgJywgJ1MnLCAnbicsICdh JywgJ3InLCAnZicsIDAgfTsNCisJc3RhdGljIFJ1bmUgTHNwYWNlcGlwZVtd ID0geyAnICcsICd8JywgMCB9Ow0KKwlzdGF0aWMgUnVuZSBMdGFicGlwZVtd ID0geyAnXHQnLCAnfCcsIDAgfTsNCisJaW50IGk7DQorCVJ1bmUgKnIsICpw LCAqcGlwZTsNCisNCisJciA9IHJ1bmVtYWxsb2Mody0+dGFnLmZpbGUtPm5j K2V4dHJhKzEpOw0KKwlidWZyZWFkKHctPnRhZy5maWxlLCAwLCByLCB3LT50 YWcuZmlsZS0+bmMpOw0KKwlyW3ctPnRhZy5maWxlLT5uY10gPSAnXDAnOw0K Kw0KKwkvKg0KKwkgKiAiIHwiIG9yICJcdHwiIGVuZHMgbGVmdCBoYWxmIG9m IHRhZw0KKwkgKiBJZiB3ZSBmaW5kICIgRGVsIFNuYXJmIiBpbiB0aGUgbGVm dCBoYWxmIG9mIHRoZSB0YWcNCisJICogKGJlZm9yZSB0aGUgcGlwZSksIHRo YXQgZW5kcyB0aGUgZmlsZSBuYW1lLg0KKwkgKi8NCisJcGlwZSA9IHJ1bmVz dHJzdHIociwgTHNwYWNlcGlwZSk7DQorCWlmKChwID0gcnVuZXN0cnN0cihy LCBMdGFicGlwZSkpICE9IG5pbCAmJiAocGlwZSA9PSBuaWwgfHwgcCA8IHBp cGUpKQ0KKwkJcGlwZSA9IHA7DQorCWlmKChwID0gcnVuZXN0cnN0cihyLCBM ZGVsc25hcmYpKSAhPSBuaWwgJiYgKHBpcGUgPT0gbmlsIHx8IHAgPCBwaXBl KSkNCisJCWkgPSBwIC0gcjsNCisJZWxzZSB7DQorCQlmb3IoaT0wOyBpPHct PnRhZy5maWxlLT5uYzsgaSsrKQ0KKwkJCWlmKHJbaV09PScgJyB8fCByW2ld PT0nXHQnKQ0KKwkJCQlicmVhazsNCisJfQ0KKwkqbGVuID0gaTsNCisJcmV0 dXJuIHI7DQorfQ0KKw0KIHZvaWQNCiB3aW5zZXR0YWcxKFdpbmRvdyAqdykN CiB7DQpAQCAtNDQ1LDEyICs0ODUsNyBAQA0KIAkvKiB0aGVyZSBhcmUgcmFj ZXMgdGhhdCBnZXQgdXMgaGVyZSB3aXRoIHN0dWZmIGluIHRoZSB0YWcgY2Fj aGUsIHNvIHdlIHRha2UgZXh0cmEgY2FyZSB0byBzeW5jIGl0ICovDQogCWlm KHctPnRhZy5uY2FjaGUhPTAgfHwgdy0+dGFnLmZpbGUtPm1vZCkNCiAJCXdp bmNvbW1pdCh3LCAmdy0+dGFnKTsJLyogY2hlY2sgZmlsZSBuYW1lOyBhbHNv IGd1YXJhbnRlZXMgd2UgY2FuIG1vZGlmeSB0YWcgY29udGVudHMgKi8NCi0J b2xkID0gcnVuZW1hbGxvYyh3LT50YWcuZmlsZS0+bmMrMSk7DQotCWJ1ZnJl YWQody0+dGFnLmZpbGUsIDAsIG9sZCwgdy0+dGFnLmZpbGUtPm5jKTsNCi0J b2xkW3ctPnRhZy5maWxlLT5uY10gPSAnXDAnOw0KLQlmb3IoaT0wOyBpPHct PnRhZy5maWxlLT5uYzsgaSsrKQ0KLQkJaWYob2xkW2ldPT0nICcgfHwgb2xk W2ldPT0nXHQnKQ0KLQkJCWJyZWFrOw0KKwlvbGQgPSBwYXJzZXRhZyh3LCAw LCAmaSk7DQogCWlmKHJ1bmVlcShvbGQsIGksIHctPmJvZHkuZmlsZS0+bmFt ZSwgdy0+Ym9keS5maWxlLT5ubmFtZSkgPT0gRkFMU0Upew0KIAkJdGV4dGRl bGV0ZSgmdy0+dGFnLCAwLCBpLCBUUlVFKTsNCiAJCXRleHRpbnNlcnQoJnct PnRhZywgMCwgdy0+Ym9keS5maWxlLT5uYW1lLCB3LT5ib2R5LmZpbGUtPm5u YW1lLCBUUlVFKTsNCkBAIC00NTgsNyArNDkzLDYgQEANCiAJCW9sZCA9IHJ1 bmVtYWxsb2Mody0+dGFnLmZpbGUtPm5jKzEpOw0KIAkJYnVmcmVhZCh3LT50 YWcuZmlsZSwgMCwgb2xkLCB3LT50YWcuZmlsZS0+bmMpOw0KIAkJb2xkW3ct PnRhZy5maWxlLT5uY10gPSAnXDAnOw0KLQkJdy0+dGFnc2FmZSA9IEZBTFNF Ow0KIAl9DQogCW5ldyA9IHJ1bmVtYWxsb2Mody0+Ym9keS5maWxlLT5ubmFt ZSsxMDApOw0KIAlpID0gMDsNCkBAIC01NzIsMTEgKzYwNiw3IEBADQogCQkJ dGV4dGNvbW1pdChmLT50ZXh0W2ldLCBGQUxTRSk7CS8qIG5vLW9wIGZvciB0 ICovDQogCWlmKHQtPndoYXQgPT0gQm9keSkNCiAJCXJldHVybjsNCi0JciA9 IHJ1bmVtYWxsb2Mody0+dGFnLmZpbGUtPm5jKTsNCi0JYnVmcmVhZCh3LT50 YWcuZmlsZSwgMCwgciwgdy0+dGFnLmZpbGUtPm5jKTsNCi0JZm9yKGk9MDsg aTx3LT50YWcuZmlsZS0+bmM7IGkrKykNCi0JCWlmKHJbaV09PScgJyB8fCBy W2ldPT0nXHQnKQ0KLQkJCWJyZWFrOw0KKwlyID0gcGFyc2V0YWcodywgMCwg JmkpOw0KIAlpZihydW5lZXEociwgaSwgdy0+Ym9keS5maWxlLT5uYW1lLCB3 LT5ib2R5LmZpbGUtPm5uYW1lKSA9PSBGQUxTRSl7DQogCQlzZXErKzsNCiAJ CWZpbGVtYXJrKHctPmJvZHkuZmlsZSk7DQpAQCAtNjExLDExICs2NDEsMTEg QEANCiAJCXIgPSBydW5lcmVhbGxvYyhyLCBuKzEpOw0KIAkJcltuXSA9IDA7 DQogCX0NCisJZnJlZShhKTsNCiAJaWYoKGQtPnFpZC50eXBlJlFURElSKSA9 PSAwKXsNCiAJCWZyZWUoZCk7DQogCQl3YXJuaW5nKG5pbCwgIiVzOiBub3Qg YSBkaXJlY3RvcnlcbiIsIGEpOw0KIAkJZnJlZShyKTsNCi0JCWZyZWUoYSk7 DQogCQlyZXR1cm47DQogCX0NCiAJZnJlZShhKTsNCg== --0-1218188679-1676909210=:9879--