Path: utzoo!yunexus!geac!syntron!jtsv16!uunet!peregrine!elroy!ames!mailrus!cornell!uw-beaver!teknowledge-vaxc!sri-unix!quintus!ok
From: ok@quintus.uucp (Richard A. O'Keefe)
Newsgroups: comp.lang.c
Subject: Re: cpp compatiblity Unix/VMS
Message-ID: <286@quintus.UUCP>
Date: 13 Aug 88 05:29:32 GMT
Article-I.D.: quintus.286
References: <792@cernvax.UUCP> <229@gsg.UUCP>
Sender: news@quintus.UUCP
Reply-To: ok@quintus.UUCP (Richard A. O'Keefe)
Organization: Quintus Computer Systems, Inc.
Lines: 54

In article <229@gsg.UUCP> lew@gsg.UUCP (Paul Lew) writes:
>Is there a version of cpp that will use Unix environment variables for
>include file names?  This is something I like to have for a long time.

Suggestion:  you don't _have_ to do everything with cpp.
Write a program that extracts the variables of interest from the
environment and writes a header file.  For example, I just knocked
together the following Bourne shell script to do this (10 minutes,
5 minutes needed to check the manual because I normally use csh):

#!/bin/sh
# FILE  : zabbo
# USAGE : zabbo var.... >foobaz.h
# EFFECT:
#	For each var in turn,
#	if var is defined, then #define var "$var" is written.
#	otherwise,		#undef  var	   is written.
# EXAMPLE: zabbo TERM HOME >env.h

d='$' q='"'
for var
    do
	eval "def=is_$d{$var+defined} val=$d{$var-}"
	if [ $def = is_defined ]
	    then
		echo "#define $var $q$val$q"
	    else
		echo "#undef  $var"
	    fi
    done

Here's an example:
	% zabbo TERM HOME NONESUCH >env.h
	% cat env.h
	#define TERM "sun"
	#define HOME "/goedel/ok"
	#undef  NONESUCH

How can you use this to select the appropriate header file?
Suppose you have an environment variable
	STRINGS_HDR=""	# or whatever
then you create a header file with
	% zabbo STRINGS_HDR ...others... >env.h
and in your C program do

	#include "env.h"
	#include STRINGS_HDR

This works in 4.2, V.2, and V.3.

There is no end to the places you might want to get definitions for
C macros.  This technique of writing a program to extract the information
and repackage it for CPP can be used for other things than looking up the
environment, and keeps CPP simple.