ctm_ed.c revision 2948
1/*
2 * ----------------------------------------------------------------------------
3 * "THE BEER-WARE LICENSE" (Revision 42):
4 * <phk@login.dknet.dk> wrote this file.  As long as you retain this notice you
5 * can do whatever you want with this stuff. If we meet some day, and you think
6 * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7 * ----------------------------------------------------------------------------
8 *
9 * $Id$
10 *
11 */
12
13#include "ctm.h"
14
15int
16ctm_edit(u_char *script, int length, char *filein, char *fileout)
17{
18    u_char *ep, cmd;
19    int ln, ln2, iln, ret=0, c;
20    FILE *fi=0,*fo=0;
21
22    fi = fopen(filein,"r");
23    if(!fi) {
24	perror(filein);
25	return 8;
26    }
27
28    fo = fopen(fileout,"w");
29    if(!fo) {
30	perror(fileout);
31	fclose(fi);
32	return 4;
33    }
34    iln = 1;
35    for(ep=script;ep < script+length;) {
36	cmd = *ep++;
37	if(cmd != 'a' && cmd != 'd') { ret = 1; goto bye; }
38	ln = 0;
39	while(isdigit(*ep)) {
40	    ln *= 10;
41	    ln += (*ep++ - '0');
42	}
43	if(*ep++ != ' ') { ret = 1; goto bye; }
44	ln2 = 0;
45	while(isdigit(*ep)) {
46	    ln2 *= 10;
47	    ln2 += (*ep++ - '0');
48	}
49	if(*ep++ != '\n') { ret = 1; goto bye; }
50
51
52	if(cmd == 'd') {
53	    while(iln < ln) {
54		c = getc(fi);
55		if(c == EOF) { ret = 1; goto bye; }
56		putc(c,fo);
57		if(c == '\n')
58		    iln++;
59	    }
60	    while(ln2) {
61		c = getc(fi);
62		if(c == EOF) { ret = 1; goto bye; }
63		if(c != '\n')
64		    continue;
65		ln2--;
66		iln++;
67	    }
68	    continue;
69	}
70	if(cmd == 'a') {
71	    while(iln <= ln) {
72		c = getc(fi);
73		if(c == EOF) { ret = 1; goto bye; }
74		putc(c,fo);
75		if(c == '\n')
76		    iln++;
77	    }
78	    while(ln2) {
79		c = *ep++;
80		putc(c,fo);
81		if(c != '\n')
82		    continue;
83		ln2--;
84	    }
85	    continue;
86	}
87	ret = 1;
88	goto bye;
89    }
90    while(1) {
91	c = getc(fi);
92	if(c == EOF) break;
93	putc(c,fo);
94    }
95    fclose(fi);
96    fclose(fo);
97    return 0;
98bye:
99    if(fi) 	fclose(fi);
100    if(fo) 	fclose(fo);
101    return ret;
102}
103
104