X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=textclient%2Fcommands.c;h=c241f014d70a08c55c24e164cb0df6b889564044;hb=HEAD;hp=bdd2dc4e55041b96317734b3bf477ba720732b4c;hpb=da6bb5e24252a0ff56d314a60081ae9ed31ab1a7;p=citadel.git diff --git a/textclient/commands.c b/textclient/commands.c index bdd2dc4e5..6d39ca9b2 100644 --- a/textclient/commands.c +++ b/textclient/commands.c @@ -1,20 +1,14 @@ -/* - * This file contains functions which implement parts of the - * text-mode user interface. - * - * Copyright (c) 1987-2018 by the citadel.org team - * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ +// This file contains functions which implement parts of the text-mode user interface. +// +// Copyright (c) 1987-2024 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure is subject to the GNU General Public 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", @@ -22,11 +16,13 @@ char *helpnames[] = { "intro", "mail", "network", - "software" + "software", + "summary" }; char *helptexts[] = { + // <.H>elp HELP " Citadel Help Menu\n" " \n" " ? Help. (Typing a '?' will give you a menu almost anywhere)\n" @@ -38,11 +34,14 @@ char *helptexts[] = { " G Goto next room which has UNREAD messages.\n" " H Help. Same as '?'\n" " I Reads the Information file for this room.\n" + " J Jump to any named room (same as <.G>oto)\n" " K List of Known rooms.\n" " L Reads the last five messages in the room.\n" + " M Go to your private Mail room\n" " N Reads all new messages in the room.\n" " O Reads all old messages, backwards.\n" " P Page another user (send an instant message)\n" + " Q Quiet mode on/off (disables receiving instant messages)\n" " R Reads all messages in the room, in reverse order.\n" " S Skips current room without making its messages old.\n" " T Terminate (logout)\n" @@ -52,13 +51,13 @@ char *helptexts[] = { " Z Zap (forget) room. (Removes the room from your list)\n" " + - Goto next, previous room on current floor.\n" " > < Goto next, previous floor.\n" - " * Enter any locally installed 'doors'.\n" " \n" " In addition, there are dot commands. You hit the . (dot), then press the\n" "first letter of each word of the command. As you hit the letters, the words\n" "pop onto your screen. Exceptions: after you hit .Help or .Goto, the remainder\n" "of the command is a help file name or room name.\n" " \n" " *** USE .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" @@ -88,6 +87,7 @@ char *helptexts[] = { " <.> dmin etwork room sharing (Replication with other Citadels)\n" " \n" " In addition, the ove and 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" @@ -131,6 +131,7 @@ char *helptexts[] = { " 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" @@ -266,6 +267,7 @@ char *helptexts[] = { "display as ''. 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" @@ -284,14 +286,17 @@ char *helptexts[] = { "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" @@ -332,9 +337,6 @@ char *helptexts[] = { " you can specify a partial match\n" "\n" " <.> ead extfile formatted File 'download' commands.\n" - " <.> ead file using modem \n" - " <.> ead file using modem \n" - " <.> ead file using modem \n" " <.> ead ile unformatted \n" " <.> ead irectory \n" "\n" @@ -421,6 +423,7 @@ int rc_display_message_numbers; int rc_force_mail_prompts; int rc_remember_passwords; int rc_ansi_color; +int rc_sixel; int rc_color_use_bg; int rc_prompt_control = 0; time_t rc_idle_threshold = (time_t) 900; @@ -432,25 +435,19 @@ int next_lazy_cmd = 5; 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 - */ -char was_a_key_pressed(void) -{ +// If an interesting key has been pressed, return its value, otherwise 0 +char was_a_key_pressed(void) { fd_set rfds; struct timeval tv; int the_character; @@ -462,29 +459,23 @@ char was_a_key_pressed(void) 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(); set_keepalives(KA_YES); - } else { + } + else { the_character = 0; } return (the_character); } - - - -/* - * 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; @@ -493,14 +484,16 @@ void print_instant(void) char sender[64]; char node[64]; char *listing = NULL; - int r; /* IPC result code */ + int r; // IPC result code - if (instant_msgs == 0) + if (instant_msgs == 0) { return; + } if (rc_exp_beep) { ctdl_beep(); } + if (IsEmptyStr(rc_exp_cmd)) { color(BRIGHT_RED); scr_printf("\r---"); @@ -508,8 +501,9 @@ void print_instant(void) while (instant_msgs != 0) { r = CtdlIPCGetInstantMessage(ipc_for_signal_handlers, &listing, buf); - if (r / 100 != 1) + if (r / 100 != 1) { return; + } instant_msgs = extract_int(buf, 0); timestamp = extract_long(buf, 1); @@ -520,7 +514,7 @@ void print_instant(void) 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; @@ -529,7 +523,7 @@ void print_instant(void) 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) @@ -538,12 +532,12 @@ void print_instant(void) 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)) @@ -555,10 +549,10 @@ void print_instant(void) 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) @@ -568,18 +562,18 @@ void print_instant(void) 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); @@ -595,57 +589,46 @@ void print_instant(void) } -void set_keepalives(int s) -{ +void set_keepalives(int s) { keepalives_enabled = (char) s; } -/* - * 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) -{ - +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); @@ -653,7 +636,7 @@ void do_keepalive(void) 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(); @@ -661,10 +644,9 @@ void do_keepalive(void) } - -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; @@ -673,10 +655,9 @@ int inkey(void) 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(); @@ -688,9 +669,8 @@ int inkey(void) 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; @@ -703,8 +683,8 @@ int inkey(void) } -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(); @@ -720,9 +700,9 @@ int yesno(void) } } -/* 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(); @@ -741,20 +721,15 @@ int yesno_d(int d) } - - -/* - * Function to read a line of text from the terminal. - * - * string Pointer to string buffer - * lim Maximum length - * noshow Echo asterisks instead of keystrokes? - * bs Allow backspacing out of the prompt? (returns -1 if this happens) - * - * returns: string length - */ -int ctdl_getline(char *string, int lim, int noshow, int bs) -{ +// Function to read a line of text from the terminal. +// +// string Pointer to string buffer +// lim Maximum length +// noshow Echo asterisks instead of keystrokes? +// bs Allow backspacing out of the prompt? (returns -1 if this happens) +// +// returns: string length +int ctdl_getline(char *string, int lim, int noshow, int bs) { int pos = strlen(string); int ch; @@ -763,25 +738,26 @@ int ctdl_getline(char *string, int lim, int noshow, int bs) while (num_stars--) { scr_putc('*'); } - } else { + } + else { scr_printf("%s", string); } while (1) { ch = inkey(); - if ((ch == 8) && (pos > 0)) { /* backspace */ + if ((ch == 8) && (pos > 0)) { // backspace --pos; scr_putc(8); scr_putc(32); scr_putc(8); } - else if ((ch == 8) && (pos == 0) && (bs)) { /* backspace out of the prompt */ + else if ((ch == 8) && (pos == 0) && (bs)) { // backspace out of the prompt return (-1); } - else if ((ch == 23) && (pos > 0)) { /* Ctrl-W deletes a word */ + else if ((ch == 23) && (pos > 0)) { // Ctrl-W deletes a word while ((pos > 0) && !isspace(string[pos])) { --pos; scr_putc(8); @@ -796,13 +772,13 @@ int ctdl_getline(char *string, int lim, int noshow, int bs) } } - else if (ch == 10) { /* return */ + else if (ch == 10) { // return string[pos] = 0; scr_printf("\n"); return (pos); } - else if (isprint(ch)) { /* payload characters */ + else if (isprint(ch)) { // payload characters scr_putc((noshow ? '*' : ch)); string[pos] = ch; ++pos; @@ -811,14 +787,10 @@ int ctdl_getline(char *string, int lim, int noshow, int bs) } -/* - * newprompt() prompt for a string, print the existing value, and - * allow the user to press return to keep it... - * If len is negative, pass the "noshow" flag to ctdl_getline() - */ -void strprompt(char *prompt, char *str, int len) -{ - print_instant(); +// prompt for a string, print the existing value, and allow the user to press return to keep it... +// If len is negative, pass the "noshow" flag to ctdl_getline() +void strprompt(char *prompt, char *str, int len) { + display_instant_messages(); color(DIM_WHITE); scr_printf("%s", prompt); color(DIM_WHITE); @@ -828,12 +800,9 @@ void strprompt(char *prompt, char *str, int len) color(DIM_WHITE); } -/* - * boolprompt() - prompt for a yes/no, print the existing value and - * allow the user to press return to keep it... - */ -int boolprompt(char *prompt, int prev_val) -{ + +// prompt for a yes/no, print the existing value and allow the user to press return to keep it... +int boolprompt(char *prompt, int prev_val) { int r; color(DIM_WHITE); @@ -850,12 +819,9 @@ int boolprompt(char *prompt, int prev_val) return r; } -/* - * intprompt() - like strprompt(), except for an integer - * (note that it RETURNS the new value!) - */ -int intprompt(char *prompt, int ival, int imin, int imax) -{ + +// like strprompt(), except for an integer (note that it RETURNS the new value!) +int intprompt(char *prompt, int ival, int imin, int imax) { char buf[16]; int i; int p; @@ -878,13 +844,10 @@ int intprompt(char *prompt, int ival, int imin, int imax) return (i); } -/* - * newprompt() prompt for a string with no existing value - * (clears out string buffer first) - * If len is negative, pass the "noshow" flag to ctdl_getline() - */ -void newprompt(char *prompt, char *str, int len) -{ + +// prompt for a string with no existing value (clears out string buffer first) +// If len is negative, pass the "noshow" flag to ctdl_getline() +void newprompt(char *prompt, char *str, int len) { str[0] = 0; color(BRIGHT_MAGENTA); scr_printf("%s", prompt); @@ -894,8 +857,8 @@ void newprompt(char *prompt, char *str, int len) } -int lkey(void) -{ /* returns a lower case value */ +// returns a lower case value +int lkey(void) { int a; a = inkey(); if (isupper(a)) @@ -903,11 +866,9 @@ int lkey(void) return (a); } -/* - * parse the citadel.rc file - */ -void load_command_set(void) -{ + +// parse the citadel.rc file +void load_command_set(void) { FILE *ccfile; char buf[1024]; struct citcmd *cptr; @@ -915,8 +876,7 @@ void load_command_set(void) int a, d; int b = 0; - /* first, set up some defaults for non-required variables */ - + // first, set up some defaults for non-required variables strcpy(editor_path, ""); strcpy(printcmd, ""); strcpy(imagecmd, ""); @@ -930,6 +890,7 @@ void load_command_set(void) rc_display_message_numbers = 0; rc_force_mail_prompts = 0; rc_ansi_color = 0; + rc_sixel = 0; rc_color_use_bg = 0; strcpy(rc_url_cmd, ""); strcpy(rc_open_cmd, ""); @@ -938,16 +899,22 @@ void load_command_set(void) rc_encrypt = RC_DEFAULT; #endif - /* now try to open the citadel.rc file */ - + // now try to open the citadel.rc file ccfile = NULL; if (getenv("HOME") != NULL) { snprintf(buf, sizeof buf, "%s/.citadelrc", getenv("HOME")); ccfile = fopen(buf, "r"); } + if (getenv("APPDIR") != NULL) { + snprintf(buf, sizeof buf, "%s/citadel.rc", getenv("APPDIR")); + ccfile = fopen(buf, "r"); + } if (ccfile == NULL) { ccfile = fopen(file_citadel_rc, "r"); } + if (ccfile == NULL) { + ccfile = fopen("/usr/local/etc/citadel.rc", "r"); + } if (ccfile == NULL) { ccfile = fopen("/etc/citadel.rc", "r"); } @@ -974,7 +941,8 @@ void load_command_set(void) #ifdef HAVE_OPENSSL else if (!strcasecmp(&buf[8], "no")) { rc_encrypt = RC_NO; - } else if (!strcasecmp(&buf[8], "default")) { + } + else if (!strcasecmp(&buf[8], "default")) { rc_encrypt = RC_DEFAULT; } #endif @@ -1023,14 +991,18 @@ void load_command_set(void) if (!strncasecmp(&buf[11], "on", 2)) rc_ansi_color = 1; if (!strncasecmp(&buf[11], "auto", 4)) - rc_ansi_color = 2; /* autodetect */ + rc_ansi_color = 2; // autodetect if (!strncasecmp(&buf[11], "user", 4)) - rc_ansi_color = 3; /* user config */ + rc_ansi_color = 3; // user config } if (!strncasecmp(buf, "status_line=", 12)) { if (!strncasecmp(&buf[12], "on", 2)) enable_status_line = 1; } + if (!strncasecmp(buf, "use_sixel=", 10)) { + if (!strncasecmp(&buf[10], "on", 2)) + rc_sixel = 1; + } if (!strncasecmp(buf, "use_background=", 15)) { if (!strncasecmp(&buf[15], "on", 2)) rc_color_use_bg = 9; @@ -1039,7 +1011,7 @@ void load_command_set(void) if (!strncasecmp(&buf[15], "on", 2)) rc_prompt_control = 1; if (!strncasecmp(&buf[15], "user", 4)) - rc_prompt_control = 3; /* user config */ + rc_prompt_control = 3; // user config } if (!strncasecmp(buf, "username=", 9)) strcpy(rc_username, &buf[9]); @@ -1105,12 +1077,8 @@ void load_command_set(void) } - -/* - * return the key associated with a command - */ -char keycmd(char *cmdstr) -{ +// return the key associated with a command +char keycmd(char *cmdstr) { int a; for (a = 0; !IsEmptyStr(&cmdstr[a]); ++a) @@ -1120,12 +1088,9 @@ char keycmd(char *cmdstr) } -/* - * Output the string from a key command without the ampersand - * "mode" should be set to 0 for normal or 1 for ommand key highlighting - */ -char *cmd_expand(char *strbuf, int mode) -{ +// Output the string from a key command without the ampersand +// "mode" should be set to 0 for normal or 1 for ommand key highlighting +char *cmd_expand(char *strbuf, int mode) { int a; static char exp[64]; char buf[1024]; @@ -1135,7 +1100,7 @@ char *cmd_expand(char *strbuf, int mode) for (a = 0; exp[a]; ++a) { if (strbuf[a] == '&') { - /* dont echo these non mnemonic command keys */ + // don't echo these non-mnemonic command keys int noecho = strbuf[a + 1] == '<' || strbuf[a + 1] == '>' || strbuf[a + 1] == '+' || strbuf[a + 1] == '-'; if (mode == 0) { @@ -1164,13 +1129,8 @@ char *cmd_expand(char *strbuf, int mode) } - -/* - * Comparison function to determine if entered commands match a - * command loaded from the config file. - */ -int cmdmatch(char *cmdbuf, struct citcmd *cptr, int ncomp) -{ +// Comparison function to determine if entered commands match a command loaded from the config file. +int cmdmatch(char *cmdbuf, struct citcmd *cptr, int ncomp) { int a; int cmdax; @@ -1189,11 +1149,8 @@ int cmdmatch(char *cmdbuf, struct citcmd *cptr, int ncomp) } -/* - * This function returns 1 if a given command requires a string input - */ -int requires_string(struct citcmd *cptr, int ncomp) -{ +// This function returns 1 if a given command requires a string input +int requires_string(struct citcmd *cptr, int ncomp) { int a; char buf[64]; @@ -1206,13 +1163,10 @@ int requires_string(struct citcmd *cptr, int ncomp) } -/* - * Input a command at the main prompt. - * This function returns an integer command number. If the command prompts - * for a string then it is placed in the supplied buffer. - */ -int getcmd(CtdlIPC * ipc, char *argbuf) -{ +// Input a command at the main prompt. +// This function returns an integer command number. If the command prompts +// for a string then it is placed in the supplied buffer. +int getcmd(CtdlIPC * ipc, char *argbuf) { char cmdbuf[5]; int cmdspaces[5]; int cmdpos; @@ -1222,22 +1176,20 @@ int getcmd(CtdlIPC * ipc, char *argbuf) int this_lazy_cmd; struct citcmd *cptr; - /* - * Starting a new command now, so set sigcaught to 0. This variable - * is set to nonzero (usually NEXT_KEY or STOP_KEY) if a command has - * been interrupted by a keypress. - */ + // Starting a new command now, so set sigcaught to 0. This variable + // is set to nonzero (usually NEXT_KEY or STOP_KEY) if a command has + // been interrupted by a keypress. sigcaught = 0; - /* Switch color support on or off if we're in user mode */ + // Switch color support on or off if we're in user mode if (rc_ansi_color == 3) { if (userflags & US_COLOR) enable_color = 1; else enable_color = 0; } - /* if we're running in idiot mode, display a cute little menu */ + // if we're running in idiot mode, display a cute little menu IFNEXPERT { scr_printf("-----------------------------------------------------------------------\n"); scr_printf("Room cmds: nown rooms, oto next room, <.G>oto a specific room,\n"); @@ -1252,12 +1204,14 @@ int getcmd(CtdlIPC * ipc, char *argbuf) scr_printf("-----------------------------------------------------------------------\n"); } - print_instant(); + display_instant_messages(); strcpy(argbuf, ""); cmdpos = 0; - for (a = 0; a < 5; ++a) + for (a = 0; a < 5; ++a) { cmdbuf[a] = 0; - /* now the room prompt... */ + } + + // now the room prompt... ok_to_interrupt = 1; color(BRIGHT_WHITE); scr_printf("\n%s", room_name); @@ -1268,15 +1222,14 @@ int getcmd(CtdlIPC * ipc, char *argbuf) ch = inkey(); ok_to_interrupt = 0; - /* Handle the backspace key, but only if there's something - * to backspace over... - */ + // Handle the backspace key, but only if there's something to backspace over... if ((ch == 8) && (cmdpos > 0)) { back(cmdspaces[cmdpos - 1] + 1); cmdbuf[cmdpos] = 0; --cmdpos; } - /* Spacebar invokes "lazy traversal" commands */ + + // Spacebar invokes "lazy traversal" commands if ((ch == 32) && (cmdpos == 0)) { this_lazy_cmd = next_lazy_cmd; if (this_lazy_cmd == 13) @@ -1295,7 +1248,8 @@ int getcmd(CtdlIPC * ipc, char *argbuf) scr_printf("\n"); return (this_lazy_cmd); } - /* Otherwise, process the command */ + + // Otherwise, process the command cmdbuf[cmdpos] = tolower(ch); for (cptr = cmdlist; cptr != NULL; cptr = cptr->next) { @@ -1312,32 +1266,30 @@ int getcmd(CtdlIPC * ipc, char *argbuf) for (cptr = cmdlist; cptr != NULL; cptr = cptr->next) { if (cmdmatch(cmdbuf, cptr, 5)) { - /* We've found our command. */ - if (requires_string(cptr, cmdpos)) { + if (requires_string(cptr, cmdpos)) { // We found our command. argbuf[0] = 0; ctdl_getline(argbuf, 64, 0, 0); - } else { + } + else { scr_printf("\n"); } - /* If this command is one that changes rooms, - * then the next lazy-command (space bar) - * should be "read new" instead of "goto" - */ + // If this command is one that changes rooms, then the next lazy-command + // (space bar) should be "read new" instead of "goto" if ((cptr->c_cmdnum == 5) || (cptr->c_cmdnum == 6) || (cptr->c_cmdnum == 47) || (cptr->c_cmdnum == 52) || (cptr->c_cmdnum == 16) - || (cptr->c_cmdnum == 20)) + || (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) + // 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); @@ -1373,38 +1325,34 @@ int getcmd(CtdlIPC * ipc, char *argbuf) } - - - -/* - * set tty modes. commands are: - * - * 01- set to Citadel mode - * 2 - save current settings for later restoral - * 3 - restore saved settings - */ -void stty_ctdl(int cmd) -{ /* SysV version of stty_ctdl() */ +// set tty modes. commands are: +// +// 01- set to Citadel mode +// 2 - save current settings for later restoral +// 3 - restore saved settings +void stty_ctdl(int cmd) { struct termios live; static struct termios saved_settings; static int last_cmd = 0; - if (cmd == SB_LAST) + if (cmd == SB_LAST) { cmd = last_cmd; - else + } + else { last_cmd = cmd; + } if ((cmd == 0) || (cmd == 1)) { tcgetattr(0, &live); + + // Character-by-character input instead of line mode live.c_iflag = ISTRIP | IXON | IXANY; live.c_oflag = OPOST | ONLCR; live.c_lflag = ISIG | NOFLSH; + // Key bindings live.c_cc[VINTR] = 0; live.c_cc[VQUIT] = 0; - - /* do we even need this stuff anymore? */ - /* live.c_line=0; */ live.c_cc[VERASE] = 8; live.c_cc[VKILL] = 24; live.c_cc[VEOF] = 1; @@ -1413,9 +1361,11 @@ void stty_ctdl(int cmd) live.c_cc[VSTART] = 0; tcsetattr(0, TCSADRAIN, &live); } + if (cmd == 2) { tcgetattr(0, &saved_settings); } + if (cmd == 3) { tcsetattr(0, TCSADRAIN, &saved_settings); } @@ -1423,44 +1373,8 @@ void stty_ctdl(int cmd) } -// 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) -{ +// display_help() - help text viewer +void display_help(CtdlIPC * ipc, char *name) { int i; int num_helps = sizeof(helpnames) / sizeof(char *); @@ -1478,61 +1392,70 @@ void display_help(CtdlIPC * ipc, char *name) } -/* - * 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 */ - 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 */ +// 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 + 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 + int in_quote = 0; + + // Space for a single word, which can be at most screenwidth word = (char *) calloc(1, width); if (!word) { scr_printf("Can't alloc memory to print message: %s!\n", strerror(errno)); logoff(NULL, 3); } - /* Read the entire message body into memory */ + // Read the entire message body into memory if (fpin) { buffer = load_message_from_file(fpin); if (!buffer) { scr_printf("Can't print message: %s!\n", strerror(errno)); logoff(NULL, 3); } - } else { + } + else { buffer = text; } e = buffer; - /* Run the message body */ + // Run the message body while (*e) { - /* Catch characters that shouldn't be there at all */ + + // Catch characters that shouldn't be there at all if (*e == '\r') { e++; continue; } - /* First, are we looking at a newline? */ - if (*e == '\n') { + + if ((in_quote) && (*e == '\n') && (enable_color)) { + in_quote = 0; + scr_printf("\033[22m\033[22m"); + } + + if (*e == '\n') { // newline? e++; - if (*e == ' ') { /* Paragraph */ + if (*e == ' ') { // paragraph? if (fpout) { fprintf(fpout, "\n"); - } else { + } + else { scr_printf("\n"); } column = 0; - } else if (old != ' ') { /* Don't print two spaces */ + } + else if (old != ' ') { // Don't print two spaces if (fpout) { fprintf(fpout, " "); - } else { + } + else { scr_printf(" "); } column++; @@ -1541,41 +1464,41 @@ int fmout(int width, /* screen width to use */ continue; } - /* Are we looking at a nonprintable? - * (This section is now commented out because we could be displaying - * a character set like UTF-8 or ISO-8859-1.) - if ( (*e < 32) || (*e > 126) ) { - e++; - continue; - } */ + if ((*e == '>') && (column <= 1) && (!fpout) && (enable_color)) { + in_quote = 1; + scr_printf("\033[2m\033[2m"); + } - /* Or are we looking at a space? */ + // Or are we looking at a space? if (*e == ' ') { e++; if (column >= width - 1) { - /* Are we in the rightmost column? */ + // Are we in the rightmost column? if (fpout) { fprintf(fpout, "\n"); - } else { + } + else { scr_printf("\n"); } column = 0; - } else if (!(column == 0 && old == ' ')) { - /* Eat only the first space on a line */ + } + else if (!(column == 0 && old == ' ')) { + // Eat only the first space on a line if (fpout) { fprintf(fpout, " "); - } else { + } + else { scr_printf(" "); } column++; } - /* ONLY eat the FIRST space on a line */ + // ONLY eat the FIRST space on a line old = ' '; continue; } old = *e; - /* Read a word, slightly messy */ + // Read a word, slightly messy i = 0; while (e[i]) { if (!isprint(e[i]) && !isspace(e[i])) @@ -1585,46 +1508,49 @@ int fmout(int width, /* screen width to use */ i++; } - /* We should never see these, but... slightly messy */ + // We should never see these, but... slightly messy if (e[i] == '\t' || e[i] == '\f' || e[i] == '\v') e[i] = ' '; - /* Break up really long words */ - /* TODO: auto-hyphenation someday? */ - if (i >= width) + // Break up really long words + if (i >= width) { i = width - 1; + } strncpy(word, e, i); word[i] = 0; - /* Decide where to print the word */ + // Decide where to print the word if (column + i >= width) { - /* Wrap to the next line */ + // Wrap to the next line if (fpout) { fprintf(fpout, "\n"); - } else { + } + else { scr_printf("\n"); } column = 0; } - /* Print the word */ + // Print the word if (fpout) { fprintf(fpout, "%s", word); - } else { + } + else { scr_printf("%s", word); } column += i; - e += i; /* Start over with the whitepsace! */ + e += i; // Start over with the whitepsace! } free(word); if (fpin) /* We allocated this, remember? */ free(buffer); - /* Is this necessary? It makes the output kind of spacey. */ + // Is this necessary? It makes the output kind of spacey. if (fpout) { fprintf(fpout, "\n"); - } else { + } + else { scr_printf("\n"); } @@ -1632,11 +1558,8 @@ int fmout(int width, /* screen width to use */ } -/* - * support ANSI color if defined - */ -void color(int colornum) -{ +// support ANSI color if defined +void color(int colornum) { static int hold_color; static int current_color; @@ -1652,12 +1575,11 @@ void color(int colornum) current_color = colornum; if (enable_color) { - /* When switching to dim white, actually output an 'original - * pair' sequence -- this looks better on black-on-white - * terminals. - Changed to ORIGINAL_PAIR as this actually - * wound up looking horrible on black-on-white terminals, not - * to mention transparent terminals. - */ + // When switching to dim white, actually output an 'original + // pair' sequence -- this looks better on black-on-white + // terminals. - Changed to ORIGINAL_PAIR as this actually + // wound up looking horrible on black-on-white terminals, not + // to mention transparent terminals. if (colornum == ORIGINAL_PAIR) printf("\033[0;39;49m"); else @@ -1666,19 +1588,17 @@ void color(int colornum) } } -void cls(int colornum) -{ + +// Clear the screen +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) -{ +// Detect whether ANSI color is available (answerback) +void send_ansi_detect(void) { if (rc_ansi_color == 2) { printf("\033[c"); scr_flush(); @@ -1686,8 +1606,8 @@ void send_ansi_detect(void) } } -void look_for_ansi(void) -{ + +void look_for_ansi(void) { fd_set rfds; struct timeval tv; char abuf[512]; @@ -1696,9 +1616,11 @@ void look_for_ansi(void) if (rc_ansi_color == 0) { enable_color = 0; - } else if (rc_ansi_color == 1) { + } + else if (rc_ansi_color == 1) { enable_color = 1; - } else if (rc_ansi_color == 2) { + } + else if (rc_ansi_color == 2) { /* otherwise, do the auto-detect */ @@ -1735,11 +1657,8 @@ void look_for_ansi(void) } -/* - * Display key options (highlight hotkeys inside angle brackets) - */ -void keyopt(char *buf) -{ +// Display key options (highlight hotkeys inside angle brackets) +void keyopt(char *buf) { int i; color(DIM_WHITE); @@ -1747,7 +1666,8 @@ void keyopt(char *buf) if (buf[i] == '<') { scr_printf("%c", buf[i]); color(BRIGHT_MAGENTA); - } else { + } + else { if (buf[i] == '>' && buf[i + 1] != '>') { color(DIM_WHITE); } @@ -1758,12 +1678,8 @@ void keyopt(char *buf) } - -/* - * Present a key-menu line choice type of thing - */ -char keymenu(char *menuprompt, char *menustring) -{ +// Present a key-menu line choice type of thing +char keymenu(char *menuprompt, char *menustring) { int i, c, a; int choices; int do_prompt = 0; @@ -1782,7 +1698,8 @@ char keymenu(char *menuprompt, char *menustring) if (display_prompt) { if (do_prompt) { scr_printf("%s ", menuprompt); - } else { + } + else { for (i = 0; i < choices; ++i) { extract_token(buf, menustring, i, '|', sizeof buf); keyopt(buf);