CLogRingBuffer Class Reference

#include <LogRingBuffer.h>

Collaboration diagram for CLogRingBuffer:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 CLogRingBuffer (int size)
virtual ~CLogRingBuffer (void)
int init (int size)
void clear (void)
void putRingBuffer (Buffer buf, int input=LOG_RB_MESG, int kind=LOG_RB_UNKNOWN_DATA)
void rewriteBinHexRingBuffer (int n, int input)
void putRingFormat (int input, char *fmt,...)
void putRingFormat (int input, char *fmt, va_list args)
Buffer getRingBuffer (void)
Buffer getRingBuffer (int pos)
int getMaxBufSize (void)
int getMaxLineX (void)
int getMaxLineY (void)
int getTotalSize (void)
int getLastPosition (void)
int getLengthX (int n)
int getKindData (int n)

Public Attributes

BufferpBuf

Protected Attributes

int maxBufSize
int tlDataSize
int maxLineX
int maxLineY
int indentSize
int rPos
int wPos
int * kindData
int * inputSrc

Detailed Description

Definition at line 42 of file LogRingBuffer.h.


Constructor & Destructor Documentation

CLogRingBuffer ( int  size  )  [inline]

Definition at line 45 of file LogRingBuffer.h.

References CLogRingBuffer::init().

00045 { init(size);}

Here is the call graph for this function:

~CLogRingBuffer ( void   )  [virtual]

Definition at line 16 of file LogRingBuffer.cpp.

References del_Buffer_dim(), and CLogRingBuffer::pBuf.

00017 {
00018     //DEBUG_INFO("DESTRUCTOR: CLogRingBuffer");
00019 
00020     if (pBuf!=NULL) del_Buffer_dim(&pBuf);
00021 
00022     //DEBUG_INFO("DESTRUCTOR: CLogRingBuffer");
00023 }

Here is the call graph for this function:


Member Function Documentation

void clear ( void   ) 

Definition at line 72 of file LogRingBuffer.cpp.

References Buffer::buf, CLogRingBuffer::maxBufSize, CLogRingBuffer::maxLineX, CLogRingBuffer::maxLineY, CLogRingBuffer::pBuf, CLogRingBuffer::rPos, CLogRingBuffer::tlDataSize, Buffer::vldsz, and CLogRingBuffer::wPos.

00073 {
00074     for (int i=0; i<maxBufSize; i++) {
00075         pBuf[i].buf[0] = '\0';
00076         pBuf[i].vldsz  = 0;
00077     }
00078 
00079     tlDataSize = 0;
00080     maxLineX = maxLineY = 0;
00081     rPos = wPos = 0;
00082 
00083     return;
00084 }

int getKindData ( int  n  )  [inline]

Definition at line 66 of file LogRingBuffer.h.

References CLogRingBuffer::kindData, and CLogRingBuffer::maxBufSize.

00066 { if(n<0) n+=maxBufSize; return kindData[n%maxBufSize];}

int getLastPosition ( void   )  [inline]

Definition at line 63 of file LogRingBuffer.h.

References CLogRingBuffer::wPos.

00063 { return wPos;}

int getLengthX ( int  n  )  [inline]

Definition at line 65 of file LogRingBuffer.h.

References CLogRingBuffer::maxBufSize, and CLogRingBuffer::pBuf.

Referenced by CLogRingBuffer::putRingBuffer().

00065 { if(n<0) n+=maxBufSize; return (int)strlen((const char*)pBuf[n%maxBufSize].buf);}

Here is the caller graph for this function:

int getMaxBufSize ( void   )  [inline]

Definition at line 59 of file LogRingBuffer.h.

References CLogRingBuffer::maxBufSize.

00059 { return maxBufSize;}

int getMaxLineX ( void   )  [inline]

Definition at line 60 of file LogRingBuffer.h.

References CLogRingBuffer::maxLineX.

00060 { return maxLineX;}

