freebsd-skq/usr.sbin/ctm/ctm/ctm_ed.c
2002-03-25 13:53:46 +00:00

115 lines
2.1 KiB
C

/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
* $FreeBSD$
*
*/
#include "ctm.h"
int
ctm_edit(u_char *script, int length, char *filein, char *fileout)
{
u_char *ep, cmd;
int ln, ln2, iln, ret=0, c;
FILE *fi=0,*fo=0;
fi = fopen(filein,"r");
if(!fi) {
warn("%s", filein);
return 8;
}
fo = fopen(fileout,"w");
if(!fo) {
warn("%s", fileout);
fclose(fi);
return 4;
}
iln = 1;
for(ep=script;ep < script+length;) {
cmd = *ep++;
if(cmd != 'a' && cmd != 'd') { ret = 1; goto bye; }
ln = 0;
while(isdigit(*ep)) {
ln *= 10;
ln += (*ep++ - '0');
}
if(*ep++ != ' ') { ret = 1; goto bye; }
ln2 = 0;
while(isdigit(*ep)) {
ln2 *= 10;
ln2 += (*ep++ - '0');
}
if(*ep++ != '\n') { ret = 1; goto bye; }
if(cmd == 'd') {
while(iln < ln) {
c = getc(fi);
if(c == EOF) { ret = 1; goto bye; }
putc(c,fo);
if(c == '\n')
iln++;
}
while(ln2) {
c = getc(fi);
if(c == EOF) { ret = 1; goto bye; }
if(c != '\n')
continue;
ln2--;
iln++;
}
continue;
}
if(cmd == 'a') {
while(iln <= ln) {
c = getc(fi);
if(c == EOF) { ret = 1; goto bye; }
putc(c,fo);
if(c == '\n')
iln++;
}
while(ln2) {
c = *ep++;
putc(c,fo);
if(c != '\n')
continue;
ln2--;
}
continue;
}
ret = 1;
goto bye;
}
while(1) {
c = getc(fi);
if(c == EOF) break;
putc(c,fo);
}
ret = 0;
bye:
if(fi) {
if(fclose(fi) != 0) {
warn("%s", filein);
ret = 1;
}
}
if(fo) {
if(fflush(fo) != 0) {
warn("%s", fileout);
ret = 1;
}
if(fclose(fo) != 0) {
warn("%s", fileout);
ret = 1;
}
}
return ret;
}