12926Sphk/*
22926Sphk * ----------------------------------------------------------------------------
32926Sphk * "THE BEER-WARE LICENSE" (Revision 42):
493150Sphk * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
52926Sphk * can do whatever you want with this stuff. If we meet some day, and you think
62926Sphk * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
72926Sphk * ----------------------------------------------------------------------------
82926Sphk *
950479Speter * $FreeBSD$
102926Sphk *
112926Sphk */
122926Sphk
132926Sphk#include "ctm.h"
142926Sphk
152886Sphkint
162926Sphkctm_edit(u_char *script, int length, char *filein, char *fileout)
172886Sphk{
182926Sphk    u_char *ep, cmd;
192926Sphk    int ln, ln2, iln, ret=0, c;
202926Sphk    FILE *fi=0,*fo=0;
212886Sphk
222926Sphk    fi = fopen(filein,"r");
238857Srgrimes    if(!fi) {
2429526Scharnier	warn("%s", filein);
258857Srgrimes	return 8;
262886Sphk    }
272926Sphk
282926Sphk    fo = fopen(fileout,"w");
292886Sphk    if(!fo) {
3029526Scharnier	warn("%s", fileout);
312926Sphk	fclose(fi);
322926Sphk	return 4;
332886Sphk    }
342948Sphk    iln = 1;
352886Sphk    for(ep=script;ep < script+length;) {
362886Sphk	cmd = *ep++;
372926Sphk	if(cmd != 'a' && cmd != 'd') { ret = 1; goto bye; }
382886Sphk	ln = 0;
392886Sphk	while(isdigit(*ep)) {
402886Sphk	    ln *= 10;
412886Sphk	    ln += (*ep++ - '0');
422886Sphk	}
432926Sphk	if(*ep++ != ' ') { ret = 1; goto bye; }
442886Sphk	ln2 = 0;
452886Sphk	while(isdigit(*ep)) {
462886Sphk	    ln2 *= 10;
472886Sphk	    ln2 += (*ep++ - '0');
482886Sphk	}
492926Sphk	if(*ep++ != '\n') { ret = 1; goto bye; }
502948Sphk
512948Sphk
522886Sphk	if(cmd == 'd') {
532948Sphk	    while(iln < ln) {
542948Sphk		c = getc(fi);
552948Sphk		if(c == EOF) { ret = 1; goto bye; }
562948Sphk		putc(c,fo);
572948Sphk		if(c == '\n')
582948Sphk		    iln++;
592948Sphk	    }
602886Sphk	    while(ln2) {
612926Sphk		c = getc(fi);
622948Sphk		if(c == EOF) { ret = 1; goto bye; }
632926Sphk		if(c != '\n')
642886Sphk		    continue;
652948Sphk		ln2--;
662886Sphk		iln++;
672886Sphk	    }
682886Sphk	    continue;
692886Sphk	}
702886Sphk	if(cmd == 'a') {
712948Sphk	    while(iln <= ln) {
722948Sphk		c = getc(fi);
732948Sphk		if(c == EOF) { ret = 1; goto bye; }
742948Sphk		putc(c,fo);
752948Sphk		if(c == '\n')
762948Sphk		    iln++;
772948Sphk	    }
782886Sphk	    while(ln2) {
792886Sphk		c = *ep++;
802886Sphk		putc(c,fo);
812926Sphk		if(c != '\n')
822886Sphk		    continue;
832886Sphk		ln2--;
842886Sphk	    }
852886Sphk	    continue;
862886Sphk	}
878857Srgrimes	ret = 1;
882926Sphk	goto bye;
892886Sphk    }
902886Sphk    while(1) {
912926Sphk	c = getc(fi);
922886Sphk	if(c == EOF) break;
932886Sphk	putc(c,fo);
942886Sphk    }
957894Sbde    ret = 0;
962926Sphkbye:
977894Sbde    if(fi) {
987894Sbde	if(fclose(fi) != 0) {
9929526Scharnier	    warn("%s", filein);
1007894Sbde	    ret = 1;
1017894Sbde	}
1027894Sbde    }
1037894Sbde    if(fo) {
1047894Sbde     	if(fflush(fo) != 0) {
10529526Scharnier	    warn("%s", fileout);
1067894Sbde	    ret = 1;
1077894Sbde     	}
1087894Sbde     	if(fclose(fo) != 0) {
10929526Scharnier	    warn("%s", fileout);
1107894Sbde	    ret = 1;
1117894Sbde     	}
1127894Sbde    }
1132926Sphk    return ret;
1142886Sphk}
115