code: def parse_file(defn, preprocess=True):
      
      if pycparser is None:
          raise ImportError("Please install pycparser in order to parse C definitions")
  
      defn = '\n'.join(x for x in defn.split('\n') if _include_re.match(x) is None)
  
      if preprocess:
          defn = do_preprocess(defn)
  
      preamble, ignoreme = make_preamble()
      node = pycparser.c_parser.CParser().parse(preamble + defn)
      if not isinstance(node, pycparser.c_ast.FileAST):
          raise ValueError("Something went horribly wrong using pycparser")
      out = {}
      extra_types = {}
      for piece in node.ext:
          if isinstance(piece, pycparser.c_ast.FuncDef):
              out[piece.decl.name] = _decl_to_type(piece.decl.type, extra_types)
          elif isinstance(piece, pycparser.c_ast.Decl):
              ty = _decl_to_type(piece.type, extra_types)
              if piece.name is not None:
                  out[piece.name] = ty
          elif isinstance(piece, pycparser.c_ast.Typedef):
              extra_types[piece.name] = _decl_to_type(piece.type, extra_types)
  
      for ty in ignoreme:
          del extra_types[ty]
      return out, extra_types
docs: Parse a series of C definitions, returns a tuple of two type mappings, one for variable
      definitions and one for type definitions.