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