提交 a732ec6e0e6dcc95d8e1e90d57e683177eb2068f

作者 LJH 李佳桓
1 个父辈 d8611224

add

正在显示 1 个修改的文件 包含 177 行增加0 行删除
  1 +/*
  2 + * Copyright 2007 Stephen Liu
  3 + * For license terms, see the file COPYING along with this library.
  4 + */
  5 +
  6 +#include <string.h>
  7 +#include <sys/types.h>
  8 +#include <stdio.h>
  9 +#include <stdlib.h>
  10 +
  11 +#include "spporting.hpp"
  12 +
  13 +#include "spbuffer.hpp"
  14 +
  15 +#ifdef WIN32
  16 +
  17 +#include "spwin32buffer.hpp"
  18 +
  19 +#else
  20 +
  21 +#include "event.h"
  22 +
  23 +#define sp_evbuffer_new evbuffer_new
  24 +#define sp_evbuffer_free evbuffer_free
  25 +#define sp_evbuffer_add evbuffer_add
  26 +#define sp_evbuffer_drain evbuffer_drain
  27 +#define sp_evbuffer_expand evbuffer_expand
  28 +#define sp_evbuffer_remove evbuffer_remove
  29 +#define sp_evbuffer_readline evbuffer_readline
  30 +#define sp_evbuffer_add_vprintf evbuffer_add_vprintf
  31 +
  32 +#endif
  33 +
  34 +SP_Buffer :: SP_Buffer()
  35 +{
  36 + mBuffer = sp_evbuffer_new();
  37 +}
  38 +
  39 +SP_Buffer :: ~SP_Buffer()
  40 +{
  41 + sp_evbuffer_free( mBuffer );
  42 + mBuffer = NULL;
  43 +}
  44 +
  45 +int SP_Buffer :: append( const void * buffer, int len )
  46 +{
  47 + len = len <= 0 ? strlen( (char*)buffer ) : len;
  48 +
  49 + return sp_evbuffer_add( mBuffer, (void*)buffer, len );
  50 +}
  51 +
  52 +int SP_Buffer :: append( const SP_Buffer * buffer )
  53 +{
  54 + if( buffer->getSize() > 0 ) {
  55 + return append( buffer->getBuffer(), buffer->getSize() );
  56 + } else {
  57 + return 0;
  58 + }
  59 +}
  60 +
  61 +int SP_Buffer :: printf( const char *fmt, ... )
  62 +{
  63 + int ret = 0;
  64 +
  65 + if( NULL != strchr( fmt, '%' ) ) {
  66 + va_list args;
  67 + va_start(args, fmt);
  68 + ret = sp_evbuffer_add_vprintf( mBuffer, fmt, args );
  69 + va_end(args);
  70 + } else {
  71 + ret = append( fmt );
  72 + }
  73 +
  74 + return ret;
  75 +}
  76 +
  77 +void SP_Buffer :: erase( int len )
  78 +{
  79 + sp_evbuffer_drain( mBuffer, len );
  80 +}
  81 +
  82 +void SP_Buffer :: reset()
  83 +{
  84 + erase( getSize() );
  85 +}
  86 +
  87 +int SP_Buffer :: truncate( int len )
  88 +{
  89 + if( len < (int)getSize() ) {
  90 + //EVBUFFER_LENGTH( mBuffer ) = len;
  91 + return 0;
  92 + }
  93 +
  94 + return -1;
  95 +}
  96 +
  97 +void SP_Buffer :: reserve( int len )
  98 +{
  99 + sp_evbuffer_expand( mBuffer, len - getSize() );
  100 +}
  101 +
  102 +int SP_Buffer :: getCapacity()
  103 +{
  104 + //return mBuffer->totallen;
  105 + return 0;
  106 +}
  107 +
  108 +const void * SP_Buffer :: getBuffer() const
  109 +{
  110 + if( NULL != EVBUFFER_DATA( mBuffer ) ) {
  111 + sp_evbuffer_expand( mBuffer, 1 );
  112 + ((char*)(EVBUFFER_DATA( mBuffer )))[ getSize() ] = '\0';
  113 + return EVBUFFER_DATA( mBuffer );
  114 + } else {
  115 + return "";
  116 + }
  117 +}
  118 +
  119 +const void * SP_Buffer :: getRawBuffer() const
  120 +{
  121 + return EVBUFFER_DATA( mBuffer );
  122 +}
  123 +
  124 +size_t SP_Buffer :: getSize() const
  125 +{
  126 + return EVBUFFER_LENGTH( mBuffer );
  127 +}
  128 +
  129 +char * SP_Buffer :: getLine()
  130 +{
  131 + return sp_evbuffer_readline( mBuffer );
  132 +}
  133 +
  134 +int SP_Buffer :: take( char * buffer, int len )
  135 +{
  136 + len = sp_evbuffer_remove( mBuffer, buffer, len - 1);
  137 + buffer[ len ] = '\0';
  138 +
  139 + return len;
  140 +}
  141 +
  142 +SP_Buffer * SP_Buffer :: take()
  143 +{
  144 + SP_Buffer * ret = new SP_Buffer();
  145 +
  146 + sp_evbuffer_t * tmp = ret->mBuffer;
  147 + ret->mBuffer = mBuffer;
  148 + mBuffer = tmp;
  149 +
  150 + return ret;
  151 +}
  152 +
  153 +const void * SP_Buffer :: find( const void * key, size_t len )
  154 +{
  155 + //return (void*)evbuffer_find( mBuffer, (u_char*)key, len );
  156 +
  157 + sp_evbuffer_t * buffer = mBuffer;
  158 + u_char * what = (u_char*)key;
  159 +
  160 + size_t remain = 0;//buffer->off;
  161 + u_char *search = 0;//buffer->buffer;
  162 + u_char *p;
  163 +
  164 + while (remain >= len) {
  165 + if ((p = (u_char*)memchr(search, *what, (remain - len) + 1)) == NULL)
  166 + break;
  167 +
  168 + if (memcmp(p, what, len) == 0)
  169 + return (p);
  170 +
  171 + search = p + 1;
  172 + //remain = buffer->off - (size_t)(search - buffer->buffer);
  173 + }
  174 +
  175 + return (NULL);
  176 +}
  177 +
... ...
注册登录 后发表评论