summaryrefslogtreecommitdiff
path: root/appl/cmd/strings.b
blob: 9f806fa581283d10c4df0c19dac2bd031582ff87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#
#	initially generated by c2l
#

implement Strings;

include "draw.m";

Strings: module
{
	init: fn(nil: ref Draw->Context, argl: list of string);
};

include "sys.m";
	sys: Sys;
include "bufio.m";
	bufio: Bufio;
	Iobuf: import bufio;

MINSPAN: con 6;
BUFSIZE: con 70;

init(nil: ref Draw->Context, argl: list of string)
{
	sys = load Sys Sys->PATH;
	bufio = load Bufio Bufio->PATH;
	argc := len argl;
	if(argc < 2){
		stringit("");
		exit;
	}
	argl = tl argl;
	for(i := 1; i < argc; i++){
		if(argc > 2)
			sys->print("%s:\n", hd argl);
		stringit(hd argl);
		argl = tl argl;
	}
}

stringit(str: string)
{
	cnt := 0;
	c: int;
	buf := string array[BUFSIZE] of { * => byte 'z' };

	if(str == nil)
		fin := bufio->fopen(sys->fildes(0), Bufio->OREAD);
	else
		fin = bufio->open(str, Bufio->OREAD);
	if(fin == nil){
		sys->fprint(sys->fildes(2), "cannot open %s\n", str);
		return;
	}
	start := big -1;
	posn := fin.offset();
	while((c = fin.getc()) >= 0){
		if(isprint(c)){
			if(start == big -1)
				start = posn;
			buf[cnt++] = c;
			if(cnt == BUFSIZE){
				sys->print("%8bd: %s ...\n", start, buf[0: cnt]);
				start = big -1;
				cnt = 0;
			}
		}
		else{
			if(cnt >= MINSPAN)
				sys->print("%8bd: %s\n", start, buf[0: cnt]);
			start = big -1;
			cnt = 0;
		}
		posn = fin.offset();
	}
	if(cnt >= MINSPAN)
		sys->print("%8bd: %s\n", start, buf[0: cnt]);
	fin = nil;
}

isprint(r: int): int
{
	if(r >= ' ' && r < 16r7f || r > 16ra0)
		return 1;
	else
		return 0;
}