#include <LogRingBuffer.h>
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 | |
Buffer * | pBuf |
Protected Attributes | |
int | maxBufSize |
int | tlDataSize |
int | maxLineX |
int | maxLineY |
int | indentSize |
int | rPos |
int | wPos |
int * | kindData |
int * | inputSrc |
Definition at line 42 of file LogRingBuffer.h.
CLogRingBuffer | ( | int | size | ) | [inline] |
Definition at line 45 of file LogRingBuffer.h.
References CLogRingBuffer::init().
00045 { init(size);}
~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 }
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);}
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)
バッファの位置を指定して読み込む.データポインタの移動無し.
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 }
Buffer getRingBuffer | ( | void | ) |
Buffer CLogRingBuffer::getRingBuffer(void)
バッファの先頭のデータを読み込む.データポインタを移動させる.
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 }
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 }
void putRingBuffer | ( | Buffer | buf, | |
int | input = LOG_RB_MESG , |
|||
int | kind = LOG_RB_UNKNOWN_DATA | |||
) |
void CLogRingBuffer::putRingBuffer(Buffer buf, int input, int kind)
バッファの最後にデータを追加する.
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 }
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 }
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 }
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 }
int indentSize [protected] |
Definition at line 77 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::init(), and CLogRingBuffer::rewriteBinHexRingBuffer().
int* inputSrc [protected] |
Definition at line 83 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::getRingBuffer(), CLogRingBuffer::init(), and CLogRingBuffer::putRingBuffer().
int* kindData [protected] |
Definition at line 82 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::getKindData(), CLogRingBuffer::init(), and CLogRingBuffer::putRingBuffer().
int maxBufSize [protected] |
Definition at line 72 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getKindData(), CLogRingBuffer::getLengthX(), CLogRingBuffer::getMaxBufSize(), CLogRingBuffer::getRingBuffer(), CLogRingBuffer::init(), CLogRingBuffer::putRingBuffer(), and CLogRingBuffer::rewriteBinHexRingBuffer().
int maxLineX [protected] |
Definition at line 75 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getMaxLineX(), CLogRingBuffer::init(), and CLogRingBuffer::putRingBuffer().
int maxLineY [protected] |
Definition at line 76 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getMaxLineY(), CLogRingBuffer::init(), and CLogRingBuffer::putRingBuffer().
Definition at line 69 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getLengthX(), CLogRingBuffer::getRingBuffer(), CLogRingBuffer::init(), CLogRingBuffer::putRingBuffer(), CLogRingBuffer::rewriteBinHexRingBuffer(), and CLogRingBuffer::~CLogRingBuffer().
int rPos [protected] |
Definition at line 79 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getRingBuffer(), and CLogRingBuffer::init().
int tlDataSize [protected] |
Definition at line 73 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getTotalSize(), CLogRingBuffer::init(), and CLogRingBuffer::putRingBuffer().
int wPos [protected] |
Definition at line 80 of file LogRingBuffer.h.
Referenced by CLogRingBuffer::clear(), CLogRingBuffer::getLastPosition(), CLogRingBuffer::init(), CLogRingBuffer::putRingBuffer(), and CLogRingBuffer::rewriteBinHexRingBuffer().