[libvirt] [PATCH 1/7] Rewrite keycode map to avoid a struct

Michal Privoznik mprivozn at redhat.com
Fri Apr 5 13:15:04 UTC 2013


On 03.04.2013 17:06, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Playing games with field offsets in a struct causes all sorts
> of alignment warnings on ARM platforms
> 
> util/virkeycode.c: In function '__virKeycodeValueFromString':
> util/virkeycode.c:26:7: warning: cast increases required alignment of target type [-Wcast-align]
>      (*(typeof(field_type) *)((char *)(object) + field_offset))
>        ^
> util/virkeycode.c:91:28: note: in expansion of macro 'getfield'
>          const char *name = getfield(virKeycodes + i, const char *, name_offset);
>                             ^
> util/virkeycode.c:26:7: warning: cast increases required alignment of target type [-Wcast-align]
>      (*(typeof(field_type) *)((char *)(object) + field_offset))
>        ^
> util/virkeycode.c:94:20: note: in expansion of macro 'getfield'
>              return getfield(virKeycodes + i, unsigned short, code_offset);
>                     ^
> util/virkeycode.c: In function '__virKeycodeValueTranslate':
> util/virkeycode.c:26:7: warning: cast increases required alignment of target type [-Wcast-align]
>      (*(typeof(field_type) *)((char *)(object) + field_offset))
>        ^
> util/virkeycode.c:127:13: note: in expansion of macro 'getfield'
>          if (getfield(virKeycodes + i, unsigned short, from_offset) == key_value)
>              ^
> util/virkeycode.c:26:7: warning: cast increases required alignment of target type [-Wcast-align]
>      (*(typeof(field_type) *)((char *)(object) + field_offset))
>        ^
> util/virkeycode.c:128:20: note: in expansion of macro 'getfield'
>              return getfield(virKeycodes + i, unsigned short, to_offset);
> 
> There is no compelling reason to use a struct for the keycode
> tables. It can easily just use an array of arrays instead,
> avoiding all alignment problems
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/util/virkeycode-mapgen.py |  78 ++++++++++++++++++-------
>  src/util/virkeycode.c         | 130 ++++++++++++++++++------------------------
>  2 files changed, 110 insertions(+), 98 deletions(-)
> 
> diff --git a/src/util/virkeycode-mapgen.py b/src/util/virkeycode-mapgen.py
> index d3d2aae..34de637 100755
> --- a/src/util/virkeycode-mapgen.py
> +++ b/src/util/virkeycode-mapgen.py
> @@ -13,7 +13,22 @@ instead of keymaps.csv which is a mirror.
>  import sys
>  import re
>  
> -namecolums = (0,2,10)
> +cols = (
> +    ["linux", True],
> +    ["linux", False],
> +    ["os_x", True],
> +    ["os_x", False],
> +    ["atset1", False],
> +    ["atset2", False],
> +    ["atset3", False],
> +    ["xt", False],
> +    ["xt_kbd", False],
> +    ["usb", False],
> +    ["win32", True],
> +    ["win32", False],
> +    ["rfb", False],
> +)
> +
>  xtkbdkey_index = 8
>  
>  def quotestring(str):
> @@ -28,29 +43,48 @@ print '''
>  # error do not use this; it is not a public header
>  #endif
>  
> -struct keycode virKeycodes[] = {
>  '''
>  
>  sys.stdin.readline() # eat the fist line.
>  
> +keycodes = []
> +
> +max = 0
> +
>  for line in sys.stdin.xreadlines():
> -    a = re.match("([^,]*)," * 13 + "([^,]*)$", line[0:-1]).groups()
> -    b = ""
> -    rfbkey = 0
> -    for i in namecolums:
> -        b = b + (a[i] and quotestring(a[i]) or 'NULL') + ','
> -    for i in [ x for x in range(12) if not x in namecolums ]:
> -        b = b + (a[i] or '0') + ','
> -        if i == xtkbdkey_index:
> -            # RFB keycodes are XT kbd keycodes with a slightly
> -            # different encoding of 0xe0 scan codes. RFB uses
> -            # the high bit of the first byte, instead of the low
> -            # bit of the second byte.
> -            rfbkey = int(a[i] or '0')
> -            rfbkey = (rfbkey & 0x100) >> 1 | (rfbkey & 0x7f)
> -
> -    # Append RFB keycode as the last column
> -    b = b + str(rfbkey)
> -    print "    { " + b + "},"
> -
> -print '};'
> +    values = re.match("([^,]*)," * 13 + "([^,]*)$", line[0:-1]).groups()
> +
> +    data = []
> +    for v in values:
> +        data.append(v)
> +
> +    # RFB keycodes are XT kbd keycodes with a slightly
> +    # different encoding of 0xe0 scan codes. RFB uses
> +    # the high bit of the first byte, instead of the low
> +    # bit of the second byte.
> +    rfbkey = int(data[xtkbdkey_index] or '0')
> +    rfbkey = (rfbkey & 0x100) >> 1 | (rfbkey & 0x7f)
> +    data.append(rfbkey)
> +
> +    keycodes.append(data)
> +    max = max + 1
> +
> +print "#define VIR_KEYMAP_ENTRY_MAX " + str(max)
> +
> +for i in range(len(cols)):
> +    col=cols[i]
> +    name=col[0]
> +    isname=col[1]
> +    if isname:
> +        print "const char *virKeymapNames_" + name + "[] = {"
> +    else:
> +        print "unsigned short virKeymapValues_" + name + "[] = {"
> +
> +    for entry in keycodes:
> +        if isname:
> +            print "  " + quotestring(entry[i] or "NULL") + ","
> +        else:
> +            print "  " + (entry[i] or "0") + ","
> +
> +    print "};\n"
> +

Empty line at EOF.

Michal




More information about the libvir-list mailing list