#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"; }