X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fovsdb-idlc.in;h=dfde735aac4e8b9f2c0f0efbfff3b3bb64931612;hb=2b540ecba2c583ec6050b5cc0017660eb101e4ed;hp=e5c81832a59f831e44b0bc61c3cf97e87a12eb68;hpb=7fae24e67c95b1dbe93497135ae533e39b61e110;p=openvswitch diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in index e5c81832..dfde735a 100755 --- a/ovsdb/ovsdb-idlc.in +++ b/ovsdb/ovsdb-idlc.in @@ -25,10 +25,14 @@ def constify(cType, const): else: return cType +def is_string_map(column): + return (column.type.key + and column.type.value + and column.type.key.type == ovs.db.types.StringType + and column.type.value.type == ovs.db.types.StringType) + 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 = '' @@ -142,6 +146,15 @@ struct %(s)s *%(s)s_insert(struct ovsdb_idl_txn *); in cMembers(prefix, columnName, column, True)] print '%s);' % ', '.join(args) + print + for columnName, column in sorted(table.columns.iteritems()): + if not is_string_map(column): + continue + print "const char *%(s)s_get_%(c)s_value(const struct %(s)s *," \ + " const char *key, const char *default_value);" \ + % {'s': structName, 'c': columnName} + + # Table indexes. printEnum(["%sTABLE_%s" % (prefix.upper(), tableName.upper()) for tableName in sorted(schema.tables)] + ["%sN_TABLES" % prefix.upper()]) print @@ -167,10 +180,6 @@ def printEnum(members): 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 @@ -184,9 +193,32 @@ def printCIDLSource(schemaFile): #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 + try: + for table in schema.tables.itervalues(): + for column in table.columns.itervalues(): + if is_string_map(column): + print """\ +static int +bsearch_strcmp(const void *a_, const void *b_) +{ + char *const *a = a_; + char *const *b = b_; + return strcmp(*a, *b); +}""" + raise StopIteration + except StopIteration: + pass + # Cast functions. for tableName, table in sorted(schema.tables.iteritems()): structName = "%s%s" % (prefix, tableName.lower()) @@ -221,36 +253,20 @@ static void 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: @@ -272,13 +288,13 @@ static void 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: @@ -289,9 +305,24 @@ static void 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: @@ -305,15 +336,7 @@ static void # Unparse functions. for columnName, column in sorted(table.columns.iteritems()): type = column.type - if (type.key.type == ovs.db.types.BooleanType and not type.value - and type.n_min == 0 and type.n_max == 1): - print ''' -static void -%(s)s_unparse_%(c)s(struct ovsdb_idl_row *row OVS_UNUSED) -{ - /* Nothing to do. */ -}''' % {'s': structName, 'c': columnName} - elif (type.n_min != 1 or type.n_max != 1) and not type.is_optional_pointer(): + if (type.n_min != 1 or type.n_max != 1) and not type.is_optional_pointer(): print ''' static void %(s)s_unparse_%(c)s(struct ovsdb_idl_row *row_) @@ -492,6 +515,25 @@ const struct ovsdb_datum * 'C': columnName.upper()} print "}" + # String Map Helpers. + for columnName, column in sorted(table.columns.iteritems()): + if not is_string_map(column): + continue + + print """ +const char * %(s)s_get_%(c)s_value(const struct %(s)s *row, const char *search_key, const char *default_value) +{ + char **keys = row->key_%(c)s; + char **values = row->value_%(c)s; + size_t n_keys = row->n_%(c)s; + char ** result_key; + + assert(inited); + result_key = bsearch(&search_key, keys, n_keys, sizeof *keys, + bsearch_strcmp); + return result_key ? values[result_key - keys] : default_value; +}""" % {'s': structName, 'c': columnName} + # Table columns. print "\nstruct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % ( structName, structName.upper()) @@ -548,6 +590,7 @@ void print " %s_columns_init();" % structName print "}" + def ovsdb_escape(string): def escape(match): c = match.group(0) @@ -569,8 +612,6 @@ def ovsdb_escape(string): return '\\x%02x' % ord(c) return re.sub(r'["\\\000-\037]', escape, string) - - def usage(): print """\ %(argv0)s: ovsdb schema compiler