/* FPDIO.C Copyright (C) 1993 Fergus Patrick Duniho */

#ifndef _FPDIO_C
#define _FPDIO_C

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

#define RdOpen(X,Y) X=FDOpen(Y, "r")
#define WrOpen(X,Y) X=FDOpen(Y, "w")
#define ApOpen(X,Y) X=FDOpen(Y, "a")

void wrapwrite (FILE *fptr, int ind, int lm, int rm, char *s, ...);
int wrdlen(char *s);
int fgetp (FILE *fptr);
FILE *FDOpen (const char *fn, const char *mode);
int Linefeeds (char *fname);
char *clone_line (FILE *fptr, int max);
int yesno ();

void wrapwrite (FILE *fptr, int ind, int lm, int rm, char *s, ...) {
    va_list ap;
    int i, j;

    va_start(ap, s);
    for (j = ind; ; j = lm) {
        for (i = 0; i < j; i++)
            fputc (' ', fptr);
        for (i = j; i < rm; i++)
            switch (*s) {
                case 0:     /* End of string reached */
                    if ((s = va_arg(ap, char *)) == 0) {
                        fputc ('\n', fptr);
                        va_end(ap);
                        return;
                    }
                    if ((i + wrdlen(s)) >= rm)
                        i = rm;
                    else if (i > j)
                        fputc (' ', fptr);
                    break;
                case ' ':     /* End of word reached */
                    if ((i + wrdlen(++s)) >= rm)
                        i = rm;
                    else if (i > j)
                        fputc (' ', fptr);
                    break;
                case '\n':    /* End of line reached */
                    i = rm;
                    s++;
                    break;
                default:
                    fputc (*s++, fptr);
            }
        fputc ('\n', fptr);
        if ((*s == '\0') && ((s = va_arg(ap, char *)) == 0)) {
            va_end(ap);
            return;
        }
    }
}

int wrdlen(char *s) {
    int r;

    for (r = 0; *s != ' ' && *s != '\n' && *s != '\0'; r++, s++);
    return r;
}

int fgetp (FILE *fptr) {
    int c, tot = 0;

    while (!isdigit(c = getc(fptr)))
        if (c == EOF)
            return EOF;
    do {
        tot *= 10;
        tot += (c - '0');
    } while (isdigit(c = getc(fptr)));
    if (c != '\n')
        ungetc (c, fptr);
    return tot;
}

FILE *FDOpen (const char *fn, const char *mode) {
    FILE *fptr;

    if ((fptr = fopen(fn, mode)) == NULL) {
        fprintf (stderr, "Could not open %s.", fn);
        exit (2);
    }
    return fptr;
}

int Linefeeds (char *fname) {
    FILE *fptr;
    int c, cnt = 0;

    RdOpen (fptr, fname);
    while ((c = getc(fptr)) != EOF)
        if (c == '\n')
            cnt++;
    fclose (fptr);
    return cnt;
}

char *clone_line (FILE *fptr, int max) {
    char *s, *r, *t;
    int i;

    s = (char *)malloc(max + 1);
    t = s;
    for (i = 0; (i < max) && ((*s = fgetc(fptr)) != '\n'); i++, s++);
    if (*s != '\n')
        ungetc(*s, fptr);
    *s = '\0';
    r = strdup(t);
    free (t);
    return r;
}

int yesno () {
    int c;

    for (;;) {
        c = fgetc(stdin);
        while (fgetc(stdin) != '\n');
        if (c == 'y' || c == 'Y')
            return 1;
        if (c == 'n' || c == 'N')
            return 0;
        puts ("Please answer y or n.");
    }
}

#endif /* _FPDIO_C */
