Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / sfio / sfpurge.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: sfpurge.c /main/3 1995/11/01 18:33:41 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 #include        "sfhdr.h"
47
48 /*      Delete all pending data in the buffer
49 **
50 **      Written by Kiem-Phong Vo (07/08/91)
51 */
52
53 #if __STD_C
54 sfpurge(reg Sfio_t* f)
55 #else
56 sfpurge(f)
57 reg Sfio_t      *f;
58 #endif
59 {
60         reg int mode;
61
62         if((mode = f->mode&SF_RDWR) != f->mode && _sfmode(f,mode,0) < 0)
63                 return -1;
64
65         if(f->disc == _Sfudisc)
66                 (void)sfclose((*_Sfstack)(f,NIL(Sfile_t*)));
67
68         /* cannot purge read string streams */
69         if((f->flags&SF_STRING) && (f->mode&SF_READ) )
70                 goto done;
71
72         SFLOCK(f,0);
73
74         /* if memory map must be a read stream, pretend data is gone */
75 #ifdef MAP_TYPE
76         if(f->flags&SF_MMAP)
77         {       f->here -= f->endb - f->next;
78                 if(f->data)
79                 {       (void)munmap((caddr_t)f->data,f->endb-f->data);
80                         SFSK(f,f->here,0,f->disc);
81                         f->endb = f->endr = f->endw =
82                         f->next = f->data = NIL(uchar*);
83                 }
84
85                 SFOPEN(f,0);
86                 return 0;
87         }
88 #endif
89
90         switch(f->mode&~SF_LOCK)
91         {
92         default :
93                 return -1;
94         case SF_WRITE :
95                 f->next = f->data;
96                 if((f->flags&(SF_PROCESS|SF_RDWR)) != (SF_PROCESS|SF_RDWR))
97                         break;
98
99                 /* 2-way pipe, must clear read buffer */
100                 (void)_sfmode(f,SF_READ,1);
101                 /* fall through */
102         case SF_READ:
103                 if(f->extent >= 0 && f->endb > f->next)
104                 {       f->here -= f->endb-f->next;
105                         SFSK(f,f->here,0,f->disc);
106                 }
107                 f->endb = f->next = f->data;
108                 break;
109         }
110
111         SFOPEN(f,0);
112
113 done:
114         if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf)
115                 (void)(*f->disc->exceptf)(f,SF_PURGE,f->disc);
116
117         return 0;
118 }