revlib.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
7abd0c58a5ce51db13f93de82407b2188d55d298Christian Maeder/***********************************************************************
7abd0c58a5ce51db13f93de82407b2188d55d298Christian Maeder* *
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder* This software is part of the ast package *
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian Maeder* Copyright (c) 1992-2011 AT&T Intellectual Property *
7abd0c58a5ce51db13f93de82407b2188d55d298Christian Maeder* and is licensed under the *
b4fbc96e05117839ca409f5f20f97b3ac872d1edTill Mossakowski* Eclipse Public License, Version 1.0 *
7abd0c58a5ce51db13f93de82407b2188d55d298Christian Maeder* by AT&T Intellectual Property *
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder* *
08faa81d4dd8409cd923b334064f64f802ecc33dChristian Maeder* A copy of the License is available at *
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder* http://www.eclipse.org/org/documents/epl-v10.html *
08faa81d4dd8409cd923b334064f64f802ecc33dChristian Maeder* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
08faa81d4dd8409cd923b334064f64f802ecc33dChristian Maeder* *
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder* Information and Software Systems Research *
08faa81d4dd8409cd923b334064f64f802ecc33dChristian Maeder* AT&T Research *
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder* Florham Park NJ *
bbae6e6ca0de7f2ffbb44d2c8da179f2b717237fChristian Maeder* *
23a00c966f2aa8da525d7a7c51933c99964426c0Christian Maeder* Glenn Fowler <gsf@research.att.com> *
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder* David Korn <dgk@research.att.com> *
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder* *
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder***********************************************************************/
afa6848d579d235c9677e1ab477916df8e5ae11aChristian Maeder#pragma prototyped
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder/*
23a00c966f2aa8da525d7a7c51933c99964426c0Christian Maeder * common support for tail and rev
7abd0c58a5ce51db13f93de82407b2188d55d298Christian Maeder */
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder#include <cmd.h>
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder#include <rev.h>
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder#define BUFSIZE SF_BUFSIZE
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder#define rounddown(n,size) (((n)-1)&~((size)-1))
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder/*
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder * copy the lines starting at offset <start> from in <in> to <out>
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder * in reverse order
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder */
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maederint rev_line(Sfio_t *in, Sfio_t *out, off_t start)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder{
c18e9c3c6d5039618f1f2c05526ece84c7794ea3Christian Maeder register char *cp, *cpold;
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder register int n, nleft=0;
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder char buff[BUFSIZE];
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder off_t offset;
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder if(sfseek(in,(off_t)0,SEEK_CUR) < 0)
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder {
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder Sfio_t *tmp = sftmp(4*SF_BUFSIZE);
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder if(!tmp)
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder return(-1);
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder if(start>0 && sfmove(in, (Sfio_t*)0, start, -1) != start)
35597678f1c9da703de8d0b6b66ea63247ebe884Christian Maeder return(-1);
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder if(sfmove(in, tmp, SF_UNBOUND, -1) < 0 || !sfeof(in) || sferror(tmp))
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder return(-1);
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder in = tmp;
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder start=0;
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder }
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder if((offset = sfseek(in,(off_t)0,SEEK_END)) <= start)
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder return(0);
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder offset = rounddown(offset,BUFSIZE);
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder while(1)
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder {
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder n = BUFSIZE;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder if(offset < start)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder {
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder n -= (start-offset);
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder offset = start;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder }
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder sfseek(in, offset, SEEK_SET);
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder if((n=sfread(in, buff, n)) <=0)
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder break;
7feac39f792f587cffdc8b63b0e7c5a7d2de292eChristian Maeder cp = buff+n;
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder n = *buff;
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder *buff = '\n';
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder while(1)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder {
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder cpold = cp;
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder if(nleft==0)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder cp--;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder if(cp==buff)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder {
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder nleft= 1;
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder break;
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder while(*--cp != '\n');
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder if(cp==buff && n!='\n')
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder {
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder *cp = n;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder nleft += cpold-cp;
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder break;
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder }
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder else
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder cp++;
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder if(sfwrite(out,cp,cpold-cp) < 0)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return(-1);
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder if(nleft)
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder {
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder if(nleft==1)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder sfputc(out,'\n');
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder else if(sfmove(in,out,nleft,-1) != nleft)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return(-1);
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder nleft = 0;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder }
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder }
94ceeb2edbd25b4697ddd9f63c94377924352cf4Christian Maeder if(offset <= start)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder break;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder offset -= BUFSIZE;
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder }
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder if(nleft)
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder {
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder sfseek(in, start, SEEK_SET);
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder if(sfmove(in,out,nleft,-1) != nleft)
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder return(-1);
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder }
a0e24c863b78669b05797ff8ce635995a9bede44Christian Maeder return(0);
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder}
c18e9c3c6d5039618f1f2c05526ece84c7794ea3Christian Maeder