]> code.citadel.org Git - citadel.git/commitdiff
html_to_ascii() "ansi" parameter is now "flags" parameter. master
authorArt Cancro <ajc@citadel.org>
Wed, 29 May 2024 22:36:34 +0000 (18:36 -0400)
committerArt Cancro <ajc@citadel.org>
Wed, 29 May 2024 22:36:34 +0000 (18:36 -0400)
H2A_ANSI is a bit that can be set in that flag bucket to tell the
renderer that the terminal supports ANSI escape sequences such as
color.

libcitadel/lib/html_to_ascii.c
libcitadel/lib/libcitadel.h
textclient/messages.c

index ca2de8df8d9e7b0eb756ca1a7186a16d5f571641..42f6438636a71aaf0fe82c28151b07d5b6c2b268 100644 (file)
@@ -25,7 +25,7 @@
 // screenwidth = desired output screenwidth
 // ansi                = if nonzero, assume output is to a terminal that supports ANSI escape codes
 //
-char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, int ansi) {
+char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, unsigned int flags) {
        char inbuf[SIZ];
        int inbuf_len = 0;
        char outbuf[SIZ];
@@ -43,6 +43,8 @@ char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, int ansi)
        int bytes_processed = 0;
        char nl[128];
 
+       int ansi = (flags & H2A_ANSI) ? 1 : 0;
+
        tag[0] = '\0';
        strcpy(nl, "\n");
        inptr = inputmsg;
index 655ebe4452baf6cb5f15653c923d03cffdb4201e..202b309b7af6d616173b9e742dcc3853c6ff3fd4 100644 (file)
@@ -430,10 +430,13 @@ void CtdlMakeTempFileName(char *name, int len);
 char *rfc2047encode(const char *line, long length);
 int is_msg_in_mset(const char *mset, long msgnum);
 int pattern2(char *search, char *patn);
-char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, int ansi);
 void LoadEntityList(char *FileName);
 void utf8ify_rfc822_string(char *buf);
 
