xref: /inferno-os/os/boot/rpcg/sload.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth /*
2*74a4d8c2SCharles.Forsyth  * send S records to rpcg
3*74a4d8c2SCharles.Forsyth  */
4*74a4d8c2SCharles.Forsyth 
5*74a4d8c2SCharles.Forsyth #include <u.h>
6*74a4d8c2SCharles.Forsyth #include <libc.h>
7*74a4d8c2SCharles.Forsyth #include <bio.h>
8*74a4d8c2SCharles.Forsyth 
9*74a4d8c2SCharles.Forsyth static	int	dbg;
10*74a4d8c2SCharles.Forsyth static	char	buf[2048];
11*74a4d8c2SCharles.Forsyth static	int	run=1;
12*74a4d8c2SCharles.Forsyth static	void	stuffbym(char*, int, int);
13*74a4d8c2SCharles.Forsyth static	void	getdot(void);
14*74a4d8c2SCharles.Forsyth 
15*74a4d8c2SCharles.Forsyth void
main(int argc,char ** argv)16*74a4d8c2SCharles.Forsyth main(int argc, char **argv)
17*74a4d8c2SCharles.Forsyth {
18*74a4d8c2SCharles.Forsyth 	int n;
19*74a4d8c2SCharles.Forsyth 	char *l;
20*74a4d8c2SCharles.Forsyth 	Biobuf *f;
21*74a4d8c2SCharles.Forsyth 	static int p;
22*74a4d8c2SCharles.Forsyth 
23*74a4d8c2SCharles.Forsyth 	ARGBEGIN{
24*74a4d8c2SCharles.Forsyth 	case 'd': dbg++; break;
25*74a4d8c2SCharles.Forsyth 	case 'n': run=0; break;
26*74a4d8c2SCharles.Forsyth 	}ARGEND
27*74a4d8c2SCharles.Forsyth 
28*74a4d8c2SCharles.Forsyth 	f = Bopen(*argv? *argv: "k.mx", OREAD);
29*74a4d8c2SCharles.Forsyth 	if(f == 0) {
30*74a4d8c2SCharles.Forsyth 		fprint(2, "sload: cannot open k.mx: %r\n");
31*74a4d8c2SCharles.Forsyth 		exits("sload");
32*74a4d8c2SCharles.Forsyth 	}
33*74a4d8c2SCharles.Forsyth 	getdot();
34*74a4d8c2SCharles.Forsyth 	while((l = Brdline(f, '\n')) != 0) {
35*74a4d8c2SCharles.Forsyth 		l[Blinelen(f)-1] = '\r';
36*74a4d8c2SCharles.Forsyth 		stuffbym(l, Blinelen(f), 16);
37*74a4d8c2SCharles.Forsyth 		getdot();
38*74a4d8c2SCharles.Forsyth 		if(++p % 25 == 0)
39*74a4d8c2SCharles.Forsyth 			write(2, ".", 1);
40*74a4d8c2SCharles.Forsyth 	}
41*74a4d8c2SCharles.Forsyth 	exits(0);
42*74a4d8c2SCharles.Forsyth }
43*74a4d8c2SCharles.Forsyth 
44*74a4d8c2SCharles.Forsyth static void
stuffbym(char * l,int n,int m)45*74a4d8c2SCharles.Forsyth stuffbym(char *l, int n, int m)
46*74a4d8c2SCharles.Forsyth {
47*74a4d8c2SCharles.Forsyth 	int nr, ns;
48*74a4d8c2SCharles.Forsyth 
49*74a4d8c2SCharles.Forsyth 	while(n > 0) {
50*74a4d8c2SCharles.Forsyth 		ns = n;
51*74a4d8c2SCharles.Forsyth 		if(ns > m)
52*74a4d8c2SCharles.Forsyth 			ns = m;
53*74a4d8c2SCharles.Forsyth 		write(1, l, ns);
54*74a4d8c2SCharles.Forsyth 		l += ns;
55*74a4d8c2SCharles.Forsyth 		n -= ns;
56*74a4d8c2SCharles.Forsyth 	}
57*74a4d8c2SCharles.Forsyth }
58*74a4d8c2SCharles.Forsyth 
59*74a4d8c2SCharles.Forsyth static void
getdot(void)60*74a4d8c2SCharles.Forsyth getdot(void)
61*74a4d8c2SCharles.Forsyth {
62*74a4d8c2SCharles.Forsyth 	char c;
63*74a4d8c2SCharles.Forsyth 
64*74a4d8c2SCharles.Forsyth 	for(;;){
65*74a4d8c2SCharles.Forsyth 		if(read(0, &c, 1) != 1)
66*74a4d8c2SCharles.Forsyth 			exits("bang");
67*74a4d8c2SCharles.Forsyth 		write(2, &c, 1);
68*74a4d8c2SCharles.Forsyth 		if(c == '.')
69*74a4d8c2SCharles.Forsyth 			break;
70*74a4d8c2SCharles.Forsyth 	}
71*74a4d8c2SCharles.Forsyth }
72