Current Path : /usr/src/usr.sbin/ctm/ctm/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/src/usr.sbin/ctm/ctm/ctm_ed.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: release/9.1.0/usr.sbin/ctm/ctm/ctm_ed.c 93150 2002-03-25 13:53:46Z phk $ * */ #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; }