int getMaxLineY ( void   )  [inline]

Definition at line 61 of file LogRingBuffer.h.

References CLogRingBuffer::maxLineY.

00061 { return maxLineY;}

Buffer getRingBuffer ( int  pos  ) 

Buffer CLogRingBuffer::getRingBuffer(int pos)

バッファの位置を指定して読み込む.データポインタの移動無し.

Returns:
指定した位置のデータ

Definition at line 320 of file LogRingBuffer.cpp.

References copy_Buffer(), init_Buffer(), CLogRingBuffer::inputSrc, LBUF, make_Buffer(), CLogRingBuffer::maxBufSize, CLogRingBuffer::pBuf, and Buffer::state.

00321 {
00322     Buffer buf = init_Buffer();
00323     buf.state  = -1;
00324 
00325     if (pos<0) return buf;
00326     if (pos>=maxBufSize) pos = pos%maxBufSize;
00327 
00328     buf = make_Buffer(LBUF);
00329     copy_Buffer(&pBuf[pos], &buf);
00330     buf.state = inputSrc[pos];
00331 
00332     return buf;
00333 }

Here is the call graph for this function:

Buffer getRingBuffer ( void   ) 

Buffer CLogRingBuffer::getRingBuffer(void)

バッファの先頭のデータを読み込む.データポインタを移動させる.

Returns:
バッファの先頭のデータ

Definition at line 298 of file LogRingBuffer.cpp.

References copy_Buffer(), CLogRingBuffer::inputSrc, LBUF, make_Buffer(), CLogRingBuffer::maxBufSize, CLogRingBuffer::pBuf, CLogRingBuffer::rPos, and Buffer::state.

00299 {
00300     Buffer buf = make_Buffer(LBUF);
00301 
00302     copy_Buffer(&pBuf[rPos], &buf);
00303     buf.state = inputSrc[rPos];
00304 
00305     rPos++;
00306     if (rPos>=maxBufSize) rPos -= maxBufSize;
00307 
00308     return buf;
00309 }

Here is the call graph for this function:

int getTotalSize ( void   )  [inline]

Definition at line 62 of file LogRingBuffer.h.

References CLogRingBuffer::tlDataSize.

00062 { return tlDataSize;}

int init ( int  size  ) 

Definition at line 27 of file LogRingBuffer.cpp.

References del_Buffer_dim(), CLogRingBuffer::indentSize, CLogRingBuffer::inputSrc, CLogRingBuffer::kindData, LBUF, make_Buffer(), CLogRingBuffer::maxBufSize, CLogRingBuffer::maxLineX, CLogRingBuffer::maxLineY, CLogRingBuffer::pBuf, CLogRingBuffer::rPos, Buffer::state, CLogRingBuffer::tlDataSize, and CLogRingBuffer::wPos.

Referenced by CLogRingBuffer::CLogRingBuffer().

00028 {
00029     bool  err_flag = false;
00030 
00031     maxBufSize = tlDataSize = 0;
00032     maxLineX   = maxLineY   = 0;
00033     rPos = wPos = 0;
00034     indentSize = 13;    // 5 + 8  "1234 SERVER: "
00035 
00036     pBuf     = (Buffer*)malloc(sizeof(Buffer)*size);
00037     kindData = (int*)malloc(sizeof(int)*size);
00038     inputSrc = (int*)malloc(sizeof(int)*size);
00039 
00040     if (pBuf!=NULL && inputSrc!=NULL && kindData!=NULL) {
00041         memset(pBuf,      0, sizeof(Buffer)*size);
00042         memset(kindData, 0, sizeof(int)*size);
00043         memset(inputSrc, 0, sizeof(int)*size);
00044         maxBufSize = size;
00045 
00046         for (int i=0; i<size; i++) {
00047             pBuf[i] = make_Buffer(LBUF);
00048             if (pBuf[i].buf==NULL) {
00049                 err_flag = true;
00050                 break;
00051             }
00052             pBuf[i].state = size;
00053         }
00054     }
00055     else {
00056         err_flag = true;
00057     }
00058 
00059     if (err_flag) {
00060         if (pBuf!=NULL) del_Buffer_dim(&pBuf);
00061         if (kindData!=NULL) free(kindData);
00062         if (inputSrc!=NULL) free(inputSrc);
00063         kindData = inputSrc = NULL;
00064         return 1;
00065     }
00066 
00067     return 0;
00068 }

