-try:
- dom = minidom.parse( stdin )
-except xml.parsers.expat.ExpatError:
- error_exit( "input invalid" )
-
-# extract information
-for volume in dom.documentElement.getElementsByTagName( "volume" ):
- name = volume.getAttribute( "name" )
- size = volume.getAttribute( "size" )
- base = volume.getAttribute( "base" )
- if name == "":
- error_exit( "volume has no name" )
- elif not match( "^[a-zA-Z0-9_]+$", name ):
- error_exit( "volume has invalid name '%s'" % name )
- elif volumes.has_key( name ):
- error_exit( "duplicate volume definition '%s'" % name )
- else:
- volumes[ name ] = "blah"
-
- if size == "":
- error_exit( "volume '%s' has no size" % name )
- try:
- size = int( size )
- except ValueError:
- error_exit( "volume '%s' has invalid size" % name )
- if base != "":
- try:
- base = int( base )
- except ValueError:
- error_exit( "volume '%s' has invalid base" % name )
- if ( size & ( SECTOR_SIZE - 1 ) ) != 0:
- error_exit( "size of volume '%s' is not a multiple of %d" % \
- ( name, SECTOR_SIZE ) )
- if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0:
- error_exit( "base of volume '%s' is not a multiple of %d" % \
- ( name, SECTOR_SIZE ) )
-
- volumeNames.append( "VOLUME_" + name )
- volumeSizes.append( size / SECTOR_SIZE )
- if base == "":
- volumeOffsets.append( -1 )
+def volumeparse( file, fname, depth ):
+ if depth > 10:
+ error_exit( "include nesting too deep - check for cycles" )
+ try:
+ dom = parse( file )
+ except xml.parsers.expat.ExpatError:
+ error_exit( fname + " is not a valid input file" )
+ except IOError:
+ error_exit( "couldn't open file " + fname )
+
+ # extract information
+ for volume in dom.documentElement.getElementsByTagName( "volume" ):
+ name = volume.getAttribute( "name" )
+ size = volume.getAttribute( "size" )
+ base = volume.getAttribute( "base" )
+ if name == "":
+ error_exit( "volume has no name" )
+ elif not match( "^[a-zA-Z0-9_]+$", name ):
+ error_exit( "volume has invalid name '%s'" % name )
+ elif volumes.has_key( name ):
+ error_exit( "duplicate volume definition '%s'" % name )
+ else:
+ volumes[ name ] = "blah"
+
+ if size == "":
+ error_exit( "volume '%s' has no size" % name )
+ try:
+ size = int( size )
+ except ValueError:
+ error_exit( "volume '%s' has invalid size" % name )
+ if base != "":
+ try:
+ base = int( base )
+ except ValueError:
+ error_exit( "volume '%s' has invalid base" % name )
+ if ( size & ( SECTOR_SIZE - 1 ) ) != 0:
+ error_exit( "size of volume '%s' is not a multiple of %d" % \
+ ( name, SECTOR_SIZE ) )
+ if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0:
+ error_exit( "base of volume '%s' is not a multiple of %d" % \
+ ( name, SECTOR_SIZE ) )
+
+ volumeNames.append( "VOLUME_" + name )
+ volumeSizes.append( size / SECTOR_SIZE )
+ if base == "":
+ volumeOffsets.append( -1 )
+ else:
+ base = base / SECTOR_SIZE
+ size = size / SECTOR_SIZE
+ volumeOffsets.append( base )
+ for i in range( size ):
+ freeSectors[ i + base ] = False
+
+ for include in dom.documentElement.getElementsByTagName( "include" ):
+ included = include.firstChild
+ if included != None and included.nodeType == included.TEXT_NODE:
+ included = expand_path( included.data )
+ volumeparse( included, "(file %s)" % included, depth + 1 )