diff options
author | chin <none@none> | 2007-08-17 12:01:52 -0700 |
---|---|---|
committer | chin <none@none> | 2007-08-17 12:01:52 -0700 |
commit | da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968 (patch) | |
tree | 5280d3b78e289fe9551371ab6e7f15ef9944ea14 /usr/src/lib/libcmd/common/revlib.c | |
parent | 073dbf9103ef2a2b05d8a16e2d26db04e0374b0e (diff) | |
download | illumos-joyent-da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968.tar.gz |
6437624 RFE: Add ksh93 (as /usr/bin/ksh93) and libshell.so to OS/Net
6505835 AST tools and library (libpp) required for creating l10n messages for ksh93
PSARC/2006/550 Korn Shell 93 Integration
PSARC/2006/587 /etc/ksh.kshrc for ksh93
PSARC/2007/035 ksh93 Amendments
Contributed by Roland Mainz <roland.mainz@nrubsig.org>
--HG--
rename : usr/src/lib/libcmd/common/mapfile-vers => deleted_files/usr/src/lib/libcmd/common/mapfile-vers
rename : usr/src/lib/libcmd/common/placeholder.c => deleted_files/usr/src/lib/libcmd/common/placeholder.c
Diffstat (limited to 'usr/src/lib/libcmd/common/revlib.c')
-rw-r--r-- | usr/src/lib/libcmd/common/revlib.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/usr/src/lib/libcmd/common/revlib.c b/usr/src/lib/libcmd/common/revlib.c new file mode 100644 index 0000000000..3693d15b2d --- /dev/null +++ b/usr/src/lib/libcmd/common/revlib.c @@ -0,0 +1,112 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1992-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* * +***********************************************************************/ +#pragma prototyped +/* + * common support for tail and rev + */ + +#include <cmd.h> +#include <rev.h> + +#define BUFSIZE SF_BUFSIZE +#define rounddown(n,size) (((n)-1)&~((size)-1)) + +/* + * copy the lines starting at offset <start> from in <in> to <out> + * in reverse order + */ +int rev_line(Sfio_t *in, Sfio_t *out, off_t start) +{ + register char *cp, *cpold; + register int n, nleft=0; + char buff[BUFSIZE]; + off_t offset; + if(sfseek(in,(off_t)0,SEEK_CUR) < 0) + { + Sfio_t *tmp = sftmp(4*SF_BUFSIZE); + if(!tmp) + return(-1); + if(start>0 && sfmove(in, (Sfio_t*)0, start, -1) != start) + return(-1); + if(sfmove(in, tmp, SF_UNBOUND, -1) < 0 || !sfeof(in) || sferror(tmp)) + return(-1); + in = tmp; + start=0; + } + if((offset = sfseek(in,(off_t)0,SEEK_END)) <= start) + return(0); + offset = rounddown(offset,BUFSIZE); + while(1) + { + n = BUFSIZE; + if(offset < start) + { + n -= (start-offset); + offset = start; + } + sfseek(in, offset, SEEK_SET); + if((n=sfread(in, buff, n)) <=0) + break; + cp = buff+n; + n = *buff; + *buff = '\n'; + while(1) + { + cpold = cp; + if(nleft==0) + cp--; + if(cp==buff) + { + nleft= 1; + break; + } + while(*--cp != '\n'); + if(cp==buff && n!='\n') + { + *cp = n; + nleft += cpold-cp; + break; + } + else + cp++; + if(sfwrite(out,cp,cpold-cp) < 0) + return(-1); + if(nleft) + { + if(nleft==1) + sfputc(out,'\n'); + else if(sfmove(in,out,nleft,-1) != nleft) + return(-1); + nleft = 0; + } + } + if(offset <= start) + break; + offset -= BUFSIZE; + } + if(nleft) + { + sfseek(in, start, SEEK_SET); + if(sfmove(in,out,nleft,-1) != nleft) + return(-1); + } + return(0); +} |