annotate toys/posix/head.c @ 1776:7bf68329eb3b draft default tip

Repository switched to git at https://github.com/landley/toybox
author Rob Landley <rob@landley.net>
date Thu, 09 Apr 2015 02:28:32 -0500
parents 57f2a26fa92c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
1 /* head.c - copy first lines from input to stdout.
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
2 *
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
3 * Copyright 2006 Timothy Elliott <tle@holymonkey.com>
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
4 *
656
6df4ccc0acbe Regularize command headers, update links to standards documents.
Rob Landley <rob@landley.net>
parents: 653
diff changeset
5 * See http://opengroup.org/onlinepubs/9699919799/utilities/head.html
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
6
1775
57f2a26fa92c To ensure that toybox can be installed alongside busybox without
Paul Barker <paul@paulbarker.me.uk>
parents: 1769
diff changeset
7 USE_HEAD(NEWTOY(head, "?n#<0=10", TOYFLAG_USR|TOYFLAG_BIN))
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
8
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
9 config HEAD
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
10 bool "head"
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
11 default y
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
12 help
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
13 usage: head [-n number] [file...]
445
2c47a9c0c619 Cleanups for head.
Rob Landley <rob@landley.net>
parents: 444
diff changeset
14
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
15 Copy first lines from files to stdout. If no files listed, copy from
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
16 stdin. Filename "-" is a synonym for stdin.
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
17
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
18 -n Number of lines to copy.
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
19 */
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
20
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
21 #define FOR_head
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
22 #include "toys.h"
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
23
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
24 GLOBALS(
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
25 long lines;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
26 int file_no;
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
27 )
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
28
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
29 static void do_head(int fd, char *name)
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
30 {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
31 int i, len, lines=TT.lines, size=sizeof(toybuf);
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
32
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
33 if (toys.optc > 1) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
34 // Print an extra newline for all but the first file
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
35 if (TT.file_no++) xprintf("\n");
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
36 xprintf("==> %s <==\n", name);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
37 xflush();
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
38 }
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
39
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
40 while (lines) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
41 len = read(fd, toybuf, size);
780
6cc69be43c42 Have error_msg() and friends set TT.exitval to 1 if it's still 0, clean out other places that were setting it that no longer need to.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
42 if (len<0) perror_msg("%s",name);
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
43 if (len<1) break;
445
2c47a9c0c619 Cleanups for head.
Rob Landley <rob@landley.net>
parents: 444
diff changeset
44
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
45 for(i=0; i<len;) if (toybuf[i++] == '\n' && !--lines) break;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
46
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
47 xwrite(1, toybuf, i);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 674
diff changeset
48 }
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
49 }
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
50
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
51 void head_main(void)
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
52 {
1744
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
53 char *arg = *toys.optargs;
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
54
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
55 // handle old "-42" style arguments
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
56 if (arg && *arg == '-' && arg[1]) {
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
57 TT.lines = atolx(arg+1);
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
58 toys.optc--;
1769
28806689547b Fix head bug pointed out by felix janda (recent -123 code broke first file argument of -n).
Rob Landley <rob@landley.net>
parents: 1744
diff changeset
59 } else arg = 0;
1744
0c30e5484516 Add -123 support to head (suggested by Elliott Hughes).
Rob Landley <rob@landley.net>
parents: 780
diff changeset
60 loopfiles(toys.optargs+!!arg, do_head);
444
d3ca5e15e457 Implement head
Timothy Elliott <tle@holymonkey.com>
parents:
diff changeset
61 }