[MERGED] libosmocore[master]: contrib/fsm-to-dot: less false positives on event parsing

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Mon Mar 26 13:03:23 UTC 2018


Neels Hofmeyr has submitted this change and it was merged.

Change subject: contrib/fsm-to-dot: less false positives on event parsing
......................................................................


contrib/fsm-to-dot: less false positives on event parsing

Do some more mad hacking to only detect event triggers if event names actually
appear in if() or case: statements. Also combine events in consecutive 'case'
statements.

When will this madness stop?

Change-Id: Iabaaab57f0d1687607eaaa4e09c7c2439fbd7a25
---
M contrib/fsm-to-dot.py
1 file changed, 29 insertions(+), 8 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/contrib/fsm-to-dot.py b/contrib/fsm-to-dot.py
index 83c95b6..38d7061 100755
--- a/contrib/fsm-to-dot.py
+++ b/contrib/fsm-to-dot.py
@@ -587,6 +587,7 @@
 re_fsm_event_dispatch = re.compile(r'osmo_fsm_inst_dispatch\(\W*[^,]+,\W*([A-Z_][A-Z_0-9]*)\W*,', re.M)
 re_comment_multiline = re.compile(r'/\*.*?\*/', re.M | re.S)
 re_comment_single_line = re.compile(r'//.*$', re.M | re.S)
+re_break = re.compile(r'^\W*\bbreak;', re.M)
 
 class CFile():
   def __init__(c_file, path):
@@ -669,7 +670,9 @@
 
   def find_state_transitions(c_file, event_names):
     TO_STATE = 'TO_STATE'
-    EVENT = 'EVENT'
+    IF_EVENT = 'IF_EVENT'
+    CASE_EVENT = 'CASE_EVENT'
+    BREAK = 'BREAK'
     func_to_state_transitions = listdict()
 
     for func_name, src in c_file.funcs.items():
@@ -680,19 +683,37 @@
         found_tokens.append((m.start(), TO_STATE, to_state))
 
       for event in event_names:
-        re_event = re.compile(r'\b(' + event + r')\b')
+        re_event = re.compile(r'\bif\w*\(.*\b(' + event + r')\b')
         for m in re_event.finditer(src):
           event = m.group(1)
-          found_tokens.append((m.start(), EVENT, event))
+          found_tokens.append((m.start(), IF_EVENT, event))
+
+        re_event = re.compile(r'^\W*case\W\W*\b(' + event + r'):', re.M)
+        for m in re_event.finditer(src):
+          event = m.group(1)
+          found_tokens.append((m.start(), CASE_EVENT, event))
+
+      for m in re_break.finditer(src):
+        found_tokens.append((m.start(), BREAK, 'break'))
 
       found_tokens = sorted(found_tokens)
 
-      last_event = None
+      last_events = []
+      saw_break = True
       for start, kind, name in found_tokens:
-        if kind == EVENT:
-          last_event = name
-        else:
-          func_to_state_transitions.add(func_name, (name, last_event))
+        if kind == IF_EVENT:
+          last_events = [name]
+          saw_break = True
+        elif kind == CASE_EVENT:
+          if saw_break:
+            last_events = []
+            saw_break = False
+          last_events.append(name)
+        elif kind == BREAK:
+          saw_break = True
+        elif kind == TO_STATE:
+          for event in (last_events or [None]):
+            func_to_state_transitions.add(func_name, (name, event))
 
     return func_to_state_transitions
 

-- 
To view, visit https://gerrit.osmocom.org/7500
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iabaaab57f0d1687607eaaa4e09c7c2439fbd7a25
Gerrit-PatchSet: 2
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list