为了账号安全,请及时绑定邮箱和手机立即绑定

gnu c的setbuf函数源代码

标签:
C++


libio/sebuf.c定义了sebbuf函数:

void setbuf (FILE *fp, char *buf)

{

  _IO_setbuffer (fp, buf, BUFSIZ);

}

libio/iosetbuffer.c定义了_IO_setbuffer函数:

void _IO_setbuffer (FILE *fp, char *buf, size_t size)

{

  CHECK_FILE (fp, );

  _IO_acquire_lock (fp);

  fp->_flags &= ~_IO_LINE_BUF;

  if (!buf)

    size = 0;

  (void) _IO_SETBUF (fp, buf, size);

  if (_IO_vtable_offset (fp) == 0 && fp->_mode == 0 && _IO_CHECK_WIDE (fp))

    /* We also have to set the buffer using the wide char function.  */

    (void) _IO_WSETBUF (fp, buf, size);

  _IO_release_lock (fp);

}

除了锁定FILE指针外,核心代码就是_IO_SETBUF和用于多字节环境的_IO_WSETBUF,最后解析,重点介绍下_IO_SETBUF

libio/libioP.h定义了_IO_SETBUF和_IO_WSETBUF:

typedef FILE* (*_IO_setbuf_t) (FILE *, char *, ssize_t);

#define _IO_SETBUF(FP, BUFFER, LENGTH) JUMP2 (__setbuf, FP, BUFFER, LENGTH)

#define _IO_WSETBUF(FP, BUFFER, LENGTH) WJUMP2 (__setbuf, FP, BUFFER, LENGTH)

       #define JUMP2(FUNC, THIS, X1, X2) (_IO_JUMPS_FUNC(THIS)->FUNC) (THIS, X1, X2)

       #define WJUMP2(FUNC, THIS, X1, X2) (_IO_WIDE_JUMPS_FUNC(THIS)->FUNC) (THIS, X1, X2)

       struct _IO_FILE_plus

       {

          FILE file;

          const struct _IO_jump_t *vtable;

        };

       1)_IO_JUMPS_FUNC(THIS)是通过_IO_CAST_FIELD_ACCESS将setbuf函数的参数fp转成struct _IO_FILE_plus类型,

并返回struct _IO_FILE_plus的vtable变量,通过vtable调用__setbuf函数(JUMP2的参数),

      2)通过JUMP_INIT (setbuf, _IO_default_setbuf)定义了vtable默认的__setbuf函数

   4. libio/genops.c定义了_IO_default_setbuf及其调用的_IO_setb,_IO_setb设置了setbuf函数的参数fp的_IO_buf_base等buf变量:

        FILE * _IO_default_setbuf (FILE *fp, char *p, ssize_t len)

        {

            if (_IO_SYNC (fp) == EOF)

                   return NULL;

            if (p == NULL || len == 0)

              {

                    fp->_flags |= _IO_UNBUFFERED;

                    _IO_setb (fp, fp->_shortbuf, fp->_shortbuf+1, 0);

             }

            else

              {

                    fp->_flags &= ~_IO_UNBUFFERED;

                    _IO_setb (fp, p, p+len, 0);

              }

               fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = 0;

               fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_read_end = 0;

              return fp;

        }

       void _IO_setb (FILE *f, char *b, char *eb, int a)

      {

          if (f->_IO_buf_base && !(f->_flags & _IO_USER_BUF))

            free (f->_IO_buf_base);

          f->_IO_buf_base = b;

          f->_IO_buf_end = eb;

          if (a)

            f->_flags &= ~_IO_USER_BUF;

          else

            f->_flags |= _IO_USER_BUF;

    }

©著作权归作者所有:来自51CTO博客作者hjun169的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消