1 b2ad2ef1 2005-01-04 devnull #include <u.h>
2 b2ad2ef1 2005-01-04 devnull #include <libc.h>
4 b2ad2ef1 2005-01-04 devnull int multi;
5 b2ad2ef1 2005-01-04 devnull int nlines;
6 b2ad2ef1 2005-01-04 devnull char *status = nil;
9 b2ad2ef1 2005-01-04 devnull line(int fd, char *file)
12 b2ad2ef1 2005-01-04 devnull int m, n, nalloc;
13 b2ad2ef1 2005-01-04 devnull char *buf;
15 b2ad2ef1 2005-01-04 devnull nalloc = 0;
16 b2ad2ef1 2005-01-04 devnull buf = nil;
17 b2ad2ef1 2005-01-04 devnull for(m=0; ; ){
18 b2ad2ef1 2005-01-04 devnull n = read(fd, &c, 1);
19 b2ad2ef1 2005-01-04 devnull if(n < 0){
20 b2ad2ef1 2005-01-04 devnull fprint(2, "read: error reading %s: %r\n", file);
21 b2ad2ef1 2005-01-04 devnull exits("read error");
23 b2ad2ef1 2005-01-04 devnull if(n == 0){
24 b2ad2ef1 2005-01-04 devnull if(m == 0)
25 b2ad2ef1 2005-01-04 devnull status = "eof";
28 b2ad2ef1 2005-01-04 devnull if(m == nalloc){
29 b2ad2ef1 2005-01-04 devnull nalloc += 1024;
30 b2ad2ef1 2005-01-04 devnull buf = realloc(buf, nalloc);
31 b2ad2ef1 2005-01-04 devnull if(buf == nil){
32 b2ad2ef1 2005-01-04 devnull fprint(2, "read: malloc error: %r\n");
33 b2ad2ef1 2005-01-04 devnull exits("malloc");
36 b2ad2ef1 2005-01-04 devnull buf[m++] = c;
37 b2ad2ef1 2005-01-04 devnull if(c == '\n')
40 b2ad2ef1 2005-01-04 devnull if(m > 0)
41 b2ad2ef1 2005-01-04 devnull write(1, buf, m);
42 b2ad2ef1 2005-01-04 devnull free(buf);
43 b2ad2ef1 2005-01-04 devnull return m;
47 b2ad2ef1 2005-01-04 devnull lines(int fd, char *file)
50 b2ad2ef1 2005-01-04 devnull if(line(fd, file) == 0)
52 b2ad2ef1 2005-01-04 devnull }while(multi || --nlines>0);
56 b2ad2ef1 2005-01-04 devnull main(int argc, char *argv[])
58 b2ad2ef1 2005-01-04 devnull int i, fd;
61 b2ad2ef1 2005-01-04 devnull ARGBEGIN{
62 b2ad2ef1 2005-01-04 devnull case 'm':
63 b2ad2ef1 2005-01-04 devnull multi = 1;
65 b2ad2ef1 2005-01-04 devnull case 'n':
66 b2ad2ef1 2005-01-04 devnull s = ARGF();
68 b2ad2ef1 2005-01-04 devnull nlines = atoi(s);
71 b2ad2ef1 2005-01-04 devnull /* fall through */
73 b2ad2ef1 2005-01-04 devnull fprint(2, "usage: read [-m] [-n nlines] [files...]\n");
74 b2ad2ef1 2005-01-04 devnull exits("usage");
77 b2ad2ef1 2005-01-04 devnull if(argc == 0)
78 b2ad2ef1 2005-01-04 devnull lines(0, "<stdin>");
80 b2ad2ef1 2005-01-04 devnull for(i=0; i<argc; i++){
81 b2ad2ef1 2005-01-04 devnull fd = open(argv[i], OREAD);
82 b2ad2ef1 2005-01-04 devnull if(fd < 0){
83 b2ad2ef1 2005-01-04 devnull fprint(2, "read: can't open %s: %r\n", argv[i]);
84 b2ad2ef1 2005-01-04 devnull exits("open");
86 b2ad2ef1 2005-01-04 devnull lines(fd, argv[i]);
87 b2ad2ef1 2005-01-04 devnull close(fd);
90 b2ad2ef1 2005-01-04 devnull exits(status);