1 #! /bin/sh 2 3 # (C) 1998, 2007 Free Software Foundation 4 # Originally by Alexandre Oliva <oliva (at] lsd.ic.unicamp.br> 5 6 # This gawk/shell script is free software; you can redistribute it and/or 7 # modify it under the terms of the GNU General Public License as published 8 # by the Free Software Foundation; either version 3, or (at your option) 9 # any later version. 10 11 # Given a preprocessed C/C++ code snippet, this script will replace any 12 # standard header files with an actual #include <...> directive. 13 14 # Example: 15 # # 1 "test.c" 16 # # 1 "/usr/include/stdio.h" 1 3 17 # <snip> 18 # # 1 "test.c" 2 19 # 20 # main() { printf("Hello world!\n"); } 21 22 # is replaced with 23 # # 1 "test.c" 24 # #include <stdio.h> 25 # main() { printf("Hello world!\n"); } 26 27 28 # Header files whose pathnames contain any of the following patterns 29 # are considered as standard headers: usr/include, g++-include, 30 # include/g++, include/c++/<version>, gcc-lib/<anything>/include. 31 32 gawk ${EXCLUDEPATT+-vexclude="$EXCLUDEPATT"} \ 33 ${INCLUDEPATT+-vinclude="$INCLUDEPATT"} ' 34 BEGIN { 35 skipping = 0; 36 cppline = "^# [0-9]+ \"[^\"]*/(usr/include|g\\+\\+-include|include/g\\+\\+|include/c\\+\\+/[^/]+|gcc-lib/[^\"]+/include|gcc/include)/([^\"]+)\"( [1-4])*$" 37 } 38 !skipping && $0 ~ cppline && 39 (exclude == "" || $3 !~ exclude) && (include == "" || $3 ~ include) { 40 skipping = 1; 41 printf "%s\n", "#include <" gensub(cppline, "\\2", 1, $0) ">" 42 next; 43 } 44 skipping && /^# [0-9]+ / && $3 == lastincluded { 45 skipping = 0; 46 next; 47 } 48 !skipping && /^# [0-9]+ / { 49 lastincluded = $3; 50 } 51 !skipping { print } 52 ' ${1+"$@"} 53