code: 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()