1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-24 13:30:21 +02:00

(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.
This commit is contained in:
Gary Houston 2001-07-22 22:03:47 +00:00
parent a6ec2a3cef
commit 714dd5fadf
2 changed files with 16 additions and 3 deletions

View file

@ -2,6 +2,11 @@
* srfi-14.c (scm_char_set_intersection, scm_char_set_xor): remove * srfi-14.c (scm_char_set_intersection, scm_char_set_xor): remove
the compulsory cs1 arguments: all args are optional in final spec. 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. * srfi-14.h: declarations updated.
2001-07-18 Martin Grabmueller <mgrabmue@cs.tu-berlin.de> 2001-07-18 Martin Grabmueller <mgrabmue@cs.tu-berlin.de>

View file

@ -1155,14 +1155,16 @@ SCM_DEFINE (scm_char_set_xor, "char-set-xor", 0, 0, 1,
{ {
long * p; long * p;
int argnum = 2; int argnum = 2;
long mask[LONGS_PER_CHARSET];
int k;
memset (mask, 0, sizeof mask);
res = scm_char_set_copy (SCM_CAR (rest)); res = scm_char_set_copy (SCM_CAR (rest));
p = (long *) SCM_SMOB_DATA (res); p = (long *) SCM_SMOB_DATA (res);
rest = SCM_CDR (rest); rest = SCM_CDR (rest);
while (SCM_CONSP (rest)) while (SCM_CONSP (rest))
{ {
int k;
SCM cs = SCM_CAR (rest); SCM cs = SCM_CAR (rest);
long *cs_data; long *cs_data;
@ -1172,9 +1174,15 @@ SCM_DEFINE (scm_char_set_xor, "char-set-xor", 0, 0, 1,
rest = SCM_CDR (rest); rest = SCM_CDR (rest);
for (k = 0; k < LONGS_PER_CHARSET; k++) 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; return res;
} }
#undef FUNC_NAME #undef FUNC_NAME