1 # include	"../hdr/defines.h"
2 
3 static char Sccsid[] = "@(#)dohist.c	1.4	02/02/88";
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 		sprintf(line,"\n%c%c ",CTLCHAR,COMMENTS);
49 		Comments = getresp(line,Cstr);
50 	}
51 }
52 
53 
54 getresp(repstr,result)
55 char *repstr;
56 char *result;
57 {
58 	char line[BUFSIZ], *index();
59 	register int done, sz;
60 	register char *p;
61 
62 	result[0] = 0;
63 	done = 0;
64 	setbuf(stdin,NULL);
65 	sz = sizeof(line) - size(repstr);
66 	while (!done && fgets(line,sz,stdin) != NULL) {
67 		p = index(line, '\0');
68 		if (*--p == '\n') {
69 			if (*--p == '\\') {
70 				copy(repstr,p);
71 			}
72 			else {
73 				*++p = 0;
74 				++done;
75 			}
76 		}
77 		else
78 			fatal("line too long (co18)");
79 		if ((size(line) + size(result)) > RESPSIZE)
80 			fatal("response too long (co19)");
81 		strcat(result,line);
82 	}
83 	return(result);
84 }
85 
86 
87 char	*Varg[NVARGS];
88 
89 valmrs(pkt,pgm)
90 struct packet *pkt;
91 char *pgm;
92 {
93 	extern char *Sflags[];
94 	register int i;
95 	int st;
96 	register char *p;
97 
98 	Varg[0] = pgm;
99 	Varg[1] = auxf(pkt->p_file,'g');
100 	if (p = Sflags[TYPEFLAG - 'a'])
101 		Varg[2] = p;
102 	else
103 		Varg[2] = Null;
104 	if ((i = fork()) < 0) {
105 		fatal("cannot fork; try again (co20)");
106 	}
107 	else if (i == 0) {
108 		for (i = 4; i < 15; i++)
109 			close(i);
110 		pexec(pgm,Varg);
111 		exit(1);
112 	}
113 	else {
114 		wait(&st);
115 		return(st);
116 	}
117 }
118 
119 
120 mrfixup()
121 {
122 	register char **argv, *p, c;
123 	char *ap;
124 
125 	argv = &Varg[VSTART];
126 	p = Mrs;
127 	NONBLANK(p);
128 	for (ap = p; *p; p++) {
129 		if (*p == ' ' || *p == '\t') {
130 			if (argv >= &Varg[(NVARGS - 1)])
131 				fatal("too many MRs (co21)");
132 			*argv = stalloc(size(ap));
133 			c = *p;
134 			*p = 0;
135 			copy(ap,*argv);
136 			*p = c;
137 			argv++;
138 			NONBLANK(p);
139 			ap = p;
140 		}
141 	}
142 	--p;
143 	if (*p != ' ' && *p != '\t')
144 		copy(ap,*argv++ = stalloc(size(ap)));
145 	*argv = 0;
146 }
147 
148 
149 # define STBUFSZ	500
150 
151 stalloc(n)
152 register int n;
153 {
154 	static char stbuf[STBUFSZ];
155 	static int stind;
156 	register char *p;
157 
158 	p = &stbuf[stind];
159 	if (&p[n] >= &stbuf[STBUFSZ])
160 		fatal("out of space (co22)");
161 	stind += n;
162 	return(p);
163 }
164