home *** CD-ROM | disk | FTP | other *** search
- /*
- *******************************************************************************
- * *
- * COPYRIGHT: *
- * (C) Copyright International Business Machines Corporation, 1998 *
- * Licensed Material - Program-Property of IBM - All Rights Reserved. *
- * US Government Users Restricted Rights - Use, duplication, or disclosure *
- * restricted by GSA ADP Schedule Contract with IBM Corp. *
- * *
- *******************************************************************************
- *
- * 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"
-
-
- bool_t
- 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;
- }
-
- bool_t
- 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;
- }
-
- bool_t
- u_scanf_scanset_init(u_scanf_scanset *scanset,
- const UChar *s,
- int32_t *len)
- {
- UChar c;
- const UChar *limit;
- int32_t count;
- bool_t result;
-
-
- /* 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;
- }
-
- bool_t
- 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;
- }
- }
-
-
-
-
-
-
-
-
-