summaryrefslogtreecommitdiffstats
path: root/console/kaede.c
diff options
context:
space:
mode:
Diffstat (limited to 'console/kaede.c')
-rw-r--r--console/kaede.c165
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