aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>2006-05-29 12:59:33 +0000
committerkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>2006-05-29 12:59:33 +0000
commita34860c5348e1e90f4feb698ccaacda56e5860be (patch)
tree952aed8eef258f61d5cd6531b08d37908753bf98 /tools
parentd4d2a11c8dc6b912fe55425cf650218f7012d8b5 (diff)
- new directive #.VIRTUAL_ASSGN - making assign from type of any filed
- new directive #.SET_TYPE - enforce type for field - T_... name is based on renamed field (if present) instead of original one - report unused #.FN_HDR, #.FN_BODY, #.FN_FTR - new directive #.TF_RENAME - renames type and field together (example of usage will follow in H225 and H245 dissectors) git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@18237 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'tools')
-rwxr-xr-xtools/asn2wrs.py94
1 files changed, 80 insertions, 14 deletions
diff --git a/tools/asn2wrs.py b/tools/asn2wrs.py
index ee2049db3a..82a82381ba 100755
--- a/tools/asn2wrs.py
+++ b/tools/asn2wrs.py
@@ -452,11 +452,11 @@ class EthCtx:
return attr
#--- eth_reg_assign ---------------------------------------------------------
- def eth_reg_assign(self, ident, val):
+ def eth_reg_assign(self, ident, val, virt=False):
#print "eth_reg_assign(ident='%s')" % (ident)
if self.assign.has_key(ident):
raise "Duplicate assignment for " + ident
- self.assign[ident] = val
+ self.assign[ident] = { 'val' : val , 'virt' : virt }
self.assign_ord.append(ident)
#--- eth_reg_vassign --------------------------------------------------------
@@ -498,7 +498,7 @@ class EthCtx:
#--- eth_reg_type -----------------------------------------------------------
def eth_reg_type(self, ident, val):
- #print "eth_reg_type(ident='%s')" % (ident)
+ #print "eth_reg_type(ident='%s', type='%s')" % (ident, val.type)
if self.type.has_key(ident):
raise "Duplicate type for " + ident
self.type[ident] = { 'val' : val, 'import' : None }
@@ -624,9 +624,9 @@ class EthCtx:
if len(t.split('/')) == 2 and t.split('/')[1] == '_item': # Sequnce of type at the 1st level
nm = t.split('/')[0] + t.split('/')[1]
elif t.split('/')[-1] == '_item': # Sequnce of type at next levels
- nm = 'T_' + t.split('/')[-2] + t.split('/')[-1]
+ nm = 'T_' + self.conform.use_item('FIELD_RENAME', '/'.join(t.split('/')[0:-1]), val_dflt=t.split('/')[-2]) + t.split('/')[-1]
else:
- nm = 'T_' + t.split('/')[-1]
+ nm = 'T_' + self.conform.use_item('FIELD_RENAME', t, val_dflt=t.split('/')[-1])
nm = asn2c(nm)
if self.eth_type.has_key(nm):
if self.eth_type_dupl.has_key(nm):
@@ -708,7 +708,7 @@ class EthCtx:
#--- fields -------------------------
for f in (self.pdu_ord + self.field_ord):
if len(f.split('/')) > 1 and f.split('/')[-1] == '_item': # Sequnce/Set of type
- nm = f.split('/')[-2] + f.split('/')[-1]
+ nm = self.conform.use_item('FIELD_RENAME', '/'.join(f.split('/')[0:-1]), val_dflt=f.split('/')[-2]) + f.split('/')[-1]
else:
nm = f.split('/')[-1]
nm = self.conform.use_item('FIELD_RENAME', f, val_dflt=nm)
@@ -1239,7 +1239,10 @@ class EthCtx:
def eth_do_output(self):
if self.dbg('a'):
print "\n# Assignments"
- print "\n".join(self.assign_ord)
+ for a in self.assign_ord:
+ v = ' '
+ if (self.assign[a]['virt']): v = '*'
+ print v, a
print "\n# Value assignments"
print "\n".join(self.vassign_ord)
if self.dbg('t'):
@@ -1336,6 +1339,8 @@ class EthCnf:
self.tblcfg['NO_EMIT'] = { 'val_nm' : 'flag', 'val_dflt' : 0, 'chk_dup' : True, 'chk_use' : True }
self.tblcfg['MODULE'] = { 'val_nm' : 'proto', 'val_dflt' : None, 'chk_dup' : True, 'chk_use' : False }
self.tblcfg['OMIT_ASSIGNMENT'] = { 'val_nm' : 'omit', 'val_dflt' : False, 'chk_dup' : True, 'chk_use' : True }
+ self.tblcfg['VIRTUAL_ASSGN'] = { 'val_nm' : 'name', 'val_dflt' : None, 'chk_dup' : True, 'chk_use' : True }
+ self.tblcfg['SET_TYPE'] = { 'val_nm' : 'type', 'val_dflt' : None, 'chk_dup' : True, 'chk_use' : True }
self.tblcfg['TYPE_RENAME'] = { 'val_nm' : 'eth_name', 'val_dflt' : None, 'chk_dup' : True, 'chk_use' : True }
self.tblcfg['FIELD_RENAME'] = { 'val_nm' : 'eth_name', 'val_dflt' : None, 'chk_dup' : True, 'chk_use' : True }
self.tblcfg['IMPORT_TAG'] = { 'val_nm' : 'ttag', 'val_dflt' : (), 'chk_dup' : True, 'chk_use' : False }
@@ -1396,6 +1401,7 @@ class EthCnf:
return '';
if (not self.fn[name][ctx]):
return '';
+ self.fn[name][ctx]['used'] = True
return '#line %u "%s"\n%s\n' % (self.fn[name][ctx]['lineno'],self.fn[name][ctx]['fn'],self.fn[name][ctx]['text']);
def add_pdu(self, par, is_new, fn, lineno):
@@ -1444,7 +1450,7 @@ class EthCnf:
if len(par) < pmin:
warnings.warn_explicit("Too few parameters. At least %d parameters are required" % (pmin), UserWarning, fn, lineno)
return None
- if len(par) > pmax:
+ if (pmax >= 0) and (len(par) > pmax):
warnings.warn_explicit("Too many parameters. Only %d parameters are allowed" % (pmax), UserWarning, fn, lineno)
return par[0:pmax]
return par
@@ -1509,8 +1515,9 @@ class EthCnf:
result = directive.search(line)
if result: # directive
if result.group('name') in ('EXPORTS', 'PDU', 'PDU_NEW', 'REGISTER', 'REGISTER_NEW',
- 'USER_DEFINED', 'NO_EMIT', 'MODULE', 'MODULE_IMPORT', 'OMIT_ASSIGNMENT',
- 'TYPE_RENAME', 'FIELD_RENAME', 'IMPORT_TAG',
+ 'USER_DEFINED', 'NO_EMIT', 'MODULE', 'MODULE_IMPORT',
+ 'OMIT_ASSIGNMENT', 'VIRTUAL_ASSGN', 'SET_TYPE',
+ 'TYPE_RENAME', 'FIELD_RENAME', 'TF_RENAME', 'IMPORT_TAG',
'TYPE_ATTR', 'ETYPE_ATTR', 'FIELD_ATTR', 'EFIELD_ATTR'):
ctx = result.group('name')
elif result.group('name') in ('FN_HDR', 'FN_FTR'):
@@ -1608,6 +1615,27 @@ class EthCnf:
par = get_par(line, 1, 1, fn=fn, lineno=lineno)
if not par: continue
self.add_item('OMIT_ASSIGNMENT', par[0], omit=True, fn=fn, lineno=lineno)
+ elif ctx == 'VIRTUAL_ASSGN':
+ if empty.match(line): continue
+ par = get_par(line, 2, -1, fn=fn, lineno=lineno)
+ if not par: continue
+ if (len(par[1].split('/')) > 1) and not self.check_item('SET_TYPE', par[1]):
+ self.add_item('SET_TYPE', par[1], type=par[0], fn=fn, lineno=lineno)
+ self.add_item('VIRTUAL_ASSGN', par[1], name=par[0], fn=fn, lineno=lineno)
+ for nm in par[2:]:
+ self.add_item('SET_TYPE', nm, type=par[0], fn=fn, lineno=lineno)
+ if not par[0][0].isupper():
+ warnings.warn_explicit("Virtual assignment should have uppercase name (%s)" % (par[0]),
+ UserWarning, fn, lineno)
+ elif ctx == 'SET_TYPE':
+ if empty.match(line): continue
+ par = get_par(line, 2, 2, fn=fn, lineno=lineno)
+ if not par: continue
+ if not self.check_item('VIRTUAL_ASSGN', par[0]):
+ self.add_item('SET_TYPE', par[0], type=par[1], fn=fn, lineno=lineno)
+ if not par[1][0].isupper():
+ warnings.warn_explicit("Set type should have uppercase name (%s)" % (par[1]),
+ UserWarning, fn, lineno)
elif ctx == 'TYPE_RENAME':
if empty.match(line): continue
par = get_par(line, 2, 2, fn=fn, lineno=lineno)
@@ -1624,6 +1652,20 @@ class EthCnf:
if not par[1][0].islower():
warnings.warn_explicit("Field should be renamed to lowercase name (%s)" % (par[1]),
UserWarning, fn, lineno)
+ elif ctx == 'TF_RENAME':
+ if empty.match(line): continue
+ par = get_par(line, 2, 2, fn=fn, lineno=lineno)
+ if not par: continue
+ tmpu = par[1][0].upper() + par[1][1:]
+ tmpl = par[1][0].lower() + par[1][1:]
+ self.add_item('TYPE_RENAME', par[0], eth_name=tmpu, fn=fn, lineno=lineno)
+ if not tmpu[0].isupper():
+ warnings.warn_explicit("Type should be renamed to uppercase name (%s)" % (par[1]),
+ UserWarning, fn, lineno)
+ self.add_item('FIELD_RENAME', par[0], eth_name=tmpl, fn=fn, lineno=lineno)
+ if not tmpl[0].islower():
+ warnings.warn_explicit("Field should be renamed to lowercase name (%s)" % (par[1]),
+ UserWarning, fn, lineno)
elif ctx in ('TYPE_ATTR', 'ETYPE_ATTR', 'FIELD_ATTR', 'EFIELD_ATTR'):
if empty.match(line): continue
par = get_par_nm(line, 1, 1, fn=fn, lineno=lineno)
@@ -1667,6 +1709,16 @@ class EthCnf:
if not self.table[t][k]['used']:
warnings.warn_explicit("Unused %s for %s" % (t, k),
UserWarning, self.table[t][k]['fn'], self.table[t][k]['lineno'])
+ fnms = self.fn.keys()
+ fnms.sort()
+ for f in fnms:
+ keys = self.fn[f].keys()
+ keys.sort()
+ for k in keys:
+ if not self.fn[f][k]: continue
+ if not self.fn[f][k]['used']:
+ warnings.warn_explicit("Unused %s for %s" % (k, f),
+ UserWarning, self.fn[f][k]['fn'], self.fn[f][k]['lineno'])
#--- EthOut -------------------------------------------------------------------
class EthOut:
@@ -1933,20 +1985,34 @@ class Type (Node):
ectx.eth_reg_type(nm, self)
if (ectx.conform.check_item('PDU', nm)):
ectx.eth_reg_field(nm, nm, impl=self.HasImplicitTag(ectx), pdu=ectx.conform.use_item('PDU', nm))
- if self.type == 'Type_Ref':
+ virtual_tr = Type_Ref(val=ectx.conform.use_item('SET_TYPE', nm))
+ if (self.type == 'Type_Ref') or ectx.conform.check_item('SET_TYPE', nm):
if ectx.conform.check_item('TYPE_RENAME', nm) or ectx.conform.get_fn_presence(nm):
- ectx.eth_reg_type(nm, self) # new type
+ if ectx.conform.check_item('SET_TYPE', nm):
+ ectx.eth_reg_type(nm, virtual_tr) # dummy Type Reference
+ else:
+ ectx.eth_reg_type(nm, self) # new type
trnm = nm
+ elif ectx.conform.check_item('SET_TYPE', nm):
+ trnm = ectx.conform.use_item('SET_TYPE', nm)
else:
trnm = self.val
else:
ectx.eth_reg_type(nm, self)
+ if ectx.conform.check_item('VIRTUAL_ASSGN', nm):
+ vnm = ectx.conform.use_item('VIRTUAL_ASSGN', nm)
+ ectx.eth_reg_assign(vnm, self, virt=True)
+ ectx.eth_reg_type(vnm, self)
+ self.eth_reg_sub(vnm, ectx)
if ident:
- if self.type == 'Type_Ref':
+ if (self.type == 'Type_Ref') or ectx.conform.check_item('SET_TYPE', nm):
ectx.eth_reg_field(nm, trnm, idx=idx, parent=parent, impl=self.HasImplicitTag(ectx))
else:
ectx.eth_reg_field(nm, nm, idx=idx, parent=parent, impl=self.HasImplicitTag(ectx))
- self.eth_reg_sub(nm, ectx)
+ if ectx.conform.check_item('SET_TYPE', nm):
+ virtual_tr.eth_reg_sub(nm, ectx)
+ else:
+ self.eth_reg_sub(nm, ectx)
def eth_get_size_constr(self):
(minv, maxv, ext) = ('NO_BOUND', 'NO_BOUND', 'FALSE')