]>
diplodocus.org Git - nmh/blob - docs/historical/SRI-NOSC/prompter.c
7 /*#define CEDIT 01 */ /* use following editing chars */
8 #define CKILL 006 /* @ => <CLOSE> */
9 #define CERASE 001 /* # => <CTRL A> */
11 /*define EDIT 001*/ /* edit after filling in fields */
17 struct swit switches
[] {
18 "editor editor", 0, /* 0 */
19 "erase chr", 2, /* 1 */
20 "kill chr", 0, /* 2 */
29 char tmpfil
[32], *drft
, name
[NAMESZ
], field
[512], *ed
;
33 register int i
, state
;
36 char *arguments
[50], **argp
;
38 int status
, pid
, wpid
, intr
;
46 if((cp
= m_find(ap
)) != -1) {
47 ap
= brkstring(cp
= getcpy(cp
), " ", '\n');
48 ap
= copyip(ap
, arguments
);
55 switch(smatch(++cp
, switches
)) {
56 case -2:ambigsw(cp
, switches
); /* ambiguous */
59 case -1:printf("prompter: -%s unknown\n", cp
);
61 case 0: if(!(ed
= *argp
++)) { /* -editor */
62 missing
: printf("prompter: Missing argument for %s switch\n", argp
[-2]);
66 case 1: if(!(erasep
= *argp
++)) /* -erase */
69 case 2: if(!(killp
= *argp
++)) /* -kill */
72 case 3: help("prompter [file] [switches]",
79 printf("prompter: missing skeleton\n");
82 if(fopen(drft
, &in
) == -1) {
83 printf("Can't open %s\n", drft
);
86 copy(makename("prmt", ".tmp"), copy("/tmp/", tmpfil
));
87 if(fcreat(tmpfil
, &out
) == -1) {
88 printf("Can't create %s\n", tmpfil
);
97 sg
.sg_kill
= killp
? chrcnv(killp
) : CKILL
;
98 sg
.sg_erase
= erasep
? chrcnv(erasep
) : CERASE
;
100 sg
.sg_kill
= killp
? chrcnv(killp
) : skill
;
101 sg
.sg_erase
= erasep
? chrcnv(erasep
) : serase
;
104 if ( skill
!= sg
.sg_kill
|| serase
!= sg
.sg_erase
) {
105 printf("Erase Char="); chrdisp(sg
.sg_erase
);
106 printf("; Kill Line="); chrdisp(sg
.sg_kill
);
107 printf(".\n"); flush();
111 for(;;) switch(state
= m_getfld(state
,name
,field
,sizeof field
,&in
)) {
116 if(field
[0] != '\n' || field
[1] != 0) {
117 printf("%s:%s", name
, field
);
121 while(state
== FLDPLUS
) {
122 state
=m_getfld(state
,name
,field
,sizeof field
,&in
);
127 printf("%s: ", name
);
132 if(i
== 0 && (field
[0] == '\n' || !field
[0]))
134 puts(name
, &out
); putc(':', &out
);
136 if(field
[0] != ' ' && field
[0] != '\t')
139 } while(i
== 1 && (i
= getln(&field
)) >= 0);
151 body
: puts("--------\n", &out
);
152 printf("--------\n");
156 /*printf("%s", field);*/
157 } while(state
== BODY
&&
158 (state
=m_getfld(state
,name
,field
,sizeof field
,&in
)));
163 if (i
== -1) goto badleave
; /**/
171 printf("Bad format file!\n");
177 printf("--------\n"); flush();
182 fcreat(drft
, &in
); /* Truncate prior to copy back */
184 if((i
= read(out
.b_fildes
, field
, sizeof field
)) > 0)
185 write(in
.b_fildes
, field
, i
);
186 while(i
== sizeof field
);
193 sg
.sg_erase
= serase
;
204 field
[length(field
) - 1] = 0; /* zap <lf> */
206 printf("Options are:\n no\n yes\n show\n <any editor>\n");
209 if(ssequal(field
, "no"))
211 if(ssequal(field
, "show")) {
216 if(ssequal(field
, "yes")) {
218 ((ed
= m_find("editor")) == -1 || equal(invo_name(), ed
)))
222 intr
= signal(SIGINT
, 1);
223 if((pid
= fork()) == 0) {
226 execlsrh(ed
, drft
, 0);
227 exit(-1); /* can't exec editor */
228 } else if(pid
== -1) {
229 printf("prompter: no forks!\n");
232 while((wpid
= waita(&status
)) != -1 && wpid
!= pid
) ;
233 if((status
& 0177400) == 0177400) goto again
; /* -1 */
234 signal(SIGINT
, intr
);
245 sg
.sg_erase
= serase
;
270 if ( cp
!= buf
) /* if not first char in line */
275 if((buf
==&(cp
[-1]))&&(cp
[-1] == '.')) {
292 signal(SIGINT
, &sig
);
303 if((c
= *cp
++) != '\\')
306 while(*cp
&& *cp
!= '\n') {
320 printf("<CTRL-%c>", c
+ '@');