text: import sys
  import os
  import string
  
  basename = ''
  output = ''
  sep = os.sep
  
  def mkromfs_output(out):
      # print '%s' % out,
      output.write(out)
  
  def mkromfs_file(filename, arrayname):
      f = open(filename, "rb")
      arrayname = arrayname.replace('.', '_')
      arrayname = arrayname.replace('-', '_')
      mkromfs_output('const static unsigned char %s[] = {\n' % arrayname)
  
      count = 0
      while True:
          byte = f.read(1)
  
          if len(byte) != 1:
              break
  
          mkromfs_output('0x%02x,' % ord(byte))
          
          count = count + 1
          if count == 16:
              count = 0
              mkromfs_output('\n')
      
      if count == 0:
          mkromfs_output('};\n\n')
      else:
          mkromfs_output('\n};\n\n')
  
      f.close()
  
  def mkromfs_dir(dirname, is_root = False):
      list = os.listdir(dirname)
      path = os.path.abspath(dirname)
      
      # make for directory 
      for item in list:
          fullpath = os.path.join(path, item)
          if os.path.isdir(fullpath):
              # if it is an empty directory, ignore it
              l = os.listdir(fullpath)
              if len(l):
                  mkromfs_dir(fullpath)
      
      # make for files
      for item in list:
          fullpath = os.path.join(path, item)
          if os.path.isfile(fullpath):
              subpath = fullpath[len(basename):]
              array = subpath.split(sep)
              arrayname = "_".join(array)
              mkromfs_file(fullpath, arrayname)
  
      subpath = path[len(basename):]
      dir = subpath.split(sep)
      direntname = "_".join(dir)
      if is_root:
          mkromfs_output('const struct romfs_dirent _root_dirent[] = {\n')
      else:
          mkromfs_output(('const static struct romfs_dirent %s[] = {\n' % direntname))
      
      for item in list:
          fullpath = os.path.join(path, item)
          fn = fullpath[len(dirname):]
          if fn[0] == sep:
              fn = fn[1:]
          fn = fn.replace('\\', '/')
  
          subpath = fullpath[len(basename):]
          items = subpath.split(sep)
          item_name = "_".join(items)
          item_name = item_name.replace('.', '_')
          item_name = item_name.replace('-', '_')
          subpath = subpath.replace('\\', '/')
          if subpath[0] == '/':
              subpath = subpath[1:]
  
          if not os.path.isfile(fullpath):
              l = os.listdir(fullpath)
              if len(l):
                  mkromfs_output(('\t{ROMFS_DIRENT_DIR, "%s", (rt_uint8_t*) %s, sizeof(%s)/sizeof(%s[0])},\n' % (fn, item_name, item_name, item_name)))
              else:
                  mkromfs_output(('\t{ROMFS_DIRENT_DIR, "%s", RT_NULL, 0},\n' % fn))
  
      for item in list:
          fullpath = os.path.join(path, item)
          fn = fullpath[len(dirname):]
          if fn[0] == sep:
              fn = fn[1:]
          fn = fn.replace('\\', '/')
      
          subpath = fullpath[len(basename):]
          items = subpath.split(sep)
          item_name = "_".join(items)
          item_name = item_name.replace('.', '_')
          item_name = item_name.replace('-', '_')
          subpath = subpath.replace('\\', '/')
          if subpath[0] == '/':
              subpath = subpath[1:]
      
          if os.path.isfile(fullpath):
              mkromfs_output(('\t{ROMFS_DIRENT_FILE, "%s", %s, sizeof(%s)},\n' % (fn, item_name, item_name)))
      
      mkromfs_output('};\n\n')
  
  if __name__ == "__main__":
      try:
          basename = os.path.abspath(sys.argv[1])
          filename = os.path.abspath(sys.argv[2])
      except IndexError:
          print("Usage: %s <dirname> <filename>" % sys.argv[0])
          raise SystemExit
  
      output = open(filename, 'wt')
      mkromfs_output("#include <dfs_romfs.h>\n\n")
      mkromfs_dir(basename, is_root = True)
      
      mkromfs_output("const struct romfs_dirent romfs_root = {ROMFS_DIRENT_DIR, \"/\", (rt_uint8_t*) _root_dirent, sizeof(_root_dirent)/sizeof(_root_dirent[0])};\n\n")
      output.close()
  