You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					114 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					114 lines
				
				3.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Build 'use others module data' mechanism for f2py2e.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Unfinished.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright 2000 Pearu Peterson all rights reserved,
							 | 
						||
| 
								 | 
							
								Pearu Peterson <pearu@ioc.ee>
							 | 
						||
| 
								 | 
							
								Permission to use, modify, and distribute this software is given under the
							 | 
						||
| 
								 | 
							
								terms of the NumPy License.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
							 | 
						||
| 
								 | 
							
								$Date: 2000/09/10 12:35:43 $
							 | 
						||
| 
								 | 
							
								Pearu Peterson
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								__version__ = "$Revision: 1.3 $"[10:-1]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								f2py_version = 'See `f2py -v`'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from .auxfuncs import (
							 | 
						||
| 
								 | 
							
								    applyrules, dictappend, gentitle, hasnote, outmess
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								usemodule_rules = {
							 | 
						||
| 
								 | 
							
								    'body': """
							 | 
						||
| 
								 | 
							
								#begintitle#
							 | 
						||
| 
								 | 
							
								static char doc_#apiname#[] = \"\\\nVariable wrapper signature:\\n\\
							 | 
						||
| 
								 | 
							
								\t #name# = get_#name#()\\n\\
							 | 
						||
| 
								 | 
							
								Arguments:\\n\\
							 | 
						||
| 
								 | 
							
								#docstr#\";
							 | 
						||
| 
								 | 
							
								extern F_MODFUNC(#usemodulename#,#USEMODULENAME#,#realname#,#REALNAME#);
							 | 
						||
| 
								 | 
							
								static PyObject *#apiname#(PyObject *capi_self, PyObject *capi_args) {
							 | 
						||
| 
								 | 
							
								/*#decl#*/
							 | 
						||
| 
								 | 
							
								\tif (!PyArg_ParseTuple(capi_args, \"\")) goto capi_fail;
							 | 
						||
| 
								 | 
							
								printf(\"c: %d\\n\",F_MODFUNC(#usemodulename#,#USEMODULENAME#,#realname#,#REALNAME#));
							 | 
						||
| 
								 | 
							
								\treturn Py_BuildValue(\"\");
							 | 
						||
| 
								 | 
							
								capi_fail:
							 | 
						||
| 
								 | 
							
								\treturn NULL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								""",
							 | 
						||
| 
								 | 
							
								    'method': '\t{\"get_#name#\",#apiname#,METH_VARARGS|METH_KEYWORDS,doc_#apiname#},',
							 | 
						||
| 
								 | 
							
								    'need': ['F_MODFUNC']
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def buildusevars(m, r):
							 | 
						||
| 
								 | 
							
								    ret = {}
							 | 
						||
| 
								 | 
							
								    outmess(
							 | 
						||
| 
								 | 
							
								        '\t\tBuilding use variable hooks for module "%s" (feature only for F90/F95)...\n' % (m['name']))
							 | 
						||
| 
								 | 
							
								    varsmap = {}
							 | 
						||
| 
								 | 
							
								    revmap = {}
							 | 
						||
| 
								 | 
							
								    if 'map' in r:
							 | 
						||
| 
								 | 
							
								        for k in r['map'].keys():
							 | 
						||
| 
								 | 
							
								            if r['map'][k] in revmap:
							 | 
						||
| 
								 | 
							
								                outmess('\t\t\tVariable "%s<=%s" is already mapped by "%s". Skipping.\n' % (
							 | 
						||
| 
								 | 
							
								                    r['map'][k], k, revmap[r['map'][k]]))
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                revmap[r['map'][k]] = k
							 | 
						||
| 
								 | 
							
								    if 'only' in r and r['only']:
							 | 
						||
| 
								 | 
							
								        for v in r['map'].keys():
							 | 
						||
| 
								 | 
							
								            if r['map'][v] in m['vars']:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if revmap[r['map'][v]] == v:
							 | 
						||
| 
								 | 
							
								                    varsmap[v] = r['map'][v]
							 | 
						||
| 
								 | 
							
								                else:
							 | 
						||
| 
								 | 
							
								                    outmess('\t\t\tIgnoring map "%s=>%s". See above.\n' %
							 | 
						||
| 
								 | 
							
								                            (v, r['map'][v]))
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                outmess(
							 | 
						||
| 
								 | 
							
								                    '\t\t\tNo definition for variable "%s=>%s". Skipping.\n' % (v, r['map'][v]))
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        for v in m['vars'].keys():
							 | 
						||
| 
								 | 
							
								            if v in revmap:
							 | 
						||
| 
								 | 
							
								                varsmap[v] = revmap[v]
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                varsmap[v] = v
							 | 
						||
| 
								 | 
							
								    for v in varsmap.keys():
							 | 
						||
| 
								 | 
							
								        ret = dictappend(ret, buildusevar(v, varsmap[v], m['vars'], m['name']))
							 | 
						||
| 
								 | 
							
								    return ret
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def buildusevar(name, realname, vars, usemodulename):
							 | 
						||
| 
								 | 
							
								    outmess('\t\t\tConstructing wrapper function for variable "%s=>%s"...\n' % (
							 | 
						||
| 
								 | 
							
								        name, realname))
							 | 
						||
| 
								 | 
							
								    ret = {}
							 | 
						||
| 
								 | 
							
								    vrd = {'name': name,
							 | 
						||
| 
								 | 
							
								           'realname': realname,
							 | 
						||
| 
								 | 
							
								           'REALNAME': realname.upper(),
							 | 
						||
| 
								 | 
							
								           'usemodulename': usemodulename,
							 | 
						||
| 
								 | 
							
								           'USEMODULENAME': usemodulename.upper(),
							 | 
						||
| 
								 | 
							
								           'texname': name.replace('_', '\\_'),
							 | 
						||
| 
								 | 
							
								           'begintitle': gentitle('%s=>%s' % (name, realname)),
							 | 
						||
| 
								 | 
							
								           'endtitle': gentitle('end of %s=>%s' % (name, realname)),
							 | 
						||
| 
								 | 
							
								           'apiname': '#modulename#_use_%s_from_%s' % (realname, usemodulename)
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								    nummap = {0: 'Ro', 1: 'Ri', 2: 'Rii', 3: 'Riii', 4: 'Riv',
							 | 
						||
| 
								 | 
							
								              5: 'Rv', 6: 'Rvi', 7: 'Rvii', 8: 'Rviii', 9: 'Rix'}
							 | 
						||
| 
								 | 
							
								    vrd['texnamename'] = name
							 | 
						||
| 
								 | 
							
								    for i in nummap.keys():
							 | 
						||
| 
								 | 
							
								        vrd['texnamename'] = vrd['texnamename'].replace(repr(i), nummap[i])
							 | 
						||
| 
								 | 
							
								    if hasnote(vars[realname]):
							 | 
						||
| 
								 | 
							
								        vrd['note'] = vars[realname]['note']
							 | 
						||
| 
								 | 
							
								    rd = dictappend({}, vrd)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    print(name, realname, vars[realname])
							 | 
						||
| 
								 | 
							
								    ret = applyrules(usemodule_rules, rd)
							 | 
						||
| 
								 | 
							
								    return ret
							 |