Here is the call graph for this function:

Here is the caller graph for this function:

void putRingBuffer ( Buffer  buf,
int  input = LOG_RB_MESG,
int  kind = LOG_RB_UNKNOWN_DATA 
)

void CLogRingBuffer::putRingBuffer(Buffer buf, int input, int kind)

バッファの最後にデータを追加する.

Parameters:
buf 追加するデータ.
input データのタグ LOG_RB_MESG, LOG_RB_INFO, LOG_RB_DEBUG, LOG_RB_WARN, LOG_RB_ERR
kind データの種類 LOG_RB_UNKNOWN_DATA, LOG_RB_TEXT_DATA, LOG_RB_TEXT_HALF_DATA, LOG_RB_BINARY_DATA, LOG_RB_BINHEX_DATA

Definition at line 98 of file LogRingBuffer.cpp.

References Buffer::buf, cat_Buffer(), cat_s2Buffer, CHAR_CR, CHAR_LF, copy_Buffer(), copy_s2Buffer, decompline_Buffer_dim(), del_Buffer_dim(), free_Buffer(), CLogRingBuffer::getLengthX(), CLogRingBuffer::inputSrc, isText_Buffer(), CLogRingBuffer::kindData, LOG_RB_BINARY_DATA, LOG_RB_DEBUG, LOG_RB_ERROR, LOG_RB_INFO, LOG_RB_TEXT_DATA, LOG_RB_TEXT_HALF_DATA, LOG_RB_UNKNOWN_DATA, LOG_RB_WARNING, Max, CLogRingBuffer::maxBufSize, CLogRingBuffer::maxLineX, CLogRingBuffer::maxLineY, ON, CLogRingBuffer::pBuf, rept_Buffer(), snprintf, Buffer::state, CLogRingBuffer::tlDataSize, Buffer::vldsz, and CLogRingBuffer::wPos.

Referenced by CLogRingBuffer::putRingFormat(), and CLogRingBuffer::rewriteBinHexRingBuffer().

