58 lines
1.2 KiB
Text
58 lines
1.2 KiB
Text
#module_parameters(RUN_TESTS := false);
|
|
|
|
to_string :: (c: cstring, count := 1) -> string #expand {
|
|
return string.{ data = c, count = count };
|
|
}
|
|
|
|
Index_Flag :: enum_flags {
|
|
from_end;
|
|
index_plus_one;
|
|
count_on_fail;
|
|
}
|
|
|
|
find_index :: (b: []byte, c: byte, $mode: Index_Flag) -> bool, int {
|
|
count := 0;
|
|
#if mode & .from_end {
|
|
i := b.count - 1;
|
|
while i >= 0 {
|
|
if b[i] == c {
|
|
return true, #ifx mode & .index_plus_one i + 1 else i;
|
|
}
|
|
|
|
i -= 1;
|
|
|
|
#if mode & .count_on_fail {
|
|
count += 1;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
for b if it == c {
|
|
return true, #ifx mode & .index_plus_one then it_index + 1 else it_index;
|
|
}
|
|
else #if mode & .count_on_fail {
|
|
count += 1;
|
|
}
|
|
}
|
|
|
|
return false, #ifx mode & .count_on_fail then count else -1;
|
|
}
|
|
|
|
find_index :: inline (s: string, c: byte, $mode: Index_Flag) -> bool, int {
|
|
ok, idx := find_index(s.([]byte), c, mode);
|
|
return ok, idx;
|
|
}
|
|
|
|
#scope_file;
|
|
|
|
#import "jc";
|
|
|
|
|
|
// ----------------------------------------------------------
|
|
// TESTS
|
|
// ----------------------------------------------------------
|
|
|
|
#if RUN_TESTS #run {
|
|
test :: #import "jc/meta/test";
|
|
}
|
|
|