00001
00002
00010 #include "LogRingBuffer.h"
00011
00012
00013 using namespace jbxl;
00014
00015
00016 CLogRingBuffer::~CLogRingBuffer(void)
00017 {
00018
00019
00020 if (pBuf!=NULL) del_Buffer_dim(&pBuf);
00021
00022
00023 }
00024
00025
00026
00027 int CLogRingBuffer::init(int size)
00028 {
00029 bool err_flag = false;
00030
00031 maxBufSize = tlDataSize = 0;
00032 maxLineX = maxLineY = 0;
00033 rPos = wPos = 0;
00034 indentSize = 13;
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 }
00069
00070
00071
00072 void CLogRingBuffer::clear()
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 }
00085
00086
00087
00098 void CLogRingBuffer::putRingBuffer(Buffer buf, int input, int kind)
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++;
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
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
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
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 }
00196
00197
00198
00205 void CLogRingBuffer::rewriteBinHexRingBuffer(int n, int input)
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 }
00220
00221
00222
00228 void CLogRingBuffer::putRingFormat(int input, char* fmt, ...)
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 }
00256
00257
00258
00265 void CLogRingBuffer::putRingFormat(int input, char* fmt, va_list args)
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 }
00288
00289
00290
00298 Buffer CLogRingBuffer::getRingBuffer(void)
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 }
00310
00311
00312
00320 Buffer CLogRingBuffer::getRingBuffer(int pos)
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 }
00334