MCPcopy Create free account
hub / github.com/csskit/csskit / consume_numeric_token

Method consume_numeric_token

crates/css_lexer/src/private.rs:520–592  ·  view source on GitHub ↗
(&mut self, atoms: &dyn DynAtomSet)

Source from the content-addressed store, hash-verified

518 }
519
520 fn consume_numeric_token(&mut self, atoms: &dyn DynAtomSet) -> Token {
521 let bytes = self.remaining_bytes();
522
523 let mut num_len: usize = 1;
524 let first_byte = bytes[0];
525 let mut is_float = first_byte == b'.';
526 let has_sign = first_byte == b'+' || first_byte == b'-';
527
528 // Scan integer part
529 let mut i: usize = 1;
530 while i < bytes.len() && bytes[i].is_ascii_digit() {
531 num_len += 1;
532 i += 1;
533 }
534
535 // Check for decimal point + fractional part
536 if !is_float && i + 1 < bytes.len() && bytes[i] == b'.' && bytes[i + 1].is_ascii_digit() {
537 num_len += 1;
538 i += 1;
539 while i < bytes.len() && bytes[i].is_ascii_digit() {
540 num_len += 1;
541 i += 1;
542 }
543 is_float = true;
544 }
545
546 // Check for exponent part
547 if i < bytes.len() && matches!(bytes[i], b'e' | b'E') {
548 let next_byte = if i + 1 < bytes.len() { bytes[i + 1] } else { 0 };
549 let next_next_byte = if i + 2 < bytes.len() { bytes[i + 2] } else { 0 };
550
551 if next_byte.is_ascii_digit() || (matches!(next_byte, b'-' | b'+') && next_next_byte.is_ascii_digit()) {
552 num_len += 1;
553 i += 1;
554 if matches!(bytes[i], b'-' | b'+') {
555 num_len += 1;
556 i += 1;
557 }
558 while i < bytes.len() && bytes[i].is_ascii_digit() {
559 num_len += 1;
560 i += 1;
561 }
562 is_float = true;
563 }
564 }
565
566 let value = if !is_float {
567 // Fast path for integers: compute value inline without str::parse
568 fast_parse_integer(bytes, has_sign, num_len)
569 } else {
570 let str = self.remaining_str();
571 str[0..num_len].parse::<f32>().unwrap()
572 };
573 self.advance_n(num_len);
574
575 match self.peek_byte(0) {
576 b'%' => {
577 self.pos += 1;

Callers 1

read_next_tokenMethod · 0.80

Calls 12

fast_parse_integerFunction · 0.85
is_ident_start_sequenceFunction · 0.85
remaining_bytesMethod · 0.80
remaining_strMethod · 0.80
advance_nMethod · 0.80
peek_byteMethod · 0.80
peek_charMethod · 0.80
peek3Method · 0.80
lenMethod · 0.45
str_to_bitsMethod · 0.45
at_endMethod · 0.45

Tested by

no test coverage detected