parameters: (output_name, filelist)
docstring: Generates a header map based on |filelist|.
  
    Per Mark Mentovai:
      A header map is structured essentially as a hash table, keyed by names used
      in #includes, and providing pathnames to the actual files.
  
    The implementation below and the comment above comes from inspecting:
      http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt
    while also looking at the implementation in clang in:
      https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp
docstring_summary: Generates a header map based on |filelist|.
docstring_tokens: Generates a header map based on |filelist| .
function: def WriteHmap(output_name, filelist):
    """Generates a header map based on |filelist|.
  
    Per Mark Mentovai:
      A header map is structured essentially as a hash table, keyed by names used
      in #includes, and providing pathnames to the actual files.
  
    The implementation below and the comment above comes from inspecting:
      http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt
    while also looking at the implementation in clang in:
      https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp
    """
    magic = 1751998832
    version = 1
    _reserved = 0
    count = len(filelist)
    capacity = NextGreaterPowerOf2(count)
    strings_offset = 24 + (12 * capacity)
    max_value_length = max(len(value) for value in filelist.values())
  
    out = open(output_name, "wb")
    out.write(struct.pack('<LHHLLLL', magic, version, _reserved, strings_offset,
                          count, capacity, max_value_length))
  
    # Create empty hashmap buckets.
    buckets = [None] * capacity
    for file, path in filelist.items():
      key = 0
      for c in file:
        key += ord(c.lower()) * 13
  
      # Fill next empty bucket.
      while buckets[key & capacity - 1] is not None:
        key = key + 1
      buckets[key & capacity - 1] = (file, path)
  
    next_offset = 1
    for bucket in buckets:
      if bucket is None:
        out.write(struct.pack('<LLL', 0, 0, 0))
      else:
        (file, path) = bucket
        key_offset = next_offset
        prefix_offset = key_offset + len(file) + 1
        suffix_offset = prefix_offset + len(os.path.dirname(path) + os.sep) + 1
        next_offset = suffix_offset + len(os.path.basename(path)) + 1
        out.write(struct.pack('<LLL', key_offset, prefix_offset, suffix_offset))
  
    # Pad byte since next offset starts at 1.
    out.write(struct.pack('<x'))
  
    for bucket in buckets:
      if bucket is not None:
        (file, path) = bucket
        out.write(struct.pack('<%ds' % len(file), file))
        out.write(struct.pack('<s', '\0'))
        base = os.path.dirname(path) + os.sep
        out.write(struct.pack('<%ds' % len(base), base))
        out.write(struct.pack('<s', '\0'))
        path = os.path.basename(path)
        out.write(struct.pack('<%ds' % len(path), path))
        out.write(struct.pack('<s', '\0'))
function_tokens: def WriteHmap ( output_name , filelist ) : magic = 1751998832 version = 1 _reserved = 0 count = len ( filelist ) capacity = NextGreaterPowerOf2 ( count ) strings_offset = 24 + ( 12 * capacity ) max_value_length = max ( len ( value ) for value in filelist . values ( ) ) out = open ( output_name , "wb" ) out . write ( struct . pack ( '<LHHLLLL' , magic , version , _reserved , strings_offset , count , capacity , max_value_length ) ) # Create empty hashmap buckets. buckets = [ None ] * capacity for file , path in filelist . items ( ) : key = 0 for c in file : key += ord ( c . lower ( ) ) * 13 # Fill next empty bucket. while buckets [ key & capacity - 1 ] is not None : key = key + 1 buckets [ key & capacity - 1 ] = ( file , path ) next_offset = 1 for bucket in buckets : if bucket is None : out . write ( struct . pack ( '<LLL' , 0 , 0 , 0 ) ) else : ( file , path ) = bucket key_offset = next_offset prefix_offset = key_offset + len ( file ) + 1 suffix_offset = prefix_offset + len ( os . path . dirname ( path ) + os . sep ) + 1 next_offset = suffix_offset + len ( os . path . basename ( path ) ) + 1 out . write ( struct . pack ( '<LLL' , key_offset , prefix_offset , suffix_offset ) ) # Pad byte since next offset starts at 1. out . write ( struct . pack ( '<x' ) ) for bucket in buckets : if bucket is not None : ( file , path ) = bucket out . write ( struct . pack ( '<%ds' % len ( file ) , file ) ) out . write ( struct . pack ( '<s' , '\0' ) ) base = os . path . dirname ( path ) + os . sep out . write ( struct . pack ( '<%ds' % len ( base ) , base ) ) out . write ( struct . pack ( '<s' , '\0' ) ) path = os . path . basename ( path ) out . write ( struct . pack ( '<%ds' % len ( path ) , path ) ) out . write ( struct . pack ( '<s' , '\0' ) )