1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Eclipse Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.eclipse.org/org/documents/epl-v10.html * 11* (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#include "sfhdr.h" 23 24/* Walk streams and run operations on them 25** 26** Written by Kiem-Phong Vo. 27*/ 28 29#if __STD_C 30int sfwalk(Sfwalk_f walkf, Void_t* data, int type) 31#else 32int sfwalk(walkf, data, type) 33Sfwalk_f walkf; /* return <0: stop, >=0: continue */ 34Void_t* data; 35int type; /* walk streams with all given flags */ 36#endif 37{ 38 Sfpool_t *p; 39 Sfio_t *f; 40 int n, rv; 41 42 /* truly initializing std-streams before walking */ 43 if(sfstdin->mode & SF_INIT) 44 _sfmode(sfstdin, (sfstdin->mode & SF_RDWR), 0); 45 if(sfstdout->mode & SF_INIT) 46 _sfmode(sfstdout, (sfstdout->mode & SF_RDWR), 0); 47 if(sfstderr->mode & SF_INIT) 48 _sfmode(sfstderr, (sfstderr->mode & SF_RDWR), 0); 49 50 for(rv = 0, p = &_Sfpool; p; p = p->next) 51 { for(n = 0; n < p->n_sf; ) 52 { f = p->sf[n]; 53 54 if(type != 0 && (f->_flags&type) != type ) 55 continue; /* not in the interested set */ 56 57 if((rv = (*walkf)(f, data)) < 0) 58 return rv; 59 60 if(p->sf[n] == f) /* move forward to next stream */ 61 n += 1; 62 /* else - a sfclose() was done on current stream */ 63 } 64 } 65 66 return rv; 67} 68