1/* 2 * ---------------------------------------------------------------------------- 3 * "THE BEER-WARE LICENSE" (Revision 42): 4 * <phk@FreeBSD.org> 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$ 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 warn("%s", filein); 25 return 8; 26 } 27 28 fo = fopen(fileout,"w"); 29 if(!fo) { 30 warn("%s", 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 ret = 0; 96bye: 97 if(fi) { 98 if(fclose(fi) != 0) { 99 warn("%s", filein); 100 ret = 1; 101 } 102 } 103 if(fo) { 104 if(fflush(fo) != 0) { 105 warn("%s", fileout); 106 ret = 1; 107 } 108 if(fclose(fo) != 0) { 109 warn("%s", fileout); 110 ret = 1; 111 } 112 } 113 return ret; 114} 115