[comp.sys.amiga.tech] getenv

lapin@cbnewsc.ATT.COM (David Roch) (11/27/89)

Unfortunately, getenv() does not always work in
Lattice C v5.02,4.  Lattice uses the same buffer
for the filename to open (e.g. ENV:some_var) as
they use to store the results.  When they copy
the results (contents of file ENV:some_var), they
do not place a NULL terminator at the end of their
string.  Lattice is aware of the problem, and is
supposed to be coming up with a fix.  In the mean
time, you may wish to use my implementation of
getenv().

------------------cut here--------------------

/* Copyright 1989 by David Roch
 * This routine may be freely used in any program
 * commercial or private, provided this copyright
 * notice remains intact.
 */

#include <stdio.h>

#define	BUFSIZE	1024
#define	ENV	"ENV:"

/*
 * char *getenv(char *)
 * Given a pointer to a character string representing a
 * variable name, return a pointer to a character string
 * that contains the value of the variable.  If no such 
 * variable exists, return a NULL pointer.
 * The returned pointer is valid until the next call to
 * getenv().
 *
 * This routine is different than the one supplied with
 * Lattice C in that multiple line variables are supported.
 * If the variable contains more than BUFSIZE characters,
 * only the first BUFSIZE characters will be returned.
 */

char *getenv(variable)
	char	*variable;
{
	FILE		*fp;
	char		*ptr;
	short		i;
	static char	buf[BUFSIZE + 1];
	
	/* if filename overflos the buffer */
	if (strlen(ENV) + strlen(variable) > BUFSIZE) {
		ptr = NULL;	/* then can't open */
	} else {
		/* create filename of form "ENV:variable_name" */
		strcpy(buf, ENV);
		strcat(buf, variable);
	
		/* open the file */
		fp = fopen(buf, "r");
		
		if (fp == NULL) { 
			/* we can't open the file */
			ptr = NULL;
		} else {
			ptr = buf;	/* set pointer to start of buffer */
			i = 0;		/* count */
			
			while ((*ptr = fgetc(fp)) != EOF && i < BUFSIZE) {
				i++;	/* bump count */
				ptr++;	/* next location in buffer */
			} /* end while */
			
			fclose(fp);	/* close file */
			*ptr = NULL;	/* terminate string */
			ptr = buf;	/* point to start of buf */
		} /* end if (fp == NULL) */
		
	} /* end if strlen's > BUFSIZE */
	
	return (ptr);
} /* end getenv() */