/*
*******************************************************************************
*
*   Copyright (C) 1998-1999, 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"


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

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;


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








