iInitial import in Git. - irc - Unnamed repository; edit this file 'description' to name the repository. Err vernunftzentrum.de 70 hgit clone git://vernunftzentrum.de/irc.git URL:git://vernunftzentrum.de/irc.git vernunftzentrum.de 70 1Log /ckeen/repos/irc/log.gph vernunftzentrum.de 70 1Files /ckeen/repos/irc/files.gph vernunftzentrum.de 70 1Refs /ckeen/repos/irc/refs.gph vernunftzentrum.de 70 1README /ckeen/repos/irc/file/README.gph vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1commit 9853570e09cd34fc5fd6a4a0c03055e5012920ec /ckeen/repos/irc/commit/9853570e09cd34fc5fd6a4a0c03055e5012920ec.gph vernunftzentrum.de 70 hAuthor: Quentin Carbonneaux URL:mailto:qcarbonneaux@gmail.com vernunftzentrum.de 70 iDate: Sat, 10 Mar 2012 13:23:07 +0100 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iInitial import in Git. Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iDiffstat: Err vernunftzentrum.de 70 i .comfile | 1 + Err vernunftzentrum.de 70 i .gitignore | 3 +++ Err vernunftzentrum.de 70 i irc.c | 520 +++++++++++++++++++++++++++++++ Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i3 files changed, 524 insertions(+), 0 deletions(-) Err vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1diff --git a/.comfile b/.comfile /ckeen/repos/irc/file/.comfile.gph vernunftzentrum.de 70 i@@ -0,0 +1 @@ Err vernunftzentrum.de 70 i+irc.c Err vernunftzentrum.de 70 1diff --git a/.gitignore b/.gitignore /ckeen/repos/irc/file/.gitignore.gph vernunftzentrum.de 70 i@@ -0,0 +1,2 @@ Err vernunftzentrum.de 70 i+irc Err vernunftzentrum.de 70 i+*.sw[po] Err vernunftzentrum.de 70 i+\ No newline at end of file Err vernunftzentrum.de 70 1diff --git a/irc.c b/irc.c /ckeen/repos/irc/file/irc.c.gph vernunftzentrum.de 70 i@@ -0,0 +1,520 @@ Err vernunftzentrum.de 70 i+/*% cc -g -Wall -lncurses -o # % Err vernunftzentrum.de 70 i+ */ Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+#define SCROLL 15 Err vernunftzentrum.de 70 i+#define DATEFMT "%T" Err vernunftzentrum.de 70 i+#define PFMT "%-12s < %s" Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+enum { ChanLen = 64, LineLen = 512, MaxChans = 16, BufSz = 2048, LogSz = 4096 }; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+char nick[64]; Err vernunftzentrum.de 70 i+char prefix[64]; Err vernunftzentrum.de 70 i+int quit; Err vernunftzentrum.de 70 i+int sfd; /* Server file descriptor. */ Err vernunftzentrum.de 70 i+struct { Err vernunftzentrum.de 70 i+ int x; Err vernunftzentrum.de 70 i+ int y; Err vernunftzentrum.de 70 i+ WINDOW *sw, *mw, *iw; Err vernunftzentrum.de 70 i+} scr; /* Screen relative data. */ Err vernunftzentrum.de 70 i+int eof; /* EOF reached on server side. */ Err vernunftzentrum.de 70 i+struct Chan { Err vernunftzentrum.de 70 i+ char name[ChanLen]; Err vernunftzentrum.de 70 i+ char *buf, *eol; Err vernunftzentrum.de 70 i+ size_t n, sz; /* n is the scoll offset, sz is size of buf. */ Err vernunftzentrum.de 70 i+} chl[MaxChans]; Err vernunftzentrum.de 70 i+int nch, ch; /* Current number of channels, and current channel. */ Err vernunftzentrum.de 70 i+char outb[BufSz], *outp=outb; /* Output buffer. */ Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void scmd(char *, char *, char *, char *); Err vernunftzentrum.de 70 i+static void tredraw(void); Err vernunftzentrum.de 70 i+static void treset(void); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+panic(const char *m) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ treset(); Err vernunftzentrum.de 70 i+ fprintf(stderr, "Panic: %s\n", m); Err vernunftzentrum.de 70 i+ exit(1); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+sndf(const char *fmt, ...) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ va_list vl; Err vernunftzentrum.de 70 i+ size_t n, l=BufSz-(outp-outb); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (l<2) return; Err vernunftzentrum.de 70 i+ va_start(vl, fmt); Err vernunftzentrum.de 70 i+ n=vsnprintf(outp, l-2, fmt, vl); Err vernunftzentrum.de 70 i+ va_end(vl); Err vernunftzentrum.de 70 i+ outp += n>l-2 ? l-2 : n; Err vernunftzentrum.de 70 i+ *outp++ = '\r'; Err vernunftzentrum.de 70 i+ *outp++ = '\n'; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static int Err vernunftzentrum.de 70 i+srd(void) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ static char l[BufSz], *p=l; Err vernunftzentrum.de 70 i+ char *s, *usr, *cmd, *par, *data; Err vernunftzentrum.de 70 i+ int rd; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (p-l>=BufSz) p=l; /* Input buffer overflow, there should something better to do. */ Err vernunftzentrum.de 70 i+ rd=read(sfd, p, BufSz-(p-l)); Err vernunftzentrum.de 70 i+ if (rd<0) { Err vernunftzentrum.de 70 i+ if (errno==EINTR) return 1; Err vernunftzentrum.de 70 i+ panic("IO error while reading."); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ if (rd==0) return 0; Err vernunftzentrum.de 70 i+ p+=rd; Err vernunftzentrum.de 70 i+ for (;;) { /* Cycle on all received lines. */ Err vernunftzentrum.de 70 i+ if (!(s=memchr(l, '\n', p-l))) Err vernunftzentrum.de 70 i+ return 1; Err vernunftzentrum.de 70 i+ if (s>l && s[-1]=='\r') Err vernunftzentrum.de 70 i+ s[-1]=0; Err vernunftzentrum.de 70 i+ *s++ = 0; Err vernunftzentrum.de 70 i+ if (*l==':') { Err vernunftzentrum.de 70 i+ if (!(cmd=strchr(l, ' '))) goto lskip; Err vernunftzentrum.de 70 i+ *cmd++ = 0; Err vernunftzentrum.de 70 i+ usr = l+1; Err vernunftzentrum.de 70 i+ } else { Err vernunftzentrum.de 70 i+ usr = 0; Err vernunftzentrum.de 70 i+ cmd = l; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ if (!(par=strchr(cmd, ' '))) goto lskip; Err vernunftzentrum.de 70 i+ *par++ = 0; Err vernunftzentrum.de 70 i+ if ((data=strchr(par, ':'))) Err vernunftzentrum.de 70 i+ *data++ = 0; Err vernunftzentrum.de 70 i+ scmd(usr, cmd, par, data); Err vernunftzentrum.de 70 i+ lskip: Err vernunftzentrum.de 70 i+ memmove(l, s, p-s); Err vernunftzentrum.de 70 i+ p-=s-l; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static int Err vernunftzentrum.de 70 i+dial(const char *host, short port) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ int f; Err vernunftzentrum.de 70 i+ struct sockaddr_in sin; Err vernunftzentrum.de 70 i+ struct addrinfo *ai, hai; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ hai.ai_family = AF_INET; Err vernunftzentrum.de 70 i+ hai.ai_socktype = SOCK_STREAM; Err vernunftzentrum.de 70 i+ hai.ai_flags = hai.ai_protocol = 0; Err vernunftzentrum.de 70 i+ if (getaddrinfo(host, 0, &hai, &ai)) Err vernunftzentrum.de 70 i+ panic("Cannot resolve host."); Err vernunftzentrum.de 70 i+ memcpy(&sin, ai->ai_addr, sizeof sin); Err vernunftzentrum.de 70 i+ sin.sin_port = htons(port); Err vernunftzentrum.de 70 i+ freeaddrinfo(ai); Err vernunftzentrum.de 70 i+ f = socket(AF_INET, SOCK_STREAM, 0); Err vernunftzentrum.de 70 i+ if (f<0) Err vernunftzentrum.de 70 i+ panic("Cannot create socket."); Err vernunftzentrum.de 70 i+ if (connect(f, (struct sockaddr *)&sin, sizeof sin)<0) Err vernunftzentrum.de 70 i+ panic("Cannot connect to host."); Err vernunftzentrum.de 70 i+ return f; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static int Err vernunftzentrum.de 70 i+chadd(char *name) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ if (nch>=MaxChans || strlen(name)>=ChanLen) Err vernunftzentrum.de 70 i+ return -1; Err vernunftzentrum.de 70 i+ strcpy(chl[nch].name, name); Err vernunftzentrum.de 70 i+ chl[nch].sz=LogSz; Err vernunftzentrum.de 70 i+ chl[nch].buf=malloc(LogSz); Err vernunftzentrum.de 70 i+ if (!chl[nch].buf) Err vernunftzentrum.de 70 i+ panic("Out of memory."); Err vernunftzentrum.de 70 i+ chl[nch].eol=chl[nch].buf; Err vernunftzentrum.de 70 i+ chl[nch].n=0; Err vernunftzentrum.de 70 i+ ch=nch; Err vernunftzentrum.de 70 i+ return nch++; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static inline int Err vernunftzentrum.de 70 i+chfind(char *name) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ int i; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ assert(name); Err vernunftzentrum.de 70 i+ for (i=nch-1; i>0; i--) Err vernunftzentrum.de 70 i+ if (!strcmp(chl[i].name, name)) Err vernunftzentrum.de 70 i+ break; Err vernunftzentrum.de 70 i+ return i; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static int Err vernunftzentrum.de 70 i+chdel(char *name) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ int n; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (!(n=chfind(name))) return 0; Err vernunftzentrum.de 70 i+ nch--; Err vernunftzentrum.de 70 i+ free(chl[n].buf); Err vernunftzentrum.de 70 i+ memmove(&chl[n], &chl[n+1], (nch-n)*sizeof(struct Chan)); Err vernunftzentrum.de 70 i+ ch=nch-1; Err vernunftzentrum.de 70 i+ return 1; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+pushm(int cn, char *msg) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ struct Chan * const c=&chl[cn]; Err vernunftzentrum.de 70 i+ size_t blen=c->eol-c->buf, l=strlen(msg); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (blen+l>=c->sz) { Err vernunftzentrum.de 70 i+ do Err vernunftzentrum.de 70 i+ c->sz *= 2; Err vernunftzentrum.de 70 i+ while (blen+l>=c->sz); Err vernunftzentrum.de 70 i+ c->buf=realloc(c->buf, c->sz); Err vernunftzentrum.de 70 i+ if (!c->buf) panic("Out of memory."); Err vernunftzentrum.de 70 i+ c->eol = c->buf+blen; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ strcpy(c->eol, msg); Err vernunftzentrum.de 70 i+ c->eol+=l; Err vernunftzentrum.de 70 i+ if (cn==ch && c->n==0) /* Redraw if the current channel was modified. */ Err vernunftzentrum.de 70 i+ tredraw(); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+pushf(int cn, const char *fmt, ...) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ //struct Chan *const c=&chl[cn]; Err vernunftzentrum.de 70 i+ char lb[512]; Err vernunftzentrum.de 70 i+ size_t n; Err vernunftzentrum.de 70 i+ time_t t; Err vernunftzentrum.de 70 i+ struct tm *tm; Err vernunftzentrum.de 70 i+ va_list vl; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ t=time(0); Err vernunftzentrum.de 70 i+ tm=localtime(&t); Err vernunftzentrum.de 70 i+ if (!tm) Err vernunftzentrum.de 70 i+ panic("localtime failed."); Err vernunftzentrum.de 70 i+ n=strftime(lb, sizeof lb, DATEFMT, tm); Err vernunftzentrum.de 70 i+ lb[n]=' '; Err vernunftzentrum.de 70 i+ if (!n) Err vernunftzentrum.de 70 i+ panic("strftime failed."); Err vernunftzentrum.de 70 i+ va_start(vl, fmt); Err vernunftzentrum.de 70 i+ n+=vsnprintf(lb+n+1, sizeof lb-n-3, fmt, vl); Err vernunftzentrum.de 70 i+ va_end(vl); Err vernunftzentrum.de 70 i+ strcat(lb, "\n"); Err vernunftzentrum.de 70 i+ pushm(cn, lb); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+scmd(char *usr, char *cmd, char *par, char *data) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ int s; Err vernunftzentrum.de 70 i+ char *pm=strtok(par, " "); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (!usr) usr="?"; Err vernunftzentrum.de 70 i+ else { Err vernunftzentrum.de 70 i+ char *bang=strchr(usr, '!'); Err vernunftzentrum.de 70 i+ if (bang) Err vernunftzentrum.de 70 i+ *bang=0; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ if (!strcmp(cmd, "PRIVMSG")) { Err vernunftzentrum.de 70 i+ if (!pm || !data) return; Err vernunftzentrum.de 70 i+ pushf(chfind(pm), PFMT, usr, data); Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "PING")) { Err vernunftzentrum.de 70 i+ sndf("PONG :%s", data?data:"(null)"); Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "PART")) { Err vernunftzentrum.de 70 i+ if (!pm) return; Err vernunftzentrum.de 70 i+ pushf(chfind(pm), "-!- %s has left %s", usr, pm); Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "JOIN")) { Err vernunftzentrum.de 70 i+ if (!pm) return; Err vernunftzentrum.de 70 i+ pushf(chfind(pm), "-!- %s has joined %s", usr, pm); Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "470")) { /* Channel forwarding. */ Err vernunftzentrum.de 70 i+ char *ch=strtok(0, " "), *fch=strtok(0, " "); Err vernunftzentrum.de 70 i+ if (!ch || !fch || !(s=chfind(ch))) return; Err vernunftzentrum.de 70 i+ chl[s].name[0] = 0; Err vernunftzentrum.de 70 i+ strncat(chl[s].name, fch, ChanLen-1); Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "471") || !strcmp(cmd, "473") Err vernunftzentrum.de 70 i+ || !strcmp(cmd, "474") || !strcmp(cmd, "475")) { /* Join error. */ Err vernunftzentrum.de 70 i+ if ((pm=strtok(0, " "))) { Err vernunftzentrum.de 70 i+ chdel(pm); Err vernunftzentrum.de 70 i+ pushf(0, "-!- Cannot join channel %s (%s)", pm, cmd); Err vernunftzentrum.de 70 i+ tredraw(); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ } else if (!strcmp(cmd, "QUIT")) { /* Commands we don't care about. */ Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ } else Err vernunftzentrum.de 70 i+ pushf(0, "%s - %s %s", cmd, par, data?data:"(null)"); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+uparse(char *m) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ char *p=m; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (p[1]!=' ' && p[1]!=0) { Err vernunftzentrum.de 70 i+ pmsg: Err vernunftzentrum.de 70 i+ if (ch!=0) { Err vernunftzentrum.de 70 i+ m+=strspn(m, " "); Err vernunftzentrum.de 70 i+ if (!*m) return; Err vernunftzentrum.de 70 i+ pushf(ch, PFMT, nick, m); Err vernunftzentrum.de 70 i+ sndf("PRIVMSG %s :%s", chl[ch].name, m); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ switch (*p) { Err vernunftzentrum.de 70 i+ case 'j': /* Join channels. */ Err vernunftzentrum.de 70 i+ p+=1+(p[1]==' '); Err vernunftzentrum.de 70 i+ p=strtok(p, " "); Err vernunftzentrum.de 70 i+ while (p) { Err vernunftzentrum.de 70 i+ if (chadd(p)<0) break; Err vernunftzentrum.de 70 i+ sndf("JOIN %s", p); Err vernunftzentrum.de 70 i+ p=strtok(0, " "); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ tredraw(); Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ case 'l': /* Leave channels. */ Err vernunftzentrum.de 70 i+ p+=1+(p[1]==' '); Err vernunftzentrum.de 70 i+ if (!*p) { Err vernunftzentrum.de 70 i+ if (ch==0) return; /* Cannot leave server window. */ Err vernunftzentrum.de 70 i+ strcat(p, chl[ch].name); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ p=strtok(p, " "); Err vernunftzentrum.de 70 i+ while (p) { Err vernunftzentrum.de 70 i+ if (chdel(p)) Err vernunftzentrum.de 70 i+ sndf("PART %s", p); Err vernunftzentrum.de 70 i+ p=strtok(0, " "); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ tredraw(); Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ case 'm': /* Private message. */ Err vernunftzentrum.de 70 i+ m=p+1+(p[1]==' '); Err vernunftzentrum.de 70 i+ if (!(p=strchr(m, ' '))) return; Err vernunftzentrum.de 70 i+ *p++ = 0; Err vernunftzentrum.de 70 i+ sndf("PRIVMSG %s :%s", m, p); Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ case 'r': /* Send raw. */ Err vernunftzentrum.de 70 i+ sndf("%s", m); Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ case 'q': /* Quit. */ Err vernunftzentrum.de 70 i+ quit=1; Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ default: /* Send on current channel. */ Err vernunftzentrum.de 70 i+ goto pmsg; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+tinit(void) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ setlocale(LC_ALL, ""); Err vernunftzentrum.de 70 i+ initscr(); Err vernunftzentrum.de 70 i+ raw(); Err vernunftzentrum.de 70 i+ noecho(); Err vernunftzentrum.de 70 i+ getmaxyx(stdscr, scr.y, scr.x); Err vernunftzentrum.de 70 i+ if (scr.y<4) panic("Screen too small."); Err vernunftzentrum.de 70 i+ if ((scr.sw=newwin(1, scr.x, 0, 0))==0 Err vernunftzentrum.de 70 i+ || (scr.mw=newwin(scr.y-2, scr.x, 1, 0))==0 Err vernunftzentrum.de 70 i+ || (scr.iw=newwin(1, scr.x, scr.y-1, 0))==0) Err vernunftzentrum.de 70 i+ panic("Cannot create windows."); Err vernunftzentrum.de 70 i+ keypad(scr.iw, 1); Err vernunftzentrum.de 70 i+ if (has_colors()==TRUE) { Err vernunftzentrum.de 70 i+ start_color(); Err vernunftzentrum.de 70 i+ init_pair(1, COLOR_WHITE, COLOR_BLUE); Err vernunftzentrum.de 70 i+ wbkgd(scr.sw, COLOR_PAIR(1)); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i+tredraw(void) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ struct Chan * const c=&chl[ch]; Err vernunftzentrum.de 70 i+ char *q, *p; Err vernunftzentrum.de 70 i+ int llen=0, nl=0; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (c->eol==c->buf) { Err vernunftzentrum.de 70 i+ wclear(scr.mw); Err vernunftzentrum.de 70 i+ wrefresh(scr.mw); Err vernunftzentrum.de 70 i+ return; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ p=c->eol-1; Err vernunftzentrum.de 70 i+ if (c->n) { Err vernunftzentrum.de 70 i+ int i=c->n; Err vernunftzentrum.de 70 i+ for (; p>c->buf; p--) Err vernunftzentrum.de 70 i+ if (*p=='\n' && !i--) break; Err vernunftzentrum.de 70 i+ if (p==c->buf) c->n-=i; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ q=p; Err vernunftzentrum.de 70 i+ while (nlc->buf) Err vernunftzentrum.de 70 i+ q--, llen++; Err vernunftzentrum.de 70 i+ nl += 1+llen/scr.x; Err vernunftzentrum.de 70 i+ if (q==c->buf) break; Err vernunftzentrum.de 70 i+ q--; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ if (q!=c->buf) q+=2; Err vernunftzentrum.de 70 i+ for (llen=0; nl>scr.y-2; ) { /* Maybe we must split the top line. */ Err vernunftzentrum.de 70 i+ if (q[llen]=='\n' || llen>=scr.x) { Err vernunftzentrum.de 70 i+ q+=llen+(q[llen]=='\n'); Err vernunftzentrum.de 70 i+ llen=0; Err vernunftzentrum.de 70 i+ nl--; Err vernunftzentrum.de 70 i+ } else llen++; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ wclear(scr.mw); Err vernunftzentrum.de 70 i+ wmove(scr.mw, 0, 0); Err vernunftzentrum.de 70 i+ for (; qCHAR_MAX || len>=BufSz) return; /* Skip other curses codes. */ Err vernunftzentrum.de 70 i+ memmove(&lb[cu+1], &lb[cu], len-cu); Err vernunftzentrum.de 70 i+ dirty=cu; Err vernunftzentrum.de 70 i+ len++; Err vernunftzentrum.de 70 i+ lb[cu++]=c; Err vernunftzentrum.de 70 i+ break; Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ /* TODO, add a cleverer printer to deal with long lines. */ Err vernunftzentrum.de 70 i+ if (dirty<=len) { Err vernunftzentrum.de 70 i+ wmove(scr.iw, 0, strlen(nick)+2+dirty); Err vernunftzentrum.de 70 i+ wclrtoeol(scr.iw); Err vernunftzentrum.de 70 i+ for (i=dirty; i