00099 {
00100     int  i,  nxt = 0;
00101     bool recalcX = false;
00102     char num[10];
00103 
00104     if (buf.buf==NULL || buf.vldsz<=0) return;
00105     Buffer* dim = decompline_Buffer_dim(buf, ON);
00106     if (dim==NULL || dim->state<=0) return;
00107     tlDataSize += buf.vldsz;    
00108 
00109 #ifdef DEBUG
00110     int total = 0;
00111     for (i=0; i<dim->state; i++) {
00112         total += dim[i].vldsz;
00113     }
00114     if (buf.vldsz!=total) {
00115         DEBUG_ERR("CLogRingBuffer::putRingBuffer(): ERROR: mismatch total data size!! %d %d", buf.vldsz, total);
00116     }
00117 #endif
00118     
00119     // 前の行の続き
00120     int pos = wPos - 1;
00121     if (pos<0) pos += maxBufSize;
00122     if (kindData[pos]==LOG_RB_TEXT_HALF_DATA && isText_Buffer(dim[0]) 
00123             && inputSrc[pos]==input && input!=LOG_RB_INFO && kind==LOG_RB_UNKNOWN_DATA) {
00124         cat_Buffer(&dim[0], &pBuf[pos]);
00125         kindData[pos] = LOG_RB_TEXT_DATA;
00126         maxLineX = Max(maxLineX, getLengthX(pos));
00127         nxt = 1;    // 処理済
00128     }
00129     
00130     // 新しい行.
00131     pos = wPos - 1; 
00132     for (i=nxt; i<dim->state; i++) {
00133         pos++;      // == wPos
00134         if (pos>=maxBufSize) pos -= maxBufSize;
00135         if (!recalcX && maxLineY==maxBufSize && maxLineX==getLengthX(pos)) recalcX = true;
00136 
00137         snprintf(num, 10, "%04d| ", pos);
00138         copy_s2Buffer(num, &pBuf[pos]);
00139         if      (input==LOG_RB_ERROR)   cat_s2Buffer("ERROR: ", &pBuf[pos]);
00140         else if (input==LOG_RB_WARNING) cat_s2Buffer("WARN : ", &pBuf[pos]);
00141         else if (input==LOG_RB_DEBUG)   cat_s2Buffer("DEBUG: ", &pBuf[pos]);
00142         else if (input==LOG_RB_INFO)    cat_s2Buffer("INFO : ", &pBuf[pos]);
00143         //else                          cat_s2Buffer("        ", &pBuf[pos]);
00144 
00145         cat_Buffer(&dim[i], &pBuf[pos]);
00146         if (kind==LOG_RB_UNKNOWN_DATA) kindData[pos] = LOG_RB_TEXT_DATA;
00147         else                           kindData[pos] = kind;
00148         inputSrc[pos] = input;
00149         maxLineX = Max(maxLineX, getLengthX(pos));
00150     }
00151 
00152     // 最後のデータの再確認
00153     if (nxt<dim->state && kind==LOG_RB_UNKNOWN_DATA) {
00154         if (isText_Buffer(dim[dim->state-1])) {
00155             unsigned char end = dim[dim->state-1].buf[dim[dim->state-1].vldsz-1]; 
00156             if (end!=CHAR_CR && end!=CHAR_LF) kindData[pos] = LOG_RB_TEXT_HALF_DATA;
00157         }
00158         else {
00159             kindData[pos] = LOG_RB_BINARY_DATA;
00160         }
00161     }
00162 
00163     pos++;
00164     if (pos>=maxBufSize) pos -= maxBufSize;
00165     wPos = pos;
00166 
00167     // 次のn行を目印行にする.
00168     Buffer spbuf = rept_Buffer(' ', 80);
00169     cat_s2Buffer("\n", &spbuf);
00170     for (i=0; i<2; i++) {
00171         copy_Buffer(&spbuf, &pBuf[pos]);
00172         inputSrc[pos] = LOG_RB_INFO;
00173         kindData[pos] = LOG_RB_TEXT_DATA;
00174         pos++;
00175         if (pos>=maxBufSize) pos -= maxBufSize;
00176     }
00177     free_Buffer(&spbuf);
00178 
00179     // コンテキストのサイズを計算
00180     if (maxLineY<maxBufSize) {
00181         if (wPos+1<maxLineY) maxLineY = maxBufSize;
00182         else  maxLineY = wPos + 1;
00183     }
00184     //DEBUG_WARN("MaxY = %d", maxLineY);
00185     
00186     if (recalcX) {
00187         maxLineX = 0;
00188         for (i=0; i<maxBufSize; i++) {
00189             maxLineX = Max(maxLineX, getLengthX(i));
00190         }
00191     }
00192 
00193     del_Buffer_dim(&dim);
00194     return;
00195 }

Here is the call graph for this function:

Here is the caller graph for this function:

void putRingFormat ( int  input,
char *  fmt,
va_list  args 
)

void CLogRingBuffer::putRingFormat(int input, char* fmt, va_list args)

可変数変数用の書き込み用関数.バッファの最後に生成された文字列を追加する. 上位の関数から呼び出して使用する.

Definition at line 265 of file LogRingBuffer.cpp.

References Buffer::buf, free_Buffer(), LBUF, LOG_RB_TEXT_DATA, make_Buffer(), CLogRingBuffer::putRingBuffer(), recalc_strlen_Buffer(), and vsnprintf.

