9front - general discussion about 9front
 help / color / mirror / Atom feed
From: ori@eigenstate.org
To: cinap_lenrek@felloff.net, 9front@9front.org
Subject: Re: [9front] fix ref822
Date: Fri, 22 Nov 2019 10:39:25 -0800	[thread overview]
Message-ID: <663176CA83C9DF3BA009A5067FE7C47A@eigenstate.org> (raw)
In-Reply-To: 4F2E28EFD56B89BE598EA209856361F5@felloff.net

> i think this is also wrong:
> 
> +	if(i + n > Nref){
> +		for(i = 0; i < n; i++)
> +			free(a[i]);
> +		for(i = n; i < Nref; i++)
> +			a[i - n] = a[i];
>  	}
> 
> i is number of entries in a[], n is number of entries in f[]. if we got
> like i = 1 and n = Nref, we'd want to remove 1 item from a because:
> 
> i + n - Nref == 1 + Nref - Nref == 1
> 
> also, i think the uniqarray() approach is wrong. we probably want to
> deduplicate while we insert into a. we should never populate m->references
> with duplicate items in the first place.
> 
> delete uniquearray() and instead just do it like this:
> 
> a = m->references;
> n = tokenize(f, ....);
> 
> for(i=0; i<n; i++){
> 	for(j=0; j<Nref; j++){
> 		if(a[j] == nil || strcmp(a[j], f[i]) == 0)
> 			break;
> 	}
> 	if(j == Nref){
> 		// handle full case, shift a by one
> 	}
> 
> 	// now a[j] can be: nil = slot free, 
> 	a[j] = f[i];	// put into array
> }
> 
> --
> cinap

Actually, ignore that last message.  Yeah, this is better, though it
has produces marginally different results.

Updated patch:

diff -r 8b2040ba4785 sys/src/cmd/upas/fs/mbox.c
--- a/sys/src/cmd/upas/fs/mbox.c	Fri Nov 22 17:29:35 2019 +1030
+++ b/sys/src/cmd/upas/fs/mbox.c	Fri Nov 22 10:38:48 2019 -0800
@@ -857,25 +857,6 @@
 	return rtrim(strdup(skipwhite(p + h->len)));
 }
 
-/*
- * firefox, e.g. doesn't keep references unique
- */
-static int
-uniqarray(char **a, int n, int allocd)
-{
-	int i, j;
-
-	for(i = 0; i < n; i++)
-		for(j = i + 1; j < n; j++)
-			if(strcmp(a[i], a[j]) == 0){
-				if(allocd)
-					free(a[j]);
-				memmove(a + j, a + j + 1, sizeof *a*(n - (j + 1)));
-				a[--n] = 0;
-			}
-	return n;
-}
-
 static char*
 ref822(Message *m, Header *h, char*, char *p)
 {
@@ -886,26 +867,26 @@
 	n = getfields(s, f, nelem(f), 1, "<> \n\t\r,");
 	if(n > Nref)
 		n = Nref;
-	n = uniqarray(f, n, 0);
 	a = m->references;
 	for(i = 0; i < Nref; i++)
 		if(a[i] == nil)
 			break;
 	/*
 	 * if there are too many references, drop from the beginning
-	 * of the list.
+	 * of the list. If someone else has a duplicate, we keep the
+	 * old duplicate.
 	 */
-	if(i + n > Nref){
-		for(i = 0; i < n; i++)
-			free(a[i]);
-		for(i = n; i < Nref; i++)
-			a[i - n] = a[i];
+	for(i = 0; i < n; i++){
+		for(j = 0; j < Nref; j++)
+			if(a[j] == nil || strcmp(a[j], f[i]) == 0)
+				break;
+		if(j == Nref){
+			free(a[0]);
+			memmove(&a[0], &a[1], (Nref - 1) * sizeof(a[0]));
+			j--;
+		}
+		a[j] = strdup(f[i]);
 	}
-	for(j = 0; j < n;)
-		a[i++] = strdup(f[j++]);
-	n = uniqarray(a, i, 1);
-	if(n < Nref)
-		a[n] = nil;
 	free(s);
 	return (char*)~0;
 }



             reply	other threads:[~2019-11-22 18:39 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-22 18:39 ori [this message]
  -- strict thread matches above, loose matches on Subject: below --
2019-11-22 21:24 ori
2019-11-22 21:14 cinap_lenrek
2019-11-22 17:59 ori
2019-11-22  7:21 cinap_lenrek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=663176CA83C9DF3BA009A5067FE7C47A@eigenstate.org \
    --to=ori@eigenstate.org \
    --cc=9front@9front.org \
    --cc=cinap_lenrek@felloff.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).