⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 procbuf.i

📁 早期freebsd实现
💻 I
📖 第 1 页 / 共 2 页
字号:
         _G_wchar_t fill() const { return (_G_wchar_t)_fill; }    _G_wchar_t fill(_G_wchar_t newf)	{_G_wchar_t oldf = (_G_wchar_t)_fill; _fill = (char)newf; return oldf;}    fmtflags flags() const { return _flags; }    fmtflags flags(fmtflags new_val) {	fmtflags old_val = _flags; _flags = new_val; return old_val; }    int precision() const { return _precision; }    int precision(int newp) {	unsigned short oldp = _precision; _precision = (unsigned short)newp;	return oldp; }    fmtflags setf(fmtflags val) {	fmtflags oldbits = _flags;	_flags |= val; return oldbits; }    fmtflags setf(fmtflags val, fmtflags mask) {	fmtflags oldbits = _flags;	_flags = (_flags & ~mask) | (val & mask); return oldbits; }    fmtflags unsetf(fmtflags mask) {	fmtflags oldbits = _flags & mask;	_flags &= ~mask; return oldbits; }    int width() const { return _width; }    int width(int val) { int save = _width; _width = val; return save; }    void _throw_failure() { }    streambuf* rdbuf() const { return _strbuf; }    void clear(iostate state = 0) {	_state = _strbuf ? state : state|badbit;	if (_state & _exceptions) _throw_failure(); }    void set(iostate flag) { _state |= flag;	if (_state & _exceptions) _throw_failure(); }    int good() const { return _state == 0; }    int eof() const { return _state & ios::eofbit; }    int fail() const { return _state & (ios::badbit|ios::failbit); }    int bad() const { return _state & ios::badbit; }    iostate rdstate() const { return _state; }    operator void*() const { return fail() ? (void*)0 : (void*)(-1); }    int operator!() const { return fail(); }    iostate exception(iostate enable) {	iostate old = _exceptions; _exceptions = enable;	if (_state & _exceptions) _throw_failure();	return old; }    static int sync_with_stdio(int on);    static void sync_with_stdio() { sync_with_stdio(1); }  protected:    ios(streambuf* sb = 0, ostream* tie = 0);    virtual ~ios();    void init(streambuf* sb) { _state=0; _strbuf=sb; }};typedef ios::seek_dir _seek_dir;       class streammarker {    friend class streambuf;    friend int __underflow(streambuf*);    struct streammarker *_next;       streambuf *_sbuf;      streampos _spos;      void set_streampos(streampos sp) { _spos = sp; }    void set_offset(int offset) { _pos = offset; _spos = (streampos)(-2); }              int _pos;  public:    streammarker(streambuf *sb);    ~streammarker();    int saving() { return  _spos == -2; }    int delta(streammarker&);    int delta();};struct __streambuf {         int _flags;		     char* _gptr;	     char* _egptr;	     char* _eback;	     char* _pbase;	     char* _pptr;	     char* _epptr;	     char* _base;	     char* _ebuf;	     struct streambuf *_chain;         friend class streammarker;    char *_other_gbase;      char *_aux_limit;       char *_other_egptr;      streammarker *_markers;         unsigned short _cur_column;    char _unused;    char _shortbuf[1];};extern unsigned __adjust_column(unsigned start, const char *line, int count);struct streambuf : private __streambuf {    friend class ios;    friend class istream;    friend class ostream;    friend class streammarker;    friend int __underflow(streambuf*);  protected:    static streambuf* _list_all;      streambuf*& xchain() { return _chain; }    void _un_link();    void _link_in();    char* gptr() const { return _gptr; }    char* pptr() const { return _pptr; }    char* egptr() const { return _egptr; }    char* epptr() const { return _epptr; }    char* pbase() const { return _pbase; }    char* eback() const { return _eback; }    char* base() const { return _base; }    char* ebuf() const { return _ebuf; }    int blen() const { return _ebuf - _base; }    void xput_char(char c) { *_pptr++ = c; }    int xflags() { return _flags; }    int xflags(int f) { int fl = _flags; _flags = f; return fl; }    void xsetflags(int f) { _flags |= f; }    void xsetflags(int f, int mask) { _flags = (_flags & ~mask) | (f & mask); }    void gbump(int n) { _gptr += n; }    void pbump(int n) { _pptr += n; }    void setb(char* b, char* eb, int a=0);    void setp(char* p, char* ep) { _pbase=_pptr=p; _epptr=ep; }    void setg(char* eb, char* g, char *eg) { _eback=eb; _gptr=g; _egptr=eg; }    char *shortbuf() { return _shortbuf; }    int in_backup() { return _flags & 0x100 ; }         char *Gbase() { return in_backup() ? _other_gbase : _eback; }         char *eGptr() { return in_backup() ? _other_egptr : _egptr; }         char *Bbase() { return in_backup() ? _eback : _other_gbase; }    char *Bptr() { return _aux_limit; }         char *eBptr() { return in_backup() ? _egptr : _other_egptr; }    char *Nbase() { return _other_gbase; }    char *eNptr() { return _other_egptr; }    int have_backup() { return _other_gbase != 0 ; }    int have_markers() { return _markers != 0 ; }    int _least_marker();    void switch_to_main_get_area();    void switch_to_backup_area();    void free_backup_area();    void unsave_markers();      int put_mode() { return _flags & 0x800 ; }    int switch_to_get_mode();        streambuf(int flags=0);  public:    static int flush_all();    static void flush_all_linebuffered();      virtual int underflow() = 0;      virtual int overflow(int c = (-1) ) = 0;      virtual int doallocate();    virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);    virtual streampos seekpos(streampos pos, int mode = ios::in|ios::out);    int seekmark(streammarker& mark, int delta = 0);    int sputbackc(char c);    int sungetc();    virtual ~streambuf();    int unbuffered() { return _flags & 2  ? 1 : 0; }    int linebuffered() { return _flags & 0x200  ? 1 : 0; }    void unbuffered(int i)	{ if (i) _flags |= 2 ; else _flags &= ~2 ; }    void linebuffered(int i)	{ if (i) _flags |= 0x200 ; else _flags &= ~0x200 ; }    int allocate() {  	if (base() || unbuffered()) return 0;	else return doallocate(); }         void allocbuf() { if (base() == 0 ) doallocbuf(); }    void doallocbuf();    virtual int sync();    virtual int pbackfail(int c);    virtual streambuf* setbuf(char* p, int len);    int in_avail() { return _egptr - _gptr; }    int out_waiting() { return _pptr - _pbase; }    virtual int xsputn(const char* s, int n);    int sputn(const char* s, int n) { return xsputn(s, n); }    int padn(char pad, int n);      virtual int xsgetn(char* s, int n);    int sgetn(char* s, int n) { return xsgetn(s, n); }    int ignore(int);    virtual int get_column();    virtual int set_column(int);    long sgetline(char* buf, _G_size_t n, char delim, int putback_delim);    int sbumpc() {	if (_gptr >= _egptr && __underflow(this) == (-1) ) return (-1) ;	else return *(unsigned char*)_gptr++; }    int sgetc() {	if (_gptr >= _egptr && __underflow(this) == (-1) ) return (-1) ;	else return *(unsigned char*)_gptr; }    int snextc() {	if (_gptr >= _egptr && __underflow(this) == (-1) ) return (-1) ;	return _gptr++, sgetc(); }    int sputc(int c) {	if (_pptr >= _epptr) return __overflow(this, (unsigned char)c);	else return *_pptr++ = c, (unsigned char)c; }    void stossc() { if (_gptr < _egptr) _gptr++; }    int vscan(char const *fmt0, _G_va_list ap, ios* stream = 0 );    int scan(char const *fmt0 ...);    int vform(char const *fmt0, _G_va_list ap);    int form(char const *fmt0 ...);};      class backupbuf : public streambuf {    friend class streammarker;  protected:    backupbuf(int flags=0) : streambuf(flags|0x4000 ) { }  public:    virtual int pbackfail(int c);    virtual int underflow();    virtual int overflow(int c = (-1) );};struct __file_fields {    short _fileno;    int _blksize;    _G_fpos_t  _offset; };class filebuf : public backupbuf {  protected:    struct __file_fields _fb;    void init();  public:    static const int openprot;      filebuf();    filebuf(int fd);    filebuf(int fd, char* p, int len);    ~filebuf();    filebuf* attach(int fd);    filebuf* open(const char *filename, const char *mode);    filebuf* open(const char *filename, ios::openmode mode, int prot = 0664);    virtual int underflow();    virtual int overflow(int c = (-1) );    int is_open() const { return _fb._fileno >= 0; }    int fd() const { return is_open() ? _fb._fileno : (-1) ; }    filebuf* close();    virtual int doallocate();    virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);    virtual streambuf* setbuf(char* p, int len);    int xsputn(const char* s, int n);    int xsgetn(char* s, int n);    virtual int sync();  protected:       int is_reading() { return eback() != egptr(); }    char* cur_ptr() { return is_reading() ?  gptr() : pptr(); }         char* file_ptr() { return eGptr(); }    int do_write(const char *data, int to_do);    int do_flush() { return do_write(_pbase, _pptr-_pbase); }         virtual _G_ssize_t sys_read(char* buf, _G_size_t size);    virtual _G_fpos_t  sys_seek(_G_fpos_t , _seek_dir);    virtual _G_ssize_t sys_write(const void*, long);    virtual int sys_stat(void*);      virtual int sys_close();};inline ios::ios(streambuf* sb  , ostream* tie  ) {		_state = sb ? ios::goodbit : ios::badbit; _exceptions=0;		_strbuf=sb; _tie = tie; _width=0; _fill=' ';		_flags=ios::skipws|ios::dec; _precision=6; }inline ios::~ios() {    if (!(_flags & (unsigned int)ios::dont_close)) delete _strbuf; }# 22 "ioprivate.h" 2# 1 "/usr/include/stdarg.h" 1 3 typedef char *va_list;# 23 "ioprivate.h" 2extern int __cvt_double(double number, register int prec, int flags,			int *signp, int fmtch, char *startp, char *endp);           extern "C" double _Xstrtod(const char *s00, char **se);extern "C" char *dtoa(double d, int mode, int ndigits,                        int *decpt, int *sign, char **rve);extern int __outfloat(double value, streambuf *sb, char mode,	       int width, int precision, __fmtflags flags,	       char sign_mode, char fill);# 19 "procbuf.C" 2# 1 "procbuf.h" 1                class procbuf : public filebuf {    _G_pid_t _pid;  public:    procbuf() : filebuf() { }    procbuf(const char *command, int mode);    procbuf* open(const char *command, int mode);    procbuf *close() { return (procbuf*)filebuf::close(); }    virtual int sys_close();    ~procbuf();};# 20 "procbuf.C" 2# 1 "/usr/include/signal.h" 1 3 # 1 "/usr/include/sys/signal.h" 1 3 # 1 "/usr/include/machine/signal.h" 1 3  typedef int sig_atomic_t; struct	sigcontext {	int	sc_onstack;	 	int	sc_mask;	 	int	sc_sp;		 	int	sc_fp;		 	int	sc_ap;		 	int	sc_pc;		 	int	sc_ps;		 };# 42 "/usr/include/sys/signal.h" 2 3# 86 "/usr/include/sys/signal.h" 3typedef unsigned int sigset_t; struct	sigaction {	void	(*sa_handler)();	 	sigset_t sa_mask;		 	int	sa_flags;		 }; # 169 "/usr/include/sys/signal.h" 3 extern "C" { void	(*signal (int, void (*) (int)		)		) (int)		;}; # 41 "/usr/include/signal.h" 2 3extern "C" { int	raise (int)		;int	kill (pid_t, int)		;int	sigaction (int, const struct sigaction *, struct sigaction *)		;int	sigaddset (sigset_t *, int)		;int	sigdelset (sigset_t *, int)		;int	sigemptyset (sigset_t *)		;int	sigfillset (sigset_t *)		;int	sigismember (const sigset_t *, int)		;int	sigpending (sigset_t *)		;int	sigprocmask (int, const sigset_t *, sigset_t *)		;int	sigsuspend (const sigset_t *)		;# 71 "/usr/include/signal.h" 3};  # 21 "procbuf.C" 2# 1 "/usr/include/sys/wait.h" 1 3    # 142 "/usr/include/sys/wait.h" 3extern "C" { struct rusage;	 pid_t	wait (int *)		;pid_t	waitpid (pid_t, int *, int)		;}; # 23 "procbuf.C" 2procbuf::procbuf(const char *command, int mode) : filebuf(){    open(command, mode);}procbuf *procbuf::open(const char *command, int mode){    int read_or_write;    if (is_open())	return 0 ;    int pipe_fds[2];    int parent_end, child_end;    if (::pipe(pipe_fds) < 0)	return 0 ;    if (mode == ios::in) {	parent_end = pipe_fds[0];	child_end = pipe_fds[1];	read_or_write = 8 ;    }    else {	parent_end = pipe_fds[1];	child_end = pipe_fds[0];	read_or_write = 4 ;    }    _pid = vfork ();    if (_pid == 0) {	::close(parent_end);	int child_std_end = mode == ios::in ? 1 : 0;	if (child_end != child_std_end) {	    ::dup2(child_end, child_std_end);	    ::close(child_end);	}	::execl("/bin/sh", "sh", "-c", command, 0 );	::_exit(127);    }    ::close(child_end);    if (_pid < 0) {	::close(parent_end);	return 0 ;    }    _fb._fileno = parent_end;    xsetflags(read_or_write, 4 |8 );    return this;} int procbuf::sys_close(){    _G_pid_t wait_pid;    int status = filebuf::sys_close();    if (status < 0)	return status;    int wstatus;    sigset_t set, oset;    (*(&set) = 0) ;    (*(&set) |= 1 << (( 2	) - 1), 0) ;    (*(&set) |= 1 << (( 3	) - 1), 0) ;    (*(&set) |= 1 << (( 1	) - 1), 0) ;    sigprocmask (1	, &set, &oset);# 100 "procbuf.C"    while ((wait_pid = wait(&wstatus)) != _pid && wait_pid != -1) { }    sigprocmask (3	, &oset, (sigset_t *)0 );# 112 "procbuf.C"    if (wait_pid == -1)	return -1;    return 0;}procbuf::~procbuf(){    close();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -