Lines Matching +full:entry +full:- +full:name

3 # Copyright (c) 2005-2007 Niels Provos <provos@citi.umich.edu>
4 # Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
9 # pylint: disable=too-many-lines
10 # pylint: disable=too-many-branches
11 # pylint: disable=too-many-public-methods
12 # pylint: disable=too-many-statements
13 # pylint: disable=global-statement
35 STRUCT_REF_RE = re.compile(r"^struct\[(?P<name>[a-zA-Z_][a-zA-Z0-9_]*)\]$")
36 STRUCT_DEF_RE = re.compile(r"^struct +[a-zA-Z_][a-zA-Z0-9_]* *{$")
57 def __init__(self, why): # pylint: disable=super-init-not-called
66 def __init__(self, name): argument
67 self._name = name
70 declare(" Created struct: %s" % name)
72 def AddEntry(self, entry): argument
73 if entry.Tag() in self._tags:
75 'Entry "%s" duplicates tag number %d from "%s" '
77 % (entry.Name(), entry.Tag(), self._tags[entry.Tag()], LINE_COUNT)
79 self._entries.append(entry)
80 self._tags[entry.Tag()] = entry.Name()
81 declare(" Added entry: %s" % entry.Name())
83 def Name(self): member in Struct
86 def EntryTagName(self, entry): argument
87 """Creates the name inside an enumeration for distinguishing data
89 name = "%s_%s" % (self._name, entry.Name())
90 return name.upper()
94 """Takes an array, add indentation to each entry and prints it."""
95 for entry in code:
96 filep.write("%s%s\n" % (ident, entry))
102 def __init__(self, name): argument
103 Struct.__init__(self, name)
109 for entry in self._entries:
110 filep.write(" %s=%d,\n" % (self.EntryTagName(entry), entry.Tag()))
120 for entry in self._entries:
121 dcl = entry.AssignDeclaration("(*%s_assign)" % entry.Name())
122 dcl.extend(entry.GetDeclaration("(*%s_get)" % entry.Name()))
123 if entry.Array():
124 dcl.extend(entry.AddDeclaration("(*%s_add)" % entry.Name()))
130 for entry in self._entries:
131 dcl = entry.Declaration()
134 for entry in self._entries:
135 filep.write(" ev_uint8_t %s_set;\n" % entry.Name())
139 """struct %(name)s *%(name)s_new(void);
140 struct %(name)s *%(name)s_new_with_arg(void *);
141 void %(name)s_free(struct %(name)s *);
142 void %(name)s_clear(struct %(name)s *);
143 void %(name)s_marshal(struct evbuffer *, const struct %(name)s *);
144 int %(name)s_unmarshal(struct %(name)s *, struct evbuffer *);
145 int %(name)s_complete(struct %(name)s *);
146 void evtag_marshal_%(name)s(struct evbuffer *, ev_uint32_t,
147 const struct %(name)s *);
148 int evtag_unmarshal_%(name)s(struct evbuffer *, ev_uint32_t,
149 struct %(name)s *);\n"""
150 % {"name": self._name}
154 for entry in self._entries:
156 filep, "", entry.AssignDeclaration(entry.AssignFuncName())
158 self.PrintIndented(filep, "", entry.GetDeclaration(entry.GetFuncName()))
159 if entry.Array():
160 self.PrintIndented(filep, "", entry.AddDeclaration(entry.AddFuncName()))
162 filep.write("/* --- %s done --- */\n\n" % self._name)
175 static struct %(name)s_access_ %(name)s_base__ = {
177 % {"name": self._name}
179 for entry in self._entries:
180 self.PrintIndented(filep, " ", entry.CodeBase())
185 """struct %(name)s *
186 %(name)s_new(void)
188 return %(name)s_new_with_arg(NULL);
191 struct %(name)s *
192 %(name)s_new_with_arg(void *unused)
194 struct %(name)s *tmp;
195 if ((tmp = malloc(sizeof(struct %(name)s))) == NULL) {
199 tmp->base = &%(name)s_base__;
202 % {"name": self._name}
205 for entry in self._entries:
206 self.PrintIndented(filep, " ", entry.CodeInitialize("tmp"))
207 filep.write(" tmp->%s_set = 0;\n\n" % entry.Name())
217 for entry in self._entries:
218 if entry.Array():
219 self.PrintIndented(filep, "", entry.CodeAdd())
223 for entry in self._entries:
224 self.PrintIndented(filep, "", entry.CodeAssign())
228 for entry in self._entries:
229 self.PrintIndented(filep, "", entry.CodeGet())
235 %(name)s_clear(struct %(name)s *tmp)
238 % {"name": self._name}
240 for entry in self._entries:
241 self.PrintIndented(filep, " ", entry.CodeClear("tmp"))
248 %(name)s_free(struct %(name)s *tmp)
251 % {"name": self._name}
254 for entry in self._entries:
255 self.PrintIndented(filep, " ", entry.CodeFree("tmp"))
267 %(name)s_marshal(struct evbuffer *evbuf, const struct %(name)s *tmp) {
269 % {"name": self._name}
271 for entry in self._entries:
274 if entry.Optional():
276 filep.write(" if (tmp->%s_set) {\n" % entry.Name())
280 entry.CodeMarshal(
282 self.EntryTagName(entry),
283 entry.GetVarName("tmp"),
284 entry.GetVarLen("tmp"),
287 if entry.Optional():
295 %(name)s_unmarshal(struct %(name)s *tmp, struct evbuffer *evbuf)
299 if (evtag_peek(evbuf, &tag) == -1)
300 return (-1);
304 % {"name": self._name}
306 for entry in self._entries:
307 filep.write(" case %s:\n" % (self.EntryTagName(entry)))
308 if not entry.Array():
310 """ if (tmp->%s_set)
311 return (-1);
313 % (entry.Name())
319 entry.CodeUnmarshal(
321 self.EntryTagName(entry),
322 entry.GetVarName("tmp"),
323 entry.GetVarLen("tmp"),
328 """ tmp->%s_set = 1;
331 % (entry.Name())
335 return -1;
343 """ if (%(name)s_complete(tmp) == -1)
344 return (-1);
348 % {"name": self._name}
355 %(name)s_complete(struct %(name)s *msg)
358 % {"name": self._name}
360 for entry in self._entries:
361 if not entry.Optional():
363 """if (!msg->%(name)s_set)
364 return (-1);"""
366 code = TranslateList(code, entry.GetTranslation())
370 filep, " ", entry.CodeComplete("msg", entry.GetVarName("msg"))
382 evtag_unmarshal_%(name)s(struct evbuffer *evbuf, ev_uint32_t need_tag,
383 struct %(name)s *msg)
386 int res = -1;
390 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
393 if (%(name)s_unmarshal(msg, tmp) == -1)
403 % {"name": self._name}
410 evtag_marshal_%(name)s(struct evbuffer *evbuf, ev_uint32_t tag,
411 const struct %(name)s *msg)
415 %(name)s_marshal(buf_, msg);
421 % {"name": self._name}
425 class Entry(object): class
426 def __init__(self, ent_type, name, tag): argument
428 self._name = name
434 self._line_count = -1
443 raise NotImplementedError("Entry does not provide an initializer")
449 assert self._line_count != -1
464 def Name(self): member in Entry
479 'Entry "%s" cannot be created as an array '
484 'Entry "%s" does not know which struct it belongs to '
489 'Entry "%s" has illegal combination of optional and array '
497 "parent_name": self._struct.Name(),
498 "name": self._name,
511 return "%(var)s->%(name)s_data" % self.GetTranslation({"var": var})
517 return "%s_%s_get" % (self._struct.Name(), self._name)
521 "int %s(struct %s *, %s *);" % (funcname, self._struct.Name(), self._ctype)
527 %(parent_name)s_%(name)s_get(struct %(parent_name)s *msg, %(ctype)s *value)
529 if (msg->%(name)s_set != 1)
530 return (-1);
531 *value = msg->%(name)s_data;
538 return "%s_%s_assign" % (self._struct.Name(), self._name)
541 return "%s_%s_add" % (self._struct.Name(), self._name)
546 % (funcname, self._struct.Name(), self._ctype)
553 "%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg,"
556 " msg->%(name)s_set = 1;",
557 " msg->%(name)s_data = value;",
566 code = ["%s->%s_set = 0;" % (structname, self.Name())]
579 code = ["%(parent_name)s_%(name)s_assign,", "%(parent_name)s_%(name)s_get,"]
581 code.append("%(parent_name)s_%(name)s_add,")
588 class EntryBytes(Entry):
589 def __init__(self, ent_type, name, tag, length): argument
591 super(EntryBytes, self).__init__(ent_type, name, tag)
610 "int %s(struct %s *, %s **);" % (funcname, self._struct.Name(), self._ctype)
617 % (funcname, self._struct.Name(), self._ctype)
627 name = self._name
631 % (self._struct.Name(), name, self._struct.Name(), self._ctype),
633 " if (msg->%s_set != 1)" % name,
634 " return (-1);",
635 " *value = msg->%s_data;" % name,
642 name = self._name
646 % (self._struct.Name(), name, self._struct.Name(), self._ctype),
648 " msg->%s_set = 1;" % name,
649 " memcpy(msg->%s_data, value, %s);" % (name, self._length),
658 "%(var)s, %(varlen)s) == -1) {",
659 ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);',
660 " return (-1);",
677 "%s->%s_set = 0;" % (structname, self.Name()),
678 "memset(%s->%s_data, 0, sizeof(%s->%s_data));"
684 def CodeInitialize(self, name): argument
686 "memset(%s->%s_data, 0, sizeof(%s->%s_data));"
687 % (name, self._name, name, self._name)
694 'Entry "%s" needs a length '
701 class EntryInt(Entry):
702 def __init__(self, ent_type, name, tag, bits=32): argument
704 super(EntryInt, self).__init__(ent_type, name, tag)
728 """Returns a new entry of this type."""
733 "if (evtag_unmarshal_%(ma)s(%(buf)s, %(tag)s, &%(var)s) == -1) {",
734 ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);',
735 " return (-1);",
755 def CodeInitialize(self, name): argument
756 code = ["%s->%s_data = 0;" % (name, self._name)]
760 class EntryString(Entry):
761 def __init__(self, ent_type, name, tag): argument
763 super(EntryString, self).__init__(ent_type, name, tag)
786 " return (-1);",
816 %(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg,
819 if (msg->%(name)s_data != NULL)
820 free(msg->%(name)s_data);
821 if ((msg->%(name)s_data = strdup(value)) == NULL)
822 return (-1);
823 msg->%(name)s_set = 1;
833 "if (evtag_unmarshal_string(%(buf)s, %(tag)s, &%(var)s) == -1) {",
834 ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);',
835 " return (-1);",
850 "if (%s->%s_set == 1) {" % (structname, self.Name()),
851 " free(%s->%s_data);" % (structname, self.Name()),
852 " %s->%s_data = NULL;" % (structname, self.Name()),
853 " %s->%s_set = 0;" % (structname, self.Name()),
859 def CodeInitialize(self, name): argument
860 code = ["%s->%s_data = NULL;" % (name, self._name)]
863 def CodeFree(self, name): argument
865 "if (%s->%s_data != NULL)" % (name, self._name),
866 " free (%s->%s_data);" % (name, self._name),
877 class EntryStruct(Entry):
878 def __init__(self, ent_type, name, tag, refname): argument
880 super(EntryStruct, self).__init__(ent_type, name, tag)
892 return "-1"
918 "if (%(refname)s_unmarshal(%(var)s, tmp) == -1) {",
928 " return (-1);",
935 name = self._name
939 % (self._struct.Name(), name, self._struct.Name(), self._ctype),
941 " if (msg->%s_set != 1) {" % name,
942 " msg->%s_data = %s_new();" % (name, self._refname),
943 " if (msg->%s_data == NULL)" % name,
944 " return (-1);",
945 " msg->%s_set = 1;" % name,
947 " *value = msg->%s_data;" % name,
956 %(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg,
960 if (msg->%(name)s_set) {
961 %(refname)s_clear(msg->%(name)s_data);
962 msg->%(name)s_set = 0;
964 msg->%(name)s_data = %(refname)s_new();
965 if (msg->%(name)s_data == NULL) {
975 if (%(refname)s_unmarshal(msg->%(name)s_data, tmp) == -1) {
979 msg->%(name)s_set = 1;
985 if (msg->%(name)s_data != NULL) {
986 %(refname)s_free(msg->%(name)s_data);
987 msg->%(name)s_data = NULL;
989 return (-1);
997 "if (%(structname)s->%(name)s_set && "
998 "%(refname)s_complete(%(var)s) == -1)",
999 " return (-1);",
1010 " return (-1);",
1012 " %(var)s) == -1) {",
1013 ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);',
1014 " return (-1);",
1030 "if (%s->%s_set == 1) {" % (structname, self.Name()),
1031 " %s_free(%s->%s_data);" % (self._refname, structname, self.Name()),
1032 " %s->%s_data = NULL;" % (structname, self.Name()),
1033 " %s->%s_set = 0;" % (structname, self.Name()),
1039 def CodeInitialize(self, name): argument
1040 code = ["%s->%s_data = NULL;" % (name, self._name)]
1043 def CodeFree(self, name): argument
1045 "if (%s->%s_data != NULL)" % (name, self._name),
1046 " %s_free(%s->%s_data);" % (self._refname, name, self._name),
1057 class EntryVarBytes(Entry):
1058 def __init__(self, ent_type, name, tag): argument
1060 super(EntryVarBytes, self).__init__(ent_type, name, tag)
1069 return "%(var)s->%(name)s_length" % self.GetTranslation({"var": var})
1079 % (funcname, self._struct.Name(), self._ctype)
1086 % (funcname, self._struct.Name(), self._ctype)
1091 name = self._name
1096 % (self._struct.Name(), name, self._struct.Name(), self._ctype),
1098 " if (msg->%s_data != NULL)" % name,
1099 " free (msg->%s_data);" % name,
1100 " msg->%s_data = malloc(len);" % name,
1101 " if (msg->%s_data == NULL)" % name,
1102 " return (-1);",
1103 " msg->%s_set = 1;" % name,
1104 " msg->%s_length = len;" % name,
1105 " memcpy(msg->%s_data, value, len);" % name,
1112 name = self._name
1116 % (self._struct.Name(), name, self._struct.Name(), self._ctype),
1118 " if (msg->%s_set != 1)" % name,
1119 " return (-1);",
1120 " *value = msg->%s_data;" % name,
1121 " *plen = msg->%s_length;" % name,
1129 "if (evtag_payload_length(%(buf)s, &%(varlen)s) == -1)",
1130 " return (-1);",
1133 " return (-1);",
1135 " return (-1);",
1137 "%(varlen)s) == -1) {",
1138 ' event_warnx("%%s: failed to unmarshal %(name)s", __func__);',
1139 " return (-1);",
1154 "if (%s->%s_set == 1) {" % (structname, self.Name()),
1155 " free (%s->%s_data);" % (structname, self.Name()),
1156 " %s->%s_data = NULL;" % (structname, self.Name()),
1157 " %s->%s_length = 0;" % (structname, self.Name()),
1158 " %s->%s_set = 0;" % (structname, self.Name()),
1164 def CodeInitialize(self, name): argument
1166 "%s->%s_data = NULL;" % (name, self._name),
1167 "%s->%s_length = 0;" % (name, self._name),
1171 def CodeFree(self, name): argument
1173 "if (%s->%s_data != NULL)" % (name, self._name),
1174 " free(%s->%s_data);" % (name, self._name),
1188 class EntryArray(Entry):
1191 def __init__(self, entry): argument
1193 super(EntryArray, self).__init__(entry._type, entry._name, entry._tag)
1195 self._entry = entry
1196 self._refname = entry._refname
1202 # provide a new function for accessing the variable name
1204 return "%(var)s->%(name)s_data[%(index)s]" % self._entry.GetTranslation(
1217 return "-1"
1230 % (funcname, self._struct.Name(), self._ctype)
1244 %(parent_name)s_%(name)s_get(struct %(parent_name)s *msg, int offset,
1247 if (!msg->%(name)s_set || offset < 0 || offset >= msg->%(name)s_length)
1248 return (-1);
1249 *value = msg->%(name)s_data[offset];
1261 "%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg, int off,",
1264 " if (!msg->%(name)s_set || off < 0 || off >= msg->%(name)s_length)",
1265 " return (-1);",
1272 "msg->%(name)s_data[off]" % self.GetTranslation(), "value"
1282 "msg->%(name)s_data[msg->%(name)s_length - 1]" % self.GetTranslation(),
1287 "%(parent_name)s_%(name)s_expand_to_hold_more("
1290 " int tobe_allocated = msg->%(name)s_num_allocated;",
1293 " new_data = (%(ctype)s*) realloc(msg->%(name)s_data,",
1296 " return -1;",
1297 " msg->%(name)s_data = new_data;",
1298 " msg->%(name)s_num_allocated = tobe_allocated;",
1303 "%(parent_name)s_%(name)s_add(struct %(parent_name)s *msg%(optaddarg)s)",
1305 " if (++msg->%(name)s_length >= msg->%(name)s_num_allocated) {",
1306 " if (%(parent_name)s_%(name)s_expand_to_hold_more(msg)<0)",
1317 " msg->%(name)s_set = 1;",
1318 " return %(optreference)s(msg->%(name)s_data["
1319 "msg->%(name)s_length - 1]);",
1321 " --msg->%(name)s_length;",
1341 " for (i = 0; i < %(structname)s->%(name)s_length; ++i) {",
1362 "if (%(var)s->%(name)s_length >= %(var)s->%(name)s_num_allocated &&",
1363 " %(parent_name)s_%(name)s_expand_to_hold_more(%(var)s) < 0) {",
1365 " return (-1);",
1372 self._index = "%(var)s->%(name)s_length" % translate
1380 code += ["++%(var)s->%(name)s_length;" % translate]
1385 code = ["{", " int i;", " for (i = 0; i < %(var)s->%(name)s_length; ++i) {"]
1403 "%(structname)s->%(name)s_data[i]"
1407 code = ["if (%(structname)s->%(name)s_set == 1) {"]
1412 " for (i = 0; i < %(structname)s->%(name)s_length; ++i) {",
1423 " free(%(structname)s->%(name)s_data);",
1424 " %(structname)s->%(name)s_data = NULL;",
1425 " %(structname)s->%(name)s_set = 0;",
1426 " %(structname)s->%(name)s_length = 0;",
1427 " %(structname)s->%(name)s_num_allocated = 0;",
1435 def CodeInitialize(self, name): argument
1437 "%s->%s_data = NULL;" % (name, self._name),
1438 "%s->%s_length = 0;" % (name, self._name),
1439 "%s->%s_num_allocated = 0;" % (name, self._name),
1447 ["free(%(structname)s->%(name)s_data);"],
1472 ENTRY_NAME_RE = re.compile(r"(?P<name>[^\[\]]+)(\[(?P<fixed_length>.*)\])?")
1476 def ProcessOneEntry(factory, newstruct, entry): argument
1480 name = ""
1486 for token in entry.split(" "):
1500 if not name:
1504 r"""Cannot parse name: "%s" around line %d""" % (entry, LINE_COUNT)
1506 name = res.group("name")
1514 r'''Expected "=" after name "%s" got "%s"''' % (name, token)
1521 raise RpcGenError(r'''Expected tag number: "%s"''' % (entry))
1525 raise RpcGenError(r'''Cannot parse "%s"''' % (entry))
1528 raise RpcGenError(r'''Need tag number: "%s"''' % (entry))
1530 # Create the right entry
1533 newentry = factory.EntryBytes(entry_type, name, tag, fixed_length)
1535 newentry = factory.EntryVarBytes(entry_type, name, tag)
1537 newentry = factory.EntryInt(entry_type, name, tag)
1539 newentry = factory.EntryInt(entry_type, name, tag, bits=64)
1541 newentry = factory.EntryString(entry_type, name, tag)
1546 newentry = factory.EntryStruct(entry_type, name, tag, res.group("name"))
1548 raise RpcGenError('Bad type: "%s" in "%s"' % (entry_type, entry))
1562 # We need to encapsulate this entry into a struct
1576 # First three tokens are: 'struct' 'name' '{'
1579 inside = " ".join(tokens[3:-1])
1585 for entry in tokens:
1586 entry = NormalizeLine(entry)
1587 if not entry:
1591 structs.extend(ProcessOneEntry(factory, newstruct, entry))
1628 line = line[:-1]
1705 def GuardName(name): argument
1707 # non-identifier characters replaced with underscores, to
1709 return "EVENT_RPCOUT_%s_" % (NONIDENT_RE.sub("_", name).upper())
1711 def HeaderPreamble(self, name): argument
1712 guard = self.GuardName(name)
1722 name,
1739 def HeaderPostamble(self, name): argument
1740 guard = self.GuardName(name)
1744 def BodyPreamble(name, header_file): argument
1749 if slash != -1:
1754 * Automatically generated from %(name)s
1761 #include <event2/event-config.h>
1777 "name": name,
1794 return ".".join(filename.split(".")[:-1]) + ".h"
1798 return ".".join(filename.split(".")[:-1]) + ".gen.c"
1801 def Struct(name): argument
1802 return StructCCode(name)
1805 def EntryBytes(entry_type, name, tag, fixed_length): argument
1806 return EntryBytes(entry_type, name, tag, fixed_length)
1809 def EntryVarBytes(entry_type, name, tag): argument
1810 return EntryVarBytes(entry_type, name, tag)
1813 def EntryInt(entry_type, name, tag, bits=32): argument
1814 return EntryInt(entry_type, name, tag, bits)
1817 def EntryString(entry_type, name, tag): argument
1818 return EntryString(entry_type, name, tag)
1821 def EntryStruct(entry_type, name, tag, struct_name): argument
1822 return EntryStruct(entry_type, name, tag, struct_name)
1825 def EntryArray(entry): argument
1826 return EntryArray(entry)
1831 """Initialize a command-line to launch event_rpcgen, as if
1832 from a command-line with CommandLine(sys.argv). If you're
1844 usage="%(prog)s [options] rpc-file [[h-file] c-file]"
1846 parser.add_argument("--quiet", action="store_true", default=False)
1865 self.impl_file = self.factory.CodeFilename(self.rpc_file.name)
1876 filename = self.rpc_file.name
1892 for entry in entities:
1893 entry.PrintForwardDeclaration(header_fp)
1896 for entry in entities:
1897 entry.PrintTags(header_fp)
1898 entry.PrintDeclaration(header_fp)
1904 for entry in entities:
1905 entry.PrintCode(impl_fp)