utils: add head
authorAlan Cox <alan@linux.intel.com>
Mon, 29 Dec 2014 22:51:20 +0000 (22:51 +0000)
committerAlan Cox <alan@linux.intel.com>
Mon, 29 Dec 2014 22:51:20 +0000 (22:51 +0000)
Applications/util/Makefile
Applications/util/head.c [new file with mode: 0644]

index de9e85f..917ab31 100644 (file)
@@ -41,6 +41,7 @@ SRCS  = banner.c \
        fgrep.c \
        fsck.c \
        grep.c \
+       head.c \
        id.c \
        init.c \
        kill.c \
diff --git a/Applications/util/head.c b/Applications/util/head.c
new file mode 100644 (file)
index 0000000..a61306b
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+  Copyright (c) 1987,1997, Prentice Hall
+  All rights reserved.
+  
+  Redistribution and use of the MINIX operating system in source and
+  binary forms, with or without modification, are permitted provided
+  that the following conditions are met:
+  
+     * Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+  
+     * Redistributions in binary form must reproduce the above
+       copyright notice, this list of conditions and the following
+       disclaimer in the documentation and/or other materials provided
+       with the distribution.
+  
+     * Neither the name of Prentice Hall nor the names of the software
+       authors or contributors may be used to endorse or promote
+       products derived from this software without specific prior
+       written permission.
+  
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND
+  CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/* 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
+
+void do_file(int n, FILE *f);
+void usage(void);
+
+int main(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(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(void)
+{
+  fprintf(stderr, "Usage: head [-n] [file ...]\n");
+  exit(1);
+}