summaryrefslogtreecommitdiffstats
path: root/mkstatichdtbl.py
blob: 20f0c153955face415e261bacfcc4601374a4c1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# This scripts reads static table entries [1] and generates
# nghttp2_hd_static_entry table.  This table is used in
# lib/nghttp2_hd.c.
#
# [1] https://httpwg.org/specs/rfc7541.html

import re, sys

def hd_map_hash(name):
  h = 2166136261

  # FNV hash variant: http://isthe.com/chongo/tech/comp/fnv/
  for c in name:
    h ^= ord(c)
    h *= 16777619
    h &= 0xffffffff

  return h

entries = []
for line in sys.stdin:
    m = re.match(r'(\d+)\s+(\S+)\s+(\S.*)?', line)
    val = m.group(3).strip() if m.group(3) else ''
    entries.append((int(m.group(1)), m.group(2), val))

print('static nghttp2_hd_entry static_table[] = {')
idx = 0
for i, ent in enumerate(entries):
    if entries[idx][1] != ent[1]:
        idx = i
    print('MAKE_STATIC_ENT("{}", "{}", {}, {}u),'\
        .format(ent[1], ent[2], entries[idx][0] - 1, hd_map_hash(ent[1])))
print('};')