minix/commands/simple/head.c
2005-04-21 14:53:53 +00:00

78 lines
1.3 KiB
C
Executable file

/* head - print the first few lines of a file Author: Andy Tanenbaum */
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define DEFAULT 10
_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(void do_file, (int n, FILE *f));
_PROTOTYPE(void usage, (void));
int main(argc, argv)
int argc;
char *argv[];
{
FILE *f;
int n, k, nfiles;
char *ptr;
/* Check for flag. Only flag is -n, to say how many lines to print. */
k = 1;
ptr = argv[1];
n = DEFAULT;
if (argc > 1 && *ptr++ == '-') {
k++;
n = atoi(ptr);
if (n <= 0) usage();
}
nfiles = argc - k;
if (nfiles == 0) {
/* Print standard input only. */
do_file(n, stdin);
exit(0);
}
/* One or more files have been listed explicitly. */
while (k < argc) {
if (nfiles > 1) printf("==> %s <==\n", argv[k]);
if ((f = fopen(argv[k], "r")) == NULL)
fprintf(stderr, "%s: cannot open %s: %s\n",
argv[0], argv[k], strerror(errno));
else {
do_file(n, f);
fclose(f);
}
k++;
if (k < argc) printf("\n");
}
return(0);
}
void do_file(n, f)
int n;
FILE *f;
{
int c;
/* Print the first 'n' lines of a file. */
while (n) switch (c = getc(f)) {
case EOF:
return;
case '\n':
--n;
default: putc((char) c, stdout);
}
}
void usage()
{
fprintf(stderr, "Usage: head [-n] [file ...]\n");
exit(1);
}