1999-08-16 21:50:52 +00:00
|
|
|
/*
|
|
|
|
*******************************************************************************
|
2000-01-13 23:54:23 +00:00
|
|
|
*
|
|
|
|
* Copyright (C) 1998-1999, International Business Machines
|
|
|
|
* Corporation and others. All Rights Reserved.
|
|
|
|
*
|
1999-08-16 21:50:52 +00:00
|
|
|
*******************************************************************************
|
|
|
|
*
|
|
|
|
* File uscanset.c
|
|
|
|
*
|
|
|
|
* Modification History:
|
|
|
|
*
|
|
|
|
* Date Name Description
|
|
|
|
* 12/03/98 stephen Creation.
|
|
|
|
* 03/13/99 stephen Modified for new C API.
|
|
|
|
*******************************************************************************
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "uscanset.h"
|
|
|
|
|
|
|
|
|
2001-02-06 21:56:47 +00:00
|
|
|
static UBool
|
1999-08-16 21:50:52 +00:00
|
|
|
u_scanf_scanset_add(u_scanf_scanset *scanset,
|
|
|
|
UChar c)
|
|
|
|
{
|
|
|
|
if(scanset->single_count == U_SCANF_MAX_SCANSET_SIZE - 1)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
scanset->singles[ scanset->single_count ] = c;
|
|
|
|
(scanset->single_count)++;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2001-02-06 21:56:47 +00:00
|
|
|
static UBool
|
1999-08-16 21:50:52 +00:00
|
|
|
u_scanf_scanset_addrange(u_scanf_scanset *scanset,
|
|
|
|
UChar start,
|
|
|
|
UChar end)
|
|
|
|
{
|
|
|
|
if(scanset->pair_count == U_SCANF_MAX_SCANSET_SIZE - 1)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
scanset->pairs[ scanset->pair_count ].start = start;
|
|
|
|
scanset->pairs[ scanset->pair_count ].end = end;
|
|
|
|
|
|
|
|
(scanset->pair_count)++;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2000-05-18 22:08:39 +00:00
|
|
|
UBool
|
1999-08-16 21:50:52 +00:00
|
|
|
u_scanf_scanset_init(u_scanf_scanset *scanset,
|
|
|
|
const UChar *s,
|
|
|
|
int32_t *len)
|
|
|
|
{
|
|
|
|
UChar c;
|
|
|
|
const UChar *limit;
|
|
|
|
int32_t count;
|
2001-02-06 20:39:23 +00:00
|
|
|
UBool result = FALSE;
|
1999-08-16 21:50:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* set up parameters */
|
|
|
|
limit = s + *len;
|
|
|
|
count = 0;
|
|
|
|
|
|
|
|
/* initialize to defaults */
|
|
|
|
scanset->single_count = 0;
|
|
|
|
scanset->pair_count = 0;
|
|
|
|
scanset->is_inclusive = TRUE;
|
|
|
|
|
|
|
|
/* check to see if this is an inclusive or exclusive scanset */
|
|
|
|
if(*s == 0x005E) { /* '^' */
|
|
|
|
scanset->is_inclusive = FALSE;
|
|
|
|
|
|
|
|
/* increment s and count */
|
|
|
|
++s;
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if ']' is the first character, add it */
|
|
|
|
else if(*s == 0x005D) {
|
|
|
|
result = u_scanf_scanset_add(scanset, *s++);
|
|
|
|
|
|
|
|
/* increment count */
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if the first character is '^' and the second is ']', add ']' */
|
|
|
|
if( ! scanset->is_inclusive && *s == 0x005D) {
|
|
|
|
result = u_scanf_scanset_add(scanset, *s++);
|
|
|
|
|
|
|
|
/* increment count */
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* add characters until a ']' is seen, adding ranges as necessary */
|
|
|
|
while(s < limit) {
|
|
|
|
|
|
|
|
/* grab the current character */
|
|
|
|
c = *s++;
|
|
|
|
|
|
|
|
/* if it's a ']', we're done */
|
|
|
|
if(c == 0x005D)
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* check if this is a range */
|
|
|
|
if(*s == 0x002D && *(s+1) != 0x005D) {
|
|
|
|
result = u_scanf_scanset_addrange(scanset, c, *(s+1));
|
|
|
|
|
|
|
|
/* increment count and s */
|
|
|
|
s += 2;
|
|
|
|
count += 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* otherwise, just add the character */
|
|
|
|
else {
|
|
|
|
result = u_scanf_scanset_add(scanset, c);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* increment count */
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* update length to reflect # of characters consumed */
|
|
|
|
*len = count;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2000-05-18 22:08:39 +00:00
|
|
|
UBool
|
1999-08-16 21:50:52 +00:00
|
|
|
u_scanf_scanset_in(u_scanf_scanset *scanset,
|
|
|
|
UChar c)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* if this is an inclusive scanset, make sure c is in it */
|
|
|
|
if(scanset->is_inclusive) {
|
|
|
|
|
|
|
|
/* check the single chars first*/
|
|
|
|
for(i = 0; i < scanset->single_count; ++i) {
|
|
|
|
if(c == scanset->singles[i])
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check the pairs */
|
|
|
|
for(i = 0; i < scanset->pair_count; ++i) {
|
|
|
|
if(c >= scanset->pairs[i].start && c <= scanset->pairs[i].end)
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* didn't find it, so c isn't in set */
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* otherwise, make sure c isn't in it */
|
|
|
|
else {
|
|
|
|
|
|
|
|
/* check the single chars first*/
|
|
|
|
for(i = 0; i < scanset->single_count; ++i) {
|
|
|
|
if(c == scanset->singles[i])
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check the pairs */
|
|
|
|
for(i = 0; i < scanset->pair_count; ++i) {
|
|
|
|
if(c >= scanset->pairs[i].start && c <= scanset->pairs[i].end)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* didn't find it, so c is in set */
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|