02831da9ec33fb4bd0ae20fbd9bd29876503f2e9
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / sfio / sfsk.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 libraries 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: sfsk.c /main/3 1995/11/01 18:36:35 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 /*      Seek function that knows discipline
49 **
50 **      Written by Kiem-Phong Vo (02/12/91)
51 */
52 #if __STD_C
53 long sfsk(reg Sfio_t* f, reg long addr, reg int type, reg Sfdisc_t* disc)
54 #else
55 long sfsk(f,addr,type,disc)
56 reg Sfio_t      *f;
57 reg long        addr;
58 reg int         type;
59 reg Sfdisc_t    *disc;
60 #endif
61 {
62         reg long        p;
63         reg int         s, local, string;
64
65         GETLOCAL(f,local);
66         if(!local && !(f->mode&SF_LOCK))
67                 return -1;
68
69         if(!(string = (f->flags&SF_STRING)))
70                 SFDISC(f,disc,seekf,local);
71
72         for(;;)
73         {
74                 if(string)
75                 {       SFSTRSIZE(f);
76                         if(type == 0)
77                                 s = (int)addr;
78                         else if(type == 1)
79                                 s = (int)(addr + f->here);
80                         else    s = (int)(addr + f->extent);
81                 }
82                 else
83                 {
84                         if(disc && disc->seekf)
85                                 p = (*(disc->seekf))(f,addr,type,disc);
86                         else    p = lseek(f->file,addr,type);
87                         if(p >= 0)
88                                 return p;
89                         s = -1;
90                 }
91
92                 if(local)
93                         SETLOCAL(f);
94                 switch(_sfexcept(f,SF_SEEK,s,disc))
95                 {
96                 case SF_EDISC:
97                 case SF_ECONT:
98                         if(string)
99                                 return 0L;
100                         continue;
101                 default:
102                         return -1L;
103                 }
104         }
105 }