[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] build: replace get-fields.sh by a python script
commit e0cfbcfa57e1b64247f1f450a7cc961bf92448ee Author: Anthony PERARD <anthony.perard@xxxxxxxxxx> AuthorDate: Thu Jan 19 15:22:55 2023 +0000 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Mon Feb 6 10:22:12 2023 +0000 build: replace get-fields.sh by a python script The get-fields.sh which generate all the include/compat/.xlat/*.h headers is quite slow. It takes for example nearly 3 seconds to generate platform.h on a recent machine, or 2.3 seconds for memory.h. Rewriting the mix of shell/sed/python into a single python script make the generation of those file a lot faster. No functional change, the headers generated are identical. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/include/Makefile | 6 +- xen/tools/compat-xlat-header.py | 432 ++++++++++++++++++++++++++++++++++++ xen/tools/get-fields.sh | 473 ---------------------------------------- 3 files changed, 434 insertions(+), 477 deletions(-) diff --git a/xen/include/Makefile b/xen/include/Makefile index cfd7851614..2da842b3ee 100644 --- a/xen/include/Makefile +++ b/xen/include/Makefile @@ -65,9 +65,7 @@ cmd_compat_c = \ quiet_cmd_xlat_headers = GEN $@ cmd_xlat_headers = \ - while read what name; do \ - $(SHELL) $(srctree)/tools/get-fields.sh "$$what" compat_$$name $< || exit $$?; \ - done <$(patsubst $(obj)/compat/%,$(obj)/compat/.xlat/%,$(basename $<)).lst >$@.new; \ + $(PYTHON) $(srctree)/tools/compat-xlat-header.py $< $(patsubst $(obj)/compat/%,$(obj)/compat/.xlat/%,$(basename $<)).lst > $@.new; \ mv -f $@.new $@ targets += $(headers-y) @@ -92,7 +90,7 @@ $(obj)/compat/%.c: $(src)/public/%.h $(srcdir)/xlat.lst $(srctree)/tools/compat- $(call if_changed,compat_c) targets += $(patsubst compat/%, compat/.xlat/%, $(headers-y)) -$(obj)/compat/.xlat/%.h: $(obj)/compat/%.h $(obj)/compat/.xlat/%.lst $(srctree)/tools/get-fields.sh FORCE +$(obj)/compat/.xlat/%.h: $(obj)/compat/%.h $(obj)/compat/.xlat/%.lst $(srctree)/tools/compat-xlat-header.py FORCE $(call if_changed,xlat_headers) quiet_cmd_xlat_lst = GEN $@ diff --git a/xen/tools/compat-xlat-header.py b/xen/tools/compat-xlat-header.py new file mode 100644 index 0000000000..ae5c9f11c9 --- /dev/null +++ b/xen/tools/compat-xlat-header.py @@ -0,0 +1,432 @@ +#!/usr/bin/env python + +from __future__ import print_function +import re +import sys + +re_identifier = re.compile(r'^[a-zA-Z_]') +re_compat_handle = re.compile(r'^COMPAT_HANDLE\((.*)\)$') +re_pad = re.compile(r'^_pad\d*$') +re_compat = re.compile(r'^compat_.*_t$') +re_brackets = re.compile(r'[{}]') + +def removeprefix(s, prefix): + if s.startswith(prefix): + return s[len(prefix):] + return s + +def removesuffix(s, suffix): + if s.endswith(suffix): + return s[:-len(suffix)] + return s + +def get_fields(looking_for, header_tokens): + level = 1 + aggr = 0 + fields = [] + name = '' + + for token in header_tokens: + if token in ('struct', 'union'): + if level == 1: + aggr = 1 + fields = [] + name = '' + elif token == '{': + level += 1 + elif token == '}': + level -= 1 + if level == 1 and name == looking_for: + fields.append(token) + return fields + elif re_identifier.match(token): + if not (aggr == 0 or name != ''): + name = token + + if aggr != 0: + fields.append(token) + + return [] + +def build_enums(name, tokens): + level = 1 + kind = '' + named = '' + fields = [] + members = [] + id = '' + + for token in tokens: + if token in ('struct', 'union'): + if not level != 2: + fields = [''] + kind = "%s;%s" % (token, kind) + elif token == '{': + level += 1 + elif token == '}': + level -= 1 + if level == 1: + subkind = kind + (subkind, _, _) = subkind.partition(';') + if subkind == 'union': + print("\nenum XLAT_%s {" % (name,)) + for m in members: + print(" XLAT_%s_%s," % (name, m)) + print("};") + return + elif level == 2: + named = '?' + elif re_identifier.match(token): + id = token + k = kind + (_, _, k) = k.partition(';') + if named != '' and k != '': + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + build_enums("%s_%s" % (name, token), fields) + named = '!' + elif token == ',': + if level == 2: + members.append(id) + elif token == ';': + if level == 2: + members.append(id) + if named != '': + (_, _, kind) = kind.partition(';') + named = '' + if len(fields) != 0: + fields.append(token) + +def handle_field(prefix, name, id, type, fields): + if len(fields) == 0: + print(" \\") + if type == '': + print("%s(_d_)->%s = (_s_)->%s;" % (prefix, id, id), end='') + else: + k = id.replace('.', '_') + print("%sXLAT_%s_HNDL_%s(_d_, _s_);" % (prefix, name, k), end='') + elif not re_brackets.search(' '.join(fields)): + tag = ' '.join(fields) + tag = re.sub(r'\s*(struct|union)\s+(compat_)?(\w+)\s.*', '\\3', tag) + print(" \\") + print("%sXLAT_%s(&(_d_)->%s, &(_s_)->%s);" % (prefix, tag, id, id), end='') + else: + func_id = id + func_tokens = fields + kind = '' + array = "" + level = 1 + arrlvl = 1 + array_type = '' + id = '' + type = '' + fields = [] + for token in func_tokens: + if token in ('struct', 'union'): + if level == 2: + fields = [''] + if level == 1: + kind = token + if kind == 'union': + tmp = func_id.replace('.', '_') + print(" \\") + print("%sswitch (%s) {" % (prefix, tmp), end='') + elif token == '{': + level += 1 + id = '' + elif token == '}': + level -= 1 + id = '' + if level == 1 and kind == 'union': + print(" \\") + print("%s}" % (prefix,), end='') + elif token == '[': + if level != 2 or arrlvl != 1: + pass + elif array == '': + array = ' ' + else: + array = "%s;" % (array,) + arrlvl += 1 + elif token == ']': + arrlvl -= 1 + elif re_compat_handle.match(token): + if level == 2 and id == '': + m = re_compat_handle.match(token) + type = m.groups()[0] + type = removeprefix(type, 'compat_') + elif token == "compat_domain_handle_t": + if level == 2 and id == '': + array_type = token + elif re_identifier.match(token): + id = token + elif token in (',', ';'): + if level == 2 and not re_pad.match(id): + if kind == 'union': + tmp = "%s.%s" % (func_id, id) + tmp = tmp.replace('.', '_') + print(" \\") + print("%scase XLAT_%s_%s:" % (prefix, name, tmp), end='') + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + handle_field("%s " % (prefix,), name, "%s.%s" % (func_id, id), type, fields) + elif array == '' and array_type == '': + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + handle_field(prefix, name, "%s.%s" % (func_id, id), type, fields) + elif array == '': + copy_array(" ", "%s.%s" % (func_id, id)) + else: + (_, _, array) = array.partition(';') + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + handle_array(prefix, name, "{func_id}.{id}", array, type, fields) + if token == ';': + fields = [] + id = '' + type = '' + array = '' + if kind == 'union': + print(" \\") + print("%s break;" % (prefix,), end='') + else: + if array != '': + array = "%s %s" % (array, token) + if len(fields) > 0: + fields.append(token) + +def copy_array(prefix, id): + print(" \\") + print("%sif ((_d_)->%s != (_s_)->%s) \\" % (prefix, id, id)) + print("%s memcpy((_d_)->%s, (_s_)->%s, sizeof((_d_)->%s));" % (prefix, id, id, id), end='') + +def handle_array(prefix, name, id, array, type, fields): + i = re.sub(r'[^;]', '', array) + i = "i%s" % (len(i),) + + print(" \\") + print("%s{ \\" % (prefix,)) + print("%s unsigned int %s; \\" % (prefix, i)) + (head, _, tail) = array.partition(';') + head = head.strip() + print("%s for (%s = 0; %s < %s; ++%s) {" % (prefix, i, i, head, i), end='') + if not ';' in array: + handle_field("%s " % (prefix,), name, "%s[%s]" % (id, i), type, fields) + else: + handle_array("%s " % (prefix,) , name, "%s[%s]" % (id, i), tail, type, fields) + print(" \\") + print("%s } \\" % (prefix,)) + print("%s}" % (prefix,), end='') + +def build_body(name, tokens): + level = 1 + id = '' + array = '' + arrlvl = 1 + array_type = '' + type = '' + fields = [] + + print("\n#define XLAT_%s(_d_, _s_) do {" % (name,), end='') + + for token in tokens: + if token in ('struct', 'union'): + if level == 2: + fields = [''] + elif token == '{': + level += 1 + id = '' + elif token == '}': + level -= 1 + id = '' + elif token == '[': + if level != 2 or arrlvl != 1: + pass + elif array == '': + array = ' ' + else: + array = "%s;" % (array,) + arrlvl += 1 + elif token == ']': + arrlvl -= 1 + elif re_compat_handle.match(token): + if level == 2 and id == '': + m = re_compat_handle.match(token) + type = m.groups()[0] + type = removeprefix(type, 'compat_') + elif token == "compat_domain_handle_t": + if level == 2 and id == '': + array_type = token + elif re_identifier.match(token): + if array != '': + array = "%s %s" % (array, token) + else: + id = token + elif token in (',', ';'): + if level == 2 and not re_pad.match(id): + if array == '' and array_type == '': + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + handle_field(" ", name, id, type, fields) + elif array == '': + copy_array(" ", id) + else: + (head, sep, tmp) = array.partition(';') + if sep == '': + tmp = head + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + handle_array(" ", name, id, tmp, type, fields) + if token == ';': + fields = [] + id = '' + type = '' + array = '' + else: + if array != '': + array = "%s %s" % (array, token) + if len(fields) > 0: + fields.append(token) + print(" \\\n} while (0)") + +def check_field(kind, name, field, extrafields): + if not re_brackets.search(' '.join(extrafields)): + print("; \\") + if len(extrafields) != 0: + for token in extrafields: + if token in ('struct', 'union'): + pass + elif re_identifier.match(token): + print(" CHECK_%s" % (removeprefix(token, 'xen_'),), end='') + break + else: + raise Exception("Malformed compound declaration: '%s'" % (token,)) + elif not '.' in field: + print(" CHECK_FIELD_(%s, %s, %s)" % (kind, name, field), end='') + else: + n = field.count('.') + field = field.replace('.', ', ') + print(" CHECK_SUBFIELD_%s_(%s, %s, %s)" % (n, kind, name, field), end='') + else: + level = 1 + fields = [] + id = '' + + for token in extrafields: + if token in ('struct', 'union'): + if level == 2: + fields = [''] + elif token == '{': + level += 1 + id = '' + elif token == '}': + level -= 1 + id = '' + elif re_compat.match(token): + if level == 2: + fields = [''] + token = removesuffix(token, '_t') + token = removeprefix(token, 'compat_') + elif re.match(r'^evtchn_.*_compat_t$', token): + if level == 2 and token != "evtchn_port_compat_t": + fields = [''] + token = removesuffix(token, '_compat_t') + elif re_identifier.match(token): + id = token + elif token in (',', ';'): + if level == 2 and not re_pad.match(id): + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + check_field(kind, name, "%s.%s" % (field, id), fields) + if token == ";": + fields = [] + id = '' + if len(fields) > 0: + fields.append(token) + +def build_check(name, tokens): + level = 1 + fields = [] + kind = '' + id = '' + arrlvl = 1 + + print("") + print("#define CHECK_%s \\" % (name,)) + + for token in tokens: + if token in ('struct', 'union'): + if level == 1: + kind = token + print(" CHECK_SIZE_(%s, %s)" % (kind, name), end='') + elif level == 2: + fields = [''] + elif token == '{': + level += 1 + id = '' + elif token == '}': + level -= 1 + id = '' + elif token == '[': + arrlvl += 1 + elif token == ']': + arrlvl -= 1 + elif re_compat.match(token): + if level == 2 and token != "compat_argo_port_t": + fields = [''] + token = removesuffix(token, '_t') + token = removeprefix(token, 'compat_') + elif re_identifier.match(token): + if not (level != 2 or arrlvl != 1): + id = token + elif token in (',', ';'): + if level == 2 and not re_pad.match(id): + if len(fields) > 0 and fields[0] == '': + fields.pop(0) + check_field(kind, name, id, fields) + if token == ";": + fields = [] + id = '' + + if len(fields) > 0: + fields.append(token) + print("") + + +def main(): + header_tokens = [] + re_tokenazier = re.compile(r'\s+') + re_skip_line = re.compile(r'^\s*(#|$)') + re_spacer = re.compile(r'([\]\[,;:{}])') + + with open(sys.argv[1]) as header: + for line in header: + if re_skip_line.match(line): + continue + line = re_spacer.sub(' \\1 ', line) + line = line.strip() + header_tokens += re_tokenazier.split(line) + + with open(sys.argv[2]) as compat_list: + for line in compat_list: + words = re_tokenazier.split(line, maxsplit=1) + what = words[0] + name = words[1] + + name = removeprefix(name, 'xen') + name = name.strip() + + fields = get_fields("compat_%s" % (name,), header_tokens) + if len(fields) == 0: + raise Exception("Fields of 'compat_%s' not found in '%s'" % (name, sys.argv[1])) + + if what == "!": + build_enums(name, fields) + build_body(name, fields) + elif what == "?": + build_check(name, fields) + else: + raise Exception("Invalid translation indicator: '%s'" % (what,)) + +if __name__ == '__main__': + main() diff --git a/xen/tools/get-fields.sh b/xen/tools/get-fields.sh deleted file mode 100644 index ad4a7aacc6..0000000000 --- a/xen/tools/get-fields.sh +++ /dev/null @@ -1,473 +0,0 @@ -test -n "$1" -a -n "$2" -a -n "$3" -set -ef - -SED=sed -if test -x /usr/xpg4/bin/sed; then - SED=/usr/xpg4/bin/sed -fi -if test -z ${PYTHON}; then - PYTHON=`/usr/bin/env python` -fi -if test -z ${PYTHON}; then - echo "Python not found" - exit 1 -fi - -get_fields () -{ - local level=1 aggr=0 name= fields= - for token in $2 - do - case "$token" in - struct|union) - test $level != 1 || aggr=1 fields= name= - ;; - "{") - level=$(expr $level + 1) - ;; - "}") - level=$(expr $level - 1) - if [ $level = 1 -a $name = $1 ] - then - echo "$fields }" - return 0 - fi - ;; - [a-zA-Z_]*) - test $aggr = 0 -o -n "$name" || name="$token" - ;; - esac - test $aggr = 0 || fields="$fields $token" - done -} - -build_enums () -{ - local level=1 kind= fields= members= named= id= token - for token in $2 - do - case "$token" in - struct|union) - test $level != 2 || fields=" " - kind="$token;$kind" - ;; - "{") - level=$(expr $level + 1) - ;; - "}") - level=$(expr $level - 1) - if [ $level = 1 ] - then - if [ "${kind%%;*}" = union ] - then - echo - echo "enum XLAT_$1 {" - for m in $members - do - echo " XLAT_${1}_$m," - done - echo "};" - fi - return 0 - elif [ $level = 2 ] - then - named='?' - fi - ;; - [a-zA-Z]*) - id=$token - if [ -n "$named" -a -n "${kind#*;}" ] - then - build_enums ${1}_$token "$fields" - named='!' - fi - ;; - ",") - test $level != 2 || members="$members $id" - ;; - ";") - test $level != 2 || members="$members $id" - test -z "$named" || kind=${kind#*;} - named= - ;; - esac - test -z "$fields" || fields="$fields $token" - done -} - -handle_field () -{ - if [ -z "$5" ] - then - echo " \\" - if [ -z "$4" ] - then - printf %s "$1(_d_)->$3 = (_s_)->$3;" - else - printf %s "$1XLAT_${2}_HNDL_$(echo $3 | $SED 's,\.,_,g')(_d_, _s_);" - fi - elif [ -z "$(echo "$5" | $SED 's,[^{}],,g')" ] - then - local tag=$(echo "$5" | ${PYTHON} -c ' -import re,sys -for line in sys.stdin.readlines(): - sys.stdout.write(re.subn(r"\s*(struct|union)\s+(compat_)?(\w+)\s.*", r"\3", line)[0].rstrip() + "\n") -') - echo " \\" - printf %s "${1}XLAT_$tag(&(_d_)->$3, &(_s_)->$3);" - else - local level=1 kind= fields= id= array= arrlvl=1 array_type= type= token - for token in $5 - do - case "$token" in - struct|union) - test $level != 2 || fields=" " - if [ $level = 1 ] - then - kind=$token - if [ $kind = union ] - then - echo " \\" - printf %s "${1}switch ($(echo $3 | $SED 's,\.,_,g')) {" - fi - fi - ;; - "{") - level=$(expr $level + 1) id= - ;; - "}") - level=$(expr $level - 1) id= - if [ $level = 1 -a $kind = union ] - then - echo " \\" - printf %s "$1}" - fi - ;; - "[") - if [ $level != 2 -o $arrlvl != 1 ] - then - : - elif [ -z "$array" ] - then - array=" " - else - array="$array;" - fi - arrlvl=$(expr $arrlvl + 1) - ;; - "]") - arrlvl=$(expr $arrlvl - 1) - ;; - COMPAT_HANDLE\(*\)) - if [ $level = 2 -a -z "$id" ] - then - type=${token#COMPAT_HANDLE?} - type=${type%?} - type=${type#compat_} - fi - ;; - compat_domain_handle_t) - if [ $level = 2 -a -z "$id" ] - then - array_type=$token - fi - ;; - [a-zA-Z]*) - id=$token - ;; - [\,\;]) - if [ $level = 2 -a -n "$(echo $id | $SED 's,^_pad[[:digit:]]*,,')" ] - then - if [ $kind = union ] - then - echo " \\" - printf %s "${1}case XLAT_${2}_$(echo $3.$id | $SED 's,\.,_,g'):" - handle_field "$1 " $2 $3.$id "$type" "$fields" - elif [ -z "$array" -a -z "$array_type" ] - then - handle_field "$1" $2 $3.$id "$type" "$fields" - elif [ -z "$array" ] - then - copy_array " " $3.$id - else - handle_array "$1" $2 $3.$id "${array#*;}" "$type" "$fields" - fi - test "$token" != ";" || fields= id= type= - array= - if [ $kind = union ] - then - echo " \\" - printf %s "$1 break;" - fi - fi - ;; - *) - if [ -n "$array" ] - then - array="$array $token" - fi - ;; - esac - test -z "$fields" || fields="$fields $token" - done - fi -} - -copy_array () -{ - echo " \\" - echo "${1}if ((_d_)->$2 != (_s_)->$2) \\" - printf %s "$1 memcpy((_d_)->$2, (_s_)->$2, sizeof((_d_)->$2));" -} - -handle_array () -{ - local i="i$(echo $4 | $SED 's,[^;], ,g' | wc -w | $SED 's,[[:space:]]*,,g')" - echo " \\" - echo "$1{ \\" - echo "$1 unsigned int $i; \\" - printf %s "$1 for ($i = 0; $i < "${4%%;*}"; ++$i) {" - if [ "$4" = "${4#*;}" ] - then - handle_field "$1 " $2 $3[$i] "$5" "$6" - else - handle_array "$1 " $2 $3[$i] "${4#*;}" "$5" "$6" - fi - echo " \\" - echo "$1 } \\" - printf %s "$1}" -} - -build_body () -{ - echo - printf %s "#define XLAT_$1(_d_, _s_) do {" - local level=1 fields= id= array= arrlvl=1 array_type= type= token - for token in $2 - do - case "$token" in - struct|union) - test $level != 2 || fields=" " - ;; - "{") - level=$(expr $level + 1) id= - ;; - "}") - level=$(expr $level - 1) id= - ;; - "[") - if [ $level != 2 -o $arrlvl != 1 ] - then - : - elif [ -z "$array" ] - then - array=" " - else - array="$array;" - fi - arrlvl=$(expr $arrlvl + 1) - ;; - "]") - arrlvl=$(expr $arrlvl - 1) - ;; - COMPAT_HANDLE\(*\)) - if [ $level = 2 -a -z "$id" ] - then - type=${token#COMPAT_HANDLE?} - type=${type%?} - type=${type#compat_} - fi - ;; - compat_domain_handle_t) - if [ $level = 2 -a -z "$id" ] - then - array_type=$token - fi - ;; - [a-zA-Z_]*) - if [ -n "$array" ] - then - array="$array $token" - else - id=$token - fi - ;; - [\,\;]) - if [ $level = 2 -a -n "$(echo $id | $SED 's,^_pad[[:digit:]]*,,')" ] - then - if [ -z "$array" -a -z "$array_type" ] - then - handle_field " " $1 $id "$type" "$fields" - elif [ -z "$array" ] - then - copy_array " " $id - else - handle_array " " $1 $id "${array#*;}" "$type" "$fields" - fi - test "$token" != ";" || fields= id= type= - array= - fi - ;; - *) - if [ -n "$array" ] - then - array="$array $token" - fi - ;; - esac - test -z "$fields" || fields="$fields $token" - done - echo " \\" - echo "} while (0)" -} - -check_field () -{ - if [ -z "$(echo "$4" | $SED 's,[^{}],,g')" ] - then - echo "; \\" - local n=$(echo $3 | $SED 's,[^.], ,g' | wc -w | $SED 's,[[:space:]]*,,g') - if [ -n "$4" ] - then - for n in $4 - do - case $n in - struct|union) - ;; - [a-zA-Z_]*) - printf %s " CHECK_${n#xen_}" - break - ;; - *) - echo "Malformed compound declaration: '$n'" >&2 - exit 1 - ;; - esac - done - elif [ $n = 0 ] - then - printf %s " CHECK_FIELD_($1, $2, $3)" - else - printf %s " CHECK_SUBFIELD_${n}_($1, $2, $(echo $3 | $SED 's!\.!, !g'))" - fi - else - local level=1 fields= id= token - for token in $4 - do - case "$token" in - struct|union) - test $level != 2 || fields=" " - ;; - "{") - level=$(expr $level + 1) id= - ;; - "}") - level=$(expr $level - 1) id= - ;; - compat_*_t) - if [ $level = 2 ] - then - fields=" " - token="${token%_t}" - token="${token#compat_}" - fi - ;; - evtchn_*_compat_t) - if [ $level = 2 -a $token != evtchn_port_compat_t ] - then - fields=" " - token="${token%_compat_t}" - fi - ;; - [a-zA-Z]*) - id=$token - ;; - [\,\;]) - if [ $level = 2 -a -n "$(echo $id | $SED 's,^_pad[[:digit:]]*,,')" ] - then - check_field $1 $2 $3.$id "$fields" - test "$token" != ";" || fields= id= - fi - ;; - esac - test -z "$fields" || fields="$fields $token" - done - fi -} - -build_check () -{ - echo - echo "#define CHECK_$1 \\" - local level=1 fields= kind= id= arrlvl=1 token - for token in $2 - do - case "$token" in - struct|union) - if [ $level = 1 ] - then - kind=$token - printf %s " CHECK_SIZE_($kind, $1)" - elif [ $level = 2 ] - then - fields=" " - fi - ;; - "{") - level=$(expr $level + 1) id= - ;; - "}") - level=$(expr $level - 1) id= - ;; - "[") - arrlvl=$(expr $arrlvl + 1) - ;; - "]") - arrlvl=$(expr $arrlvl - 1) - ;; - compat_*_t) - if [ $level = 2 -a $token != compat_argo_port_t ] - then - fields=" " - token="${token%_t}" - token="${token#compat_}" - fi - ;; - [a-zA-Z_]*) - test $level != 2 -o $arrlvl != 1 || id=$token - ;; - [\,\;]) - if [ $level = 2 -a -n "$(echo $id | $SED 's,^_pad[[:digit:]]*,,')" ] - then - check_field $kind $1 $id "$fields" - test "$token" != ";" || fields= id= - fi - ;; - esac - test -z "$fields" || fields="$fields $token" - done - echo "" -} - -list="$($SED -e 's,^[[:space:]]#.*,,' -e 's!\([]\[,;:{}]\)! \1 !g' $3)" -fields="$(get_fields $(echo $2 | $SED 's,^compat_xen,compat_,') "$list")" -if [ -z "$fields" ] -then - echo "Fields of '$2' not found in '$3'" >&2 - exit 1 -fi -name=${2#compat_} -name=${name#xen} -case "$1" in -"!") - build_enums $name "$fields" - build_body $name "$fields" - ;; -"?") - build_check $name "$fields" - ;; -*) - echo "Invalid translation indicator: '$1'" >&2 - exit 1 - ;; -esac -- generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |