The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
 * Copyright 1987, 1988, 1989, 1992, 1993, Geoff Kuenning, Granada Hills, CA
 * All rights reserved.
 */

#include <string.h>
#include "jsconfig.h"
#include "jspell.h"
#include "proto.h"

char *xgets(char *string, int size, FILE *stream);

#ifndef MAXINCLUDEFILES
#define MAXINCLUDEFILES     1        /* maximum number of new files in stack */
#endif

/*
 * xgets () acts just like gets () except that if a line matches
 * "&Include_File&<something>" xgets () will start reading from the
 * file <something>.
 *
 *  Andrew Vignaux -- andrew@vuwcomp  Fri May  8 16:40:23 NZST 1987
 * modified
 *  Mark Davies -- mark@vuwcomp  Mon May 11 22:38:10 NZST 1987
 */

char * xgets (str, size, stream)
    char           str[];
    int            size;
    FILE *         stream;
    {
#if MAXINCLUDEFILES == 0
    return fgets (str, size, stream);
#else
    static char *  Include_File = DEFINCSTR;
    static int     Include_Len = 0;
    static FILE *  F[MAXINCLUDEFILES+1];
    static FILE ** current_F = F;
    char *         s = str;
    int            c;

    /* read the environment variable if we havent already */
    if (Include_Len == 0)
        {
        char * env_variable;

        if ((env_variable = getenv (INCSTRVAR)) != NULL)
            Include_File = env_variable;
        Include_Len = strlen (Include_File);

        /* initialise the file stack */
        *current_F = stream;
        }

    for (  ;  ;  )
        {
        c = '\0';
        if ((s - str) + 1 < size
          &&  (c = getc (*current_F)) != EOF
          &&  c != '\n')
            {
            *s++ = (char) c;
            continue;
            }
        *s = '\0';                /* end of line */
        if (c == EOF)
            {
            if (current_F == F) /* if end of standard input */
                {
                if (s == str)
                    return (NULL);
                }
            else
                {
                (void) fclose (*(current_F--));
                      if (s == str) continue;
                }
            }

        if (incfileflag != 0
          &&  strncmp (str, Include_File, (unsigned int) Include_Len) == 0)
            {
            char *        file_name = str + Include_Len;

            if (current_F - F < MAXINCLUDEFILES  &&  strlen (file_name) != 0)
                {
                FILE *        f;

                if ((f = fopen (file_name, "r")))
                    *(++current_F) = f;
                }
            s = str;
            continue;
            }
        break;
        }

    return (str);
#endif
    }