ctm_ed.c revision 2886
1int
2ctm_edit(u_char *script, int length, char *filename, char *md5)
3{
4    u_char *ep, cmd, c;
5    int ln, ln2, iln;
6    FILE *fi,*fo;
7    char buf[BUFSIZ];
8
9    fi = fopen(filename,"r");
10    if(!fi) {
11	/* XXX */
12	return 1;
13    }
14    strcpy(buf,filename);
15    strcat(buf,".ctm");
16    fo = fopen(filename,"w");
17    if(!fo) {
18	/* XXX */
19	return 1;
20    }
21    iln = 0;
22    for(ep=script;ep < script+length;) {
23	cmd = *ep++;
24	if(cmd != 'a' && cmd != 'd') ARGH
25	ln = 0;
26	while(isdigit(*ep)) {
27	    ln *= 10;
28	    ln += (*ep++ - '0');
29	}
30	if(*ep++ != ' ') BARF
31	ln2 = 0;
32	while(isdigit(*ep)) {
33	    ln2 *= 10;
34	    ln2 += (*ep++ - '0');
35	}
36	if(*ep++ != '\n') BARF
37	while(iln < ln) {
38	    c = getf(fi);
39	    putc(c,fo);
40	    if(c == '/n')
41		iln++;
42	}
43	if(cmd == 'd') {
44	    while(ln2) {
45		c = getf(fi);
46		if(c != '/n')
47		    continue;
48		iln++;
49		ln2--;
50	    }
51	    continue;
52	}
53	if(cmd == 'a') {
54	    while(ln2) {
55		c = *ep++;
56		putc(c,fo);
57		if(c != '/n')
58		    continue;
59		ln2--;
60	    }
61	    continue;
62	}
63	ARGH
64    }
65    while(1) {
66	c = getf(fi);
67	if(c == EOF) break;
68	putc(c,fo);
69    }
70    fclose(fi);
71    fclose(fo);
72    if(strcmp(md5,MD5File(buf))) {
73	unlink(buf);
74	return 1; /*XXX*/
75    }
76    if(rename(buf,filename)) {
77	unlink(buf);
78	return 1; /*XXX*/
79    }
80}
81