1 # include	"../hdr/defines.h"
2 
3 SCCSID(@(#)dohist	2.1);
4 
5 char	Cstr[RESPSIZE];
6 char	Mstr[RESPSIZE];
7 
8 dohist(file)
9 char *file;
10 {
11 	char line[BUFSIZ];
12 	int tty[3];
13 	int doprmt;
14 	register char *p;
15 	FILE *in;
16 	extern char *Mrs;
17 	extern char *Comments;
18 	extern int Domrs;
19 
20 	in = xfopen(file,0);
21 	while ((p = fgets(line,sizeof(line),in)) != NULL)
22 		if (line[0] == CTLCHAR && line[1] == EUSERNAM)
23 			break;
24 	if (p != NULL) {
25 		while ((p = fgets(line,sizeof(line),in)) != NULL)
26 			if (line[3] == VALFLAG && line[1] == FLAG && line[0] == CTLCHAR)
27 				break;
28 			else if (line[1] == BUSERTXT && line[0] == CTLCHAR)
29 				break;
30 		if (p != NULL && line[1] == FLAG) {
31 			Domrs++;
32 		}
33 	}
34 	fclose(in);
35 	doprmt = 0;
36 	if (gtty(0,tty) >= 0)
37 		doprmt++;
38 	if (Domrs && !Mrs) {
39 		if (doprmt)
40 			printf("MRs? ");
41 		Mrs = getresp(" ",Mstr);
42 	}
43 	if (Domrs)
44 		mrfixup();
45 	if (!Comments) {
46 		if (doprmt)
47 			printf("comments? ");
48 		Comments = getresp(sprintf(line,"\n%c%c ",CTLCHAR,COMMENTS),Cstr);
49 	}
50 }
51 
52 
53 getresp(repstr,result)
54 char *repstr;
55 char *result;
56 {
57 	char line[BUFSIZ], *index();
58 	register int done, sz;
59 	register char *p;
60 
61 	result[0] = 0;
62 	done = 0;
63 	setbuf(stdin,NULL);
64 	sz = sizeof(line) - size(repstr);
65 	while (!done && fgets(line,sz,stdin) != NULL) {
66 		p = index(line, '\0');
67 		if (*--p == '\n') {
68 			if (*--p == '\\') {
69 				copy(repstr,p);
70 			}
71 			else {
72 				*++p = 0;
73 				++done;
74 			}
75 		}
76 		else
77 			fatal("line too long (co18)");
78 		if ((size(line) + size(result)) > RESPSIZE)
79 			fatal("response too long (co19)");
80 		strcat(result,line);
81 	}
82 	return(result);
83 }
84 
85 
86 char	*Varg[NVARGS];
87 
88 valmrs(pkt,pgm)
89 struct packet *pkt;
90 char *pgm;
91 {
92 	extern char *Sflags[];
93 	register int i;
94 	int st;
95 	register char *p;
96 
97 	Varg[0] = pgm;
98 	Varg[1] = auxf(pkt->p_file,'g');
99 	if (p = Sflags[TYPEFLAG - 'a'])
100 		Varg[2] = p;
101 	else
102 		Varg[2] = Null;
103 	if ((i = fork()) < 0) {
104 		fatal("cannot fork; try again (co20)");
105 	}
106 	else if (i == 0) {
107 		for (i = 4; i < 15; i++)
108 			close(i);
109 		pexec(pgm,Varg);
110 		exit(1);
111 	}
112 	else {
113 		wait(&st);
114 		return(st);
115 	}
116 }
117 
118 
119 mrfixup()
120 {
121 	register char **argv, *p, c;
122 	char *ap;
123 
124 	argv = &Varg[VSTART];
125 	p = Mrs;
126 	NONBLANK(p);
127 	for (ap = p; *p; p++) {
128 		if (*p == ' ' || *p == '\t') {
129 			if (argv >= &Varg[(NVARGS - 1)])
130 				fatal("too many MRs (co21)");
131 			*argv = stalloc(size(ap));
132 			c = *p;
133 			*p = 0;
134 			copy(ap,*argv);
135 			*p = c;
136 			argv++;
137 			NONBLANK(p);
138 			ap = p;
139 		}
140 	}
141 	--p;
142 	if (*p != ' ' && *p != '\t')
143 		copy(ap,*argv++ = stalloc(size(ap)));
144 	*argv = 0;
145 }
146 
147 
148 # define STBUFSZ	500
149 
150 stalloc(n)
151 register int n;
152 {
153 	static char stbuf[STBUFSZ];
154 	static int stind;
155 	register char *p;
156 
157 	p = &stbuf[stind];
158 	if (&p[n] >= &stbuf[STBUFSZ])
159 		fatal("out of space (co22)");
160 	stind =+ n;
161 	return(p);
162 }
163