#include <errno.h>
#include <stdarg.h>
#include "citadel.h"
+#include "citadel_ipc.h"
#include "commands.h"
#include "messages.h"
#include "citadel_decls.h"
int rc_force_mail_prompts;
int rc_remember_passwords;
int rc_ansi_color;
-int num_urls = 0;
+int rc_color_use_bg;
int rc_prompt_control = 0;
-char urls[MAXURLS][SIZ];
+time_t rc_idle_threshold = (time_t)900;
char rc_url_cmd[SIZ];
+char rc_gotmail_cmd[SIZ];
char *gl_string;
int next_lazy_cmd = 5;
int lines_printed = 0; /* line count for paginator */
extern int screenwidth, screenheight;
extern int termn8;
+extern CtdlIPC *ipc_for_signal_handlers; /* KLUDGE cover your eyes */
struct citcmd *cmdlist = NULL;
/* these variables are local to this module */
char keepalives_enabled = KA_YES; /* send NOOPs to server when idle */
-int ok_to_interrupt = 0; /* print express msgs asynchronously */
+int ok_to_interrupt = 0; /* print instant msgs asynchronously */
time_t AnsiDetect; /* when did we send the detect code? */
int enable_color = 0; /* nonzero for ANSI color */
/*
* Check to see if we need to pause at the end of a screen.
- * If we do, we have to disable server keepalives during the pause because
+ * If we do, we have to switch to half keepalives during the pause because
* we are probably in the middle of a server operation and the NOOP command
* would confuse everything.
*/
-int checkpagin(int lp, int pagin, int height)
+int checkpagin(int lp, unsigned int pagin, unsigned int height)
{
int thekey;
if (!pagin) return(0);
if (lp>=(height-1)) {
- set_keepalives(KA_NO);
- hit_any_key();
+ set_keepalives(KA_HALF);
+ hit_any_key(ipc_for_signal_handlers); /* Cheating -IO */
set_keepalives(KA_YES);
return(0);
}
/*
- * print_express() - print express messages if there are any
+ * print_instant() - print instant messages if there are any
*/
-void print_express(void)
+void print_instant(void)
{
char buf[1024];
FILE *outpipe;
time_t timestamp;
- struct tm *stamp;
+ struct tm stamp;
int flags = 0;
char sender[64];
char node[64];
+ char *listing = NULL;
+ int r; /* IPC result code */
- if (express_msgs == 0)
+ if (instant_msgs == 0)
return;
if (rc_exp_beep) {
- scr_putc(7);
+ ctdl_beep();
}
if (strlen(rc_exp_cmd) == 0) {
color(BRIGHT_RED);
scr_printf("\r---");
}
- while (express_msgs != 0) {
- serv_puts("GEXP");
- serv_gets(buf);
- if (buf[0] != '1')
+ while (instant_msgs != 0) {
+ r = CtdlIPCGetInstantMessage(ipc_for_signal_handlers, &listing, buf);
+ if (r / 100 != 1)
return;
- express_msgs = extract_int(&buf[4], 0);
- timestamp = extract_long(&buf[4], 1);
- flags = extract_int(&buf[4], 2);
- extract(sender, &buf[4], 3);
- extract(node, &buf[4], 4);
+ instant_msgs = extract_int(buf, 0);
+ timestamp = extract_long(buf, 1);
+ flags = extract_int(buf, 2);
+ extract_token(sender, buf, 3, '|', sizeof sender);
+ extract_token(node, buf, 4, '|', sizeof node);
strcpy(last_paged, sender);
- stamp = localtime(×tamp);
+ localtime_r(×tamp, &stamp);
/* If the page is a Logoff Request, honor it. */
if (flags & 2) {
else
fprintf(outpipe, "Message ");
/* Timestamp. Can this be improved? */
- if (stamp->tm_hour == 0 || stamp->tm_hour == 12)
+ if (stamp.tm_hour == 0 || stamp.tm_hour == 12)
fprintf(outpipe, "at 12:%02d%cm",
- stamp->tm_min,
- stamp->tm_hour ? 'p' : 'a');
- else if (stamp->tm_hour > 12) /* pm */
+ stamp.tm_min,
+ stamp.tm_hour ? 'p' : 'a');
+ else if (stamp.tm_hour > 12) /* pm */
fprintf(outpipe, "at %d:%02dpm",
- stamp->tm_hour - 12,
- stamp->tm_min);
+ stamp.tm_hour - 12,
+ stamp.tm_min);
else /* am */
fprintf(outpipe, "at %d:%02dam",
- stamp->tm_hour, stamp->tm_min);
+ stamp.tm_hour, stamp.tm_min);
fprintf(outpipe, " from %s", sender);
- if (strncmp(serv_info.serv_nodename, node, 32))
+ if (strncmp(ipc_for_signal_handlers->ServInfo.nodename, node, 32))
fprintf(outpipe, " @%s", node);
- fprintf(outpipe, ":\n");
- while (serv_gets(buf), strcmp(buf, "000")) {
- fprintf(outpipe, "%s\n", buf);
- }
+ fprintf(outpipe, ":\n%s\n", listing);
pclose(outpipe);
- if (express_msgs == 0)
+ if (instant_msgs == 0)
return;
continue;
}
}
- /* fall back to built-in express message display */
+ /* fall back to built-in instant message display */
scr_printf("\n");
lines_printed++;
scr_printf("Message ");
/* Timestamp. Can this be improved? */
- if (stamp->tm_hour == 0 || stamp->tm_hour == 12)/* 12am/12pm */
- scr_printf("at 12:%02d%cm", stamp->tm_min,
- stamp->tm_hour ? 'p' : 'a');
- else if (stamp->tm_hour > 12) /* pm */
+ if (stamp.tm_hour == 0 || stamp.tm_hour == 12)/* 12am/12pm */
+ scr_printf("at 12:%02d%cm", stamp.tm_min,
+ stamp.tm_hour ? 'p' : 'a');
+ else if (stamp.tm_hour > 12) /* pm */
scr_printf("at %d:%02dpm",
- stamp->tm_hour - 12, stamp->tm_min);
+ stamp.tm_hour - 12, stamp.tm_min);
else /* am */
- scr_printf("at %d:%02dam", stamp->tm_hour, stamp->tm_min);
+ scr_printf("at %d:%02dam", stamp.tm_hour, stamp.tm_min);
/* Sender */
scr_printf(" from %s", sender);
/* Remote node, if any */
- if (strncmp(serv_info.serv_nodename, node, 32))
+ if (strncmp(ipc_for_signal_handlers->ServInfo.nodename, node, 32))
scr_printf(" @%s", node);
scr_printf(":\n");
lines_printed++;
- fmout(screenwidth, NULL, NULL, 1, screenheight, -1, 0);
+ fmout(screenwidth, NULL, listing, NULL, 1, screenheight, -1, 0);
+ free(listing);
/* when running in curses mode, the scroll bar in most
xterm-style programs becomes useless, so it makes sense to
static time_t idlet = 0;
static void really_do_keepalive(void) {
- char buf[1024];
+ int r; /* IPC response code */
time(&idlet);
+
+ /* This may sometimes get called before we are actually connected
+ * to the server. Don't do anything if we aren't connected. -IO
+ */
+ if (!ipc_for_signal_handlers)
+ return;
+
+ /* If full keepalives are enabled, send a NOOP to the server and
+ * wait for a response.
+ */
if (keepalives_enabled == KA_YES) {
- serv_puts("NOOP");
- serv_gets(buf);
- if (buf[3] == '*') {
- express_msgs = 1;
+ r = CtdlIPCNoop(ipc_for_signal_handlers);
+ if (instant_msgs > 0) {
if (ok_to_interrupt == 1) {
scr_printf("\r%64s\r", "");
- print_express();
+ print_instant();
scr_printf("%s%c ", room_name,
room_prompt(room_flags));
scr_flush();
}
}
}
+
+ /* If half keepalives are enabled, send a QNOP to the server (if the
+ * server supports it) and then do nothing.
+ */
+ if ( (keepalives_enabled == KA_HALF)
+ && (ipc_for_signal_handlers->ServInfo.supports_qnop > 0) ) {
+ CtdlIPC_chat_send(ipc_for_signal_handlers, "QNOP");
+ }
}
/* threaded nonblocking keepalive stuff starts here. I'm going for a simple
* necessary and then waits again.
*/
do {
+ scr_set_windowsize(ipc_for_signal_handlers);
do_keepalive();
+ scr_set_windowsize(ipc_for_signal_handlers);
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* At this point, there's input, so fetch it.
* (There's a hole in the bucket...)
*/
- a = scr_getc();
+ a = scr_getc(SCR_BLOCK);
if (a == 127)
a = 8;
if (a > 126)
a = 0;
if (a == 13)
a = 10;
- if (((a != 4) && (a != 10) && (a != 8) && (a != NEXT_KEY) && (a != STOP_KEY))
+ if (((a != 23) && (a != 4) && (a != 10) && (a != 8) && (a != NEXT_KEY) && (a != STOP_KEY))
&& ((a < 32) || (a > 126)))
a = 0;
+
+#ifndef DISABLE_CURSES
+#if defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H)
+ if (a == ERR) {
+ logoff(NULL, 3);
+ }
+#endif
+#endif
+
} while (a == 0);
return (a);
}
async_ka_start();
GLA:a = inkey();
a = (a & 127);
- if ((a == 8) && (strlen(string) == 0))
+ if ((a == 8 || a == 23) && (strlen(string) == 0))
goto GLA;
if ((a != 10) && (a != 8) && (strlen(string) == lim))
goto GLA;
if ((a == 8) && (string[0] != 0)) {
string[strlen(string) - 1] = 0;
- scr_putc(8);
- scr_putc(32);
- scr_putc(8);
+ scr_putc(8); scr_putc(32); scr_putc(8);
+ goto GLA;
+ }
+ if ((a == 23) && (string[0] != 0)) {
+ do {
+ string[strlen(string) - 1] = 0;
+ scr_putc(8); scr_putc(32); scr_putc(8);
+ } while (strlen(string) && string[strlen(string) - 1] != ' ');
goto GLA;
}
if ((a == 10)) {
int i;
char buf[128];
- print_express();
+ print_instant();
color(DIM_WHITE);
scr_printf("%s ", prompt);
color(DIM_MAGENTA);
color(DIM_WHITE);
scr_printf("%s ", prompt);
color(DIM_MAGENTA);
- scr_printf(" [");
+ scr_printf("[");
color(BRIGHT_MAGENTA);
scr_printf("%s", (prev_val ? "Yes" : "No"));
color(DIM_MAGENTA);
{
FILE *ccfile;
char buf[1024];
+ char editor_key[100];
struct citcmd *cptr;
struct citcmd *lastcmd = NULL;
int a, d;
int b = 0;
+ int i;
/* first, set up some defaults for non-required variables */
- strcpy(editor_path, "");
+ for (i = 0; i < MAX_EDITORS; i++)
+ strcpy(editor_paths[i], "");
strcpy(printcmd, "");
+ strcpy(imagecmd, "");
strcpy(rc_username, "");
strcpy(rc_password, "");
rc_floor_mode = 0;
rc_display_message_numbers = 0;
rc_force_mail_prompts = 0;
rc_ansi_color = 0;
+ rc_color_use_bg = 0;
+ rc_reply_extedit = 0;
strcpy(rc_url_cmd, "");
+ strcpy(rc_gotmail_cmd, "");
#ifdef HAVE_OPENSSL
rc_encrypt = RC_DEFAULT;
#endif
-#ifdef HAVE_CURSES_H
+#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES)
rc_screen = RC_DEFAULT;
#endif
rc_alt_semantics = 0;
ccfile = fopen(buf, "r");
}
if (ccfile == NULL) {
- snprintf(buf, sizeof buf, "%s/citadel.rc", BBSDIR);
+ snprintf(buf, sizeof buf, "%s/citadel.rc", CTDLDIR);
ccfile = fopen(buf, "r");
}
if (ccfile == NULL) {
}
if (ccfile == NULL) {
perror("commands: cannot open citadel.rc");
- logoff(errno);
+ logoff(NULL, 3);
}
while (fgets(buf, sizeof buf, ccfile) != NULL) {
while ((strlen(buf) > 0) ? (isspace(buf[strlen(buf) - 1])) : 0)
rc_encrypt = RC_YES;
#else
fprintf(stderr, "citadel.rc requires encryption support but citadel is not compiled with OpenSSL");
- logoff(1);
+ logoff(NULL, 3);
#endif
}
#ifdef HAVE_OPENSSL
#endif
}
-#ifdef HAVE_CURSES_H
+#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES)
if (!strncasecmp(buf, "fullscreen=", 11)) {
if (!strcasecmp(&buf[11], "yes"))
rc_screen = RC_YES;
#endif
if (!strncasecmp(buf, "editor=", 7))
- strcpy(editor_path, &buf[7]);
+ strcpy(editor_paths[0], &buf[7]);
+
+ for (i = 0; i < MAX_EDITORS; i++)
+ {
+ sprintf(editor_key, "editor%d=", i);
+ if (!strncasecmp(buf, editor_key, strlen(editor_key)))
+ strcpy(editor_paths[i], &buf[strlen(editor_key)]);
+ }
if (!strncasecmp(buf, "printcmd=", 9))
strcpy(printcmd, &buf[9]);
+ if (!strncasecmp(buf, "imagecmd=", 9))
+ strcpy(imagecmd, &buf[9]);
+
if (!strncasecmp(buf, "expcmd=", 7))
strcpy(rc_exp_cmd, &buf[7]);
if (!strncasecmp(buf, "allow_attachments=", 18)) {
rc_allow_attachments = atoi(&buf[18]);
}
+ if (!strncasecmp(buf, "idle_threshold=", 15)) {
+ rc_idle_threshold = atol(&buf[15]);
+ }
if (!strncasecmp(buf, "remember_passwords=", 19)) {
rc_remember_passwords = atoi(&buf[19]);
}
if (!strncasecmp(&buf[11], "user", 4))
rc_ansi_color = 3; /* user config */
}
+ if (!strncasecmp(buf, "use_background=", 15)) {
+ if (!strncasecmp(&buf[15], "on", 2))
+ rc_color_use_bg = 9;
+ }
if (!strncasecmp(buf, "prompt_control=", 15)) {
if (!strncasecmp(&buf[15], "on", 2))
rc_prompt_control = 1;
if (!strncasecmp(buf, "urlcmd=", 7))
strcpy(rc_url_cmd, &buf[7]);
+ if (!strncasecmp(buf, "gotmailcmd=", 11))
+ strcpy(rc_gotmail_cmd, &buf[11]);
+
if (!strncasecmp(buf, "alternate_semantics=", 20)) {
- if (!strncasecmp(&buf[11], "yes", 3))
+ if (!strncasecmp(&buf[20], "yes", 3)) {
rc_alt_semantics = 1;
- if (!strncasecmp(&buf[11], "no", 2))
+ }
+ else {
rc_alt_semantics = 0;
+ }
+ }
+ if (!strncasecmp(buf, "reply_with_external_editor=", 27)) {
+ if (!strncasecmp(&buf[27], "yes", 3)) {
+ rc_reply_extedit = 1;
+ }
+ else {
+ rc_reply_extedit = 0;
+ }
}
if (!strncasecmp(buf, "cmd=", 4)) {
strcpy(buf, &buf[4]);
* This function returns an integer command number. If the command prompts
* for a string then it is placed in the supplied buffer.
*/
-int getcmd(char *argbuf)
+int getcmd(CtdlIPC *ipc, char *argbuf)
{
char cmdbuf[5];
int cmdspaces[5];
enable_color = 0;
}
/* if we're running in idiot mode, display a cute little menu */
- IFNEXPERT formout("mainmenu");
+ IFNEXPERT formout(ipc, "mainmenu");
- print_express(); /* print express messages if there are any */
+ print_instant();
strcpy(argbuf, "");
cmdpos = 0;
for (a = 0; a < 5; ++a)
|| (cptr->c_cmdnum == 20))
next_lazy_cmd = 13;
+ /* If this command is "read new"
+ * then the next lazy-command (space bar)
+ * should be "goto"
+ */
+ if (cptr->c_cmdnum == 13)
+ next_lazy_cmd = 5;
+
return (cptr->c_cmdnum);
}
/*
* set tty modes. commands are:
*
- * 01- set to bbs mode
+ * 01- set to Citadel mode
* 2 - save current settings for later restoral
* 3 - restore saved settings
*/
#ifdef HAVE_TERMIOS_H
-void sttybbs(int cmd)
-{ /* SysV version of sttybbs() */
+void stty_ctdl(int cmd)
+{ /* SysV version of stty_ctdl() */
struct termios live;
static struct termios saved_settings;
static int last_cmd = 0;
live.c_oflag = OPOST | ONLCR;
live.c_lflag = ISIG | NOFLSH;
- live.c_cc[VINTR] = (-1);
- live.c_cc[VQUIT] = (-1);
+ live.c_cc[VINTR] = 0;
+ live.c_cc[VQUIT] = 0;
#ifdef hpux
live.c_cc[VMIN] = 0;
if (cmd == 3) {
tcsetattr(0, TCSADRAIN, &saved_settings);
}
+
}
#else
-void sttybbs(int cmd)
-{ /* BSD version of sttybbs() */
+void stty_ctdl(int cmd)
+{ /* BSD version of stty_ctdl() */
struct sgttyb live;
static struct sgttyb saved_settings;
static int last_cmd = 0;
/*
* display_help() - help file viewer
*/
-void display_help(char *name)
+void display_help(CtdlIPC *ipc, char *name)
{
- formout(name);
+ formout(ipc, name);
}
/*
- * fmout() - Citadel text formatter and paginator
+ * fmout() - Citadel text formatter and paginator
*/
int fmout(
int width, /* screen width to use */
- FILE *fpin, /* file to read from, or NULL to read from server */
- FILE *fpout, /* File to write to, or NULL to write to screen */
+ FILE *fpin, /* file to read from, or NULL to format given text */
+ char *text, /* text to be formatted (when fpin is NULL */
+ FILE *fpout, /* file to write to, or NULL to write to screen */
char pagin, /* nonzero if we should use the paginator */
int height, /* screen height to use */
int starting_lp,/* starting value for lines_printed, -1 for global */
- char subst) /* nonzero if we should use hypertext mode */
+ int subst) /* nonzero if we should use hypertext mode */
{
- int a, b, c, d, old;
- int real = (-1);
- char aaa[140];
- char buffer[512];
- int eof_flag = 0;
+ char *buffer = NULL; /* The current message */
+ char *word = NULL; /* What we are about to actually print */
+ char *e; /* Pointer to position in text */
+ char old = 0; /* The previous character */
+ int column = 0; /* Current column */
+ size_t i; /* Generic counter */
+
+ /* Space for a single word, which can be at most screenwidth */
+ word = (char *)calloc(1, width);
+ if (!word) {
+ err_printf("Can't alloc memory to print message: %s!\n",
+ strerror(errno));
+ logoff(NULL, 3);
+ }
- num_urls = 0; /* Start with a clean slate of embedded URL's */
+ /* Read the entire message body into memory */
+ if (fpin) {
+ buffer = load_message_from_file(fpin);
+ if (!buffer) {
+ err_printf("Can't print message: %s!\n",
+ strerror(errno));
+ logoff(NULL, 3);
+ }
+ } else {
+ buffer = text;
+ }
+ e = buffer;
- if (starting_lp >= 0) {
+ if (starting_lp >= 0)
lines_printed = starting_lp;
- }
- strcpy(aaa, "");
- old = 255;
- strcpy(buffer, "");
- c = 1; /* c is the current pos */
-
-FMTA: while ((eof_flag == 0) && (strlen(buffer) < 126)) {
- if (fpin != NULL) { /* read from file */
- if (feof(fpin))
- eof_flag = 1;
- if (eof_flag == 0) {
- a = getc(fpin);
- buffer[strlen(buffer) + 1] = 0;
- buffer[strlen(buffer)] = a;
+
+ /* Run the message body */
+ while (*e) {
+ /* Catch characters that shouldn't be there at all */
+ if (*e == '\r') {
+ e++;
+ continue;
+ }
+ /* First, are we looking at a newline? */
+ if (*e == '\n') {
+ e++;
+ if (*e == ' ') { /* Paragraph */
+ if (fpout) {
+ fprintf(fpout, "\n");
+ } else {
+ scr_printf("\n");
+ ++lines_printed;
+ lines_printed = checkpagin(lines_printed, pagin, height);
+ }
+ column = 0;
+ } else if (old != ' ') {/* Don't print two spaces */
+ if (fpout) {
+ fprintf(fpout, " ");
+ } else {
+ scr_printf(" ");
+ }
+ column++;
}
- } else { /* read from server */
- d = strlen(buffer);
- serv_gets(&buffer[d]);
- while ((!isspace(buffer[d])) && (isspace(buffer[strlen(buffer) - 1])))
- buffer[strlen(buffer) - 1] = 0;
- if (!strcmp(&buffer[d], "000")) {
- buffer[d] = 0;
- eof_flag = 1;
- while (isspace(buffer[strlen(buffer) - 1]))
- buffer[strlen(buffer) - 1] = 0;
+ old = '\n';
+ continue;
+ }
+ /* Are we looking at a nonprintable? */
+ if ( (*e < 32) || (*e > 126) ) {
+ e++;
+ continue;
+ }
+ /* Or are we looking at a space? */
+ if (*e == ' ') {
+ e++;
+ if (column >= width - 1) {
+ /* Are we in the rightmost column? */
+ if (fpout) {
+ fprintf(fpout, "\n");
+ } else {
+ scr_printf("\n");
+ ++lines_printed;
+ lines_printed = checkpagin(lines_printed, pagin, height);
+ }
+ column = 0;
+ } else if (!(column == 0 && old == ' ')) {
+ /* Eat only the first space on a line */
+ if (fpout) {
+ fprintf(fpout, " ");
+ } else {
+ scr_printf(" ");
+ }
+ column++;
}
- d = strlen(buffer);
- buffer[d] = 10;
- buffer[d + 1] = 0;
+ /* ONLY eat the FIRST space on a line */
+ old = ' ';
+ continue;
}
- }
-
- if ( (!strncasecmp(buffer, "http://", 7))
- || (!strncasecmp(buffer, "ftp://", 6)) ) {
- safestrncpy(urls[num_urls], buffer, (SIZ-1));
- for (a=0; a<strlen(urls[num_urls]); ++a) {
- b = urls[num_urls][a];
- if ( (b==' ') || (b==')') || (b=='>') || (b==10)
- || (b==13) || (b==9) || (b=='\"') )
- urls[num_urls][a] = 0;
+ old = *e;
+
+ /* Read a word, slightly messy */
+ i = 0;
+ while (e[i]) {
+ if (!isprint(e[i]) && !isspace(e[i]))
+ e[i] = ' ';
+ if (isspace(e[i]))
+ break;
+ i++;
}
- ++num_urls;
- }
- buffer[strlen(buffer) + 1] = 0;
- a = buffer[0];
- strcpy(buffer, &buffer[1]);
+ /* We should never see these, but... slightly messy */
+ if (e[i] == '\t' || e[i] == '\f' || e[i] == '\v')
+ e[i] = ' ';
- old = real;
- real = a;
- if (a <= 0)
- goto FMTEND;
+ /* Break up really long words */
+ /* TODO: auto-hyphenation someday? */
+ if (i >= width)
+ i = width - 1;
+ strncpy(word, e, i);
+ word[i] = 0;
- if (((a == 13) || (a == 10)) && (old != 13) && (old != 10))
- a = 32;
- if (((old == 13) || (old == 10)) && (isspace(real))) {
- if (fpout) {
- fprintf(fpout, "\n");
- } else {
- scr_printf("\n");
- ++lines_printed;
- lines_printed = checkpagin(lines_printed, pagin, height);
- }
- c = 1;
- }
- if (a > 126)
- goto FMTA;
-
- if (a > 32) {
- if (((strlen(aaa) + c) > (width - 1)) && (strlen(aaa) > (width - 1))) {
- if (fpout) {
- fprintf(fpout, "\n%s", aaa);
- } else {
- scr_printf("\n%s", aaa);
- ++lines_printed;
- lines_printed = checkpagin(lines_printed, pagin, height);
- }
- c = strlen(aaa);
- aaa[0] = 0;
- }
- b = strlen(aaa);
- aaa[b] = a;
- aaa[b + 1] = 0;
- }
- if (a == 32) {
- if ((strlen(aaa) + c) > (width - 1)) {
- c = 1;
+ /* Decide where to print the word */
+ if (column + i >= width) {
+ /* Wrap to the next line */
if (fpout) {
fprintf(fpout, "\n");
} else {
++lines_printed;
lines_printed = checkpagin(lines_printed, pagin, height);
}
+ column = 0;
}
+
+ /* Print the word */
if (fpout) {
- fprintf(fpout, "%s ", aaa);
- } else {
- scr_printf("%s ", aaa);
- }
- ++c;
- c = c + strlen(aaa);
- strcpy(aaa, "");
- goto FMTA;
- }
- if ((a == 13) || (a == 10)) {
- if (fpout) {
- fprintf(fpout, "%s\n", aaa);
+ fprintf(fpout, "%s", word);
} else {
- scr_printf("%s\n", aaa);
- ++lines_printed;
- lines_printed = checkpagin(lines_printed, pagin, height);
+ scr_printf("%s", word);
}
- c = 1;
- if (sigcaught) goto OOPS;
- strcpy(aaa, "");
- goto FMTA;
+ column += i;
+ e += i; /* Start over with the whitepsace! */
}
- goto FMTA;
- /* keypress caught; drain the server */
-OOPS: do {
- serv_gets(aaa);
- } while (strcmp(aaa, "000"));
+ free(word);
+ if (fpin) /* We allocated this, remember? */
+ free(buffer);
-FMTEND:
+ /* Is this necessary? It makes the output kind of spacey. */
if (fpout) {
fprintf(fpout, "\n");
} else {
++lines_printed;
lines_printed = checkpagin(lines_printed, pagin, height);
}
- return (sigcaught);
+
+ return sigcaught;
}
*/
void color(int colornum)
{
- static int is_bold = 0;
- static int hold_color, current_color;
+ static int hold_color;
+ static int current_color;
if (colornum == COLOR_PUSH) {
hold_color = current_color;
current_color = colornum;
if (enable_color) {
-#ifdef HAVE_CURSES_H
+#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES)
if (scr_color(colornum))
return;
#endif
/* When switching to dim white, actually output an 'original
* pair' sequence -- this looks better on black-on-white
- * terminals.
+ * terminals. - Changed to ORIGINAL_PAIR as this actually
+ * wound up looking horrible on black-on-white terminals, not
+ * to mention transparent terminals.
*/
- if (colornum == DIM_WHITE)
- printf("\033[39;49m");
+ if (colornum == ORIGINAL_PAIR)
+ printf("\033[0;39;49m");
else
- printf("\033[3%d;40m", (colornum & 7));
-
- if ((colornum >= 8) && (is_bold == 0)) {
- printf("\033[1m");
- is_bold = 1;
- } else if ((colornum < 8) && (is_bold == 1)) {
- printf("\033[0m");
- is_bold = 0;
- }
+ printf("\033[%d;3%d;4%dm",
+ (colornum & 8) ? 1 : 0,
+ (colornum & 7),
+ rc_color_use_bg);
+
scr_flush();
}
}
void cls(int colornum)
{
if (enable_color) {
- printf("\033[4%dm\033[2J\033[H\033[0m", colornum);
+ printf("\033[4%dm\033[2J\033[H\033[0m",
+ colornum ? colornum : rc_color_use_bg);
scr_flush();
}
}
}
else {
for (i=0; i<choices; ++i) {
- extract(buf, menustring, i);
+ extract_token(buf, menustring, i, '|', sizeof buf);
keyopt(buf);
scr_printf(" ");
}
}
- scr_printf(" -> ");
+ scr_printf("-> ");
display_prompt = 0;
}
ch = lkey();
scr_printf("\rOne of... ");
scr_printf(" \n");
for (i=0; i<choices; ++i) {
- extract(buf, menustring, i);
+ extract_token(buf, menustring, i, '|', sizeof buf);
scr_printf(" ");
keyopt(buf);
scr_printf("\n");
}
for (i=0; i<choices; ++i) {
- extract(buf, menustring, i);
+ extract_token(buf, menustring, i, '|', sizeof buf);
for (c=1; c<strlen(buf); ++c) {
if ( (ch == tolower(buf[c]))
&& (buf[c-1]=='<')
scr_putc(buf[a]);
}
}
- scr_printf("\n\n");
+ scr_printf("\n");
return ch;
}
}