#define TAIL_LINES 11

#ifdef COMPAT_TAIL
/* This version is strictly compatible with the old version */
int tail(string fname) {
     string str;
     int offset = file_size(fname);

     if (offset < 0)
	 return 0;

     offset -= 54 * 20;
     if (offset < 0) offset = 0;
     str = read_bytes(fname, offset, 1080);
     if (!str) return 0;
     if (offset) str = str[strsrch(str, "\n")+1..];
     write(str);

     return 1;
}
#else
/* This version is slightly extended and compatible in spirit, but doesn't
 * reproduce the oddities of the original tail() efun.  Note that it also
 * returns the string, so write(tail(fname)) is needed for strict
 * compatibility.
 */
varargs string tail(string fname, int nlines)
{
    int chunk, offset, num_nl, p, skip;
    string str = "";

    if(nullp(fname)) error("tail: No file name supplied.");
    if(nullp(nlines) || nlines < 1) nlines = TAIL_LINES;

    chunk = nlines * 80;
    offset = file_size(fname);

    while (offset > 0 && num_nl <= nlines) {
    num_nl = 0;
    offset -= chunk;
    if (offset < 0) {
        chunk += offset; /* negative */
        offset = 0;
    }
    str = read_bytes(fname, offset, chunk) + str;
    p = -1;
    while (p < sizeof(str)-1 && p = member_array('\n', str, p+1))
        num_nl++;
    }
    skip = num_nl - nlines;
    p = -1;
    while (skip--)
    p = member_array('\n', str, p+1);
    return str[p..];
}
#endif
