# HG changeset patch # User Matti Hamalainen # Date 1289930825 -7200 # Node ID 4007b9ac7cde62ff61367940dc9aa1bd6bb7dfe6 # Parent df284de8b118ee52e091ba53d48ee719bb1d12e0 Handle usernames with whitespace by converting whitespaces to chr 255 in userhashes and internal buffers, and then back to 32 when outputting to screen/UI or sending to network. diff -r df284de8b118 -r 4007b9ac7cde nnchat.c --- a/nnchat.c Tue Nov 16 19:34:43 2010 +0200 +++ b/nnchat.c Tue Nov 16 20:07:05 2010 +0200 @@ -168,6 +168,24 @@ } } +char *encodeUsername(char *str) +{ + unsigned char *c = (unsigned char *) str; + if (str == NULL) return NULL; + for (; *c ; c++) + if (*c == ' ') *c = 255; + return str; +} + +char *decodeUsername(char *str) +{ + unsigned char *c = (unsigned char *) str; + if (str == NULL) return NULL; + for (; *c ; c++) + if (*c == 255) *c = ' '; + return str; +} + void updateStatus(BOOL insertMode) { char tmpStr[128]; @@ -209,9 +227,12 @@ void printEditBuf(const char *str, nn_editbuf_t *buf) { + char *tmp; if (statusWin == NULL || buf == NULL) return; buf->data[buf->len] = 0; + tmp = decodeUsername(th_strdup(buf->data)); + werase(editWin); wattrset(editWin, A_BOLD); @@ -220,18 +241,19 @@ wattrset(editWin, A_NORMAL); if (buf->pos < buf->len) { - waddnstr(editWin, buf->data, buf->pos); + waddnstr(editWin, tmp, buf->pos); wattrset(editWin, A_REVERSE); - waddch(editWin, buf->data[buf->pos]); + waddch(editWin, tmp[buf->pos]); wattrset(editWin, A_NORMAL); - waddnstr(editWin, buf->data + buf->pos + 1, buf->len - buf->pos - 1); + waddnstr(editWin, tmp + buf->pos + 1, buf->len - buf->pos - 1); } else { - waddnstr(editWin, buf->data, buf->len); + waddnstr(editWin, tmp, buf->len); wattrset(editWin, A_REVERSE); waddch(editWin, ' '); wattrset(editWin, A_NORMAL); } wrefresh(editWin); + th_free(tmp); } int printWin(WINDOW *win, const char *fmt) @@ -254,7 +276,7 @@ } if (*s != '˝') return -1; s++; - + if (val < 9) { col = A_DIM | COLOR_PAIR(val); } else if (val < 30) { @@ -262,6 +284,9 @@ } } } else { + if ((unsigned char) *s == 255) + waddch(win, ((unsigned char) ' ') | col); + else if (*s != '\r') waddch(win, ((unsigned char) *s) | col); s++; @@ -287,7 +312,10 @@ s++; } } else { - fputc((unsigned char) *s, outFile); + if ((unsigned char) *s == 255) + fputc(' ', outFile); + else + fputc((unsigned char) *s, outFile); s++; } } @@ -358,7 +386,6 @@ va_end(ap2); } - int handleUser(nn_conn_t *conn, const char *str) { const char *msg = "", *p = str; @@ -466,7 +493,7 @@ p = nn_dbldecode_str(str); if (!p) return -1; - nn_userhash_insert(nnUsers, p); + nn_userhash_insert(nnUsers, encodeUsername(p)); printMsg("! ˝3˝%s˝0˝ ˝2˝ADDED.˝0˝\n", p); th_free(p); @@ -486,7 +513,7 @@ p = nn_dbldecode_str(str); if (!p) return -1; - nn_userhash_delete(nnUsers, p); + nn_userhash_delete(nnUsers, encodeUsername(p)); printMsg("! ˝3˝%s˝0˝ ˝1˝DELETED.˝0˝\n", p); th_free(p); @@ -574,6 +601,7 @@ buf[bufLen--] = 0; while (bufLen > 0 && (buf[bufLen] == '\n' || buf[bufLen] == '\r' || th_isspace(buf[bufLen]))) buf[bufLen--] = 0; + decodeUsername(buf); /* Check for special user commands */ if (*buf == 0) { @@ -687,7 +715,7 @@ } /* Send double-encoded */ - tmpStr = nn_dblencode_str(buf); + tmpStr = nn_dblencode_str(decodeUsername(buf)); if (tmpStr == 0) return -2; result = nn_conn_send_msg(conn, optUserName2, "%s", tmpStr); th_free(tmpStr);