Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84 +SENDMAIL+2.11; site dcl-cs.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!panda!talcott!harvard!seismo!mcvax!ukc!icdoc!dcl-cs!stephen From: stephen@dcl-cs.UUCP (Stephen J. Muir) Newsgroups: net.sources Subject: A program to list files from bottom to top. Message-ID: <419@dcl-cs.UUCP> Date: Fri, 30-Aug-85 22:03:52 EDT Article-I.D.: dcl-cs.419 Posted: Fri Aug 30 22:03:52 1985 Date-Received: Mon, 2-Sep-85 04:12:34 EDT Reply-To: stephen@dcl-cs.UUCP (Stephen J. Muir) Organization: Department of Computing at Lancaster University. Lines: 185 Xpath: icdoc ivax Here is a program which reverses the order of lines in files. ----------------------------------- cut here ---------------------------------- #!/bin/sh echo 'Start of pack.out, part 01 of 01:' echo 'x - revfile.1' sed 's/^X//' > revfile.1 << '/' X.TH REVERSE 1 "30 August 1985" X.SH NAME Xrevfile \- reverse order of lines in files X.SH SYNOPSIS X.B revfile X[ file ] ... X.SH DESCRIPTION X.I Revfile Xcopies the named files to the standard output, reversing the order of the lines. XIf no file is specified, the standard input is copied. XThe filename \*(lq-\*(rq also refers to the standard input. XLines can be arbitrary length. X.SH BUGS XThe effect is irreversible if the last character of the file isn't '\\n', Xobviously. X.SH AUTHOR XStephen J. Muir (dcl-cs!stephen) / echo 'x - revfile.c' sed 's/^X//' > revfile.c << '/' X/* Written by Stephen J. Muir, Computing Dept., Lancaster University X * stephen@uk.ac.lancs.comp X * stephen@uk.ac.lancaster.computing X * dcl-cs!stephen X * X * revfile(1) - reverse order of lines in files X * X */ X X# include X# include X# include X# include X X# define BUFSIZE 4096 X Xextern char *malloc (); X Xchar *standin = "-", *tmpfile = "/tmp/revfileXXXXXX"; X Xstruct stat mystat; X Xstruct list X { char l_buf [BUFSIZE]; X short l_cnt; X struct list *l_next; X } *head, *pool; X X/* insert data at beginning of list */ Xlinsert (buf, size) X char *buf; X { register struct list *lp; X if (size == 0) X return; X if (lp = pool) /* try to reuse a list element */ X pool = pool->l_next; X else if ((lp = (struct list *)malloc (sizeof (struct list))) == 0) X { fprintf (stderr, "Out of memory\n"); X exit (1); X } X bcopy (buf, lp->l_buf, size); X lp->l_cnt = size; X lp->l_next = head; X head = lp; /* insert at head of list */ X } X Xlflush (buf, size) X char *buf; X { register struct list *lp; X if (size && fwrite (buf, 1, size, stdout) != size) X { perror ("stdout"); X exit (1); X } X while (head) /* flush list */ X { if (fwrite (head->l_buf, 1, head->l_cnt, stdout) != head->l_cnt) X { perror ("stdout"); X exit (1); X } X head = (lp = head)->l_next; X lp->l_next = pool; X pool = lp; /* add to list of old elements */ X } X } X Xrevfile (name) X char *name; X { static char buf [BUFSIZE]; X register char *cp, *ep; X register int ofd, nfd, i, pos, newpos; X if (strcmp (name, standin)) /* open the file */ X { if ((ofd = open (name, O_RDONLY)) == -1) X { perror (name); X return (1); X } X } X else X ofd = 0; X /* attempt to use original file */ X if (fstat (ofd, &mystat) == -1 || X (mystat.st_mode & S_IFMT) != S_IFREG || /* regular file? */ X (pos = lseek (ofd, 0, L_XTND)) == -1 /* go to EOF? */ X ) X { pos = 0; /* failed - copy file */ X if ((nfd = open (tmpfile, O_RDWR|O_CREAT, 0)) == -1 || X unlink (tmpfile) == -1 X ) X { perror (tmpfile); X goto erroro; X } X while ((i = read (ofd, buf, BUFSIZE)) > 0) X { if (write (nfd, buf, i) != i) X { perror (tmpfile); X goto errorn; X } X pos += i; X } X if (i == -1) X { perror (name); X goto errorn; X } X close (ofd); X ofd = nfd; X name = tmpfile; X } X while (pos) X { if ((newpos = pos - BUFSIZE) < 0) X newpos = 0; X i = pos - newpos; X if (lseek (ofd, newpos, L_SET) != newpos || read (ofd, buf, i) != i) X { perror (name); X goto erroro; X } X for (cp = ep = &buf [i]; cp > &buf [0]; ) X if (*--cp == '\n') X { lflush (cp + 1, ep - (cp + 1)); X ep = cp + 1; X } X linsert (cp, ep - cp); X pos = newpos; X } X lflush (0, 0); X if (ofd) X close (ofd); X return (0); Xerrorn: close (nfd); Xerroro: if (ofd) X close (ofd); X return (1); X } X X/*ARGSUSED*/ Xmain (argc, argv, envp) X char *argv [], *envp []; X { register short exitstat = 0; X if (--argc <= 0) X { argv = &standin; X argc = 1; X } X else X ++argv; X mktemp (tmpfile); X while (argc--) X if (revfile (*argv++)) X exitstat = 1; X if (fclose (stdout) == EOF) X { perror ("stdout"); X exit (1); X } X exit (exitstat); X } / echo 'Part 01 of pack.out complete.' exit -- UUCP: ...!seismo!mcvax!ukc!dcl-cs!stephen DARPA: stephen%lancs.comp@ucl-cs | Post: University of Lancaster, JANET: stephen@uk.ac.lancs.comp | Department of Computing, Phone: +44 524 65201 Ext. 4599 | Bailrigg, Lancaster, UK. Project:Alvey ECLIPSE Distribution | LA1 4YR