# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_at_check_pattern.html # =========================================================================== # # SYNOPSIS # # AX_AT_CHECK_PATTERN(COMMANDS, [STATUS], [STDOUT-RE], [STDERR-RE], [RUN-IF-FAIL], [RUN-IF-PASS]) # AX_AT_DIFF_PATTERN(PATTERN-FILE, TEST-FILE, [STATUS=0], [DIFFERENCES]) # # DESCRIPTION # # AX_AT_CHECK_PATTERN() executes a test similar to AT_CHECK(), except that # stdout and stderr are awk regular expressions (REs). # # NOTE: as autoconf uses [] for quoting, the use of [brackets] in the RE # arguments STDOUT-RE and STDERR-RE can be awkward and require careful # extra quoting, or quadrigraphs '@<:@' (for '[') and '@:>@' (for ']'). # # awk is invoked via $AWK, which defaults to "awk" if unset or empty. # # Implemented using AT_CHECK() with a custom value for $at_diff that # invokes diff with an awk post-processor. # # AX_AT_DIFF_PATTERN() checks that the PATTERN-FILE applies to TEST-FILE. # If there are differences, STATUS will be 1 and they should be # DIFFERENCES. # # LICENSE # # Copyright (c) 2013-2014 Luke Mewburn # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 2 m4_defun([_AX_AT_CHECK_PATTERN_PREPARE], [dnl dnl Can't use AC_PROG_AWK() in autotest. AS_VAR_IF([AWK], [], [AWK=awk]) AS_REQUIRE_SHELL_FN([ax_at_diff_pattern], [AS_FUNCTION_DESCRIBE([ax_at_diff_pattern], [PATTERN OUTPUT], [Diff PATTERN OUTPUT and elide change lines where the RE pattern matches])], [diff "$[]1" "$[]2" | $AWK ' BEGIN { exitval=0 } function mismatch() { print mode for (i = 0; i < lc; i++) { print ll[[i]] } print "---" for (i = 0; i < rc; i++) { print rl[[i]] } mode="" exitval=1 } $[]1 ~ /^[[0-9]]+(,[[0-9]]+)?[[ad]][[0-9]]+(,[[0-9]]+)?$/ { print mode="" exitval=1 next } $[]1 ~ /^[[0-9]]+(,[[0-9]]+)?[[c]][[0-9]]+(,[[0-9]]+)?$/ { mode=$[]1 lc=0 rc=0 next } mode == "" { print $[]0 next } $[]1 == "<" { ll[[lc]] = $[]0 lc = lc + 1 next } $[]1 == "---" { next } $[]1 == ">" { rl[[rc]] = $[]0 rc = rc + 1 if (rc > lc) { mismatch() next } pat = "^" substr(ll[[rc-1]], 2) "$" str = substr($[]0, 2) if (str !~ pat) { mismatch() } next } { print "UNEXPECTED LINE: " $[]0 exit 10 } END { exit exitval } '])dnl ax_at_diff_pattern ])dnl _AX_AT_CHECK_PATTERN_PREPARE m4_defun([AX_AT_CHECK_PATTERN], [dnl AS_REQUIRE([_AX_AT_CHECK_PATTERN_PREPARE]) _ax_at_check_pattern_prepare_original_at_diff="$at_diff" at_diff='ax_at_diff_pattern' AT_CHECK($1, $2, $3, $4, [at_diff="$_ax_at_check_pattern_prepare_original_at_diff";]$5, [at_diff="$_ax_at_check_pattern_prepare_original_at_diff";]$6) ])dnl AX_AT_CHECK_PATTERN m4_defun([AX_AT_DIFF_PATTERN], [dnl AS_REQUIRE([_AX_AT_CHECK_PATTERN_PREPARE]) AT_CHECK([ax_at_diff_pattern $1 $2], [$3], [$4]) ])dnl AX_AT_CHECK_PATTERN