[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



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.