/***********************************************************************/
/* MANEXT - Extract manual pages from C source code.                   */
/***********************************************************************/
/*
 * MANEXT - A program to extract manual pages from C source code.
 * Copyright (C) 1991-1996 Mark Hessling
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * If you make modifications to this software that you feel increases
 * it usefulness for the rest of the community, please email the
 * changes, enhancements, bug fixes as well as any and all ideas to me.
 * This software is going to be maintained and enhanced as deemed
 * necessary by the community.
 *
 * Mark Hessling <mark@rexx.org>
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE 255

void display_info(void)
{
    fprintf(stderr, "\nMANEXT 1.03 Copyright (C) 1991-1996 Mark Hessling\n"
                    "All rights reserved.\n"
                    "MANEXT is distributed under the terms of the GNU\n"
                    "General Public License and comes with NO WARRANTY.\n"
                    "See the file COPYING for details.\n"
                    "\nUsage: manext sourcefile [...]\n\n");
}

int main(int argc, char **argv)
{
    char s[MAX_LINE + 1];       /* input line */
    int i;
    FILE *fp;

#ifdef __EMX__
    _wildcard(&argc, &argv);
#endif
    if (strcmp(argv[1], "-h") == 0)
    {
        display_info();
        exit(1);
    }

    for (i = 1; i < argc; i++)
    {
        if ((fp = fopen(argv[i], "r")) == NULL)
        {
            fprintf(stderr, "\nCould not open %s\n", argv[i]);
            continue;
        }

        while (!feof(fp))
        {
            if (fgets(s, (int)sizeof(s), fp) == NULL)
            {
                if (ferror(fp) != 0)
                {
                    fprintf(stderr, "*** Error reading %s.  Exiting.\n",
                            argv[i]);
                    exit(1);
                }

                break;
            }

            /* check for manual entry marker at beginning of line */

            if (strncmp(s, "/*man-start*", 12) != 0)
                continue;

            /* inner loop */

            for (;;)
            {
                /* read next line of manual entry */

                if (fgets(s, (int)sizeof(s), fp) == NULL)
                {
                    if (ferror(fp) != 0)
                    {
                        fprintf(stderr, "*** Error reading %s.  Exiting.\n",
                                argv[i]);
                        exit(1);
                    }

                    break;
                }

                /* check for end of entry marker */

                if (strncmp(s, "**man-end", 9) == 0)
                    break;

                printf("%s", s);
            }

            printf("\n\n-----------------------------------"
                   "---------------------------------------\n\n");
        }

        fclose(fp);
    }

    return 0;
}
