#!/usr/bin/env python3

import re
import sys

from  urllib.request import urlopen

syscalls = {}


def print_table(name):
  tab = syscalls[name]
  print('\n\n----------------- BEGIN OF %s -----------------' % name)
  for i in range(max(tab.keys()) + 1):
    print('"%s",  // %d' % (tab.get(i, ''), i))
  print('----------------- END OF %s -----------------' % name)


# Parses a .tbl file (new format).
def parse_tlb(data):
  table = {}
  for line in data.splitlines():
    line = line.strip()
    if line.startswith('#') or not (line):
      continue
    parts = line.split()
    table[int(parts[0])] = 'sys_' + parts[2]
  return table


# Parses a #define __NR_xx 1234 old-style unistd.h header.
def parse_def(data):
  table = {}
  for line in data.splitlines():
    m = re.match(r'^#define\s+__NR\d*?_(\w+)\s+(\d+)\s*$', line.strip())
    if not m or m.group(1) == 'syscalls':  # __NR_syscalls is just a sentinel.
      continue
    table[int(m.group(2))] = 'sys_' + m.group(1)
  return table


def Main():
  KSRC = 'https://raw.githubusercontent.com/torvalds/linux/v4.20/'

  response = urlopen(KSRC + 'arch/x86/entry/syscalls/syscall_64.tbl')
  syscalls['x86_64'] = parse_tlb(response.read().decode())

  response = urlopen(KSRC + 'arch/x86/entry/syscalls/syscall_32.tbl')
  syscalls['x86'] = parse_tlb(response.read().decode())

  response = urlopen(KSRC + 'arch/arm/tools/syscall.tbl')
  syscalls['armeabi'] = parse_tlb(response.read().decode())

  response = urlopen(KSRC + 'arch/arm64/include/asm/unistd32.h')
  syscalls['aarch32'] = parse_def(response.read().decode())

  # From:
  # arch/arm64/include/asm/unistd.h
  #   -> arch/arm64/include/uapi/asm/unistd.h
  #     -> include/uapi/asm-generic/unistd.h
  response = urlopen(KSRC + 'include/uapi/asm-generic/unistd.h')
  syscalls['aarch64'] = parse_def(response.read().decode())

  print_table('x86_64')
  print_table('x86')
  print_table('aarch64')
  print_table('armeabi')
  print_table('aarch32')


if __name__ == '__main__':
  sys.exit(Main())