int atr_failsafe(ring *r, mtype lm, const char *lt, const char *ltag) { int e=0; if((e=add_to_ring(r, lm, lt, ltag))) { fprintf(stderr, "atr[%d]: %s%s\n", e, ltag, lt); } return(e); }
/** * e_debug_logv: * * Since: 2.32 **/ void e_debug_logv (gboolean is_milestone, const gchar *domain, const gchar *format, va_list args) { gchar *str; gchar *debug_str; struct timeval tv; struct tm tm; lock (); if (!(is_milestone || is_domain_enabled (domain))) goto out; str = g_strdup_vprintf (format, args); gettimeofday (&tv, NULL); tm = *localtime (&tv.tv_sec); debug_str = g_strdup_printf ( "%p;%04d/%02d/%02d;%02d:%02d:%02d.%04d;(%s);%s", g_thread_self (), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (gint) (tv.tv_usec / 100), domain, str); g_free (str); add_to_ring (debug_str); if (is_milestone) add_to_milestones (debug_str); out: unlock (); }
int init_buffer(int buf, btype type, const char *bname, int nlines) { bufs[buf].type=type; bufs[buf].bname=strdup(bname); if(type==SERVER) bufs[buf].serverloc=strdup(bname); else bufs[buf].serverloc=NULL; bufs[buf].realsname=NULL; bufs[buf].nlist=NULL; bufs[buf].us=NULL; bufs[buf].ilist=NULL; bufs[buf].handle=0; bufs[buf].server=0; bufs[buf].nick=NULL; bufs[buf].topic=NULL; bufs[buf].logf=NULL; bufs[buf].nlines=nlines; bufs[buf].ptr=0; bufs[buf].scroll=0; bufs[buf].ascroll=0; bufs[buf].lm=malloc(nlines*sizeof(mtype)); bufs[buf].lq=malloc(nlines*sizeof(prio)); bufs[buf].lp=malloc(nlines); bufs[buf].ls=malloc(nlines*sizeof(bool)); bufs[buf].lt=malloc(nlines*sizeof(char *)); int i; for(i=0;i<bufs[buf].nlines;i++) { bufs[buf].lt[i]=NULL; } bufs[buf].ltag=malloc(nlines*sizeof(char *)); for(i=0;i<bufs[buf].nlines;i++) { bufs[buf].ltag[i]=NULL; } bufs[buf].lpl=malloc(nlines*sizeof(int)); bufs[buf].lpc=malloc(nlines*sizeof(colour)); bufs[buf].lpt=malloc(nlines*sizeof(char **)); for(i=0;i<nlines;i++) { bufs[buf].lpl[i]=0; bufs[buf].lpc[i]=(colour){.fore=7, .back=0, .hi=false, .ul=false}; bufs[buf].lpt[i]=NULL; } bufs[buf].dirty=false; bufs[buf].ts=malloc(nlines*sizeof(time_t)); bufs[buf].filled=false; bufs[buf].alert=false; bufs[buf].hi_alert=0; bufs[buf].ping=0; bufs[buf].last=time(NULL); bufs[buf].namreply=false; bufs[buf].live=false; bufs[buf].conninpr=false; initibuf(&bufs[buf].input); bufs[buf].casemapping=RFC1459; if(type==SERVER) { bufs[buf].npfx=2; bufs[buf].prefixes=malloc(2*sizeof(prefix)); bufs[buf].prefixes[0]=(prefix){.letter='o', .pfx='@'}; bufs[buf].prefixes[1]=(prefix){.letter='v', .pfx='+'}; } else { bufs[buf].npfx=0; bufs[buf].prefixes=NULL; } bufs[buf].autoent=NULL; bufs[buf].conf=conf; bufs[buf].key=NULL; bufs[buf].lastkey=NULL; return(0); } int free_buffer(int buf) { if(bufs[buf].live) { add_to_buffer(buf, ERR, NORMAL, 0, false, "Buffer is still live!", "free_buffer:"); return(1); } else { free(bufs[buf].bname); free(bufs[buf].serverloc); free(bufs[buf].realsname); n_free(bufs[buf].nlist); bufs[buf].nlist=NULL; n_free(bufs[buf].ilist); bufs[buf].ilist=NULL; free(bufs[buf].nick); free(bufs[buf].topic); if(bufs[buf].logf) fclose(bufs[buf].logf); free(bufs[buf].lm); free(bufs[buf].lq); free(bufs[buf].lp); free(bufs[buf].ls); int l; if(bufs[buf].lt) { for(l=0;l<bufs[buf].nlines;l++) free(bufs[buf].lt[l]); free(bufs[buf].lt); } if(bufs[buf].ltag) { for(l=0;l<bufs[buf].nlines;l++) free(bufs[buf].ltag[l]); free(bufs[buf].ltag); } if(bufs[buf].lpt) { for(l=0;l<bufs[buf].nlines;l++) { if(bufs[buf].lpt[l]) { if(bufs[buf].lpl) { int p; for(p=0;p<bufs[buf].lpl[l];p++) { free(bufs[buf].lpt[l][p]); } } free(bufs[buf].lpt[l]); } } free(bufs[buf].lpt); } free(bufs[buf].lpl); free(bufs[buf].lpc); free(bufs[buf].ts); freeibuf(&bufs[buf].input); free(bufs[buf].prefixes); free(bufs[buf].key); free(bufs[buf].lastkey); if(cbuf>=buf) cbuf--; nbufs--; int b; for(b=buf;b<nbufs;b++) { bufs[b]=bufs[b+1]; } for(b=0;b<nbufs;b++) { if(bufs[b].server==buf) { bufs[b].server=0; // orphaned; should not happen bufs[b].live=false; bufs[b].handle=0; // just in case } else if(bufs[b].server>buf) { bufs[b].server--; } } if(nbufs) redraw_buffer(); return(0); } } int add_to_buffer(int buf, mtype lm, prio lq, char lp, bool ls, const char *lt, const char *ltag) { if(buf>=nbufs) { if(bufs&&buf) { add_to_buffer(0, ERR, NORMAL, 0, false, "Line was written to bad buffer! Contents below.", "add_to_buffer(): "); add_to_buffer(0, lm, NORMAL, lp, ls, lt, ltag); } return(1); } if(!debug&&(lq==DEBUG)) { if(!d_buf.nlines) { init_ring(&d_buf); d_buf.loop=true; } return(add_to_ring(&d_buf, lm, lt, ltag)); } int optr=bufs[buf].ptr; bool scrollisptr=(bufs[buf].scroll==bufs[buf].ptr)&&(bufs[buf].ascroll==0); bufs[buf].lm[bufs[buf].ptr]=lm; bufs[buf].lq[bufs[buf].ptr]=lq; bufs[buf].lp[bufs[buf].ptr]=lp; bufs[buf].ls[bufs[buf].ptr]=ls; free(bufs[buf].lt[bufs[buf].ptr]); bufs[buf].lt[bufs[buf].ptr]=strdup(lt); free(bufs[buf].ltag[bufs[buf].ptr]); bufs[buf].ltag[bufs[buf].ptr]=strdup(ltag); time_t ts=bufs[buf].ts[bufs[buf].ptr]=time(NULL); bufs[buf].ptr=(bufs[buf].ptr+1)%bufs[buf].nlines; if(scrollisptr) { bufs[buf].scroll=bufs[buf].ptr; bufs[buf].ascroll=0; } if(bufs[buf].ptr==0) bufs[buf].filled=true; render_line(buf, optr); if(buf==cbuf) { int e=redraw_buffer(); if(e) return(e); } else { if(!( (bufs[buf].conf&&((lm==JOIN)||(lm==PART)||(lm==NICK)||(lm==MODE)||(lm==QUIT))) || (quiet&&(lq==QUIET)) || (!debug&&(lq==DEBUG)) )) bufs[buf].alert=true; } if(bufs[buf].logf) { int e=log_add(bufs[buf].logf, bufs[buf].logt, lm, lq, lp, ls, lt, ltag, ts); if(e) return(e); } return(0); } int redraw_buffer(void) { if(bufs[cbuf].dirty) { int e=render_buffer(cbuf); if(e) return(e); if(bufs[cbuf].dirty) return(1); } int uline=bufs[cbuf].scroll; int pline=bufs[cbuf].ascroll; while(pline<0) { uline--; if((bufs[cbuf].filled)&&(uline==bufs[cbuf].ptr)) { uline++; pline=0; break; } if(uline<0) { if(bufs[cbuf].filled) uline+=bufs[cbuf].nlines; else { uline=0; pline=0; break; } } pline+=bufs[cbuf].lpl[uline]; } if(uline==bufs[cbuf].ptr) { pline=0; } while(pline>=bufs[cbuf].lpl[uline]) { pline-=bufs[cbuf].lpl[uline]; if(bufs[cbuf].filled) { if(uline==bufs[cbuf].ptr) { pline=0; break; } uline=(uline+1)%bufs[cbuf].nlines; } else { if(uline>=bufs[cbuf].ptr) { uline=bufs[cbuf].ptr; pline=0; break; } uline++; } } bufs[cbuf].scroll=uline; bufs[cbuf].ascroll=pline; int row=height-2; //setcolour(bufs[cbuf].lpc[uline]); while(row>(tsb?1:0)) { bool breakit=false; pline--; while(pline<0) { uline--; if(uline<0) { if(bufs[cbuf].filled) uline+=bufs[cbuf].nlines; else { breakit=true; pline=0; break; } } if(uline==bufs[cbuf].ptr) { breakit=true; break; } pline+=bufs[cbuf].lpl[uline]; } if(breakit) break; locate(row, 0); fputs(bufs[cbuf].lpt[uline][pline], stdout); if(!full_width_colour) resetcol(); clr(); row--; } resetcol(); while(row>(tsb?1:0)) { locate(row--, 0); clr(); } switch(bufs[cbuf].type) { case STATUS: settitle("quIRC - status"); break; case SERVER: // have to scope it for the cstr 'variably modified type' { char cstr[16+strlen(bufs[cbuf].bname)]; sprintf(cstr, "quIRC - %s", bufs[cbuf].bname); settitle(cstr); } break; case CHANNEL: // have to scope it for the cstr 'variably modified type' { char cstr[16+strlen(bufs[cbuf].bname)+strlen(SERVER(cbuf).bname)]; sprintf(cstr, "quIRC - %s on %s", bufs[cbuf].bname, SERVER(cbuf).bname); settitle(cstr); } break; case PRIVATE: // have to scope it for the cstr 'variably modified type' { char cstr[16+strlen(bufs[cbuf].bname)+strlen(SERVER(cbuf).bname)]; sprintf(cstr, "quIRC - <%s> on %s", bufs[cbuf].bname, SERVER(cbuf).bname); settitle(cstr); } break; default: settitle("quIRC"); break; } if(tsb) titlebar(); bufs[cbuf].alert=false; return(0); } int mark_buffer_dirty(int buf) { bufs[buf].dirty=true; return(0); }