+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Filters preprocessed C-like header files to remove included files
+#
+# This tool is used in the process of parsing header files to extract
+# information on the declared services (the functions and structures).
+# This information is then used to generate bindings for Nit code
+# to access these services.
+#
+# The C preprocessor extends macros, inline files marked with `#include`,
+# and more. This tool acts after the C preprocessor, in a way to keep
+# everything but the included files. It searches for line pragmas
+# to identify the source of each line. The result is printed to stdout.
+#
+# Typical usage on the output of `gcc -E` (it would be the same with `clang`):
+#
+# ~~~sh
+# gcc -E /usr/include/SDL/SDL_image.h | header_keeper SDL_image.h > preprocessed_header.h
+# ~~~
+#
+# This module can also be used as a library.
+# The main service is the method `header_keeper`.
+module header_keeper
+
+# Filters the preprocessed `input` to keep only files from `target` and write to the `output`
+fun header_keeper(input: Reader, output: Writer, target: String)
+do
+ var in_target = false
+ while not input.eof do
+ var line = input.read_line
+ if not line.is_empty and line[0] == '#' then
+ in_target = line.has(target)
+ continue
+ end
+
+ if in_target then output.write line + "\n"
+ end
+end
+
+if args.length != 1 then
+ print "Usage: header_keeper header_name.h"
+ exit 1
+end
+
+header_keeper(sys.stdin, sys.stdout, args.first)