eol
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/ZeroRadiant@190 8a3a26a2-13c4-0310-b231-cf6edde360e5
This commit is contained in:
260
utils.py
260
utils.py
@@ -1,130 +1,130 @@
|
||||
# -*- mode: python -*-
|
||||
# QuakeZero build scripts
|
||||
# TTimo <ttimo@idsoftware.com>
|
||||
# http://scons.sourceforge.net
|
||||
|
||||
import os, commands, platform, xml.sax, re, string, platform
|
||||
|
||||
class vcproj( xml.sax.handler.ContentHandler ):
|
||||
def __init__( self, filepath ):
|
||||
self.source_files = []
|
||||
self.misc_files = []
|
||||
self._files = []
|
||||
print 'parse %s' % filepath
|
||||
xml.sax.parse( filepath, self )
|
||||
|
||||
def getSourceFiles( self ):
|
||||
return self.source_files
|
||||
|
||||
def filterSource( self, expression, filelist = None ):
|
||||
if ( filelist is None ):
|
||||
filelist = self.source_files
|
||||
match = []
|
||||
nomatch = []
|
||||
for s in filelist:
|
||||
if ( re.match( expression, s ) ):
|
||||
match.append( s )
|
||||
else:
|
||||
nomatch.append( s )
|
||||
return ( match, nomatch )
|
||||
|
||||
def startElement( self, name, attrs ):
|
||||
if ( name == 'File' ):
|
||||
self._files.append( attrs.getValue('RelativePath') )
|
||||
|
||||
def endDocument( self ):
|
||||
# split into source and headers, remap path seperator to the platform
|
||||
for f in self._files:
|
||||
if ( platform.system() != 'Windows' ):
|
||||
f = f.replace( '\\', '/' )
|
||||
if ( f[-2:] == '.c' or f[-4:] == '.cpp' ):
|
||||
self.source_files.append( f.encode('ascii') )
|
||||
else:
|
||||
self.misc_files.append( f )
|
||||
print '%d source files' % len( self.source_files )
|
||||
|
||||
# action uses LDD to verify that the source doesn't hold unresolved symbols
|
||||
# setup as an AddPostAction of a regular SharedLibrary call
|
||||
def CheckUnresolved( source, target, env ):
|
||||
# TODO: implement this for OSX
|
||||
if ( platform.system() == 'Darwin' ):
|
||||
return None
|
||||
print 'CheckUnresolved %s' % target[0].abspath
|
||||
if ( not os.path.isfile( target[0].abspath ) ):
|
||||
print 'CheckUnresolved: %s does not exist' % target[0]
|
||||
return 1 # fail
|
||||
( status, output ) = commands.getstatusoutput( 'ldd -r %s' % target[0] )
|
||||
if ( status != 0 ):
|
||||
print 'CheckUnresolved: ldd command failed (exit code %d)' % status
|
||||
os.system( 'rm %s' % target[ 0 ] )
|
||||
return 1 # fail
|
||||
lines = string.split( output, '\n' )
|
||||
have_undef = 0
|
||||
for i_line in lines:
|
||||
regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)')
|
||||
if ( regex.match( i_line ) ):
|
||||
symbol = regex.sub( '\\1', i_line )
|
||||
try:
|
||||
env['ALLOWED_SYMBOLS'].index( symbol )
|
||||
except:
|
||||
have_undef = 1
|
||||
if ( have_undef ):
|
||||
print output
|
||||
print "CheckUnresolved: undefined symbols"
|
||||
os.system('rm %s' % target[0])
|
||||
return 1
|
||||
|
||||
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486
|
||||
|
||||
def Enum(*names):
|
||||
##assert names, "Empty enums are not supported" # <- Don't like empty enums? Uncomment!
|
||||
|
||||
class EnumClass(object):
|
||||
__slots__ = names
|
||||
def __iter__(self): return iter(constants)
|
||||
def __len__(self): return len(constants)
|
||||
def __getitem__(self, i): return constants[i]
|
||||
def __repr__(self): return 'Enum' + str(names)
|
||||
def __str__(self): return 'enum ' + str(constants)
|
||||
|
||||
class EnumValue(object):
|
||||
__slots__ = ('__value')
|
||||
def __init__(self, value): self.__value = value
|
||||
Value = property(lambda self: self.__value)
|
||||
EnumType = property(lambda self: EnumType)
|
||||
def __hash__(self): return hash(self.__value)
|
||||
def __cmp__(self, other):
|
||||
# C fans might want to remove the following assertion
|
||||
# to make all enums comparable by ordinal value {;))
|
||||
assert self.EnumType is other.EnumType, "Only values from the same enum are comparable"
|
||||
return cmp(self.__value, other.__value)
|
||||
def __invert__(self): return constants[maximum - self.__value]
|
||||
def __nonzero__(self): return bool(self.__value)
|
||||
def __repr__(self): return str(names[self.__value])
|
||||
|
||||
maximum = len(names) - 1
|
||||
constants = [None] * len(names)
|
||||
for i, each in enumerate(names):
|
||||
val = EnumValue(i)
|
||||
setattr(EnumClass, each, val)
|
||||
constants[i] = val
|
||||
constants = tuple(constants)
|
||||
EnumType = EnumClass()
|
||||
return EnumType
|
||||
|
||||
#if __name__ == '__main__':
|
||||
# print '\n*** Enum Demo ***'
|
||||
# print '--- Days of week ---'
|
||||
# Days = Enum('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su')
|
||||
# print Days
|
||||
# print Days.Mo
|
||||
# print Days.Fr
|
||||
# print Days.Mo < Days.Fr
|
||||
# print list(Days)
|
||||
# for each in Days:
|
||||
# print 'Day:', each
|
||||
# print '--- Yes/No ---'
|
||||
# Confirmation = Enum('No', 'Yes')
|
||||
# answer = Confirmation.No
|
||||
# print 'Your answer is not', ~answer
|
||||
|
||||
# -*- mode: python -*-
|
||||
# QuakeZero build scripts
|
||||
# TTimo <ttimo@idsoftware.com>
|
||||
# http://scons.sourceforge.net
|
||||
|
||||
import os, commands, platform, xml.sax, re, string, platform
|
||||
|
||||
class vcproj( xml.sax.handler.ContentHandler ):
|
||||
def __init__( self, filepath ):
|
||||
self.source_files = []
|
||||
self.misc_files = []
|
||||
self._files = []
|
||||
print 'parse %s' % filepath
|
||||
xml.sax.parse( filepath, self )
|
||||
|
||||
def getSourceFiles( self ):
|
||||
return self.source_files
|
||||
|
||||
def filterSource( self, expression, filelist = None ):
|
||||
if ( filelist is None ):
|
||||
filelist = self.source_files
|
||||
match = []
|
||||
nomatch = []
|
||||
for s in filelist:
|
||||
if ( re.match( expression, s ) ):
|
||||
match.append( s )
|
||||
else:
|
||||
nomatch.append( s )
|
||||
return ( match, nomatch )
|
||||
|
||||
def startElement( self, name, attrs ):
|
||||
if ( name == 'File' ):
|
||||
self._files.append( attrs.getValue('RelativePath') )
|
||||
|
||||
def endDocument( self ):
|
||||
# split into source and headers, remap path seperator to the platform
|
||||
for f in self._files:
|
||||
if ( platform.system() != 'Windows' ):
|
||||
f = f.replace( '\\', '/' )
|
||||
if ( f[-2:] == '.c' or f[-4:] == '.cpp' ):
|
||||
self.source_files.append( f.encode('ascii') )
|
||||
else:
|
||||
self.misc_files.append( f )
|
||||
print '%d source files' % len( self.source_files )
|
||||
|
||||
# action uses LDD to verify that the source doesn't hold unresolved symbols
|
||||
# setup as an AddPostAction of a regular SharedLibrary call
|
||||
def CheckUnresolved( source, target, env ):
|
||||
# TODO: implement this for OSX
|
||||
if ( platform.system() == 'Darwin' ):
|
||||
return None
|
||||
print 'CheckUnresolved %s' % target[0].abspath
|
||||
if ( not os.path.isfile( target[0].abspath ) ):
|
||||
print 'CheckUnresolved: %s does not exist' % target[0]
|
||||
return 1 # fail
|
||||
( status, output ) = commands.getstatusoutput( 'ldd -r %s' % target[0] )
|
||||
if ( status != 0 ):
|
||||
print 'CheckUnresolved: ldd command failed (exit code %d)' % status
|
||||
os.system( 'rm %s' % target[ 0 ] )
|
||||
return 1 # fail
|
||||
lines = string.split( output, '\n' )
|
||||
have_undef = 0
|
||||
for i_line in lines:
|
||||
regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)')
|
||||
if ( regex.match( i_line ) ):
|
||||
symbol = regex.sub( '\\1', i_line )
|
||||
try:
|
||||
env['ALLOWED_SYMBOLS'].index( symbol )
|
||||
except:
|
||||
have_undef = 1
|
||||
if ( have_undef ):
|
||||
print output
|
||||
print "CheckUnresolved: undefined symbols"
|
||||
os.system('rm %s' % target[0])
|
||||
return 1
|
||||
|
||||
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486
|
||||
|
||||
def Enum(*names):
|
||||
##assert names, "Empty enums are not supported" # <- Don't like empty enums? Uncomment!
|
||||
|
||||
class EnumClass(object):
|
||||
__slots__ = names
|
||||
def __iter__(self): return iter(constants)
|
||||
def __len__(self): return len(constants)
|
||||
def __getitem__(self, i): return constants[i]
|
||||
def __repr__(self): return 'Enum' + str(names)
|
||||
def __str__(self): return 'enum ' + str(constants)
|
||||
|
||||
class EnumValue(object):
|
||||
__slots__ = ('__value')
|
||||
def __init__(self, value): self.__value = value
|
||||
Value = property(lambda self: self.__value)
|
||||
EnumType = property(lambda self: EnumType)
|
||||
def __hash__(self): return hash(self.__value)
|
||||
def __cmp__(self, other):
|
||||
# C fans might want to remove the following assertion
|
||||
# to make all enums comparable by ordinal value {;))
|
||||
assert self.EnumType is other.EnumType, "Only values from the same enum are comparable"
|
||||
return cmp(self.__value, other.__value)
|
||||
def __invert__(self): return constants[maximum - self.__value]
|
||||
def __nonzero__(self): return bool(self.__value)
|
||||
def __repr__(self): return str(names[self.__value])
|
||||
|
||||
maximum = len(names) - 1
|
||||
constants = [None] * len(names)
|
||||
for i, each in enumerate(names):
|
||||
val = EnumValue(i)
|
||||
setattr(EnumClass, each, val)
|
||||
constants[i] = val
|
||||
constants = tuple(constants)
|
||||
EnumType = EnumClass()
|
||||
return EnumType
|
||||
|
||||
#if __name__ == '__main__':
|
||||
# print '\n*** Enum Demo ***'
|
||||
# print '--- Days of week ---'
|
||||
# Days = Enum('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su')
|
||||
# print Days
|
||||
# print Days.Mo
|
||||
# print Days.Fr
|
||||
# print Days.Mo < Days.Fr
|
||||
# print list(Days)
|
||||
# for each in Days:
|
||||
# print 'Day:', each
|
||||
# print '--- Yes/No ---'
|
||||
# Confirmation = Enum('No', 'Yes')
|
||||
# answer = Confirmation.No
|
||||
# print 'Your answer is not', ~answer
|
||||
|
||||
|
||||
Reference in New Issue
Block a user