src/tempo/tempo.c: add silence detection (closes #23), add old behavior in examples...
[aubio.git] / waflib / Tools / d_scan.py
1 #! /usr/bin/env python
2 # encoding: utf-8
3 # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
4
5 import re
6 from waflib import Utils,Logs
7 def filter_comments(filename):
8         txt=Utils.readf(filename)
9         i=0
10         buf=[]
11         max=len(txt)
12         begin=0
13         while i<max:
14                 c=txt[i]
15                 if c=='"'or c=="'":
16                         buf.append(txt[begin:i])
17                         delim=c
18                         i+=1
19                         while i<max:
20                                 c=txt[i]
21                                 if c==delim:break
22                                 elif c=='\\':
23                                         i+=1
24                                 i+=1
25                         i+=1
26                         begin=i
27                 elif c=='/':
28                         buf.append(txt[begin:i])
29                         i+=1
30                         if i==max:break
31                         c=txt[i]
32                         if c=='+':
33                                 i+=1
34                                 nesting=1
35                                 c=None
36                                 while i<max:
37                                         prev=c
38                                         c=txt[i]
39                                         if prev=='/'and c=='+':
40                                                 nesting+=1
41                                                 c=None
42                                         elif prev=='+'and c=='/':
43                                                 nesting-=1
44                                                 if nesting==0:break
45                                                 c=None
46                                         i+=1
47                         elif c=='*':
48                                 i+=1
49                                 c=None
50                                 while i<max:
51                                         prev=c
52                                         c=txt[i]
53                                         if prev=='*'and c=='/':break
54                                         i+=1
55                         elif c=='/':
56                                 i+=1
57                                 while i<max and txt[i]!='\n':
58                                         i+=1
59                         else:
60                                 begin=i-1
61                                 continue
62                         i+=1
63                         begin=i
64                         buf.append(' ')
65                 else:
66                         i+=1
67         buf.append(txt[begin:])
68         return buf
69 class d_parser(object):
70         def __init__(self,env,incpaths):
71                 self.allnames=[]
72                 self.re_module=re.compile("module\s+([^;]+)")
73                 self.re_import=re.compile("import\s+([^;]+)")
74                 self.re_import_bindings=re.compile("([^:]+):(.*)")
75                 self.re_import_alias=re.compile("[^=]+=(.+)")
76                 self.env=env
77                 self.nodes=[]
78                 self.names=[]
79                 self.incpaths=incpaths
80         def tryfind(self,filename):
81                 found=0
82                 for n in self.incpaths:
83                         found=n.find_resource(filename.replace('.','/')+'.d')
84                         if found:
85                                 self.nodes.append(found)
86                                 self.waiting.append(found)
87                                 break
88                 if not found:
89                         if not filename in self.names:
90                                 self.names.append(filename)
91         def get_strings(self,code):
92                 self.module=''
93                 lst=[]
94                 mod_name=self.re_module.search(code)
95                 if mod_name:
96                         self.module=re.sub('\s+','',mod_name.group(1))
97                 import_iterator=self.re_import.finditer(code)
98                 if import_iterator:
99                         for import_match in import_iterator:
100                                 import_match_str=re.sub('\s+','',import_match.group(1))
101                                 bindings_match=self.re_import_bindings.match(import_match_str)
102                                 if bindings_match:
103                                         import_match_str=bindings_match.group(1)
104                                 matches=import_match_str.split(',')
105                                 for match in matches:
106                                         alias_match=self.re_import_alias.match(match)
107                                         if alias_match:
108                                                 match=alias_match.group(1)
109                                         lst.append(match)
110                 return lst
111         def start(self,node):
112                 self.waiting=[node]
113                 while self.waiting:
114                         nd=self.waiting.pop(0)
115                         self.iter(nd)
116         def iter(self,node):
117                 path=node.abspath()
118                 code="".join(filter_comments(path))
119                 names=self.get_strings(code)
120                 for x in names:
121                         if x in self.allnames:continue
122                         self.allnames.append(x)
123                         self.tryfind(x)
124 def scan(self):
125         env=self.env
126         gruik=d_parser(env,self.generator.includes_nodes)
127         node=self.inputs[0]
128         gruik.start(node)
129         nodes=gruik.nodes
130         names=gruik.names
131         if Logs.verbose:
132                 Logs.debug('deps: deps for %s: %r; unresolved %r'%(str(node),nodes,names))
133         return(nodes,names)