1#!python
2#
3# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
4#
5# SPDX-License-Identifier: BSD-2-Clause
6#
7
8import sys
9import re
10
11
12def strip_comments(s):
13    s2 = ''
14    d = 0
15    quote = False
16    i, l = 0, len(s)
17    while i < l:
18        if quote == False and s[i:i+2] == '(*':
19            d += 1
20            i += 2
21        elif quote == False and s[i:i+2] == '*)' and d > 0:
22            d -= 1
23            i += 2
24        else:
25            if d == 0:
26                s2 += s[i]
27                if quote == s[i]:
28                    quote = False
29                elif s[i] in ['"', "'"]:
30                    quote = s[i]
31            i += 1
32    return s2
33
34
35def unquote(s):
36    if s[:1] == '"' and s[-1:] == '"':
37        return s[1:-1]
38    return s
39
40
41def get(dir):
42    sessions = []
43    try:
44        root = strip_comments(''.join(open(dir + '/ROOT').readlines()))
45        sessions += [unquote(s) for s in re.findall('session\s+("[^"]*"|\S+)', root)]
46    except IOError:
47        pass
48    try:
49        roots = [l.strip() for l in open(dir + '/ROOTS').readlines() if l.strip()[:1] != '#']
50        for dir2 in roots:
51            sessions += get(dir + '/' + dir2)
52    except IOError:
53        pass
54    return sessions
55
56
57if '-h' in sys.argv or '--help' in sys.argv:
58    print('Usage: %s DIRS...' % sys.argv[0])
59    print('Print Isabelle session names defined in DIRS.')
60else:
61    sessions = []
62    for dir in sys.argv[1:]:
63        sessions += get(dir)
64    print('\n'.join(sessions))
65