netmsgs  1.2.2
RoadNarrows Robotics Network Messaging Package
NetMsgsGenPy.py
Go to the documentation of this file.
1 ###############################################################################
2 #
3 # Package: NetMsgs
4 #
5 # File: NetMsgsGenPy.py
6 #
7 
8 """
9 NetMsgs Generate Python files module.
10 
11 A .py source file is generated from a RoadNarrows NetMsg XML specification.
12 """
13 
14 ## \file
15 ## \package NetMsgs.NetMsgsGenPy
16 ##
17 ## $LastChangedDate: 2011-01-14 12:59:01 -0700 (Fri, 14 Jan 2011) $
18 ## $Rev: 670 $
19 ##
20 ## \brief NetMsgs Generate C files module.
21 ##
22 ## A .py source file is generated from a RoadNarrows NetMsg XML specification.
23 ##
24 ## \todo Calculate maximum message lengths.
25 ##
26 ## \sa
27 ## \htmlonly
28 ## <a href="../pydoc/NetMsgs.NetMsgsGenPy.html">PyDoc Generated Documentation</a>
29 ## \endhtmlonly
30 ##
31 ## \author Robin Knight (robin.knight@roadnarrows.com)
32 ##
33 ## \copyright
34 ## \h_copy 2010-2017. RoadNarrows LLC.\n
35 ## http://www.roadnarrows.com\n
36 ## All Rights Reserved
37 ##
38 
39 # Permission is hereby granted, without written agreement and without
40 # license or royalty fees, to use, copy, modify, and distribute this
41 # software and its documentation for any purpose, provided that
42 # (1) The above copyright notice and the following two paragraphs
43 # appear in all copies of the source code and (2) redistributions
44 # including binaries reproduces these notices in the supporting
45 # documentation. Substantial modifications to this software may be
46 # copyrighted by their authors and need not follow the licensing terms
47 # described here, provided that the new terms are clearly indicated in
48 # all files where they apply.
49 #
50 # IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY MEMBERS/EMPLOYEES
51 # OF ROADNARROW LLC OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY
52 # PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
53 # DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
54 # EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF
55 # THE POSSIBILITY OF SUCH DAMAGE.
56 #
57 # THE AUTHOR AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
58 # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
59 # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
60 # "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
61 # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
62 #
63 ###############################################################################
64 
65 import sys
66 import os
67 import time
68 
69 import NetMsgs.NetMsgsBase as nmBase
70 import NetMsgs.NetMsgsXmlParser as NMXmlParser
71 
72 ## space 'macro'
73 space = lambda indent: "%*s" % (indent, '')
74 
75 
76 #-----------------------------------------------------------------------------
77 # CLASS: NetMsgsGenC
78 #-----------------------------------------------------------------------------
80  """ RoadNarrows Net Messages Python Source Generator Class.
81 
82  The NetMsgsGenPy class reads the post-parsed database of a
83  NetMsgsXmlParser class instance and generates a Python .py file. The
84  python file expects the NetMsgs run-time python library.
85  """
86 
87  #--
88  def __init__(self, xml, pyfilepath, **kwargs):
89  """ Initialize NetMsgsGenPy instance.
90 
91  Parameters:
92  xml - NetMsgsXMLParser class instance.
93  pyfilepath - Generated output python file.
94  kwargs - Optional keyword arguments.
95  debug - Set debugging level: 0 == off, 1, 2, 3.
96  """
97  ## parsed xml instance
98  self.mXml = xml
99 
100  ## output .h header file name
101  self.mPyFilePath = pyfilepath
102 
103  ## debug level
104  self.mDebug = kwargs.get('debug', 0)
105 
106  ## do [not] prepend RN Hungarian notation to message fields
107  self.mHungarian = kwargs.get('hungarian', False)
108 
109  ## output .h header file basename
110  self.mPyBaseName = os.path.basename(self.mPyFilePath)
111 
112  ## extended field type dictionary
113  self.mFTDict = {}
114 
115  ## message definition set dictionary
116  self.mMsgDefSet = {}
117 
118  self.AugmentXmlDB()
119  ##
120 
121  #--
122  def AugmentXmlDB(self):
123  """ Augument the XML database of parsed XML values with python generated
124  parameters.
125  """
126  self.mXml['genpy'] = { }
127  encoding = self.mXml['netmsgs']['encoding'].lower()
128  if not encoding:
129  encoding = 'itv'
130  if encoding == 'itv':
131  self.mXml['genpy']['encoding_prefix'] = encoding.upper()
132  else:
133  self.mXml['genpy']['encoding_prefix'] = encoding.capitalize()
134 
135  endian = self.mXml['netmsgs']['endian'].lower()
136  if not endian:
137  endian = 'big'
138  self.mXml['genpy']['endian_desc'] = endian + '-endian'
139  self.mXml['genpy']['endian_enum'] = 'NMEndian'+endian.capitalize()
140 
141  # perform pass 0 through database, setting C specific information
142  self.Pass0()
143  ##
144 
145  #--
146  def Pass0(self):
147  """ Make initial pass through the XML database and augument with
148  specific python information.
149 
150  No generated python code is written to file output.
151  """
152  pass
153 
154 
155  #.............................................................................
156  # Generate Source Functions
157  #.............................................................................
158 
159  #--
160  def GenSource(self):
161  """ Generate python .py source file.
162 
163  Exceptions:
164  Raises NetMsgError exception on error.
165  """
166  # open python file for writing
167  try:
168  fp = open(self.mPyFilePath, 'w')
169  except IOError, err:
170  raise nmBase.NetMsgsError("Error: %s" % (err))
171  self.PrettyPrintTopComment(fp)
172  self.GenPrologue(fp)
173  self.GenMsgIds(fp)
174  self.GenFTDict(fp)
175  self.GenMsgDefSet(fp)
176  self.GenClass(fp)
177  self.GenEpilogue(fp)
178  fp.close()
179  ##
180 
181  #--
182  def GenPrologue(self, fp):
183  """ Generate .py file prologue.
184 
185  Prologue includes core imports plus any prologue specified
186  in the XML file.
187 
188  Parameters:
189  fp - Opened output file pointer.
190  """
191  pre = self.mXml['genpy']['encoding_prefix']
192  module = "NetMsgs.NetMsgsLib%s" % pre
193  if self.mXml['netmsgs']['encoding'] == 'flat':
194  baseclass = 'NetMsgs'
195  else:
196  baseclass = 'NetMsgs%s' % pre
197  prologue = self.mXml['meta']['python']['prologue']
198  fp.write(
199 """
200 
201 import NetMsgs.NetMsgsBase as nmBase
202 from %s import %s
203 
204 """ % (module, baseclass))
205  if prologue:
206  fp.write("%s\n\n" % (prologue))
207  ##
208 
209  #--
210  def GenMsgIds(self, fp):
211  """ Generate Message Id enumeration.
212 
213  Parameters:
214  fp - Opened output file pointer.
215  """
216  ns = self.mXml['meta']['ns']
217  msgorder = self.mXml['msg_types'][nmBase.NMKeyOrder]
218  if len(msgorder) == 0:
219  return
220  self.PrettyPrintMajorDivComment(fp, "%s Message Id Enumeration" % (ns))
221  fp.write("class %sMsgId:\n" % ns)
222  fp.write(' """ %s Message Id Enumeration class. """\n' % ns)
223  n = 0
224  nmBase.PrettyPrintCols(fp, 0,
225  2, 'NoId',
226  34, '= ' + repr(n),
227  42, '# no message id\n')
228  for msgid in msgorder:
229  n += 1
230  msgdef = self.mXml['msg_types'][msgid]
231  if self.IsDeprecated(msgdef):
232  comment = "%s (deprecated)" % (msgid)
233  else:
234  comment = "%s" % (msgid)
235  nmBase.PrettyPrintCols(fp, 0,
236  2, msgid,
237  34, '= ' + repr(n),
238  42, "# %s\n" % (comment))
239  n += 1
240  nmBase.PrettyPrintCols(fp, 0,
241  2, 'NumOf',
242  34, '= ' + repr(n),
243  42, '# number of message ids\n')
244  fp.write("##\n\n")
245  ##
246 
247  #--
248  def GenFTDict(self, fp):
249  """ Generate field types dictionary.
250 
251  genftdict ::=
252  ns+'ExtFieldTypes' '=' '{' ftdict '}'
253 
254  ftdict ::=
255  ftdict_item
256  | ftdict ',' ftdict_item
257 
258  ftdict_item ::=
259  ftid ':' '{' msgdef '}'
260  | ftid ':' '{' fielddef '}'
261 
262  Parameters:
263  fp - Opened output file pointer.
264  """
265  ns = self.mXml['meta']['ns']
266  section = 'field_types'
267  if len(self.mXml[section][nmBase.NMKeyOrder]) == 0:
268  return
269 
270  # generate dictionary
271  self.mFTDict = {}
272  self.mFTDict[nmBase.NMKeyOrder] = []
273  nomsgid = "@%sMsgId.NoId" % (ns)
274  nofid = "@nmBase.NMFIdNone"
275  for ftid in self.mXml[section][nmBase.NMKeyOrder]:
276  ftdef = self.mXml[section][ftid]
277  if not self.IsDeprecated(ftdef):
278  xtype = ftdef['ftype']
279  base_xtype = self.BaseXType(xtype)
280  self.mFTDict[ftid] = {}
281  self.mFTDict[nmBase.NMKeyOrder] += [ftid]
282  if base_xtype == 'struct':
283  self.GenMsgDef(ftid, nomsgid, ftdef, self.mFTDict[ftid])
284  else:
285  self.GenFieldDef(ftid, nofid, ftdef, self.mFTDict[ftid])
286 
287  # generate output
288  self.PrettyPrintMajorDivComment(fp, "Extended Field Types")
289  self.WriteFTDict(fp)
290  ##
291 
292  #--
293  def GenMsgDefSet(self, fp):
294  """ Generate message definition set.
295 
296  genmsgdefset ::=
297  ns+'MsgDefSet' '=' '{' msgdefset '}'
298 
299  msgdefset ::=
300  msgdef_item
301  | msgdefset ',' msgdef_item
302 
303  msgdef_item ::=
304  msgid ':' '{' msgdef '}'
305 
306  Parameters:
307  fp - Opened output file pointer.
308  """
309  ns = self.mXml['meta']['ns']
310  section = 'msg_types'
311  if len(self.mXml[section][nmBase.NMKeyOrder]) == 0:
312  return
313 
314  # generate dictionary
315  self.mMsgDefSet = {}
316  self.mMsgDefSet[nmBase.NMKeyOrder] = []
317  for msgid in self.mXml[section][nmBase.NMKeyOrder]:
318  msgdef = self.mXml[section][msgid]
319  if not self.IsDeprecated(msgdef):
320  xtype = msgdef['ftype']
321  enum = "@%sMsgId.%s" % (ns, msgid)
322  self.mMsgDefSet[nmBase.NMKeyOrder] += [enum]
323  self.mMsgDefSet[enum] = {}
324  self.GenMsgDef(msgid, enum, msgdef, self.mMsgDefSet[enum])
325 
326  # generate output
327  self.PrettyPrintMajorDivComment(fp, "Message Definition Set")
328  self.WriteMsgDefSet(fp)
329  ##
330 
331  #--
332  def GenMsgDef(self, name, msgid, msgdef, dentry):
333  """ Generate message definition dictionary entry.
334 
335  msgdef ::=
336  msgdef_common ',' 'fielddef:' '[' fdeflist ']'
337 
338  msgdef_common ::=
339  'name:' name ',' 'msgid:' msgid ',' 'max_count:' n
340 
341  fdeflist ::=
342  '{' fielddef '}'
343  fdeflist ',' '{' fielddef '}'
344 
345  name ::= (* message string name *)
346 
347  msgid ::= (* message id enumeration *)
348 
349  max_count ::= (* number of fields in message definition *)
350 
351  Parameters:
352  name - Name keyword value.
353  msgid - Message id keyword value.
354  msgdef - XML message definition.
355  deentry - Output message definition entry.
356  """
357  ns = self.mXml['meta']['ns']
358  xtype = msgdef['ftype']
359  base_xtype = self.BaseXType(xtype)
360 
361  # definition parameters
362  dentry['name'] = name
363  dentry['msgid'] = msgid
364  dentry['ftype'] = nmBase.NMBuiltInFieldTypes[base_xtype]['code']
365  dentry['max_count'] = 0
366  dentry['fielddef'] = []
367 
368  # derived definition
369  if xtype != base_xtype:
370  lineage = self.GetLineage(xtype)
371  eve = lineage[0] # mother of all
372  ftentry = self.mFTDict[eve]
373  dentry['max_count'] = ftentry['max_count']
374  dentry['fielddef'] = "@%sExtFType%s['fielddef']" % (ns, eve)
375 
376  # in-situ definition
377  else:
378  if not msgdef.has_key('fields'):
379  return
380  fields = msgdef['fields']
381  max_count = 0
382  fid = 1
383  for fname in fields[nmBase.NMKeyOrder]:
384  fdef = fields[fname]
385  if not self.IsDeprecated(fdef):
386  d = {}
387  self.GenFieldDef(fname, fid, fdef, d)
388  dentry['fielddef'] += [d]
389  max_count += 1
390  fid += 1
391  dentry['max_count'] = max_count
392  ##
393 
394  #--
395  def GenFieldDef(self, name, fid, fdef, dentry):
396  """ Generate field definition dictionary entry.
397 
398  fielddef ::=
399  fielddef_simple
400  | fielddef_string
401  | fielddef_struct
402  | fielddef_vector
403 
404  fielddef_simple ::=
405  fielddef_common ',' ['min:' m ',' 'max:' M ',' 'const:' C]
406 
407  fielddef_string ::=
408  fielddef_common ',' ['const:' C]
409 
410  fielddef_struct ::=
411  fielddef_common ',' 'msgdef:' '{' msgdef '}'
412 
413  fielddef_vector ::=
414  fielddef_common ',' 'vdef:' '{' fielddef '}'
415 
416  fielddef_common ::=
417  'name:' name ',' 'fid:' fid ',' 'ftype:' ftype ',' 'max_count:' n
418 
419  name ::= (* field string name *)
420 
421  msgid ::= (* field id enumeration *)
422 
423  ftype ::= (* field type code *)
424 
425  max_count ::= (* number of vector items, string characters or 1 for
426  simpel types *)
427 
428  Parameters:
429  name - Name keyword value.
430  fid - Field id keyword value.
431  fdef - XML field definition.
432  deentry - Output field definition entry.
433  """
434  ns = self.mXml['meta']['ns']
435  xtype = fdef['ftype']
436  base_xtype = self.BaseXType(xtype)
437 
438  # field definition common parameters
439  dentry['name'] = name
440  dentry['fid'] = fid
441  dentry['ftype'] = nmBase.NMBuiltInFieldTypes[base_xtype]['code']
442  dentry['max_count'] = 1
443 
444  # derived definition
445  if xtype != base_xtype:
446  lineage = self.GetLineage(xtype)
447  eve = lineage[0] # mother of all
448  ftentry = self.mFTDict[eve]
449  # in-situ definition
450  else:
451  eve = None
452 
453  # structure field definition
454  if base_xtype == 'struct':
455  nomsgid = "@%sMsgId.NoId" % (ns)
456  subname = name + '_struct'
457 
458  # derived struct
459  if eve:
460  dentry['msgdef'] = "@%sExtFType%s" % (ns, eve)
461  # in-situ definition
462  else:
463  dentry['msgdef'] = {}
464  self.GenMsgDef(subname, nomsgid, fdef, dentry['msgdef'])
465 
466  # vector field definition
467  elif base_xtype == 'vector':
468  nofid = "@nmBase.NMFIdNone"
469  subname = name + '_item'
470 
471  # derived vector
472  if eve:
473  dentry['max_count'] = ftentry['max_count']
474  dentry['vdef'] = "@%sExtFType%s['vdef']" % (ns, eve)
475  # in-situ definition
476  else:
477  dentry['max_count'] = '@' + fdef.get('size', 'nmBase.NMVectorMaxCount')
478  # create a vector item definition
479  vdef = {}
480  vdef['name'] = subname
481  vdef['ftype'] = fdef['vtype']
482  vdef['fields'] = fdef.get('fields', {})
483  dentry['vdef'] = {}
484  self.GenFieldDef(subname, nofid, vdef, dentry['vdef'])
485 
486  # string field definition
487  elif base_xtype == 'string':
488  # derived string
489  if eve:
490  dentry['max_count'] = ftentry['max_count']
491  if ftentry.has_key('const'):
492  dentry['const'] = ftentry['const']
493  # in-situ definition
494  else:
495  dentry['max_count'] = '@' + fdef.get('size', 'nmBase.NMStringMaxCount')
496  if fdef.has_key('const'):
497  dentry['const'] = '@' + fdef['const']
498 
499  # padding definition
500  elif xtype == 'pad':
501  dentry['max_count'] = '@' + fdef.get('count', 'nmBase.NMPadDftCount')
502 
503  # simple field definition
504  else:
505  # derived simple
506  if eve:
507  if ftentry.has_key('min'):
508  dentry['min'] = ftentry['min']
509  if ftentry.has_key('max'):
510  dentry['max'] = ftentry['max']
511  if ftentry.has_key('const'):
512  dentry['const'] = ftentry['const']
513  # in-situ definition
514  else:
515  if fdef.has_key('min'):
516  dentry['min'] = '@' + fdef['min']
517  if fdef.has_key('max'):
518  dentry['max'] = '@' + fdef['max']
519  if fdef.has_key('const'):
520  dentry['const'] = '@' + fdef['const']
521  ##
522 
523  def GenClass(self, fp):
524  """ Generate derived NetMsgs class.
525 
526  Parameters:
527  fp - Opened output file pointer.
528  """
529  ns = self.mXml['meta']['ns']
530  if not ns:
531  ns = '_App'
532  classname = "%sNetMsgs" % (ns)
533  if self.mXml['netmsgs']['encoding'] == 'flat':
534  baseclass = 'NetMsgs'
535  else:
536  pre = self.mXml['genpy']['encoding_prefix']
537  baseclass = 'NetMsgs%s' % pre
538  msgdefset = "%sSetMsgDef" % (ns)
539  msgsetname = "%sMsgSet" % (ns)
540  self.PrettyPrintMajorDivComment(fp, "CLASS: %s" % (classname))
541  fp.write("""\
542 class %s(%s):
543  \"\"\" %s NetMsgs Class. \"\"\"
544 
545  #--
546  def __init__(self, **kwargs):
547  \"\"\" %s NetMsgs initialization. \"\"\"
548  kwargs['msgsetname'] = '%s'
549  %s.__init__(self, %s, **kwargs)
550  ##
551 ##""" % (classname, baseclass, ns, ns, msgsetname, baseclass, msgdefset))
552  ##
553 
554  #--
555  def GenEpilogue(self, fp):
556  """ Generate .py file epilogue.
557 
558  Parameters:
559  fp - Opened output file pointer.
560  """
561  epilogue = self.mXml['meta']['python']['epilogue']
562  if epilogue:
563  fp.write("\n\n%s" % (epilogue))
564  fp.write("\n")
565  ##
566 
567 
568  #.............................................................................
569  # Output Functions
570  #.............................................................................
571 
572  #--
573  def WriteFTDict(self, fp):
574  """ Write field types and field type dictionary.
575 
576  Parameters:
577  fp - Opened output file pointer.
578  """
579  ns = self.mXml['meta']['ns']
580  d = {}
581  for ftid in self.mFTDict[nmBase.NMKeyOrder]:
582  ftname = "%sExtFType%s" % (ns, ftid)
583  self.PrettyPrintBriefComment(fp, "%s Extended Field Type " % ftid)
584  nmBase.PrettyPrintAssignExpr(ftname, self.mFTDict[ftid], fp=fp)
585  fp.write("##\n\n")
586  d[ftid] = '@' + ftname
587  self.PrettyPrintBriefComment(fp, "%s Extended Field Type Dictionary" % ns)
588  dname = "%sExtFieldTypes" % (ns)
589  nmBase.PrettyPrintAssignExpr(dname, d, fp=fp)
590  fp.write("##\n\n")
591  ##
592 
593  #--
594  def WriteMsgDefSet(self, fp):
595  """ Write message definitions and message definition set dictionary.
596 
597  Parameters:
598  fp - Opened output file pointer.
599  """
600  ns = self.mXml['meta']['ns']
601  d = {}
602  for enum in self.mMsgDefSet[nmBase.NMKeyOrder]:
603  msgdef = self.mMsgDefSet[enum]
604  name = msgdef['name']
605  mname = "%sMsgDef%s" % (ns, name)
606  self.PrettyPrintBriefComment(fp, "%s Message Definition " % name)
607  nmBase.PrettyPrintAssignExpr(mname, msgdef, fp=fp)
608  fp.write("##\n\n")
609  d[enum] = '@' + mname
610  self.PrettyPrintBriefComment(fp,
611  "%s Message Definition Set Dictionary" % ns)
612  dname = "%sSetMsgDef" % (ns)
613  nmBase.PrettyPrintAssignExpr(dname, d, fp=fp)
614  fp.write("##\n\n")
615  ##
616 
617 
618  #.............................................................................
619  # Utilities
620  #.............................................................................
621 
622  #--
623  def IsDeprecated(self, xdef):
624  """ Returns True (False) is definition is (not) deprecated.
625 
626  Parameters:
627  xdef - XML ftypedef, msgdef, or fielddef XML specification.
628 
629  Return:
630  True or False.
631  """
632  dispo = xdef.get('disposition', 'active')
633  if dispo == 'deprecated':
634  return True
635  else:
636  return False
637  ##
638 
639  #--
640  def BaseXType(self, ftype):
641  """ Returns the base XML field type for the given field type.
642 
643  Parameters:
644  ftype - (Derived) field type.
645 
646  Return:
647  Base field type.
648  """
649  if ftype == 'pad':
650  return ftype
651  while not nmBase.NMBuiltInFieldTypes.has_key(ftype):
652  if self.mXml['field_types'].has_key(ftype):
653  ftype = self.mXml['field_types'][ftype]['ftype']
654  else:
655  raise nmBase.NetMsgsError("Error: %s is not a defined ftype" % (ftype))
656  return ftype
657  ##
658 
659  #--
660  def GetLineage(self, xtype):
661  """ Get lineage of XML field type
662 
663  Parameters:
664  xtype - XML field type
665 
666  Return:
667  List of ancestors order from base to nearest to xtype.
668  """
669  lineage = []
670  if xtype == 'pad':
671  return lineage
672  while not nmBase.NMBuiltInFieldTypes.has_key(xtype):
673  if self.mXml['field_types'].has_key(xtype):
674  lineage = [xtype] + lineage
675  xtype = self.mXml['field_types'][xtype]['ftype']
676  else:
677  raise nmBase.NetMsgsError("Error: %s is not a defined ftype" % (xtype))
678  return lineage
679  ##
680 
681  #--
682  def EvalNum(sefl, *args):
683  """ Evaluate a summation of terms.
684 
685  Paramters:
686  args List of summation terms, with each term one of:
687  an equation, string, number
688 
689  Examples:
690  5 -> '5'
691  5, '(3 * 10)' -> '35'
692  5, 'MY_MAX', '1*255' -> '300+MY_MAX'
693 
694  Return:
695  Returns string of the evaluated results.
696  """
697  n = 0
698  s = ''
699  for arg in args:
700  if arg is None:
701  continue
702  elif type(arg) == str:
703  arg = arg.replace("NMFVAL_LEN_MAX_STRING", "255") # built-in
704  arg = arg.replace("NMFVAL_LEN_MAX_VECTOR", "255") # built-in
705  else:
706  arg = repr(arg)
707  try:
708  n += eval(arg)
709  except:
710  s += '+(' + arg + ')'
711  n = int(n)
712  return repr(n) + s
713  ##
714 
715 
716  #.............................................................................
717  # Pretty Printing
718  #.............................................................................
719 
720  #--
721  def PrettyPrintTopComment(self, fp):
722  """ Prints source file top comment block.
723 
724  Parameters:
725  fp - Opened output file pointer.
726  """
727  srcbasename = self.mPyBaseName
728  brief = self.mXml['meta']['brief']
729  xmlfilename = self.mXml.GetXMLFileName()
730  now = time.localtime()
731  thisdate = "%d.%02d.%02d" % (now.tm_year, now.tm_mon, now.tm_mday)
732  thistime = "%02d:%02d:%02d" % (now.tm_hour, now.tm_min, now.tm_sec)
733  fp.write("""\
734 ##############################################################################
735 #
736 # File: %s
737 #
738 
739 \"\"\"
740 %s
741 \"\"\"
742 
743 ## \\file
744 ##
745 ## \\brief %s
746 ##
747 ## \\warning This file was auto-generated on %s %s from the NetMsgs
748 ## XML specification %s.
749 ##
750 ## \\par Copyright:
751 ## (C) %d. RoadNarrows LLC
752 ## (http://www.roadnarrows.com)
753 ## All Rights Reserved
754 ##
755 ##############################################################################
756 """ % (srcbasename, srcbasename, brief, thisdate, thistime,
757  xmlfilename, now.tm_year))
758  ##
759 
760  #--
761  def PrettyPrintMajorDivComment(self, fp, comment):
762  """ Prints major file division comment block.
763 
764  Parameters:
765  fp - Opened output file pointer.
766  comment - Major division comment line.
767  """
768  fp.write("""\
769 
770 # -----------------------------------------------------------------------------
771 # %s
772 # -----------------------------------------------------------------------------
773 
774 """ % (comment))
775  ##
776 
777  #--
778  def PrettyPrintMinorDivComment(self, fp, comment):
779  """ Prints minor file division comment block.
780 
781  Parameters:
782  fp - Opened output file pointer.
783  comment - Minor division comment line.
784  """
785  fp.write("""\
786 
787 # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
788 # %s
789 # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
790 
791 """ % (comment))
792  ##
793 
794  #--
795  def PrettyPrintBriefComment(self, fp, brief):
796  """ Print doxygen brief comment block.
797 
798  Parameters:
799  fp - Opened output file pointer.
800  brief - Brief comment.
801  """
802  fp.write("""\
803 ## %s
804 """ % (brief))
805  ##
806 ##
807 
mMsgDefSet
message definition set dictionary
def PrettyPrintMajorDivComment(self, fp, comment)
mFTDict
extended field type dictionary
def GenMsgDef(self, name, msgid, msgdef, dentry)
def GenFieldDef(self, name, fid, fdef, dentry)
def PrettyPrintBriefComment(self, fp, brief)
mPyBaseName
output .h header file basename
def PrettyPrintMinorDivComment(self, fp, comment)
NetMsgs Base Data Module.
Definition: NetMsgsBase.py:1
def __init__(self, xml, pyfilepath, kwargs)
Definition: NetMsgsGenPy.py:88
mHungarian
do [not] prepend RN Hungarian notation to message fields
mPyFilePath
output .h header file name
NetMsgs XML parser module.