summaryrefslogtreecommitdiff
path: root/mcon/U/cppfilecom.U
diff options
context:
space:
mode:
Diffstat (limited to 'mcon/U/cppfilecom.U')
-rw-r--r--mcon/U/cppfilecom.U202
1 files changed, 202 insertions, 0 deletions
diff --git a/mcon/U/cppfilecom.U b/mcon/U/cppfilecom.U
new file mode 100644
index 0000000..3caa41c
--- /dev/null
+++ b/mcon/U/cppfilecom.U
@@ -0,0 +1,202 @@
+?RCS: $Id: cppfilecom.U,v 3.0 1993/08/18 12:05:37 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS:
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: Orginal Author: Graham Stoney <greyham@research.canon.oz.au>
+?RCS:
+?RCS: $Log: cppfilecom.U,v $
+?RCS: Revision 3.0 1993/08/18 12:05:37 ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:cppfilecom cppstdinflags d_cppignhdrs d_cppcanstdin: \
+ contains package test Myread Oldconfig Loc Setvar cpp cc cat rm
+?MAKE: -pick add $@ %<
+?S:cppfilecom:
+?S: This variable contains the first part of the string which will invoke
+?S: the C preprocessor a file and produce to standard output, preserving
+?S: comments. Typical value of "cc -E -C" or "/lib/cpp -C".
+?S:.
+?S:cppstdinflags:
+?S: This variable contains any flags necessary to get cppfilecom to read
+?S: from the standard input.
+?S:.
+?S:d_cppignhdrs:
+?S: This symbol conditionally defines CPP_IGN_HDRS if CPP_FILE_COM ignores
+?S: *.h files.
+?S:.
+?S:d_cppcanstdin:
+?S: This symbol conditionally defines CPP_CAN_STDIN if CPP_FILE_COM can
+?S: read standard input directly.
+?S:.
+?C:CPP_FILE_COM (CPPFILECOM):
+?C: This symbol contains the first part of the string which will invoke
+?C: the C preprocessor a file and produce to standard output, preserving
+?C: comments. Typical value of "cc -E -C" or "/lib/cpp -C".
+?C:.
+?C:CPP_STDIN_FLAGS (CPPSTDINFLAGS):
+?C: This variable contains any flags necessary to get CPP_FILE_COM to
+?C: read from the standard input.
+?C:.
+?C:CPP_IGN_HDRS (CPPIGNHDRS):
+?C: This symbol is defined if CPP_FILE_COM ignores *.h files.
+?C:.
+?C:CPP_CAN_STDIN (CPPCANSTDIN):
+?C: This symbol is defined if CPP_FILE_COM can read standard input
+?C: directly.
+?C:.
+?H:#define CPP_FILE_COM "$cppfilecom"
+?H:#define CPP_STDIN_FLAGS "$cppstdinflags"
+?H:#$d_cppignhdrs CPP_IGN_HDRS /* does CPP ignore .h files? */
+?H:#$d_cppcanstdin CPP_CAN_STDIN /* can CPP read stdin directly? */
+?H:.
+?T:cont
+?LINT:set d_cppcanstdin d_cppignhdrs
+: see how we invoke the C preprocessor
+$cat <<EOM
+
+$package needs to be able to preprocess its input files in a mode which
+preserves comments, which is often not the default behaviour. It should run
+the C preprocessor you will use when compiling your own source code, which
+should be ISO/ANSI C compliant if you want $package to handle the latest
+standard C. I will try to guess, but I might guess wrongly because it is not
+necessarily the same preprocessor used to build $package.
+
+EOM
+$cat <<'EOT' >testcpp.c
+#define ABC abc
+#define XYZ xyz
+ABC.XYZ
+/* comment */
+EOT
+:
+if $test "X$cppfilecom" != "X" && \
+ $cppfilecom testcpp.c </dev/null >testcpp.out 2>/dev/null && \
+ $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+then
+ echo "You used to use $cppfilecom so we'll use that again."
+elif echo 'Maybe "'$cc' -E -C" will work...' && \
+ $cc -E -C testcpp.c </dev/null >testcpp.out 2>/dev/null && \
+ $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+then
+ echo "It works!"
+ cppfilecom="$cc -E -C"
+elif echo 'Nope...maybe "'"$cc"' -P -C" will work...' && \
+ $cc -P -C testcpp.c </dev/null >testcpp.out 2>/dev/null && \
+ $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+then
+ echo "Yup, that does."
+ cppfilecom="$cc -P -C"
+elif echo 'No such luck, maybe "'"$cpp"' -C" will work...' && \
+ $cpp -C testcpp.c </dev/null >testcpp.out 2>/dev/null && \
+ $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+then
+ echo "Yup, it does."
+ cppfilecom="$cpp -C"
+else
+ cppfilecom=''
+ $cat <<'EOM'
+I can't find a C preprocessor that will preserve comments. Please name one.
+EOM
+fi
+:
+dflt="$cppfilecom"
+cont=true
+while $test "$cont" ; do
+ echo " "
+ rp="How should $package run your preprocessor preserving comments?"
+ . ./myread
+ cppfilecom="$ans"
+ $cppfilecom testcpp.c >testcpp.out 2>&1
+ if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+ then
+ echo "OK, that will do."
+ cont=''
+ else
+ echo "Sorry, I can't get that to work."
+ fi
+done
+
+@if CPP_IGN_HDRS || d_cppignhdrs
+: Now see if it ignores header files.
+cp testcpp.c testcpp.h
+$cppfilecom testcpp.h >testcpp.out 2>&1
+if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+then
+ echo "Terrific; it processes .h files passed on the command line too."
+ val="$undef"
+else
+ echo "It ignores .h files on the command line; pity."
+ val="$define"
+fi
+set d_cppignhdrs
+eval $setvar
+
+@end
+@if CPP_STDIN_FLAGS || CPP_CAN_STDIN || cppstdinflags || d_cppcanstdin
+: Now see how to send stdin to it.
+echo " "
+cp testcpp.c testcpp.h
+$cppfilecom <testcpp.h >testcpp.out 2>&1
+if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+then
+ echo "Great; and it will read stdin if passed no arguments."
+ val="$define"
+ cppstdinflags=''
+else
+ $cppfilecom - <testcpp.h >testcpp.out 2>&1
+ if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+ then
+ echo "Great; and it can read stdin by passing it '-'."
+ val="$define"
+ cppstdinflags='-'
+ else
+ $cat <<FOO
+Unfortunately, I can't find an easy way to get that preprocessor to read from
+standard input. Do you know any flags I can pass it to get it to do so?
+If that preprocessor can't read directly form standard input, answer 'none'.
+
+FOO
+ val='dunno'
+ while $test "$val" = "dunno"; do
+ rp='Flags to get preprocessor to read stdin?'
+ dflt='none'
+ . ./myread
+ if $test $ans = 'none'; then
+ echo "Oh well, if $package wants it done, it will do it for itself."
+ val="$undef"
+ else
+ $cppfilecom $ans <testcpp.h >testcpp.out 2>&1
+ if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 && \
+ $contains comment testcpp.out >/dev/null 2>&1
+ then
+ echo "Good; that works fine."
+ val="$define"
+ cppstdinflags="$ans"
+ else
+ echo "Sorry, I couldn't get that to work."
+ fi
+ fi
+ done
+ fi
+fi
+set d_cppcanstdin
+eval $setvar
+
+@end
+: cleanup cpp test files anyway
+$rm -f testcpp.*
+