Script `config' relies on extensions of `GNU sed', and is thus not working on all Unixes: - in-place edition of files (-i), which can be replaced with a temporary file; - extended-regexps (-r), which can be split into basic regexps; - single-line calls to `a' command, while some implementations require a leading newline before the parameter. Rewrite calls to `sed' to comply with POSIX interface, and move them to helper functions. Signed-off-by: Clement Chauplannaz <chauplac@xxxxxxxxx> --- Changes in v2: - ANSI C style quoting to produce newlines ($'\n') is replaced with printf's, not to introduce further dependency on bash. - helper functions are introduced to wrap calls to `sed'. scripts/config | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/scripts/config b/scripts/config index a65ecbb..a01bc11 100755 --- a/scripts/config +++ b/scripts/config @@ -60,15 +60,48 @@ checkarg() { fi } +txt_append() { + local anchor="$1" + local insert="$2" + local infile="$3" + local outfile="$4" + + # sed append cmd: 'a\' + newline + text + newline + cmd="$(printf "a\\%b$insert%b" "\n" "\n")" + + sed -e "/$anchor/$cmd" "$infile" >"$outfile" +} + +txt_subst() { + local before="$1" + local after="$2" + local infile="$3" + local outfile="$4" + + sed -e "s/$before/$after/" "$infile" >"$outfile" +} + +txt_delete() { + local text="$1" + local infile="$2" + local outfile="$3" + + sed -e "/$text/d" "$infile" >"$outfile" +} + set_var() { local name=$1 new=$2 before=$3 name_re="^($name=|# $name is not set)" before_re="^($before=|# $before is not set)" if test -n "$before" && grep -Eq "$before_re" "$FN"; then - sed -ri "/$before_re/a $new" "$FN" + txt_append "^$before=" "$new" "$FN" "$FN.swp" + txt_append "^# $before is not set" "$new" "$FN.swp" "$FN" + rm "$FN.swp" elif grep -Eq "$name_re" "$FN"; then - sed -ri "s:$name_re.*:$new:" "$FN" + txt_subst "^$name=.*" "$new" "$FN" "$FN.swp" + txt_subst "^# $name is not set" "$new" "$FN.swp" "$FN" + rm "$FN.swp" else echo "$new" >>"$FN" fi @@ -77,7 +110,9 @@ set_var() { undef_var() { local name=$1 - sed -ri "/^($name=|# $name is not set)/d" "$FN" + txt_delete "^$name=" "$FN" "$FN.swp" + txt_delete "^# $name is not set" "$FN.swp" "$FN" + rm "$FN.swp" } if [ "$1" = "--file" ]; then -- 1.8.3.rc1.44.gb387c77.dirty -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html