00266 {
00267     char*  nfmt;
00268     int    len;
00269     Buffer buf;
00270 
00271     len  = (int)strlen(fmt);    
00272     nfmt = (char*)malloc(len+1);
00273     if (nfmt==NULL) return;
00274 
00275     strncpy(nfmt, fmt, len);
00276     nfmt[len] = '\0';
00277 
00278     buf = make_Buffer(LBUF);
00279     vsnprintf((char*)buf.buf, LBUF-1, nfmt, args);
00280     recalc_strlen_Buffer(&buf);
00281     free(nfmt);
00282 
00283     putRingBuffer(buf, input, LOG_RB_TEXT_DATA);
00284     free_Buffer(&buf);
00285     
00286     return;
00287 }

Here is the call graph for this function:

void putRingFormat ( int  input,
char *  fmt,
  ... 
)

void CLogRingBuffer::putRingFormat(int input, char* fmt, ...)

可変数変数用の書き込み用関数.バッファの最後に生成された文字列を追加する.

Definition at line 228 of file LogRingBuffer.cpp.

References Buffer::buf, free_Buffer(), LBUF, LOG_RB_TEXT_DATA, make_Buffer(), CLogRingBuffer::putRingBuffer(), recalc_strlen_Buffer(), and vsnprintf.

00229 {
00230     char*  nfmt;
00231     int    len;
00232     Buffer buf;
00233 
00234     va_list  args;
00235     va_start(args, fmt);
00236 
00237     len  = (int)strlen(fmt);    
00238     nfmt = (char*)malloc(len+1);
00239     if (nfmt==NULL) return;
00240 
00241     strncpy(nfmt, fmt, len);
00242     nfmt[len] = '\0';
00243 
00244     buf = make_Buffer(LBUF);
00245     vsnprintf((char*)buf.buf, LBUF-1, nfmt, args);
00246     recalc_strlen_Buffer(&buf);
00247     free(nfmt);
00248 
00249     va_end(args);
00250 
00251     putRingBuffer(buf, input, LOG_RB_TEXT_DATA);
00252     free_Buffer(&buf);
00253     
00254     return;
00255 }

Here is the call graph for this function:

void rewriteBinHexRingBuffer ( int  n,
int  input 
)

void CLogRingBuffer::rewriteBinHexRingBuffer(int n, int input)

バッファ位置 nにあるデータを 16進表示で書き直す. 主に,位置 nにあるデータがバイナリの場合に使用する.

Definition at line 205 of file LogRingBuffer.cpp.

References Buffer::buf, dump_Buffer(), free_Buffer(), CLogRingBuffer::indentSize, LOG_RB_BINHEX_DATA, CLogRingBuffer::maxBufSize, CLogRingBuffer::pBuf, CLogRingBuffer::putRingBuffer(), Buffer::vldsz, and CLogRingBuffer::wPos.

00206 {
00207     while (n<0) n += maxBufSize;
00208     if (n>=maxBufSize) n = n%maxBufSize;
00209 
00210     Buffer dup = pBuf[n];
00211     dup.buf    = dup.buf   + indentSize;
00212     dup.vldsz  = dup.vldsz - indentSize;
00213 
00214     Buffer buf = dump_Buffer(dup);
00215     wPos = n;
00216     putRingBuffer(buf, input, LOG_RB_BINHEX_DATA);
00217 
00218     free_Buffer(&buf);
00219 }

Here is the call graph for this function:


Member Data Documentation

int indentSize [protected]
int* inputSrc [protected]
int* kindData [protected]
int maxBufSize [protected]
int maxLineX [protected]
int maxLineY [protected]
int rPos [protected]
int tlDataSize [protected]
int wPos [protected]

The documentation for this class was generated from the following files:

Generated on 15 Nov 2023 for JunkBox_Lib++ (for Windows) by  doxygen 1.6.1