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; }
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); }
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; }
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 ) ); }
static Range *Range_new_copy( Range *r ) { return( Range_new( r->lb, r->ub ) ); }
static RegExp *matchChar( uint c ) { return( RegExp_new_MatchOp( Range_new( c, c + 1 ) ) ); }