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