def cMembers(prefix, columnName, column, const):
type = column.type
- if is_optional_bool(type):
- const = True
if type.n_min == 1 and type.n_max == 1:
singleton = True
pointer = ''
print " %s" % members[-1]
print "};"
-def is_optional_bool(type):
- return (type.key.type == ovs.db.types.BooleanType and not type.value
- and type.n_min == 0 and type.n_max == 1)
-
def printCIDLSource(schemaFile):
schema = parseSchema(schemaFile)
prefix = schema.idlPrefix
#include "ovsdb-data.h"
#include "ovsdb-error.h"
+#ifdef __CHECKER__
+/* Sparse dislikes sizeof(bool) ("warning: expression using sizeof bool"). */
+enum { sizeof_bool = 1 };
+#else
+enum { sizeof_bool = sizeof(bool) };
+#endif
+
static bool inited;
''' % schema.idlHeader
keyVar = "row->%s" % columnName
valueVar = None
- if is_optional_bool(type):
- # Special case for an optional bool. This is only here because
- # sparse does not like the "normal" case below ("warning:
- # expression using sizeof bool").
- print
- print " assert(inited);"
- print " if (datum->n >= 1) {"
- print " static const bool false_value = false;"
- print " static const bool true_value = true;"
- print
- print " row->n_%s = 1;" % columnName
- print " %s = datum->keys[0].boolean ? &true_value : &false_value;" % keyVar
- print " } else {"
- print " row->n_%s = 0;" % columnName
- print " %s = NULL;" % keyVar
- print " }"
- elif (type.n_min == 1 and type.n_max == 1) or type.is_optional_pointer():
+ if (type.n_min == 1 and type.n_max == 1) or type.is_optional_pointer():
print
print " assert(inited);"
print " if (datum->n >= 1) {"
if not type.key.ref_table:
print " %s = datum->keys[0].%s;" % (keyVar, type.key.type.to_string())
else:
- print " %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->keys[0].uuid));" % (keyVar, prefix, type.key.ref_table.lower(), prefix, prefix.upper(), type.key.ref_table.upper())
+ print " %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->keys[0].uuid));" % (keyVar, prefix, type.key.ref_table.name.lower(), prefix, prefix.upper(), type.key.ref_table.name.upper())
if valueVar:
if type.value.ref_table:
print " %s = datum->values[0].%s;" % (valueVar, type.value.type.to_string())
else:
- print " %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->values[0].uuid));" % (valueVar, prefix, type.value.ref_table.lower(), prefix, prefix.upper(), type.value.ref_table.upper())
+ print " %s = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->values[0].uuid));" % (valueVar, prefix, type.value.ref_table.name.lower(), prefix, prefix.upper(), type.value.ref_table.name.upper())
print " } else {"
print " %s" % type.key.initCDefault(keyVar, type.n_min == 0)
if valueVar:
print " for (i = 0; i < %s; i++) {" % nMax
refs = []
if type.key.ref_table:
- print " struct %s%s *keyRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->keys[i].uuid));" % (prefix, type.key.ref_table.lower(), prefix, type.key.ref_table.lower(), prefix, prefix.upper(), type.key.ref_table.upper())
+ print " struct %s%s *keyRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->keys[i].uuid));" % (prefix, type.key.ref_table.name.lower(), prefix, type.key.ref_table.name.lower(), prefix, prefix.upper(), type.key.ref_table.name.upper())
keySrc = "keyRow"
refs.append('keyRow')
else:
keySrc = "datum->keys[i].%s" % type.key.type.to_string()
if type.value and type.value.ref_table:
- print " struct %s%s *valueRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->values[i].uuid));" % (prefix, type.value.ref_table.lower(), prefix, type.value.ref_table.lower(), prefix, prefix.upper(), type.value.ref_table.upper())
+ print " struct %s%s *valueRow = %s%s_cast(ovsdb_idl_get_row_arc(row_, &%stable_classes[%sTABLE_%s], &datum->values[i].uuid));" % (prefix, type.value.ref_table.name.lower(), prefix, type.value.ref_table.name.lower(), prefix, prefix.upper(), type.value.ref_table.name.upper())
valueSrc = "valueRow"
refs.append('valueRow')
elif valueVar:
else:
indent = " "
print "%sif (!row->n_%s) {" % (indent, columnName)
- print "%s %s = xmalloc(%s * sizeof *%s);" % (indent, keyVar, nMax, keyVar)
+
+ # Special case for boolean types. This is only here because
+ # sparse does not like the "normal" case ("warning: expression
+ # using sizeof bool").
+ if type.key.type == ovs.db.types.BooleanType:
+ sizeof = "sizeof_bool"
+ else:
+ sizeof = "sizeof *%s" % keyVar
+ print "%s %s = xmalloc(%s * %s);" % (indent, keyVar, nMax,
+ sizeof)
if valueVar:
- print "%s %s = xmalloc(%s * sizeof *%s);" % (indent, valueVar, nMax, valueVar)
+ # Special case for boolean types (see above).
+ if type.value.type == ovs.db.types.BooleanType:
+ sizeof = " * sizeof_bool"
+ else:
+ sizeof = "sizeof *%s" % valueVar
+ print "%s %s = xmalloc(%s * %s);" % (indent, valueVar,
+ nMax, sizeof)
print "%s}" % indent
print "%s%s[row->n_%s] = %s;" % (indent, keyVar, columnName, keySrc)
if valueVar:
print " %s_columns_init();" % structName
print "}"
+
def ovsdb_escape(string):
def escape(match):
c = match.group(0)
return '\\x%02x' % ord(c)
return re.sub(r'["\\\000-\037]', escape, string)
-
-
def usage():
print """\
%(argv0)s: ovsdb schema compiler