# A script to convert an entire directory to a C array, in the "romfs" format import os, sys import re import struct _crtline = ' ' _numdata = 0 _bytecnt = 0 # Line output function def _add_data( data, outfile, moredata = True ): global _crtline, _numdata, _bytecnt _bytecnt = _bytecnt + 1 if moredata: _crtline = _crtline + "0x%02X, " % data else: _crtline = _crtline + "0x%02X" % data _numdata = _numdata + 1 if _numdata == 16 or not moredata: outfile.write( _crtline + '\n' ) _crtline = ' ' _numdata = 0 # dirname - the directory where the files are located. # outname - the name of the C output # flist - list of files # Returns True for OK, False for error def mkfs( dirname, outname, flist ): # Try to create the output files outfname = outname + ".h" try: outfile = file( outfname, "wb" ) except: print "Unable to create output file" return False global _crtline, _numdata, _bytecnt _crtline = ' ' _numdata = 0 _bytecnt = 0 # Generate headers outfile.write( "// Generated by mkfs.py\n// DO NOT MODIFY\n\n" ) outfile.write( "#ifndef __%s_H__\n#define __%s_H__\n\n" % ( outname.upper(), outname.upper() ) ) outfile.write( "const unsigned char %s_fs[] = \n{\n" % ( outname.lower() ) ) # Process all files for fname in flist: if len( fname ) > 14: print "Skipping %s (name longer than 14 chars)" % realname continue # Get actual file name realname = os.path.join( dirname, fname ) # Ensure it actually is a file if not os.path.isfile( realname ): print "Skipping %s ... (not found or not a regular file)" % fname continue # Try to open and read the file try: crtfile = file( realname, "rb" ) filedata = crtfile.read() except: outfile.close() os.remove( outfname ) print "Unable to read %s" % fname return False # Write name, size, id, numpars for c in fname: _add_data( ord( c ), outfile ) _add_data( 0, outfile ) # ASCIIZ size_l = len( filedata ) & 0xFF size_h = ( len( filedata ) >> 8 ) & 0xFF _add_data( size_l, outfile ) _add_data( size_h, outfile ) # Then write the rest of the file for c in filedata: _add_data( ord( c ), outfile ) # Report print "Encoded file %s (%d bytes)" % ( fname, len( filedata ) ) # All done, write the final "0" (terminator) _add_data( 0, outfile, False ) outfile.write( "};\n\n#endif\n" ); outfile.close() print "Done, total size is %d bytes" % _bytecnt return True