Source code for qcodes_contrib_drivers.drivers.Spectrum.py_header.h2py
#! /usr/bin/env python# Read #define's and translate to Python code.# Handle #include statements.# Handle #define macros with one argument.# Anything that isn't recognized or doesn't translate into valid# Python is ignored.# Without filename arguments, acts as a filter.# If one or more filenames are given, output is written to corresponding# filenames in the local directory, translated to all uppercase, with# the extension replaced by ".py".# By passing one or more options of the form "-i regular_expression"# you can specify additional strings to be ignored. This is useful# e.g. to ignore casts to u_long: simply specify "-i '(u_long)'".# XXX To do:# - turn trailing C comments into Python comments# - turn C Boolean operators "&& || !" into Python "and or not"# - what to do about #if(def)?# - what to do about macros with multiple parameters?importsys,re,getopt,osp_define=re.compile('^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+')p_macro=re.compile(r'^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+')p_include=re.compile(r'^[\t ]*#[\t ]*include[\t ]+<([a-zA-Z0-9_/\.]+)')p_comment=re.compile(r'/\*([^*]+|\*+[^/])*(\*+/)?')p_cpp_comment=re.compile('//.*')ignores=[p_comment,p_cpp_comment]p_char=re.compile(r"'(\\.[^\\]*|[^\\])'")p_hex=re.compile(r"0x([0-9a-fA-F]+)L?")filedict={}# type: dictimportable={}try:searchdirs=os.environ['include'].split(';')exceptKeyError:try:searchdirs=os.environ['INCLUDE'].split(';')exceptKeyError:try:ifsys.platform.find("beos")==0:searchdirs=os.environ['BEINCLUDES'].split(';')elifsys.platform.startswith("atheos"):searchdirs=os.environ['C_INCLUDE_PATH'].split(':')else:raiseKeyErrorexceptKeyError:searchdirs=['/usr/include']
[docs]defmain():globalfiledictopts,args=getopt.getopt(sys.argv[1:],'i:')foro,ainopts:ifo=='-i':ignores.append(re.compile(a))ifnotargs:args=['-']forfilenameinargs:iffilename=='-':# sys.stdout.write('# Generated by h2py from stdin\n')process(sys.stdin,sys.stdout)else:fp=open(filename,'r')outfile=os.path.basename(filename)i=outfile.rfind('.')ifi>0:outfile=outfile[:i]modname=outfile.upper()outfile=modname+'.py'outfp=open(outfile,'w')# outfp.write('# Generated by h2py from %s\n' % filename)filedict={}fordirinsearchdirs:iffilename[:len(dir)]==dir:filedict[filename[len(dir)+1:]]=None# no '/' trailingimportable[filename[len(dir)+1:]]=modnamebreakprocess(fp,outfp)outfp.close()fp.close()
[docs]defpytify(body):# replace ignored patterns by spacesforpinignores:body=p.sub(' ',body)# replace char literals by ord(...)body=p_char.sub('ord(\\0)',body)# Compute negative hexadecimal constantsstart=0UMAX=2*(sys.maxint+1)while1:m=p_hex.search(body,start)ifnotm:breaks,e=m.span()val=long(body[slice(*m.span(1))],16)ifval>sys.maxint:val-=UMAXbody=body[:s]+"("+str(val)+")"+body[e:]start=s+1returnbody
[docs]defprocess(fp,outfp,env={}):lineno=0while1:line=fp.readline()ifnotline:breaklineno=lineno+1match=p_define.match(line)ifmatch:# gobble up continuation lineswhileline[-2:]=='\\\n':nextline=fp.readline()ifnotnextline:breaklineno=lineno+1line=line+nextlinename=match.group(1)body=line[match.end():]body=pytify(body)#UE: Python3 kommt mit den l am Ende der Konstanten nicht klar, daher entfernenbody=body.strip()ifbody[-1:]=='l':body=body[:-1]#/UEok=0stmt='%s = %s\n'%(name,body)try:exec(stmt,env)except:sys.stderr.write('Skipping: %s'%stmt)else:outfp.write(stmt)match=p_macro.match(line)ifmatch:macro,arg=match.group(1,2)body=line[match.end():]body=pytify(body)stmt='def %s(%s): return %s\n'%(macro,arg,body)try:exec(stmt,env)except:sys.stderr.write('Skipping: %s'%stmt)else:outfp.write(stmt)match=p_include.match(line)ifmatch:regs=match.regsa,b=regs[1]filename=line[a:b]ifimportable.has_key(filename):outfp.write('from %s import *\n'%importable[filename])elifnotfiledict.has_key(filename):filedict[filename]=Noneinclfp=Nonefordirinsearchdirs:try:inclfp=open(dir+'/'+filename)breakexceptIOError:passifinclfp:outfp.write('\n# Included from %s\n'%filename)process(inclfp,outfp,env)else:sys.stderr.write('Warning - could not find file %s\n'%filename)