+// flags for html_to_ascii
+#define H2A_ANSI       0x01
+char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth, unsigned int flags);
+
 
 typedef struct {
        void *the_elements;
index 343d2064fedad6b06315e1b1baa4fdf04d1271ca..54779db0e75bf9785164c8ceeafaab4ff24187c4 100644 (file)
@@ -4,7 +4,7 @@
 // late 1980s when my coding style was absolute garbage.  It
 // works, but we probably should replace most of it.
 //
-// Copyright (c) 1987-2022 by the citadel.org team
+// 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.
 
@@ -54,12 +54,12 @@ extern int rc_allow_attachments;
 extern int rc_display_message_numbers;
 extern int rc_force_mail_prompts;
 extern int editor_pid;
-extern CtdlIPC *ipc_for_signal_handlers;       /* KLUDGE cover your eyes */
+extern CtdlIPC *ipc_for_signal_handlers;       // KLUDGE cover your eyes
 int num_urls = 0;
 char urls[MAXURLS][SIZ];
 char imagecmd[SIZ];
-int has_images = 0;            /* Current msg has images */
-struct parts *last_message_parts = NULL;       /* Parts from last msg */
+int has_images = 0;                            // Current msg has images
+struct parts *last_message_parts = NULL;       // Parts from last msg
 
 
 void ka_sigcatch(int signum) {
@@ -69,9 +69,7 @@ void ka_sigcatch(int signum) {
 }
 
 
-/*
- * server keep-alive version of wait() (needed for external editor)
- */
+// server keep-alive version of wait() (needed for external editor)
 pid_t ka_wait(int *kstatus) {
        pid_t p;
 
@@ -87,9 +85,7 @@ pid_t ka_wait(int *kstatus) {
 }
 
 
-/*
- * version of system() that uses ka_wait()
- */
+// version of system() that uses ka_wait()
 int ka_system(char *shc) {
        pid_t childpid;
        pid_t waitpid;
@@ -119,9 +115,7 @@ int ka_system(char *shc) {
 }
 
 
-/*
- * add a newline to the buffer...
- */
+// add a newline to the buffer...
 void add_newline(struct cittext *textlist) {
        struct cittext *ptr;
 
@@ -140,9 +134,7 @@ void add_newline(struct cittext *textlist) {
 }
 
 
-/*
- * add a word to the buffer...
- */
+// add a word to the buffer...
 void add_word(struct cittext *textlist, char *wordbuf) {
        struct cittext *ptr;
 
@@ -163,9 +155,7 @@ void add_word(struct cittext *textlist, char *wordbuf) {
 }
 
 
-/*
- * begin editing of an opened file pointed to by fp
- */
+// begin editing of an opened file pointed to by fp
 void citedit(FILE * fp) {
        int a, prev, finished, b, last_space;
        int appending = 0;
@@ -174,7 +164,7 @@ void citedit(FILE * fp) {
        char wordbuf[MAXWORDBUF];
        int rv = 0;
 
-       /* first, load the text into the buffer */
+       // first, load the text into the buffer
        fseek(fp, 0L, 0);
        textlist = (struct cittext *) malloc(sizeof(struct cittext));
        textlist->next = NULL;
@@ -204,7 +194,7 @@ void citedit(FILE * fp) {
                prev = a;
        }
 
-       /* get text */
+       // get text
        finished = 0;
        prev = (appending ? 13 : (-1));
        strcpy(wordbuf, "");
@@ -293,7 +283,7 @@ void citedit(FILE * fp) {
                prev = a;
        } while (finished == 0);
 
-       /* write the buffer back to disk */
+       // write the buffer back to disk
        fseek(fp, 0L, 0);
        for (ptr = textlist; ptr != NULL; ptr = ptr->next) {
                fprintf(fp, "%s", ptr->text);
@@ -305,7 +295,7 @@ void citedit(FILE * fp) {
                scr_printf("failed to set message buffer: %s\n", strerror(errno));
 
 
-       /* and deallocate the memory we used */
+       // and deallocate the memory we used
        while (textlist != NULL) {
                ptr = textlist->next;
                free(textlist);
@@ -314,9 +304,7 @@ void citedit(FILE * fp) {
 }
 
 
-/*
- * Free the struct parts
- */
+// Free the struct parts
 void free_parts(struct parts *p) {
        struct parts *a_part = p;
 
@@ -330,11 +318,9 @@ void free_parts(struct parts *p) {
 }
 
 
-/*
- * This is a mini RFC2047 decoder.
- * It only handles strings encoded from UTF-8 as Quoted-printable.
- * We can do this "in place" because the converted string will always be smaller than the source string.
- */
+// This is a mini RFC2047 decoder.
+// It only handles strings encoded from UTF-8 as Quoted-printable.
+// We can do this "in place" because the converted string will always be smaller than the source string.
 void mini_2047_decode(char *s) {
        if (!s) {               // no null strings allowed!
                return;
@@ -389,20 +375,19 @@ void mini_2047_decode(char *s) {
 }
 
 
-/*
- * Read a message from the server
- */
-int read_message(CtdlIPC * ipc, long num,      /* message number */
-                int pagin,     /* 0 = normal read, 1 = read with pagination, 2 = header */
-                FILE * dest    /* Destination file, NULL for screen */
-    ) {
+// Read a message from the server
+int read_message(CtdlIPC *ipc,
+       long num,       // message number
+       int pagin,      // 0 = normal read, 1 = read with pagination, 2 = header
+       FILE *dest      // Destination file, NULL for screen
+) {
        char buf[SIZ];
        char now[256];
        int format_type = 0;
        int fr = 0;
        int nhdr = 0;
        struct ctdlipcmessage *message = NULL;
-       int r;                  /* IPC response code */
+       int r;                  // IPC response code
        char *converted_text = NULL;
        char *lineptr;
        char *nextline;
@@ -444,7 +429,7 @@ int read_message(CtdlIPC * ipc, long num,   /* message number */
                color(BRIGHT_CYAN);
        }
 
-       /* View headers only */
+       // View headers only
        if (pagin == 2) {
                scr_printf("nhdr=%s\nfrom=%s\ntype=%d\nmsgn=%s\n",
                           message->nhdr ? "yes" : "no", message->author, message->type, message->msgid);
@@ -598,14 +583,11 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                color(BRIGHT_WHITE);
        }
 
-       /******* end of header output, start of message text output *******/
+       // ****** end of header output, start of message text output ******
 
-       /*
-        * Convert HTML to plain text, formatting for the actual width
-        * of the client screen.
-        */
+       // Convert HTML to plain text, formatting for the actual width of the client screen.
        if (!strcasecmp(message->content_type, "text/html")) {
-               converted_text = html_to_ascii(message->text, 0, screenwidth, (enable_color ? 1 : 0));
+               converted_text = html_to_ascii(message->text, 0, screenwidth, (enable_color ? H2A_ANSI : 0));
                if (converted_text != NULL) {
                        free(message->text);
                        message->text = converted_text;
@@ -613,24 +595,24 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
-       /* Text/plain is a different type */
+       // Text/plain is a different type
        if (!strcasecmp(message->content_type, "text/plain")) {
                format_type = 1;
        }
 
-       /* Render text/x-markdown as plain text */
+       // Render text/x-markdown as plain text
        if (!strcasecmp(message->content_type, "text/x-markdown")) {
                format_type = 1;
        }
 
-       /* Extract URL's */
+       // Extract URL's
        static char *urlprefixes[] = {
                "http://",
                "https://",
                "ftp://"
        };
        int p = 0;
-       num_urls = 0;           /* Start with a clean slate */
+       num_urls = 0;           // Start with a clean slate
        for (p = 0; p < (sizeof urlprefixes / sizeof(char *)); ++p) {
                searchptr = message->text;
                while ((searchptr != NULL) && (num_urls < MAXURLS)) {
@@ -650,17 +632,14 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
-       /*
-        * Here we go
-        */
+       // Here we go
        if (format_type == 0) {
+               // renderer for legacy Citadel format
                fr = fmout(screenwidth, NULL, message->text, dest, 1);
        }
        else {
-               /* renderer for text/plain */
-
+               // renderer for text/plain
                lineptr = message->text;
-
                do {
                        nextline = strchr(lineptr, '\n');
                        if (nextline != NULL) {
@@ -700,18 +679,18 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
-       /* Enumerate any attachments */
+       // Enumerate any attachments
        if ((pagin == 1) && (message->attachments)) {
                struct parts *ptr;
 
                for (ptr = message->attachments; ptr; ptr = ptr->next) {
-                       if ((!strcasecmp(ptr->disposition, "attachment"))
-                           || (!strcasecmp(ptr->disposition, "inline"))
-                           || (!strcasecmp(ptr->disposition, ""))
-                           ) {
-                               if ((strcasecmp(ptr->number, message->mime_chosen))
-                                   && (!IsEmptyStr(ptr->mimetype))
-                                   ) {
+                       if (    (!strcasecmp(ptr->disposition, "attachment"))
+                               || (!strcasecmp(ptr->disposition, "inline"))
+                               || (!strcasecmp(ptr->disposition, ""))
+                       ) {
+                               if (    (strcasecmp(ptr->number, message->mime_chosen))
+                                       && (!IsEmptyStr(ptr->mimetype))
+                               ) {
                                        color(DIM_WHITE);
                                        scr_printf("Part ");
                                        color(BRIGHT_MAGENTA);
@@ -730,23 +709,22 @@ int read_message(CtdlIPC * ipc, long num, /* message number */
                }
        }
 
-       /* Save the attachments info for later */
+       // Save the attachments info for later
        last_message_parts = message->attachments;
 
-       /* Now we're done */
+       // Now we're done
        free(message->text);
        free(message);
 
-       if (pagin == 1 && !dest)
+       if (pagin == 1 && !dest) {
                color(DIM_WHITE);
+       }
        stty_ctdl(0);
        return (fr);
 }
 
 
-/*
- * replace string function for the built-in editor
- */
+// replace string function for the built-in editor
 void replace_string(char *filename, long int startpos) {
        char buf[512];
        char srch_str[128];
@@ -791,7 +769,7 @@ void replace_string(char *filename, long int startpos) {
                        rv = fwrite((char *) buf, 128, 1, fp);
                        if (rv < 0) {
                                scr_printf("failed to replace string: %s\n", strerror(errno));
-                               break;  /*whoopsi! */
+                               break;          // No replacement happened; break out of the loop
                        }
                        strcpy(buf, &buf[128]);
                        wpos = ftell(fp);
@@ -810,10 +788,15 @@ void replace_string(char *filename, long int startpos) {
 
 
 // Function to begin composing a new message
-int client_make_message(CtdlIPC * ipc, char *filename, // temporary file name
-                       char *recipient,        // NULL if it's not mail
-                       int is_anonymous, int format_type, int mode, char *subject,     // buffer to store subject line
-                       int subject_required) {
+int client_make_message(CtdlIPC *ipc,
+               char *filename,         // temporary file name
+               char *recipient,        // NULL if it's not mail
+               int is_anonymous,
+               int format_type,
+               int mode,
+               char *subject,          // buffer to store subject line
+               int subject_required
+) {
        FILE *fp;
        int a, b, e_ex_code;
        long beg;
@@ -875,7 +858,7 @@ int client_make_message(CtdlIPC * ipc, char *filename,      // temporary file name
                }
        }
 
-      ME1:switch (mode) {
+ME1:   switch (mode) {
 
        case 0:
                fp = fopen(filename, "r+");
@@ -911,8 +894,8 @@ int client_make_message(CtdlIPC * ipc, char *filename,      // temporary file name
                break;
 
        case 2:
-       default:                /* allow 2+ modes */
-               e_ex_code = 1;  /* start with a failed exit code */
+       default:                // allow 2+ modes
+               e_ex_code = 1;  // start with a failed exit code
                stty_ctdl(SB_RESTORE);
                editor_pid = fork();
                cksum = file_checksum(filename);
@@ -1001,9 +984,7 @@ int client_make_message(CtdlIPC * ipc, char *filename,     // temporary file name
 }
 
 
-/*
- * Make sure there's room in msg_arr[] for at least one more.
- */
+// Make sure there's room in msg_arr[] for at least one more.
 void check_msg_arr_size(void) {
        if ((num_msgs + 1) > msg_arr_size) {
                msg_arr_size += 512;
@@ -1012,10 +993,7 @@ void check_msg_arr_size(void) {
 }
 
 
-/*
- * break_big_lines()  -  break up lines that are >1024 characters
- *                       otherwise the server will truncate
- */
+// break_big_lines()  -  break up lines that are >1024 characters, otherwise the server will truncate them.
 void break_big_lines(char *msg) {
        char *ptr;
        char *break_here;
@@ -1036,14 +1014,13 @@ void break_big_lines(char *msg) {
 }
 
 
-/*
- * entmsg()  -  edit and create a message
- *              returns 0 if message was saved
- */
-int entmsg(CtdlIPC * ipc, int is_reply,        /* nonzero if this was a <R>eply command */
-          int c,               /* mode */
-          int masquerade       /* prompt for a non-default display name? */
-    ) {
+// entmsg()  -  edit and create a message
+//              returns 0 if message was saved
+int entmsg(CtdlIPC *ipc,
+       int is_reply,   // nonzero if this was a <R>eply command
+       int c,          // mode
+       int masquerade  // prompt for a non-default display name?
+) {
        char buf[SIZ];
        int a, b;
        int need_recp = 0;
@@ -1053,15 +1030,13 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
        char subject[SIZ];
        struct ctdlipcmessage message;
        unsigned long *msgarr = NULL;
-       int r;                  /* IPC response code */
+       int r;                  // IPC response code
        int subject_required = 0;
 
-       /*
-        * First, check to see if we have permission to enter a message in
-        * this room.  The server will return an error code if we can't.
-        */
+       // First, check to see if we have permission to enter a message in
+       // this room.  The server will return an error code if we can't.
        if (entmsg_ok == ENTMSG_OK_YES) {
-               /* no problem, go right ahead */
+               // no problem, go right ahead
        }
        else if (entmsg_ok == ENTMSG_OK_BLOG) {
                if (!is_reply) {
@@ -1092,7 +1067,7 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
        strcpy(message.author, "");
        strcpy(message.subject, "");
        strcpy(message.references, "");
-       message.text = "";      /* point to "", changes later */
+       message.text = "";      // point to "", changes later
        message.anonymous = 0;
        message.type = mode;
 
@@ -1111,9 +1086,8 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
                        }
                }
 
-               /* Trim down excessively long lists of thread references.  We eliminate the
-                * second one in the list so that the thread root remains intact.
-                */
+               // Trim down excessively long lists of thread references.  We eliminate the
+               // second one in the list so that the thread root remains intact.
                int rrtok = num_tokens(reply_references, '|');
                int rrlen = strlen(reply_references);
                if (((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10)) {
@@ -1121,7 +1095,8 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
                }
 
                snprintf(message.references, sizeof message.references, "%s%s%s",
-                        reply_references, (IsEmptyStr(reply_references) ? "" : "|"), reply_inreplyto);
+                        reply_references, (IsEmptyStr(reply_references) ? "" : "|"), reply_inreplyto
+               );
        }
 
        r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf);
@@ -1131,22 +1106,20 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                return (1);
        }
 
-       /* Error code 570 is special.  It means that we CAN enter a message
-        * in this room, but a recipient needs to be specified.
-        */
+       // Error code 570 is special.  It means that we CAN enter a message in this room, but a recipient needs to be specified.
        need_recp = 0;
        if (r / 10 == 57) {
                need_recp = 1;
        }
 
-       /* If the user is a dumbass, tell them how to type. */
+       // If the user is a dumbass, tell them how to type.
        if ((userflags & US_EXPERT) == 0) {
                scr_printf("Entering message.  Word wrap will give you soft linebreaks.  Pressing the\n");
                scr_printf("'enter' key will give you a hard linebreak and an indent.  Press 'enter' twice\n");
                scr_printf("when finished.\n");
        }
 
-       /* Handle the selection of a recipient, if necessary. */
+       // Handle the selection of a recipient, if necessary.
        strcpy(buf, "");
        if (need_recp == 1) {
                if (axlevel >= AxProbU) {
@@ -1172,7 +1145,7 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
                        message.anonymous = 1;
        }
 
-       /* If it's mail, we've got to check the validity of the recipient... */
+       // If it's mail, we've got to check the validity of the recipient...
        if (!IsEmptyStr(message.recipient)) {
                r = CtdlIPCPostMessage(ipc, 0, &subject_required, &message, buf);
                if (r / 100 != 2) {
@@ -1181,9 +1154,7 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
                }
        }
 
-       /* Learn the number of the newest message in in the room, so we can
-        * tell upon saving whether someone else has posted too.
-        */
+       // Learn the number of the newest message in in the room, so we can tell upon saving whether someone else has posted too.
        num_msgs = 0;
        r = CtdlIPCGetMessages(ipc, LastMessages, 1, NULL, &msgarr, buf);
        if (r / 100 != 1) {
@@ -1193,14 +1164,14 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                for (num_msgs = 0; msgarr[num_msgs]; num_msgs++);
        }
 
-       /* Now compose the message... */
+       // Now compose the message...
        if (client_make_message(ipc, temp, message.recipient, message.anonymous, 0, c, message.subject, subject_required) != 0) {
                if (msgarr)
                        free(msgarr);
                return (2);
        }
 
-       /* Reopen the temp file that was created, so we can send it */
+       // Reopen the temp file that was created, so we can send it
        fp = fopen(temp, "r");
 
        if (!fp || !(message.text = load_message_from_file(fp))) {
@@ -1212,19 +1183,17 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
        if (fp)
                fclose(fp);
 
-       /* Break lines that are >1024 characters, otherwise the server
-        * will truncate them.
-        */
+       // Break lines that are >1024 characters, otherwise the server will truncate them.
        break_big_lines(message.text);
 
-       /* Transmit message to the server */
+       // Transmit message to the server
        r = CtdlIPCPostMessage(ipc, 1, NULL, &message, buf);
        if (r / 100 != 4) {
                scr_printf("%s\n", buf);
                return (1);
        }
 
-       /* Yes, unlink it now, so it doesn't stick around if we crash */
+       // Yes, unlink it now, so it doesn't stick around if we crash
        unlink(temp);
 
        if (num_msgs >= 1)
@@ -1241,10 +1210,10 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                for (num_msgs = 0; msgarr[num_msgs]; num_msgs++);
        }
 
-       /* get new highest message number in room to set lrp for goto... */
+       // get new highest message number in room to set lrp for goto...
        maxmsgnum = msgarr[num_msgs - 1];
 
-       /* now see if anyone else has posted in here */
+       // now see if anyone else has posted in here
        b = (-1);
        for (a = 0; a < num_msgs; ++a) {
                if (msgarr[a] > highmsg) {
@@ -1256,9 +1225,7 @@ int entmsg(CtdlIPC * ipc, int is_reply,   /* nonzero if this was a <R>eply command
        }
        msgarr = NULL;
 
-       /* In the Mail> room, this algorithm always counts one message
-        * higher than in public rooms, so we decrement it by one.
-        */
+       // In the Mail> room, this algorithm always counts one message higher than in public rooms, so we decrement it by one.
        if (need_recp) {
                --b;
        }
@@ -1270,28 +1237,24 @@ int entmsg(CtdlIPC * ipc, int is_reply, /* nonzero if this was a <R>eply command
                scr_printf("*** %d additional messages have been entered in this room by other users.\n", b);
        }
        free(message.text);
-
        return (0);
 }
 
 
-/*
- * Do editing on a quoted file
- */
+// Do editing on a quoted file
 void process_quote(void) {
        FILE *qfile, *tfile;
        char buf[128];
        int line, qstart, qend;
 
-       // Unlink the second temp file as soon as it's opened, so it'll get
-       // deleted even if the program dies
+       // Unlink the second temp file as soon as it's opened, so it'll get deleted even if the program dies
        qfile = fopen(temp2, "r");
        unlink(temp2);
 
-       /* Display the quotable text with line numbers added */
+       // Display the quotable text with line numbers added
        line = 0;
        if (fgets(buf, 128, qfile) == NULL) {
-               /* we're skipping a line here */
+               // we're skipping a line here
        }
        while (fgets(buf, 128, qfile) != NULL) {
                scr_printf("%3d %s", ++line, buf);
@@ -1303,7 +1266,7 @@ void process_quote(void) {
        rewind(qfile);
        line = 0;
        if (fgets(buf, 128, qfile) == NULL) {
-               /* we're skipping a line here */
+               // we're skipping a line here
        }
        tfile = fopen(temp, "w");
        while (fgets(buf, 128, qfile) != NULL) {
@@ -1318,9 +1281,7 @@ void process_quote(void) {
 }
 
 
-/*
- * List the URLs which were embedded in the previous message
- */
+// List the URLs which were embedded in the previous message
 void list_urls(CtdlIPC * ipc) {
        int i;
        char cmd[SIZ];
@@ -1345,9 +1306,7 @@ void list_urls(CtdlIPC * ipc) {
 }
 
 
-/*
- * Run image viewer in background
- */
+// Run image viewer in background
 int do_image_view(const char *filename) {
        char cmd[SIZ];
        pid_t childpid;
@@ -1406,19 +1365,18 @@ int do_image_view(const char *filename) {
 }
 
 
-/*
- * View an image attached to a message
- */
+// View an image attached to a message
 void image_view(CtdlIPC * ipc, unsigned long msg) {
        struct parts *ptr = last_message_parts;
        char part[SIZ];
        int found = 0;
 
-       /* Run through available parts */
+       // Run through available parts
        for (ptr = last_message_parts; ptr; ptr = ptr->next) {
-               if ((!strcasecmp(ptr->disposition, "attachment")
-                    || !strcasecmp(ptr->disposition, "inline"))
-                   && !strncmp(ptr->mimetype, "image/", 6)) {
+               if (    (!strcasecmp(ptr->disposition, "attachment")
+                       || !strcasecmp(ptr->disposition, "inline"))
+                       && !strncmp(ptr->mimetype, "image/", 6)
+               ) {
                        found++;
                        if (found == 1) {
                                strcpy(part, ptr->number);
@@ -1427,8 +1385,9 @@ void image_view(CtdlIPC * ipc, unsigned long msg) {
        }
 
        while (found > 0) {
-               if (found > 1)
+               if (found > 1) {
                        strprompt("View which part (0 when done)", part, SIZ - 1);
+               }
                found = -found;
                for (ptr = last_message_parts; ptr; ptr = ptr->next) {
                        if ((!strcasecmp(ptr->disposition, "attachment")
@@ -1437,10 +1396,10 @@ void image_view(CtdlIPC * ipc, unsigned long msg) {
                            && !strcasecmp(ptr->number, part)) {
                                char tmp[PATH_MAX];
                                char buf[SIZ];
-                               void *file = NULL;      /* The downloaded file */
+                               void *file = NULL;      // The downloaded file
                                int r;
 
-                               /* view image */
+                               // view image
                                found = -found;
                                r = CtdlIPCAttachmentDownload(ipc, msg, ptr->number, &file, progress, buf);
                                if (r / 100 != 2) {
@@ -1467,13 +1426,12 @@ void image_view(CtdlIPC * ipc, unsigned long msg) {
 }
 
 
-/*
- * Read the messages in the current room
- */
-void readmsgs(CtdlIPC * ipc, enum MessageList c,       // see listing in citadel_ipc.h
-             enum MessageDirection rdir,       // 1=Forward (-1)=Reverse
-             int q             // Number of msgs to read (if c==3)
-    ) {
+// Read the messages in the current room
+void readmsgs(CtdlIPC *ipc,
+       enum MessageList c,     // see listing in citadel_ipc.h
+       enum MessageDirection rdir,     // 1=Forward (-1)=Reverse
+       int q           // Number of msgs to read (if c==3)
+) {
        int a, e, f, g, start;
        int savedpos;
        int hold_sw = 0;
@@ -1486,11 +1444,11 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        // see listing in citadel_ipc.h
        char targ[ROOMNAMELEN];
        char filename[PATH_MAX];
        char save_to[PATH_MAX];
-       void *attachment = NULL;        /* Downloaded attachment */
-       FILE *dest = NULL;      /* Alternate destination other than screen */
-       int r;                  /* IPC response code */
-       static int att_seq = 0; /* Attachment download sequence number */
-       int rv = 0;             /* silence the stupid warn_unused_result warnings */
+       void *attachment = NULL;        // Downloaded attachment
+       FILE *dest = NULL;              // Alternate destination other than screen
+       int r;                          // IPC response code
+       static int att_seq = 0;         // Attachment download sequence number
+       int rv = 0;                     // silence the stupid warn_unused_result warnings
 
        CtdlMakeTempFileName(prtfile, sizeof prtfile);
 
@@ -1519,7 +1477,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  // see listing in citadel_ipc.h
                return;
        }
 
-       /* this loop cycles through each message... */
+       // this loop cycles through each message...
        start = ((rdir == 1) ? 0 : (num_msgs - 1));
        for (a = start; ((a < num_msgs) && (a >= 0)); a = a + rdir) {
                while (msg_arr[a] == 0L) {
@@ -1532,30 +1490,30 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        // see listing in citadel_ipc.h
                         && (quotflag == 0)
                         && (userflags & US_PAGINATOR)) ? 1 : 0;
 
-               /* If we're doing a quote, set the screenwidth to 72 */
+               // If we're doing a quote, set the screenwidth to 72
                if (quotflag) {
                        hold_sw = screenwidth;
                        screenwidth = 72;
                }
 
-               /* If printing or archiving, set the screenwidth to 80 */
+               // If printing or archiving, set the screenwidth to 80
                if (arcflag) {
                        hold_sw = screenwidth;
                        screenwidth = 80;
                }
 
-               /* clear parts list */
+               // clear parts list
                free_parts(last_message_parts);
                last_message_parts = NULL;
 
-               /* now read the message... */
+               // now read the message...
                e = read_message(ipc, msg_arr[a], pagin, dest);
 
-               /* ...and set the screenwidth back if we have to */
+               // ...and set the screenwidth back if we have to
                if ((quotflag) || (arcflag)) {
                        screenwidth = hold_sw;
                }
-             RMSGREAD:
+RMSGREAD:
                highest_msg_read = msg_arr[a];
                if (quotflag) {
                        fclose(dest);
@@ -1574,7 +1532,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  // see listing in citadel_ipc.h
                        f = fork();
                        if (f == 0) {
                                if (freopen(prtfile, "r", stdin) == NULL) {
-                                       /* we probably should handle the error condition here */
+                                       // we probably should handle the error condition here
                                }
                                stty_ctdl(SB_RESTORE);
                                ka_system(printcmd);
@@ -1614,43 +1572,46 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        // see listing in citadel_ipc.h
                                e = (inkey() & 127);
                                e = tolower(e);
 
-/* return key same as <N> */ if (e == 10)
+                                if (e == 10) {                                 // return key same as <N>
                                        e = 'n';
+                               }
 
-/* space key same as <N> */ if (e == 32)
+                                if (e == 32) {                                 // space key same as <N>
                                        e = 'n';
+                               }
 
-/* del/move for aides only */
-                               if ((!is_room_aide)
-                                   && ((room_flags & QR_MAILBOX) == 0)
-                                   && ((room_flags2 & QR2_COLLABDEL) == 0)
-                                   ) {
-                                       if ((e == 'd') || (e == 'm'))
+                               if (    (!is_room_aide)                         // delete/move are available only to admins
+                                       && ((room_flags & QR_MAILBOX) == 0)
+                                       && ((room_flags2 & QR2_COLLABDEL) == 0)
+                               ) {
+                                       if ((e == 'd') || (e == 'm')) {
                                                e = 0;
+                                       }
                                }
 
-/* print only if available */
-                               if ((e == 'p') && (IsEmptyStr(printcmd)))
+                               if ((e == 'p') && (IsEmptyStr(printcmd))) {             // print, if available
                                        e = 0;
+                               }
 
-/* can't file if not allowed */
-                               if ((e == 'f')
-                                   && (rc_allow_attachments == 0))
+                               if ((e == 'f') && (rc_allow_attachments == 0)) {        // file attachments, if available
                                        e = 0;
+                               }
 
-/* link only if browser avail*/
-                               if ((e == 'u')
-                                   && (IsEmptyStr(rc_url_cmd)))
+                               if ((e == 'u') && (IsEmptyStr(rc_url_cmd))) {           // display urls, if a browser is available
                                        e = 0;
-                               if ((e == 'i')
-                                   && (IsEmptyStr(imagecmd) || !has_images))
+                               }
+
+                               if ((e == 'i') && (IsEmptyStr(imagecmd) || !has_images)) {      // display images, if available
                                        e = 0;
+                               }
+
                        } while ((e != 'a') && (e != 'n') && (e != 's')
                                 && (e != 'd') && (e != 'm') && (e != 'p')
                                 && (e != 'q') && (e != 'b') && (e != 'h')
                                 && (e != 'r') && (e != 'f') && (e != '?')
                                 && (e != 'u') && (e != 'c') && (e != 'y')
-                                && (e != 'i') && (e != 'o'));
+                                && (e != 'i') && (e != 'o')
+                       );
                        switch (e) {
                        case 's':
                                scr_printf("Stop");
@@ -1708,7 +1669,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  // see listing in citadel_ipc.h
                        else
                                scr_printf("\n");
                }
-             DONE_QUOTING:switch (e) {
+DONE_QUOTING:  switch (e) {
                case '?':
                        scr_printf("Options available here:\n"
                                   " ?  Help (prints this message)\n"
@@ -1770,8 +1731,9 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  // see listing in citadel_ipc.h
                        else {
                                goto RMSGREAD;
                        }
-                       if (r / 100 != 2)       /* r will be init'ed, FIXME */
-                               goto RMSGREAD;  /* the logic here sucks */
+                       if (r / 100 != 2) {     // r will be initialized.  The logic here sucks.
+                               goto RMSGREAD;
+                       }
                        break;
                case 'o':
                case 'f':
@@ -1782,23 +1744,21 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,        // see listing in citadel_ipc.h
                        }
                        else {
                                extract_token(filename, cmd, 2, '|', sizeof filename);
-                               /*
-                                * Part 1 won't have a filename; use the
-                                * subject of the message instead. IO
-                                */
+                               // Part 1 won't have a filename; use the subject of the message instead. --IO
                                if (IsEmptyStr(filename)) {
                                        strcpy(filename, reply_subject);
                                }
-                               if (e == 'o') { /* open attachment */
+                               if (e == 'o') {         // open attachment
                                        mkdir(tempdir, 0700);
                                        snprintf(save_to, sizeof save_to, "%s/%04x.%s", tempdir, ++att_seq, filename);
                                        save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to);
                                        snprintf(cmd, sizeof cmd, rc_open_cmd, save_to);
                                        rv = system(cmd);
-                                       if (rv != 0)
+                                       if (rv != 0) {
                                                scr_printf("failed to save %s Reason %d\n", cmd, rv);
+                                       }
                                }
-                               else {  /* save attachment to disk */
+                               else {  // save attachment to disk
                                        destination_directory(save_to, filename);
                                        save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to);
                                }
@@ -1865,9 +1825,7 @@ void readmsgs(CtdlIPC * ipc, enum MessageList c,  // see listing in citadel_ipc.h
 }                              /* end read routine */
 
 
-/*
- * View and edit a system message
- */
+// View and edit a system message
 void edit_system_message(CtdlIPC * ipc, char *which_message) {
        char desc[SIZ];
        char read_cmd[SIZ];
@@ -1880,10 +1838,8 @@ void edit_system_message(CtdlIPC * ipc, char *which_message) {
 }
 
 
-/*
- * Loads the contents of a file into memory.  Caller must free the allocated memory.
- */
-char *load_message_from_file(FILE * src) {
+// Loads the contents of a file into memory.  Caller must free the allocated memory.
+char *load_message_from_file(FILE *src) {
        size_t i;
        size_t got = 0;
        char *dest = NULL;
@@ -1893,8 +1849,9 @@ char *load_message_from_file(FILE * src) {
        rewind(src);
 
        dest = (char *) calloc(1, i + 1);
-       if (!dest)
+       if (!dest) {
                return NULL;
+       }
 
        while (got < i) {
                size_t g;
@@ -1902,10 +1859,10 @@ char *load_message_from_file(FILE * src) {
                g = fread(dest + got, 1, i - got, src);
                got += g;
                if (g < i - got) {
-                       /* Interrupted system call, keep going */
-                       if (errno == EINTR)
-                               continue;
-                       /* At this point we have either EOF or error */
+                       if (errno == EINTR) {
+                               continue;               // Interrupted system call, keep going
+                       }
+                       // At this point we have either EOF or error
                        i = got;
                        break;
                }