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
#include	<bio.h>
4
 
5
Biobuf	*fin;
6
Biobuf	fout;
7
 
8
#define	MINSPAN		6		/* Min characters in string (default) */
9
#define BUFSIZE		70
10
 
11
void stringit(char *);
12
int isprint(Rune);
13
 
14
static int minspan = MINSPAN;
15
 
16
static void
17
usage(void)
18
{
19
	fprint(2, "usage: %s [-m min] [file...]\n", argv0);
20
	exits("usage");
21
}
22
 
23
void
24
main(int argc, char **argv)
25
{
26
	int i;
27
 
28
	ARGBEGIN{
29
	case 'm':
30
		minspan = atoi(EARGF(usage()));
31
		break;
32
	default:
33
		usage();
34
		break;
35
	}ARGEND
36
	Binit(&fout, 1, OWRITE);
37
	if(argc < 1) {
38
		stringit("/fd/0");
39
		exits(0);
40
	}
41
 
42
	for(i = 0; i < argc; i++) {
43
		if(argc > 2)
44
			print("%s:\n", argv[i]);
45
 
46
		stringit(argv[i]);
47
	}
48
 
49
	exits(0);
50
}
51
 
52
void
53
stringit(char *str)
54
{
55
	long posn, start;
56
	int cnt = 0;
57
	long c;
58
 
59
	Rune buf[BUFSIZE];
60
 
61
	if ((fin = Bopen(str, OREAD)) == 0) {
62
		perror("open");
63
		return;
64
	}
65
 
66
	start = 0;
67
	posn = Boffset(fin);
68
	while((c = Bgetrune(fin)) >= 0) {
69
		if(isprint(c)) {
70
			if(start == 0)
71
				start = posn;
72
			buf[cnt++] = c;
73
			if(cnt == BUFSIZE-1) {
74
				buf[cnt] = 0;
75
				Bprint(&fout, "%8ld: %S ...\n", start, buf);
76
				start = 0;
77
				cnt = 0;
78
			}
79
		} else {
80
			 if(cnt >= minspan) {
81
				buf[cnt] = 0;
82
				Bprint(&fout, "%8ld: %S\n", start, buf);
83
			}
84
			start = 0;
85
			cnt = 0;
86
		}	
87
		posn = Boffset(fin);
88
	}
89
 
90
	if(cnt >= minspan){
91
		buf[cnt] = 0;
92
		Bprint(&fout, "%8ld: %S\n", start, buf);
93
	}
94
	Bterm(fin);
95
}
96
 
97
int
98
isprint(Rune r)
99
{
100
	if (r != Runeerror)
101
	if ((r >= ' ' && r < 0x7F) || r > 0xA0)
102
		return 1;
103
	return 0;
104
}