Merge branch '2022-04-08-env-updates'
[platform/kernel/u-boot.git] / scripts / env2string.awk
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
16 BEGIN {
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
23 NF {
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
73 END {
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 }