Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
 
4
int	multi;
5
int	nlines;
6
char	*status = nil;
7
 
8
int
9
line(int fd, char *file)
10
{
11
	char c;
12
	int m, n, nalloc;
13
	char *buf;
14
 
15
	nalloc = 0;
16
	buf = nil;
17
	for(m=0; ; ){
18
		n = read(fd, &c, 1);
19
		if(n < 0){
20
			fprint(2, "read: error reading %s: %r\n", file);
21
			exits("read error");
22
		}
23
		if(n == 0){
24
			if(m == 0)
25
				status = "eof";
26
			break;
27
		}
28
		if(m == nalloc){
29
			nalloc += 1024;
30
			buf = realloc(buf, nalloc);
31
			if(buf == nil){
32
				fprint(2, "read: malloc error: %r\n");
33
				exits("malloc");
34
			}
35
		}
36
		buf[m++] = c;
37
		if(c == '\n')
38
			break;
39
	}
40
	if(m > 0)
41
		write(1, buf, m);
42
	free(buf);
43
	return m;
44
}
45
 
46
void
47
lines(int fd, char *file)
48
{
49
	do{
50
		if(line(fd, file) == 0)
51
			break;
52
	}while(multi || --nlines>0);
53
}
54
 
55
void
56
main(int argc, char *argv[])
57
{
58
	int i, fd;
59
	char *s;
60
 
61
	ARGBEGIN{
62
	case 'm':
63
		multi = 1;
64
		break;
65
	case 'n':
66
		s = ARGF();
67
		if(s){
68
			nlines = atoi(s);
69
			break;
70
		}
71
		/* fall through */
72
	default:
73
		fprint(2, "usage: read [-m] [-n nlines] [files...]\n");
74
		exits("usage");
75
	}ARGEND
76
 
77
	if(argc == 0)
78
		lines(0, "<stdin>");
79
	else
80
		for(i=0; i<argc; i++){
81
			fd = open(argv[i], OREAD);
82
			if(fd < 0){
83
				fprint(2, "read: can't open %s: %r\n", argv[i]);
84
				exits("open");
85
			}
86
			lines(fd, argv[i]);
87
			close(fd);
88
		}
89
 
90
	exits(status);
91
}