if (style == NOTSET)
if (style == NOTSET) {
main(argc, argv)	int argc;	char *argv[];{	struct stat sb;	FILE *fp;	long off = 0;	enum STYLE style;	int ch, first;	char *p;	/*	 * Tail's options are weird.  First, -n10 is the same as -n-10, not	 * -n+10.  Second, the number options are 1 based and not offsets,	 * so -n+1 is the first line, and -c-1 is the last byte.  Third, the	 * number options for the -r option specify the number of things that	 * get displayed, not the starting point in the file.  The one major	 * incompatibility in this version as compared to historical versions	 * is that the 'r' option couldn't be modified by the -lbc options,	 * i.e. it was always done in lines.  This version treats -rc as a	 * number of characters in reverse order.  Finally, the default for	 * -r is the entire file, not 10 lines.	 */#define	ARG(units, forward, backward) {					\	if (style)							\		usage();						\	off = strtol(optarg, &p, 10) * (units);				\	if (*p)								\		errx(1, "illegal offset -- %s", optarg);		\	switch(optarg[0]) {						\	case '+':							\		if (off)						\			off -= (units);					\			style = (forward);				\		break;							\	case '-':							\		off = -off;						\		/* FALLTHROUGH */					\	default:							\		style = (backward);					\		break;							\	}								\}	obsolete(argv);	style = NOTSET;	while ((ch = getopt(argc, argv, "b:c:fn:r")) != -1)		switch(ch) {		case 'b':			ARG(512, FBYTES, RBYTES);			break;		case 'c':			ARG(1, FBYTES, RBYTES);			break;		case 'f':			fflag = 1;			break;		case 'n':			ARG(1, FLINES, RLINES);			break;		case 'r':			rflag = 1;			break;		case '?':		default:			usage();		}	argc -= optind;	argv += optind;	if (fflag && argc > 1)		errx(1, "-f option only appropriate for a single file");	/*	 * If displaying in reverse, don't permit follow option, and convert	 * style values.	 */	if (rflag) {		if (fflag)			usage();		if (style == FBYTES)			style = RBYTES;		else if (style == FLINES)			style = RLINES;	}	/*	 * If style not specified, the default is the whole file for -r, and	 * the last 10 lines if not -r.	 */	if (style == NOTSET)		if (rflag) {			off = 0;			style = REVERSE;		} else {			off = 10;			style = RLINES;		}	if (*argv)		for (first = 1; (fname = *argv++);) {			if ((fp = fopen(fname, "r")) == NULL ||			    fstat(fileno(fp), &sb)) {				ierr();				continue;			}			if (argc > 1) {				(void)printf("%s==> %s <==\n",				    first ? "" : "\n", fname);				first = 0;				(void)fflush(stdout);			}			if (rflag)				reverse(fp, style, off, &sb);			else				forward(fp, style, off, &sb);			(void)fclose(fp);		}	else {		fname = "stdin";		if (fstat(fileno(stdin), &sb)) {			ierr();			exit(1);		}		/*		 * Determine if input is a pipe.  4.4BSD will set the SOCKET		 * bit in the st_mode field for pipes.  Fix this then.		 */		if (lseek(fileno(stdin), (off_t)0, SEEK_CUR) == -1 &&		    errno == ESPIPE) {			errno = 0;			fflag = 0;		/* POSIX.2 requires this. */		}		if (rflag)			reverse(stdin, style, off, &sb);		else			forward(stdin, style, off, &sb);	}	exit(rval);}