Play viking, get axe ... take axe to useless deadwood that has existed way
[dragonfly.git] / usr.sbin / ctm / ctm / ctm_ed.c
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  * $FreeBSD: src/usr.sbin/ctm/ctm/ctm_ed.c,v 1.10 1999/08/28 01:15:59 peter Exp $
10  * $DragonFly: src/usr.sbin/ctm/ctm/Attic/ctm_ed.c,v 1.2 2003/06/17 04:29:53 dillon Exp $
11  *
12  */
13
14 #include "ctm.h"
15
16 int
17 ctm_edit(u_char *script, int length, char *filein, char *fileout)
18 {
19     u_char *ep, cmd;
20     int ln, ln2, iln, ret=0, c;
21     FILE *fi=0,*fo=0;
22
23     fi = fopen(filein,"r");
24     if(!fi) {
25         warn("%s", filein);
26         return 8;
27     }
28
29     fo = fopen(fileout,"w");
30     if(!fo) {
31         warn("%s", fileout);
32         fclose(fi);
33         return 4;
34     }
35     iln = 1;
36     for(ep=script;ep < script+length;) {
37         cmd = *ep++;
38         if(cmd != 'a' && cmd != 'd') { ret = 1; goto bye; }
39         ln = 0;
40         while(isdigit(*ep)) {
41             ln *= 10;
42             ln += (*ep++ - '0');
43         }
44         if(*ep++ != ' ') { ret = 1; goto bye; }
45         ln2 = 0;
46         while(isdigit(*ep)) {
47             ln2 *= 10;
48             ln2 += (*ep++ - '0');
49         }
50         if(*ep++ != '\n') { ret = 1; goto bye; }
51
52
53         if(cmd == 'd') {
54             while(iln < ln) {
55                 c = getc(fi);
56                 if(c == EOF) { ret = 1; goto bye; }
57                 putc(c,fo);
58                 if(c == '\n')
59                     iln++;
60             }
61             while(ln2) {
62                 c = getc(fi);
63                 if(c == EOF) { ret = 1; goto bye; }
64                 if(c != '\n')
65                     continue;
66                 ln2--;
67                 iln++;
68             }
69             continue;
70         }
71         if(cmd == 'a') {
72             while(iln <= ln) {
73                 c = getc(fi);
74                 if(c == EOF) { ret = 1; goto bye; }
75                 putc(c,fo);
76                 if(c == '\n')
77                     iln++;
78             }
79             while(ln2) {
80                 c = *ep++;
81                 putc(c,fo);
82                 if(c != '\n')
83                     continue;
84                 ln2--;
85             }
86             continue;
87         }
88         ret = 1;
89         goto bye;
90     }
91     while(1) {
92         c = getc(fi);
93         if(c == EOF) break;
94         putc(c,fo);
95     }
96     ret = 0;
97 bye:
98     if(fi) {
99         if(fclose(fi) != 0) {
100             warn("%s", filein);
101             ret = 1;
102         }
103     }
104     if(fo) {
105         if(fflush(fo) != 0) {
106             warn("%s", fileout);
107             ret = 1;
108         }
109         if(fclose(fo) != 0) {
110             warn("%s", fileout);
111             ret = 1;
112         }
113     }
114     return ret;
115 }