4444 """
4545'''
4646
47- decl_banner = autogen_top + '''
48- from .types cimport *
49-
50- cdef extern from *:
51- '''
52-
5347
5448function_re = re .compile (r"^[A-Za-z][A-Za-z0-9_]*$" )
5549function_blacklist = {"O" , # O(p^e) needs special parser support
@@ -75,7 +69,27 @@ class PariFunctionGenerator(object):
7569 def __init__ (self ):
7670 self .gen_filename = os .path .join ('cypari2' , 'auto_gen.pxi' )
7771 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 " )
7993
8094 def can_handle_function (self , function , cname = "" , ** kwds ):
8195 """
@@ -107,9 +121,10 @@ def can_handle_function(self, function, cname="", **kwds):
107121 if sec == "programming/control" :
108122 # Skip if, return, break, ...
109123 return False
124+
110125 return True
111126
112- def handle_pari_function (self , function , cname , prototype = "" , help = "" , obsolete = None , ** kwds ):
127+ def handle_pari_function (self , function , cname , prototype , help , args = None , ret = None , obsolete = None , ** kwds ):
113128 r"""
114129 Handle one PARI function: decide whether or not to add the
115130 function, in which file (as method of :class:`Gen` or
@@ -118,8 +133,8 @@ def handle_pari_function(self, function, cname, prototype="", help="", obsolete=
118133
119134 EXAMPLES::
120135
121- >>> from autogen.parser import read_pari_desc
122136 >>> from autogen.generator import PariFunctionGenerator
137+ >>> import sys
123138 >>> G = PariFunctionGenerator()
124139 >>> G.gen_file = sys.stdout
125140 >>> G.instance_file = sys.stdout
@@ -201,13 +216,10 @@ def bernvec(self, long x):
201216 return new_gen(_ret)
202217 <BLANKLINE>
203218 """
204- try :
219+ if args is None or ret is None :
205220 args , ret = parse_prototype (prototype , help )
206- except NotImplementedError :
207- return # Skip unsupported prototype codes
208-
221+ sys .stdout .flush ()
209222 doc = get_rest_doc (function )
210-
211223 self .write_declaration (cname , args , ret , self .decl_file )
212224
213225 if len (args ) > 0 and isinstance (args [0 ], PariArgumentGEN ):
@@ -222,6 +234,8 @@ def bernvec(self, long x):
222234 self .write_method (function , cname , args , ret , args [1 :],
223235 self .instance_file , doc , obsolete )
224236
237+ return 0
238+
225239 def write_declaration (self , cname , args , ret , file ):
226240 """
227241 Write a .pxd declaration of a PARI library function.
@@ -293,29 +307,43 @@ def __call__(self):
293307 """
294308 D = read_pari_desc ()
295309 D = sorted (D .values (), key = lambda d : d ['function' ])
296- sys .stdout .write ("Generating PARI functions:" )
297310
298311 self .gen_file = io .open (self .gen_filename + '.tmp' , 'w' , encoding = 'utf-8' )
299312 self .gen_file .write (gen_banner )
300313 self .instance_file = io .open (self .instance_filename + '.tmp' , 'w' , encoding = 'utf-8' )
301314 self .instance_file .write (instance_banner )
302315 self .decl_file = io .open (self .decl_filename + '.tmp' , 'w' , encoding = 'utf-8' )
303- self .decl_file .write (decl_banner )
316+
317+ DD = []
318+ sys .stdout .write ("Unhandled PARI function:\n " )
319+ for v in D :
320+ func = v ["function" ]
321+ if not self .can_handle_function (** v ):
322+ sys .stdout .write (" (%s)" % func )
323+ else :
324+ try :
325+ args , ret = parse_prototype (v ["prototype" ], v ["help" ])
326+ v ["args" ] = args
327+ v ["ret" ] = ret
328+ DD .append (v )
329+ except NotImplementedError :
330+ sys .stdout .write (" ((%s))" % func )
331+ sys .stdout .write ("\n " )
332+
333+ self .write_paridecl_no_desc (DD )
304334
305335 # Check for availability of hi-res SVG plotting. This requires
306336 # PARI-2.10 or later.
307337 have_plot_svg = False
308338
309- for v in D :
339+ sys .stdout .write ("Generating PARI functions:\n " )
340+ for v in DD :
310341 func = v ["function" ]
311- 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
317- else :
318- sys .stdout .write (" (%s)" % func )
342+ sys .stdout .write (" %s" % func )
343+ self .handle_pari_function (** v )
344+ sys .stdout .flush ()
345+ if func == "plothraw" :
346+ have_plot_svg = True
319347 sys .stdout .write ("\n " )
320348
321349 self .instance_file .write ("DEF HAVE_PLOT_SVG = {}" .format (have_plot_svg ))
0 commit comments