mirror of
https://github.com/tests-always-included/mo.git
synced 2024-12-18 16:27:52 +00:00
Only cut strings once
It's faster to loop through the string and check the character at an index than it is to trim single characters from the end in a loop. Trimming multiple characters in the loop is surprisingly slower than trimming one. Addresses more of the speed problem reported in #73.
This commit is contained in:
parent
5db34e55d3
commit
8056ee6961
73
mo
73
mo
@ -432,30 +432,19 @@ mo::indirectArray() {
|
|||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
mo::trimUnparsed() {
|
mo::trimUnparsed() {
|
||||||
local moLastLen moR moN moT
|
local moI moC
|
||||||
|
|
||||||
moLastLen=0
|
moI=0
|
||||||
moR=$'\r'
|
moC=${MO_UNPARSED:0:1}
|
||||||
moN=$'\n'
|
|
||||||
moT=$'\t'
|
|
||||||
|
|
||||||
while [[ "${#MO_UNPARSED}" != "$moLastLen" ]]; do
|
while [[ "$moC" == " " || "$moC" == $'\r' || "$moC" == $'\n' || "$moC" == $'\t' ]]; do
|
||||||
moLastLen=${#MO_UNPARSED}
|
moI=$((moI + 1))
|
||||||
|
moC=${MO_UNPARSED:$moI:1}
|
||||||
|
done
|
||||||
|
|
||||||
# These conditions are necessary for a significant speed increase
|
if [[ "$moI" != 0 ]]; then
|
||||||
while [[ "${MO_UNPARSED:0:1}" == " " ]]; do
|
MO_UNPARSED=${MO_UNPARSED:$moI}
|
||||||
MO_UNPARSED=${MO_UNPARSED# }
|
fi
|
||||||
done
|
|
||||||
while [[ "${MO_UNPARSED:0:1}" == "$moR" ]]; do
|
|
||||||
MO_UNPARSED=${MO_UNPARSED#"$moR"}
|
|
||||||
done
|
|
||||||
while [[ "${MO_UNPARSED:0:1}" == "$moN" ]]; do
|
|
||||||
MO_UNPARSED=${MO_UNPARSED#"$moN"}
|
|
||||||
done
|
|
||||||
while [[ "${MO_UNPARSED:0:1}" == "$moT" ]]; do
|
|
||||||
MO_UNPARSED=${MO_UNPARSED#"$moT"}
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1430,31 +1419,39 @@ mo::standaloneCheck() {
|
|||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
mo::standaloneProcess() {
|
mo::standaloneProcess() {
|
||||||
local moContent moLast moT moR moN
|
local moI moTemp
|
||||||
|
|
||||||
moT=$'\t'
|
|
||||||
moR=$'\r'
|
|
||||||
moN=$'\n'
|
|
||||||
moLast=
|
|
||||||
|
|
||||||
mo::debug "Standalone tag - processing content before and after tag"
|
mo::debug "Standalone tag - processing content before and after tag"
|
||||||
|
moI=$((${#MO_PARSED} - 1))
|
||||||
|
mo::debug "zero done ${#MO_PARSED}"
|
||||||
|
mo::escape moTemp "$MO_PARSED"
|
||||||
|
mo::debug "$moTemp"
|
||||||
|
|
||||||
while [[ "$moLast" != "$MO_PARSED" ]]; do
|
while [[ "${MO_PARSED:$moI:1}" == " " || "${MO_PARSED:$moI:1}" == $'\t' ]]; do
|
||||||
moLast=$MO_PARSED
|
moI=$((moI - 1))
|
||||||
MO_PARSED=${MO_PARSED% }
|
|
||||||
MO_PARSED=${MO_PARSED%"$moT"}
|
|
||||||
done
|
done
|
||||||
|
|
||||||
moLast=
|
if [[ $((moI + 1)) != "${#MO_PARSED}" ]]; then
|
||||||
|
MO_PARSED="${MO_PARSED:0:${moI}+1}"
|
||||||
|
fi
|
||||||
|
|
||||||
while [[ "$moLast" != "$MO_UNPARSED" ]]; do
|
moI=0
|
||||||
moLast=$MO_UNPARSED
|
|
||||||
MO_UNPARSED=${MO_UNPARSED# }
|
while [[ "${MO_UNPARSED:${moI}:1}" == " " || "${MO_UNPARSED:${moI}:1}" == $'\t' ]]; do
|
||||||
MO_UNPARSED=${MO_UNPARSED#"$moT"}
|
moI=$((moI + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
MO_UNPARSED=${MO_UNPARSED#"$moR"}
|
if [[ "${MO_UNPARSED:${moI}:1}" == $'\r' ]]; then
|
||||||
MO_UNPARSED=${MO_UNPARSED#"$moN"}
|
moI=$((moI + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${MO_UNPARSED:${moI}:1}" == $'\n' ]]; then
|
||||||
|
moI=$((moI + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$moI" != 0 ]]; then
|
||||||
|
MO_UNPARSED=${MO_UNPARSED:${moI}}
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user