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