]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/strings.c
vga: fix type in vga.font, make vga/unicode.font file
[plan9front.git] / sys / src / cmd / strings.c
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 }