12c593315Sopenharmony_ci#!/usr/bin/env python3
22c593315Sopenharmony_ci# -*- coding: utf-8 -*-
32c593315Sopenharmony_ci
42c593315Sopenharmony_ci# This scripts reads static table entries [1] and generates
52c593315Sopenharmony_ci# nghttp2_hd_static_entry table.  This table is used in
62c593315Sopenharmony_ci# lib/nghttp2_hd.c.
72c593315Sopenharmony_ci#
82c593315Sopenharmony_ci# [1] https://httpwg.org/specs/rfc7541.html
92c593315Sopenharmony_ci
102c593315Sopenharmony_ciimport re, sys
112c593315Sopenharmony_ci
122c593315Sopenharmony_cidef hd_map_hash(name):
132c593315Sopenharmony_ci  h = 2166136261
142c593315Sopenharmony_ci
152c593315Sopenharmony_ci  # FNV hash variant: http://isthe.com/chongo/tech/comp/fnv/
162c593315Sopenharmony_ci  for c in name:
172c593315Sopenharmony_ci    h ^= ord(c)
182c593315Sopenharmony_ci    h *= 16777619
192c593315Sopenharmony_ci    h &= 0xffffffff
202c593315Sopenharmony_ci
212c593315Sopenharmony_ci  return h
222c593315Sopenharmony_ci
232c593315Sopenharmony_cientries = []
242c593315Sopenharmony_cifor line in sys.stdin:
252c593315Sopenharmony_ci    m = re.match(r'(\d+)\s+(\S+)\s+(\S.*)?', line)
262c593315Sopenharmony_ci    val = m.group(3).strip() if m.group(3) else ''
272c593315Sopenharmony_ci    entries.append((int(m.group(1)), m.group(2), val))
282c593315Sopenharmony_ci
292c593315Sopenharmony_ciprint('static nghttp2_hd_entry static_table[] = {')
302c593315Sopenharmony_ciidx = 0
312c593315Sopenharmony_cifor i, ent in enumerate(entries):
322c593315Sopenharmony_ci    if entries[idx][1] != ent[1]:
332c593315Sopenharmony_ci        idx = i
342c593315Sopenharmony_ci    print('MAKE_STATIC_ENT("{}", "{}", {}, {}u),'\
352c593315Sopenharmony_ci        .format(ent[1], ent[2], entries[idx][0] - 1, hd_map_hash(ent[1])))
362c593315Sopenharmony_ciprint('};')
37