Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libcmd / revlib.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: revlib.c /main/3 1995/11/01 19:07:43 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 #include        <cmdlib.h>
94
95 #define BUFSIZE                 SF_BUFSIZE
96 #define rounddown(n,size)       (((n)-1)&~((size)-1))
97
98 /*
99  * copy the lines starting at offset <start> from in <in> to <out>
100  * in reverse order
101  */
102 int rev_line __PARAM__((Sfio_t *in, Sfio_t *out, off_t start), (in, out, start)) __OTORP__(Sfio_t *in; Sfio_t *out; off_t start;){
103         register char *cp, *cpold;
104         register int n, nleft=0;
105         char buff[BUFSIZE];
106         off_t offset;
107         if(sfseek(in,(off_t)0,SEEK_CUR) < 0)
108         {
109                 Sfio_t *tmp = sftmp(4*SF_BUFSIZE);
110                 if(!tmp)
111                         return(-1);
112                 if(start>0)
113                         sfmove(in, (Sfio_t*)0, (long)start, -1);
114                 if(sfmove(in, tmp, SF_UNBOUND, -1) < 0)
115                         return(-1);
116                 in = tmp;
117                 start=0;
118         }
119         if((offset = sfseek(in,(off_t)0,SEEK_END)) <= start)
120                 return(0);
121         offset = rounddown(offset,BUFSIZE);
122         while(1)
123         {
124                 n = BUFSIZE;
125                 if(offset < start)
126                 {
127                         n -= (start-offset);
128                         offset = start;
129                 }
130                 sfseek(in, offset, SEEK_SET);
131                 if((n=sfread(in, buff, n)) <=0)
132                         break;
133                 cp = buff+n;
134                 n = *buff;
135                 *buff = '\n';
136                 while(1)
137                 {
138                         cpold = cp;
139                         if(nleft==0)
140                                 cp--;
141                         if(cp==buff)
142                         {
143                                 nleft= 1;
144                                 break;
145                         }
146                         while(*--cp != '\n');
147                         if(cp==buff && n!='\n')
148                         {
149                                 *cp = n;
150                                 nleft += cpold-cp;
151                                 break;
152                         }
153                         else
154                                 cp++;
155                         if(sfwrite(out,cp,cpold-cp) < 0)
156                                 return(-1);
157                         if(nleft)
158                         {
159                                 if(nleft==1)
160                                         sfputc(out,'\n');
161                                 else if(sfmove(in,out,nleft,-1) < 0)
162                                         return(-1);
163                                 nleft = 0;
164                         }
165                 }
166                 if(offset <= start)
167                         break;
168                 offset -= BUFSIZE;
169         }
170         if(nleft)
171         {
172                 sfseek(in, start, SEEK_SET);
173                 if(sfmove(in,out,nleft,-1) < 0)
174                         return(-1);
175         }
176         return(0);
177 }