/* ****************************************************************************** * * 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; } }