#![allow(dead_code)]
#![cfg(feature = "std")]
use crate::tools::intutils::{qrc_intutils_clear_string, qrc_intutils_min};
use unicode_segmentation::UnicodeSegmentation;
pub fn qrc_stringutils_clear_string(source: &mut String) {
if !source.is_empty() {
if qrc_stringutils_string_size(source) != 0 {
qrc_intutils_clear_string(source);
}
}
}
pub fn qrc_stringutils_concat_strings(dest: &mut String, dstlen: usize, source: &str) -> usize {
let mut res = 0;
if !source.is_empty() {
let dlen = qrc_stringutils_string_size(dest);
let slen = qrc_stringutils_string_size(source);
if slen > 0 && slen <= dstlen - dlen {
dest.push_str(&source[..dstlen.min(qrc_stringutils_string_size(source))]);
}
if !qrc_stringutils_string_size(dest) == dstlen {
res = qrc_stringutils_string_size(dest);
}
}
return res;
}
pub fn qrc_stringutils_copy_string(dest: &mut String, dstlen: usize, source: &str) -> usize {
let mut res = 0;
if !source.is_empty() {
let slen = qrc_stringutils_string_size(source);
if slen > 0 {
qrc_stringutils_clear_string(dest);
dest.push_str(&source[..dstlen.min(qrc_stringutils_string_size(source))]);
}
if !qrc_stringutils_string_size(dest) == dstlen {
res = qrc_stringutils_string_size(dest);
}
}
return res;
}
pub fn qrc_stringutils_find_string(source: &str, token: &str) -> i32 {
let mut pos = -1;
if !source.is_empty() && !token.is_empty() {
if let Some(position) = source.find(token) {
pos = position as i32;
}
}
return pos;
}
pub fn qrc_stringutils_is_numeric(source: &str) -> bool {
let mut res = false;
if qrc_stringutils_string_size(source) != 0 {
res = true;
for c in source.chars() {
if c < '0' as char || c > '9' as char {
res = false;
}
}
}
return res;
}
pub fn qrc_stringutils_string_contains(source: &str, token: &str) -> bool {
let mut res = false;
if !source.is_empty() && !token.is_empty() {
res = qrc_stringutils_find_string(source, token) >= 0;
}
return res;
}
pub fn qrc_stringutils_split_strings(
dest1: &mut String,
dest2: &mut String,
destlen: usize,
source: &str,
token: &str,
) {
let pos = qrc_stringutils_find_string(source, token);
if pos > 0 {
let toklen = qrc_stringutils_string_size(token);
let mut pstr = source;
let mut plen = pos as usize + toklen;
if destlen >= plen {
qrc_stringutils_copy_string(dest1, plen, &pstr[..plen]);
plen += 1;
pstr = pstr.get(plen..).unwrap();
plen = qrc_stringutils_string_size(pstr);
if destlen >= plen {
qrc_stringutils_copy_string(dest2, plen, pstr);
}
}
}
}
pub fn qrc_stringutils_reverse_sub_string(source: &str, token: &str) -> String {
let mut sub = String::with_capacity(qrc_stringutils_string_size(source));
if qrc_stringutils_string_size(source) != 0 && qrc_stringutils_string_size(token) != 0 {
if let Some(pch) = source.rfind(token.chars().next().unwrap()) {
let pos = pch + 1;
sub = source[pos..].to_string();
}
}
return sub;
}
pub fn qrc_stringutils_string_to_int(source: &str) -> i32 {
let mut res = 0;
for c in source.chars() {
if c == '\0' || c < '0' as char || c > '9' as char {
break;
}
res = res * 10 + (c as i32) - ('0' as i32);
}
res
}
pub fn qrc_stringutils_string_size(source: &str) -> usize {
let mut res = 0;
if !source.is_empty() {
res = source.len();
}
return res;
}
pub fn qrc_stringutils_to_uppercase(source: &mut String, maxlen: usize) {
if qrc_stringutils_string_size(source) != 0 {
let tmp = &source[..];
let uppercased = tmp.to_uppercase();
let actual_length = uppercased.graphemes(true).count();
let trimmed: String = uppercased
.graphemes(true)
.take(qrc_intutils_min(
qrc_intutils_min(QRC_STRING_MAX_LEN, actual_length),
maxlen,
))
.collect();
qrc_intutils_clear_string(source);
source.push_str(&trimmed[..]);
}
}
const QRC_STRING_MAX_LEN: usize = 4096;