windows-nt/Source/XPSP1/NT/sdktools/head/head.c
2020-09-26 16:20:57 +08:00

110 lines
2.3 KiB
C

/* head - first n lines to STDOUT
*
* 20-Jul-1991 ianja Wrote it.
* 21-Jul-1991 ianja Close stdin (for piped input)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
int Head(char *pszFile, int nLines, BOOL fBanner);
char *Version = "HEAD v1.1 1991-06-20:";
#define BUFSZ 256
void
__cdecl main (argc, argv)
int argc;
char *argv[];
{
int nArg;
int cLines = 10; // default
int nFiles = 0;
int nErr = 0;
if ((argc > 1) && ((*argv[1] == '-') || (*argv[1] == '/'))) {
if (argv[1][1] == '?') {
printf("%s\n", Version);
printf("usage: HEAD [switches] [filename]*\n");
printf(" switches: [-?] display this message\n");
printf(" [-n] display top n lines of each file (default 10)\n");
exit(0);
}
cLines = atoi(argv[1]+1);
nArg = 2;
} else {
nArg = 1;
}
nFiles = argc - nArg;
if (nFiles < 1) {
nErr += Head(NULL, cLines, FALSE);
} else while (nArg < argc) {
nErr += Head(argv[nArg], cLines, (nFiles > 1));
nArg++;
}
if (nErr) {
exit(2);
} else {
exit(0);
}
}
int Head(char *pszFile, int nLines, BOOL fBanner)
{
FILE *fp;
int nErr = 0;
char buff[BUFSZ];
/*
* Open file for reading
*/
if (pszFile) {
if ((fp = fopen(pszFile, "r")) == NULL) {
fprintf(stderr, "HEAD: can't open %s\n", pszFile);
return 1;
}
} else {
fp = stdin;
}
/*
* Banner printed if there is more than one input file
*/
if (fBanner) {
fprintf(stdout, "==> %s <==\n", pszFile);
}
/*
* Print cLines, or up to end of file, whichever comes first
*/
while (nLines-- > 0) {
if (fgets(buff, BUFSZ-1, fp) == NULL) {
if (!feof(fp)) {
fprintf(stderr, "HEAD: can't read %s\n", pszFile);
nErr++;
goto CloseOut;
}
break;
}
if (fputs(buff, stdout) == EOF) {
fprintf(stderr, "can't write output\n");
nErr++;
goto CloseOut;
}
}
if (fBanner) {
fprintf(stdout, "\n");
}
CloseOut:
fclose(fp);
return nErr;
}