1# SPDX-License-Identifier: GPL-2.0+ 2# 3# Copyright 2021 Google, Inc 4# 5# SPDX-License-Identifier: GPL-2.0+ 6# 7# Awk script to parse a text file containing an environment and convert it 8# to a C string which can be compiled into U-Boot. 9 10# The resulting output is: 11# 12# #define CONFIG_EXTRA_ENV_TEXT "<environment here>" 13# 14# If the input is empty, this script outputs a comment instead. 15 16BEGIN { 17 # env holds the env variable we are currently processing 18 env = ""; 19 ORS = "" 20} 21 22# Skip empty lines, as these are generated by the clang preprocessor 23NF { 24 do_output = 0 25 26 # Quote quotes 27 gsub("\"", "\\\"") 28 29 # Avoid using the non-POSIX third parameter to match(), by splitting 30 # the work into several steps. 31 has_var = match($0, "^([^ \t=][^ =]*)=(.*)$") 32 33 # Is this the start of a new environment variable? 34 if (has_var) { 35 if (length(env) != 0) { 36 # Record the value of the variable now completed 37 vars[var] = env 38 do_output = 1 39 } 40 41 # Collect the variable name. The value follows the '=' 42 match($0, "^([^ \t=][^ =]*)=") 43 var = substr($0, 1, RLENGTH - 1) 44 env = substr($0, RLENGTH + 1) 45 46 # Deal with += which concatenates the new string to the existing 47 # variable. Again we are careful to use POSIX match() 48 if (length(env) != 0 && match(var, "^(.*)[+]$")) { 49 plusname = substr(var, RSTART, RLENGTH - 1) 50 # Allow var\+=val to indicate that the variable name is 51 # var+ and this is not actually a concatenation 52 if (substr(plusname, length(plusname)) == "\\") { 53 # Drop the backslash 54 sub(/\\[+]$/, "+", var) 55 } else { 56 var = plusname 57 env = vars[var] env 58 } 59 } 60 } else { 61 # Change newline to space 62 gsub(/^[ \t]+/, "") 63 64 # Don't keep leading spaces generated by the previous blank line 65 if (length(env) == 0) { 66 env = $0 67 } else { 68 env = env " " $0 69 } 70 } 71} 72 73END { 74 # Record the value of the variable now completed. If the variable is 75 # empty it is not set. 76 if (length(env) != 0) { 77 vars[var] = env 78 do_output = 1 79 } 80 81 if (do_output) { 82 printf("%s", "#define CONFIG_EXTRA_ENV_TEXT \"") 83 84 # Print out all the variables by alphabetic order, if using 85 # gawk. This allows test_env_test.py to work on both awk (where 86 # this next line does nothing) 87 PROCINFO["sorted_in"] = "@ind_str_asc" 88 for (var in vars) { 89 env = vars[var] 90 print var "=" vars[var] "\\0" 91 } 92 print "\"\n" 93 } 94} 95