diff options
Diffstat (limited to 'console/kaede.c')
-rw-r--r-- | console/kaede.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/console/kaede.c b/console/kaede.c new file mode 100644 index 00000000..b3d9c0ae --- /dev/null +++ b/console/kaede.c @@ -0,0 +1,165 @@ +/* $Id$ */ +#include "bbs.h" + +// TODO move stuff to libbbs(or util)/string.c, ... +// this file can be removed (or not?) + +char * +Ptt_prints(char *str, size_t size, int mode) +{ + char *strbuf = alloca(size); + int r, w; + for( r = w = 0 ; str[r] != 0 && w < (size - 1) ; ++r ) + if( str[r] != ESC_CHR ) + strbuf[w++] = str[r]; + else{ + if( str[++r] != '*' ){ + if(w+2>=size-1) break; + strbuf[w++] = ESC_CHR; + strbuf[w++] = str[r]; + } + else{ + /* Note, w will increased by copied length after */ + switch( str[++r] ){ + + // secure content + + case 't': // current time + strlcpy(strbuf+w, Cdate(&now), size-w); + w += strlen(strbuf+w); + break; + case 'u': // current online users + w += snprintf(&strbuf[w], size - w, + "%d", SHM->UTMPnumber); + break; + + // insecure content + + case 's': // current user id + strlcpy(strbuf+w, cuser.userid, size-w); + w += strlen(strbuf+w); + break; + case 'n': // current user nickname + strlcpy(strbuf+w, cuser.nickname, size-w); + w += strlen(strbuf+w); + break; + case 'l': // current user logins + w += snprintf(&strbuf[w], size - w, + "%d", cuser.numlogins); + break; + case 'p': // current user posts + w += snprintf(&strbuf[w], size - w, + "%d", cuser.numposts); + break; + + /* It's saver not to send these undefined escape string. + default: + strbuf[w++] = ESC_CHR; + strbuf[w++] = '*'; + strbuf[w++] = str[r]; + */ + } + } + } + strbuf[w] = 0; + strip_ansi(str, strbuf, mode); + return str; +} + +// utility from screen.c +void +outs_n(const char *str, int n) +{ + while (*str && n--) { + outc(*str++); + } +} + +// XXX left-right (for large term) +// TODO someday please add ANSI detection version +void +outslr(const char *left, int leftlen, const char *right, int rightlen) +{ + if (left == NULL) + left = ""; + if (right == NULL) + right = ""; + if(*left && leftlen < 0) + leftlen = strlen(left); + if(*right && rightlen < 0) + rightlen = strlen(right); + // now calculate padding + rightlen = t_columns - leftlen - rightlen; + outs(left); + + // ignore right msg if we need to. + if(rightlen >= 0) + { + while(--rightlen > 0) + outc(' '); + outs(right); + } else { + rightlen = t_columns - leftlen; + while(--rightlen > 0) + outc(' '); + } +} + + +/* Jaky */ +void +out_lines(const char *str, int line) +{ + int y, x; + getyx(&y, &x); + while (*str && line) { + if (*str == '\n') + { + move(++y, 0); + line--; + } else + { + outc(*str); + } + str++; + } +} + +void +outmsg(const char *msg) +{ + move(b_lines - msg_occupied, 0); + clrtoeol(); + outs(msg); +} + +void +outmsglr(const char *msg, int llen, const char *rmsg, int rlen) +{ + move(b_lines - msg_occupied, 0); + clrtoeol(); + outslr(msg, llen, rmsg, rlen); + outs(ANSI_RESET ANSI_CLRTOEND); +} + +void +prints(const char *fmt,...) +{ + va_list args; + char buff[1024]; + + va_start(args, fmt); + vsnprintf(buff, sizeof(buff), fmt, args); + va_end(args); + outs(buff); +} + +void +mouts(int y, int x, const char *str) +{ + move(y, x); + clrtoeol(); + outs(str); +} + +// vim:ts=4 |