On Sun, Jul 24, 2022 at 10:34:04AM -0700, Andrew Hewus Fresh wrote:
>  I'll try to think about whether I can build a sed program that will
>  spit out matches.

Unfortunately the sed version seems to be even slower than matching one
line at a time.  Just building the patterns for sed is slower than the
original single match.

--- fw_update.sh.orig   Sun Jul 24 10:07:40 2022
+++ fw_update.sh        Sun Jul 24 20:50:02 2022
@@ -168,22 +168,34 @@
 }
 
 firmware_in_dmesg() {
-       local _d _m _line _dmesgtail _last='' _nl=$( echo )
+       local _cmd
 
-       # The dmesg can contain multiple boots, only look in the last one
-       _dmesgtail="$( echo ; sed -n 'H;/^OpenBSD/h;${g;p;}' 
/var/run/dmesg.boot )"
-
-       grep -v '^[[:space:]]*#' "$FWPATTERNS" |
+       _cmd="$( grep -v '^[[:space:]]*#' "$FWPATTERNS" | (
+           _s='/^%s/i\\\n%s\n'
+           _last=
+           _patterns=
            while read -r _d _m; do
-               [ "$_d" = "$_last" ] && continue
-               [ "$_m" ]             || _m="${_nl}${_d}[0-9] at "
-               [ "$_m" = "${_m#^}" ] || _m="${_nl}${_m#^}"
+               [ "$_m" ] || _m="^${_d}[0-9] at "
+               [ "$_m" = "${_m#*/}" ] || _m="$( printf "$_m" | sed 's,/,\\/,g' 
)"
 
-               if [[ $_dmesgtail = *$_m* ]]; then
-                       echo "$_d"
-                       _last="$_d"
+               if [ "$_patterns" ] && [ "$_d" != "$_last" ]; then
+                       printf "$_s" "$_patterns" "$_last"
+                       _last=
+                       _patterns=
                fi
+
+               _last="$_d"
+               if [ "$_patterns" ]; then
+                       _patterns="$_patterns|$_m"
+               else
+                       _patterns="$_m"
+               fi
            done
+           [ "$_patterns" ] && printf "$_s" "$_patterns" "$_last"
+       ) )"
+
+       # The dmesg can contain multiple boots, only look in the last one
+       sed -n 'H;/^OpenBSD/h;${g;p;}' /var/run/dmesg.boot | sed -En "$_cmd"
 }
 
 firmware_filename() {

Reply via email to