blob: 90f13afb583d2ee147ec42c6e52b65e83ce645e2 [file] [log] [blame]
/*
******************************************************************************
*
* Copyright (C) 1998-2001, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
*
* 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"
static UBool
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;
}
static UBool
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;
}
UBool
u_scanf_scanset_init(u_scanf_scanset *scanset,
const UChar *s,
int32_t *len)
{
UChar c;
const UChar *limit;
int32_t count;
UBool result = FALSE;
/* 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;
}
UBool
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;
}
}