if ((flag) || (i == size))
if (flag || size == 0)
static int buffer_gets(BIO *b, char *buf, int size)	{	BIO_F_BUFFER_CTX *ctx;	int num=0,i,flag;	char *p;	ctx=(BIO_F_BUFFER_CTX *)b->ptr;	size--; /* reserve space for a '\0' */	BIO_clear_retry_flags(b);	for (;;)		{		if (ctx->ibuf_len > 0)			{			p= &(ctx->ibuf[ctx->ibuf_off]);			flag=0;			for (i=0; (i<ctx->ibuf_len) && (i<size); i++)				{				*(buf++)=p[i];				if (p[i] == '\n')					{					flag=1;					i++;					break;					}				}			num+=i;			size-=i;			ctx->ibuf_len-=i;			ctx->ibuf_off+=i;			if ((flag) || (i == size))				{				*buf='\0';				return(num);				}			}		else	/* read another chunk */			{			i=BIO_read(b->next_bio,ctx->ibuf,ctx->ibuf_size);			if (i <= 0)				{				BIO_copy_next_retry(b);				if (i < 0) return((num > 0)?num:i);				if (i == 0) return(num);				}			ctx->ibuf_len=i;			ctx->ibuf_off=0;			}		}	}