44
44
"""
45
45
'''
46
46
47
- decl_banner = autogen_top + '''
48
- from .types cimport *
49
-
50
- cdef extern from *:
51
- '''
52
-
53
47
54
48
function_re = re .compile (r"^[A-Za-z][A-Za-z0-9_]*$" )
55
49
function_blacklist = {"O" , # O(p^e) needs special parser support
@@ -75,9 +69,29 @@ class PariFunctionGenerator(object):
75
69
def __init__ (self ):
76
70
self .gen_filename = os .path .join ('cypari2' , 'auto_gen.pxi' )
77
71
self .instance_filename = os .path .join ('cypari2' , 'auto_instance.pxi' )
78
- self .decl_filename = os .path .join ('cypari2' , 'auto_paridecl.pxd' )
72
+ self .decl_filename = os .path .join ('cypari2' , 'paridecl.pxd' )
73
+
74
+ def write_paridecl_no_desc (self , D ):
75
+ r"""
76
+ Write the template ``template_paridecl.pxd`` into the declaration file
77
+ after removing all functions from ``D`` (that are obtained from
78
+ ``pari.desc``).
79
+ """
80
+ fnc = re .compile (" (int|long|void|GEN) +([A-Za-z][0-9A-Za-z_]*)\(.*\)" )
81
+
82
+ functions = set (f .get ('cname' ) for f in D )
83
+
84
+ with open ('autogen/template_paridecl.pxd' ) as template :
85
+ for line in template .read ().split ('\n ' ):
86
+ match = fnc .match (line )
87
+ if match :
88
+ out_type , fname = match .groups ()
89
+ if fname in functions :
90
+ continue
91
+ self .decl_file .write (line )
92
+ self .decl_file .write ("\n " )
79
93
80
- def can_handle_function (self , function , cname = "" , ** kwds ):
94
+ def can_handle_function (self , function , cname = "" , prototype = "" , help = "" , ** kwds ):
81
95
"""
82
96
Can we actually handle this function?
83
97
@@ -107,6 +121,10 @@ def can_handle_function(self, function, cname="", **kwds):
107
121
if sec == "programming/control" :
108
122
# Skip if, return, break, ...
109
123
return False
124
+ try :
125
+ args , ret = parse_prototype (prototype , help )
126
+ except NotImplementedError :
127
+ return # Skip unsupported prototype codes
110
128
return True
111
129
112
130
def handle_pari_function (self , function , cname , prototype = "" , help = "" , obsolete = None , ** kwds ):
@@ -201,12 +219,8 @@ def bernvec(self, long x):
201
219
return new_gen(_ret)
202
220
<BLANKLINE>
203
221
"""
204
- try :
205
- args , ret = parse_prototype (prototype , help )
206
- except NotImplementedError :
207
- return # Skip unsupported prototype codes
208
-
209
222
doc = get_rest_doc (function )
223
+ args , ret = parse_prototype (prototype , help )
210
224
211
225
self .write_declaration (cname , args , ret , self .decl_file )
212
226
@@ -293,31 +307,40 @@ def __call__(self):
293
307
"""
294
308
D = read_pari_desc ()
295
309
D = sorted (D .values (), key = lambda d : d ['function' ])
296
- sys .stdout .write ("Generating PARI functions:" )
297
310
298
311
self .gen_file = io .open (self .gen_filename + '.tmp' , 'w' , encoding = 'utf-8' )
299
312
self .gen_file .write (gen_banner )
300
313
self .instance_file = io .open (self .instance_filename + '.tmp' , 'w' , encoding = 'utf-8' )
301
314
self .instance_file .write (instance_banner )
302
315
self .decl_file = io .open (self .decl_filename + '.tmp' , 'w' , encoding = 'utf-8' )
303
- self .decl_file .write (decl_banner )
304
-
305
- # Check for availability of hi-res SVG plotting. This requires
306
- # PARI-2.10 or later.
307
- have_plot_svg = False
308
316
317
+ sys .stdout .write ("Non handled PARI functions:" )
318
+ DD = []
309
319
for v in D :
310
320
func = v ["function" ]
311
321
if self .can_handle_function (** v ):
312
- sys .stdout .write (" %s" % func )
313
- sys .stdout .flush ()
314
- self .handle_pari_function (** v )
315
- if func == "plothraw" :
316
- have_plot_svg = True
322
+ DD .append (v )
317
323
else :
318
324
sys .stdout .write (" (%s)" % func )
319
325
sys .stdout .write ("\n " )
320
326
327
+ self .write_paridecl_no_desc (DD )
328
+
329
+
330
+ sys .stdout .write ("Generating PARI functions:" )
331
+
332
+ # Check for availability of hi-res SVG plotting. This requires
333
+ # PARI-2.10 or later.
334
+ have_plot_svg = False
335
+ for v in DD :
336
+ func = v ["function" ]
337
+ sys .stdout .write (" %s" % func )
338
+ sys .stdout .flush ()
339
+ self .handle_pari_function (** v )
340
+ if func == "plothraw" :
341
+ have_plot_svg = True
342
+ sys .stdout .write ("\n " )
343
+
321
344
self .instance_file .write ("DEF HAVE_PLOT_SVG = {}" .format (have_plot_svg ))
322
345
323
346
self .gen_file .close ()
0 commit comments