// This file contains functions which implement parts of the
// text-mode user interface.
//
-// Copyright (c) 1987-2018 by the citadel.org team
+// Copyright (c) 1987-2021 by the citadel.org team
//
// This program is open source software. Use, duplication, and/or
// disclosure are subject to the GNU General Purpose License version 3.
#include "textclient.h"
+
+// The help "files" are now just an embedded set of Very Long Strings. helpnames[] is
+// an array of "file names" and helptexts[] is the "content".
+
char *helpnames[] = {
"help",
"admin",
char *helptexts[] = {
+ // <.H>elp HELP
" Citadel Help Menu\n"
" \n"
" ? Help. (Typing a '?' will give you a menu almost anywhere)\n"
" \n"
" *** USE .<H>elp ? for additional help *** \n",
+ // <.H>elp ADMIN
"The following commands are available only to Admins. A subset of these\n"
"commands are available to room aides when they are currently in the room\n"
"they are room aide for.\n"
" <.> <A>dmin <N>etwork room sharing (Replication with other Citadels)\n"
" \n" " In addition, the <M>ove and <D>elete commands are available at the\n" "message prompt.\n",
+ // <.H>elp FLOORS
" Floors\n"
" ------\n"
" Floors in Citadel are used to group rooms into related subject areas,\n"
" Feel free to experiment, you can't hurt yourself or the system with the\n"
"floor stuff unless you ZForget a floor by accident.\n",
+ // <.H>elp INTRO
" New User's Introduction to the site\n"
" \n"
" This is an introduction to the Citadel BBS concept. It is intended\n"
"display as '<private room>'. Along with this information is displayed the\n"
"name of the host computer the user is logged in from.\n",
+ // <.H>elp MAIL
"To send mail on this system, go to the Mail> room (using the command .G Mail)\n"
"and press E to enter a message. You will be prompted with:\n"
" \n"
"anyone on the Internet here. Simply enter their address at the prompt:\n"
" \n" " Enter Recipient: ajc@herring.fishnet.com\n",
+ // <.H>elp NETWORK
" Welcome to the network. Messages entered in a network room will appear in\n"
"that room on all other systems carrying it (The name of the room, however,\n" "may be different on other systems).\n",
+ // <.H>elp SOFTWARE
" Citadel is the premier 'online community' (i.e. Bulletin Board System)\n"
"software. It runs on all POSIX-compliant systems, including Linux. It is an\n"
"advanced client/server application, and is being actively maintained.\n"
" \n" " For more info, visit UNCENSORED! BBS at uncensored.citadel.org\n",
+ // <.H>elp SUMMARY
"Extended commands are available using the period ( . ) key. To use\n"
"a dot command, press the . key, and then enter the first letter of\n"
"each word in the command. The words will appear as you enter the keys.\n"
extern int screenwidth, screenheight;
extern int termn8;
-extern CtdlIPC *ipc_for_signal_handlers; /* KLUDGE cover your eyes */
+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 instant msgs asynchronously */
-time_t AnsiDetect; /* when did we send the detect code? */
-int enable_color = 0; /* nonzero for ANSI color */
+// these variables are local to this module
+char keepalives_enabled = KA_YES; // send NOOPs to server when idle
+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
-/*
- * If an interesting key has been pressed, return its value, otherwise 0
- */
+// If an interesting key has been pressed, return its value, otherwise 0
char was_a_key_pressed(void) {
fd_set rfds;
struct timeval tv;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
- /* Careful! Disable keepalives during keyboard polling; we're probably
- * in the middle of a data transfer from the server, in which case
- * sending a NOOP would throw the client protocol out of sync.
- */
+ // Careful! Disable keepalives during keyboard polling; we're probably
+ // in the middle of a data transfer from the server, in which case
+ // sending a NOOP would throw the client protocol out of sync.
if ((retval > 0) && FD_ISSET(0, &rfds)) {
set_keepalives(KA_NO);
the_character = inkey();
}
-/*
- * print_instant() - print instant messages if there are any
- */
-void print_instant(void) {
+// display_instant_messages() - print instant messages if there are any
+void display_instant_messages(void) {
char buf[1024];
FILE *outpipe;
time_t timestamp;
char sender[64];
char node[64];
char *listing = NULL;
- int r; /* IPC result code */
+ int r; // IPC result code
if (instant_msgs == 0) {
return;
localtime_r(×tamp, &stamp);
- /* If the page is a Logoff Request, honor it. */
+ // If the message contains a Logoff Request, honor it.
if (flags & 2) {
termn8 = 1;
return;
if (!IsEmptyStr(rc_exp_cmd)) {
outpipe = popen(rc_exp_cmd, "w");
if (outpipe != NULL) {
- /* Header derived from flags */
+ // Header derived from flags
if (flags & 2)
fprintf(outpipe, "Please log off now, as requested ");
else if (flags & 1)
fprintf(outpipe, "Chat request ");
else
fprintf(outpipe, "Message ");
- /* Timestamp. Can this be improved? */
+ // Timestamp. Can this be improved?
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 */
+ else if (stamp.tm_hour > 12) // pm
fprintf(outpipe, "at %d:%02dpm", stamp.tm_hour - 12, stamp.tm_min);
- else /* am */
+ else // am
fprintf(outpipe, "at %d:%02dam", stamp.tm_hour, stamp.tm_min);
fprintf(outpipe, " from %s", sender);
if (strncmp(ipc_for_signal_handlers->ServInfo.nodename, node, 32))
continue;
}
}
- /* fall back to built-in instant message display */
+ // fall back to built-in instant message display
scr_printf("\n");
- /* Header derived from flags */
+ // Header derived from flags
if (flags & 2)
scr_printf("Please log off now, as requested ");
else if (flags & 1)
else
scr_printf("Message ");
- /* Timestamp. Can this be improved? */
- if (stamp.tm_hour == 0 || stamp.tm_hour == 12) /* 12am/12pm */
+ // 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 */
+ else if (stamp.tm_hour > 12) // pm
scr_printf("at %d:%02dpm", stamp.tm_hour - 12, stamp.tm_min);
- else /* am */
+ else // am
scr_printf("at %d:%02dam", stamp.tm_hour, stamp.tm_min);
- /* Sender */
+ // Sender
scr_printf(" from %s", sender);
- /* Remote node, if any */
+ // Remote node, if any
if (strncmp(ipc_for_signal_handlers->ServInfo.nodename, node, 32))
scr_printf(" @%s", node);
}
-/*
- * This loop handles the "keepalive" messages sent to the server when idling.
- */
+// This loop handles the "keepalive" messages sent to the server when idling.
static time_t idlet = 0;
static void really_do_keepalive(void) {
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
- */
+ // 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 full keepalives are enabled, send a NOOP to the server and
+ // wait for a response.
if (keepalives_enabled == KA_YES) {
CtdlIPCNoop(ipc_for_signal_handlers);
if (instant_msgs > 0) {
if (ok_to_interrupt == 1) {
scr_printf("\r%64s\r", "");
- print_instant();
+ display_instant_messages();
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)) {
+ // If half keepalives are enabled, send a QNOP to the server, then do nothing.
+ if (keepalives_enabled == KA_HALF) {
CtdlIPC_chat_send(ipc_for_signal_handlers, "QNOP");
}
}
-/* I changed this from static to not because I need to call it from
- * screen.c, either that or make something in screen.c not static.
- * Fix it how you like. Why all the staticness? stu
- */
-void do_keepalive(void)
-{
+// I changed this from static to not because I need to call it from
+// screen.c, either that or make something in screen.c not static.
+// Fix it how you like. Why all the staticness? stu
+void do_keepalive(void) {
time_t now;
time(&now);
return;
}
- /* Do a space-backspace to keep terminal sessions from idling out */
+ // Do a space-backspace to keep terminal sessions from idling out
scr_printf(" %c", 8);
scr_flush();
}
-int inkey(void)
-{ /* get a character from the keyboard, with */
- int a; /* the watchdog timer in effect if necessary */
+// Get a character from the keyboard, with the watchdog timer in effect if necessary.
+int inkey(void) {
+ int a;
fd_set rfds;
struct timeval tv;
time_t start_time;
time(&start_time);
do {
- /* This loop waits for keyboard input. If the keepalive
- * timer expires, it sends a keepalive to the server if
- * necessary and then waits again.
- */
+ // This loop waits for keyboard input. If the keepalive
+ // timer expires, it sends a keepalive to the server if
+ // necessary and then waits again.
do {
do_keepalive();
select(1, &rfds, NULL, NULL, &tv);
} while (!FD_ISSET(0, &rfds));
- /* At this point, there's input, so fetch it.
- * (There's a hole in the bucket...)
- */
+ // At this point, there's input, so fetch it.
+ // (There's a hole in the bucket...)
a = scr_getc(SCR_BLOCK);
if (a == 127) {
a = 8;
}
-int yesno(void)
-{ /* Returns 1 for yes, 0 for no */
+// Returns 1 for yes, 0 for no
+int yesno(void) {
int a;
while (1) {
a = inkey();
}
}
-/* Returns 1 for yes, 0 for no, arg is default value */
-int yesno_d(int d)
-{
+
+// Returns 1 for yes, 0 for no, arg is default value
+int yesno_d(int d) {
int a;
while (1) {
a = inkey();
}
-
-
/*
* Function to read a line of text from the terminal.
*
*/
void strprompt(char *prompt, char *str, int len)
{
- print_instant();
+ display_instant_messages();
color(DIM_WHITE);
scr_printf("%s", prompt);
color(DIM_WHITE);
scr_printf("-----------------------------------------------------------------------\n");
}
- print_instant();
+ display_instant_messages();
strcpy(argbuf, "");
cmdpos = 0;
for (a = 0; a < 5; ++a)
}
-
-
-
/*
* set tty modes. commands are:
*
* 2 - save current settings for later restoral
* 3 - restore saved settings
*/
-void stty_ctdl(int cmd)
-{ /* SysV version of stty_ctdl() */
+void stty_ctdl(int cmd) { /* SysV version of stty_ctdl() */
struct termios live;
static struct termios saved_settings;
static int last_cmd = 0;
}
-// this is the old version which uses sgtty.h instead of termios.h
-#if 0
-void stty_ctdl(int cmd)
-{ /* BSD version of stty_ctdl() */
- struct sgttyb live;
- static struct sgttyb saved_settings;
- static int last_cmd = 0;
-
- if (cmd == SB_LAST)
- cmd = last_cmd;
- else
- last_cmd = cmd;
-
- if ((cmd == 0) || (cmd == 1)) {
- gtty(0, &live);
- live.sg_flags |= CBREAK;
- live.sg_flags |= CRMOD;
- live.sg_flags |= NL1;
- live.sg_flags &= ~ECHO;
- if (cmd == 1)
- live.sg_flags |= NOFLSH;
- stty(0, &live);
- }
- if (cmd == 2) {
- gtty(0, &saved_settings);
- }
- if (cmd == 3) {
- stty(0, &saved_settings);
- }
-}
-#endif
-
-
/*
* display_help() - help text viewer
*/
-void display_help(CtdlIPC * ipc, char *name)
-{
+void display_help(CtdlIPC * ipc, char *name) {
int i;
int num_helps = sizeof(helpnames) / sizeof(char *);
* fmout() - Citadel text formatter and paginator
*/
int fmout(int width, /* screen width to use */
- 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 */
- int subst) { /* nonzero if we should use hypertext mode */
+ 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 */
+ int subst) { /* nonzero if we should use hypertext mode */
char *buffer = NULL; /* The current message */
char *word = NULL; /* What we are about to actually print */
char *e; /* Pointer to position in text */
e[i] = ' ';
/* Break up really long words */
- /* TODO: auto-hyphenation someday? */
- if (i >= width)
+ if (i >= width) {
i = width - 1;
+ }
strncpy(word, e, i);
word[i] = 0;
/*
* support ANSI color if defined
*/
-void color(int colornum)
-{
+void color(int colornum) {
static int hold_color;
static int current_color;
}
}
-void cls(int colornum)
-{
+void cls(int colornum) {
if (enable_color) {
printf("\033[4%dm\033[2J\033[H\033[0m", colornum ? colornum : rc_color_use_bg);
}
/*
* Detect whether ANSI color is available (answerback)
*/
-void send_ansi_detect(void)
-{
+void send_ansi_detect(void) {
if (rc_ansi_color == 2) {
printf("\033[c");
scr_flush();
}
}
-void look_for_ansi(void)
-{
+
+void look_for_ansi(void) {
fd_set rfds;
struct timeval tv;
char abuf[512];
/*
* Display key options (highlight hotkeys inside angle brackets)
*/
-void keyopt(char *buf)
-{
+void keyopt(char *buf) {
int i;
color(DIM_WHITE);
}
-
/*
* Present a key-menu line choice type of thing
*/
-char keymenu(char *menuprompt, char *menustring)
-{
+char keymenu(char *menuprompt, char *menustring) {
int i, c, a;
int choices;
int do_prompt = 0;