1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 21:40:33 +02:00

Reverse the n-ary logxor change. The behaviour is weird in a set

context, but consistent with logxor and scsh.  Maybe it should get
     the benefit of the doubt.
This commit is contained in:
Gary Houston 2001-07-22 23:21:03 +00:00
parent 42b54c05a9
commit d95744e986
2 changed files with 3 additions and 15 deletions

View file

@ -2,10 +2,6 @@
* srfi-14.c (scm_char_set_intersection, scm_char_set_xor): remove
the compulsory cs1 arguments: all args are optional in final spec.
(scm_char_set_xor): bug fix: characters should only be included if
they occur in exactly one argument, but were included if they
occured an odd number of times >= 3, e.g, in (char-set-xor a a a)
where a is (char-set #\a). fix it with a "mask" array.
* srfi-14.h: declarations updated.

View file

@ -1153,12 +1153,9 @@ SCM_DEFINE (scm_char_set_xor, "char-set-xor", 0, 0, 1,
res = make_char_set (FUNC_NAME);
else
{
long * p;
int argnum = 2;
long mask[LONGS_PER_CHARSET];
int k;
long * p;
memset (mask, 0, sizeof mask);
res = scm_char_set_copy (SCM_CAR (rest));
p = (long *) SCM_SMOB_DATA (res);
rest = SCM_CDR (rest);
@ -1167,6 +1164,7 @@ SCM_DEFINE (scm_char_set_xor, "char-set-xor", 0, 0, 1,
{
SCM cs = SCM_CAR (rest);
long *cs_data;
int k;
SCM_VALIDATE_SMOB (argnum, cs, charset);
argnum++;
@ -1174,14 +1172,8 @@ SCM_DEFINE (scm_char_set_xor, "char-set-xor", 0, 0, 1,
rest = SCM_CDR (rest);
for (k = 0; k < LONGS_PER_CHARSET; k++)
{
mask[k] |= p[k] & cs_data[k];
p[k] ^= cs_data[k];
}
p[k] ^= cs_data[k];
}
/* avoid including characters that occur an odd number of times >= 3. */
for (k = 0; k < LONGS_PER_CHARSET; k++)
p[k] &= ~mask[k];
}
return res;
}