def add_data(self, filenames):
        def _parse_table(table):
            def _parse_line(line):
                return line.split('\t')
            lines = (_parse_line(one) for one in table.splitlines()
                     if re.match(r'^\d', one))
            return (remove_false(one) for one in lines)
        def _parse_decl(decl):
            index = len('SYSCALL_DEFINE')
            argc = decl[index]
            rest = decl[index + 1:][1:-1].split(',')
            name = rest[0]
            args = ','.join(rest[1:])
            return name, argc, args
        def _parse_line(line):
            index = line.find(':')
            if index == -1:
                raise RuntimeError('This is unexpected: %s', line)
            filename = line[:index]
            decl = line[index + 1:]
            return filename, _parse_decl(decl)
        def _split_into_lines(grep_output):
            lines = grep_output.replace('\n\n', '\n')
            lines = lines.replace('\n\t', '').replace('\t', ' ')
            return lines.strip().splitlines()
        for one in filenames:
            if one.name.endswith('.tbl'):
                for item in _parse_table(one.read()):
                    args = list(item)
                    if len(args) != 5:
                        args += [''] * (5 - len(args))
                    self.session.add(
                        Item(name=args[2], abi=args[1],
                             number=args[0], entry=args[3],
                             compat=args[4]))
            else:
                for line in _split_into_lines(one.read()):
                    filename, rest = (_parse_line(line))
                    self.session.add(
                        Decl(name=rest[0], filename=filename,
                             argc=rest[1], args=rest[2]))
        self.session.commit()