Exemple #1
0
Range* Range_parse(char *str) {

  Range* self = Range_new(0, 0x10000);

  if(strlen(str) == 0) {
    return self;
  }
  
  char *start = str;
  char *end = strstr(str, "-");

  if(end != NULL) {
    end++;
  }
  
  while(isspace((int)start[0])) start++;
  
  if(strlen(start) > 0 && start[0] != '-') {
    self->start = (int) strtol(start, NULL, 0);
  }

  if(end == NULL) {
    self->end = -1;
  }
  else {
    while(isspace((int)end[0])) end++;
    
    if(strlen(end) > 0) {
      self->end = (int) strtol(end, NULL, 0);
    }
  }
  return self;
}
Exemple #2
0
Range* Range_new_from_int(int range) {

  int start = ((unsigned int) range) >> 16;
  int end = range & 0xffff;
  if(end == 0) end = 0x10000;

  return Range_new(start, end);
}
Exemple #3
0
static Range *doDiff( Range *r1, Range *r2 )
{
    Range   *r, *s, **rP = &r;

    for( ; r1; r1 = r1->next ) {
        uint lb = r1->lb;
        for( ; r2 && r2->ub <= r1->lb; r2 = r2->next ) ;
        for( ; r2 && r2->lb <  r1->ub; r2 = r2->next ) {
            if( lb < r2->lb ) {
                *rP = s = Range_new( lb, r2->lb );
                rP = &s->next;
            }
            if( (lb = r2->ub) >= r1->ub ) {
                goto noMore;
            }
        }
        *rP = s = Range_new( lb, r1->ub );
        rP = &s->next;
noMore: ;
    }
    *rP = NULL;
    return r;
}
Exemple #4
0
static Range *getRange( SubStr *s )
{
    uchar lb = unescape( s ), ub;

    if( s->len < 2 || *s->str != '-' ) {
        ub = lb;
    } else {
        s->len--; s->str++;
        ub = unescape( s );
        if( ub < lb ) {
            uchar tmp;
            tmp = lb; lb = ub; ub = tmp;
        }
    }
    return( Range_new( lb, ub + 1 ) );
}
Exemple #5
0
static Range *Range_new_copy( Range *r )
{
    return( Range_new( r->lb, r->ub ) );
}
Exemple #6
0
static RegExp *matchChar( uint c )
{
    return( RegExp_new_MatchOp( Range_new( c, c + 1 ) ) );
}