refactor: utils macros
This commit is contained in:
parent
93ed18602a
commit
75362bd2a8
16 changed files with 70 additions and 91 deletions
95
src/utils.rs
95
src/utils.rs
|
|
@ -3,13 +3,10 @@
|
|||
#[macro_export]
|
||||
macro_rules! expect {
|
||||
($src:ident, $index:expr, $expect:tt) => {
|
||||
$src.as_bytes().get($index).filter(|&b| b == &$expect)
|
||||
$src.as_bytes().get($index).filter(|&&b| b == $expect)
|
||||
};
|
||||
($src:ident, $index:expr, $expect:expr) => {
|
||||
// $src.as_bytes().get($index).filter($expect)
|
||||
if $index >= $src.len() || !$expect($src.as_bytes()[$index]) {
|
||||
return None;
|
||||
}
|
||||
$src.as_bytes().get($index).filter(|&&b| $expect(b))
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -30,30 +27,30 @@ macro_rules! eol {
|
|||
macro_rules! until {
|
||||
($src:expr, $until:tt) => {{
|
||||
let mut pos = 0;
|
||||
while pos < $src.len() {
|
||||
if $until == $src.as_bytes()[pos] {
|
||||
break;
|
||||
loop {
|
||||
if pos >= $src.len() {
|
||||
break None;
|
||||
}
|
||||
|
||||
if $until == $src.as_bytes()[pos] {
|
||||
break Some(pos);
|
||||
} else {
|
||||
pos += 1;
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
if pos == $src.len() {
|
||||
None
|
||||
} else {
|
||||
Some(pos)
|
||||
}
|
||||
}};
|
||||
($src:expr, $until:expr) => {{
|
||||
let mut pos = 0;
|
||||
while pos < $src.len() {
|
||||
if $until($src.as_bytes()[pos]) {
|
||||
break;
|
||||
loop {
|
||||
if pos >= $src.len() {
|
||||
break None;
|
||||
}
|
||||
|
||||
if $until($src.as_bytes()[pos]) {
|
||||
break Some(pos);
|
||||
} else {
|
||||
pos += 1;
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
if pos == $src.len() {
|
||||
None
|
||||
} else {
|
||||
Some(pos)
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
|
@ -62,41 +59,33 @@ macro_rules! until {
|
|||
macro_rules! until_while {
|
||||
($src:expr, $start:expr, $until:tt, $while:expr) => {{
|
||||
let mut pos = $start;
|
||||
while pos < $src.len() {
|
||||
// println!("pos {} char {} ", pos, $src.as_bytes()[pos] as char,);
|
||||
if $until == $src.as_bytes()[pos] {
|
||||
break;
|
||||
loop {
|
||||
if pos >= $src.len() {
|
||||
break None;
|
||||
} else if $until == $src.as_bytes()[pos] {
|
||||
break Some(pos);
|
||||
} else if $while($src.as_bytes()[pos]) {
|
||||
pos += 1;
|
||||
continue;
|
||||
} else {
|
||||
return None;
|
||||
break None;
|
||||
}
|
||||
}
|
||||
if pos == $src.len() {
|
||||
return None;
|
||||
} else {
|
||||
pos
|
||||
}
|
||||
}};
|
||||
($src:expr, $start:expr, $until:expr, $while:expr) => {{
|
||||
let mut pos = $start;
|
||||
while pos < $src.len() {
|
||||
// println!("pos {} char {}", pos, $src.as_bytes()[pos] as char);
|
||||
if $until($src.as_bytes()[pos]) {
|
||||
break;
|
||||
loop {
|
||||
if pos >= $src.len() {
|
||||
break None;
|
||||
} else if $until($src.as_bytes()[pos]) {
|
||||
break Some(pos);
|
||||
} else if $while($src.as_bytes()[pos]) {
|
||||
pos += 1;
|
||||
continue;
|
||||
} else {
|
||||
return None;
|
||||
break None;
|
||||
}
|
||||
}
|
||||
if pos == $src.len() {
|
||||
return None;
|
||||
} else {
|
||||
pos
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
|
|
@ -111,16 +100,6 @@ macro_rules! cond_eq {
|
|||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! position {
|
||||
($s:ident, $i:expr, $p:expr) => {
|
||||
match $s[$i..].chars().position($p) {
|
||||
Some(x) => x + $i,
|
||||
None => return None,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! starts_with {
|
||||
($s:ident, $p:expr) => {
|
||||
|
|
@ -144,13 +123,13 @@ macro_rules! skip_space {
|
|||
macro_rules! skip_empty_line {
|
||||
($src:ident, $from:expr) => {{
|
||||
let mut pos = $from;
|
||||
while pos < $src.len() {
|
||||
if $src.as_bytes()[pos] != b'\n' {
|
||||
break;
|
||||
loop {
|
||||
if pos >= $src.len() || $src.as_bytes()[pos] != b'\n' {
|
||||
break pos;
|
||||
} else {
|
||||
pos += 1;
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
pos
|
||||
}};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue