From 02d5c04d14f2be4c603eec5934107bf84474f3ac Mon Sep 17 00:00:00 2001 From: Michael Hampton Date: Tue, 22 Jan 2002 10:46:25 +0000 Subject: [PATCH] * read_message() and fmout() now accept a FILE to which to send their output; this fixes quoting in the fullscreen client --- citadel/ChangeLog | 5 + citadel/citadel.c | 2 +- citadel/commands.c | 68 +++++++++----- citadel/commands.h | 4 +- citadel/messages.c | 222 +++++++++++++++++++++++++++++---------------- citadel/rooms.c | 4 +- 6 files changed, 201 insertions(+), 104 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 227db862d..a31a5952b 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,8 @@ $Log$ + Revision 590.80 2002/01/22 10:46:25 error + * read_message() and fmout() now accept a FILE to which to send their + output; this fixes quoting in the fullscreen client + Revision 590.79 2002/01/20 08:03:43 error * curses client: use the status line as "input" line in chat mode @@ -3212,3 +3216,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/citadel.c b/citadel/citadel.c index 5793f1681..e4b427f6e 100644 --- a/citadel/citadel.c +++ b/citadel/citadel.c @@ -184,7 +184,7 @@ void formout(char *name) scr_printf("%s\n", &cmd[4]); return; } - fmout(screenwidth, NULL, + fmout(screenwidth, NULL, NULL, ((userflags & US_PAGINATOR) ? 1 : 0), screenheight, 1, 1); } diff --git a/citadel/commands.c b/citadel/commands.c index 8ae1978a0..1fa6e127b 100644 --- a/citadel/commands.c +++ b/citadel/commands.c @@ -310,7 +310,7 @@ void print_express(void) scr_printf(":\n"); lines_printed++; - fmout(screenwidth, NULL, 1, screenheight, -1, 0); + fmout(screenwidth, NULL, NULL, 1, screenheight, -1, 0); } scr_printf("\n---\n"); color(BRIGHT_WHITE); @@ -1184,7 +1184,8 @@ void display_help(char *name) */ int fmout( int width, /* screen width to use */ - FILE *fp, /* file to read from, or NULL to read from server */ + FILE *fpin, /* file to read from, or NULL to read from server */ + 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 */ @@ -1207,11 +1208,11 @@ int fmout( c = 1; /* c is the current pos */ FMTA: while ((eof_flag == 0) && (strlen(buffer) < 126)) { - if (fp != NULL) { /* read from file */ - if (feof(fp)) + if (fpin != NULL) { /* read from file */ + if (feof(fpin)) eof_flag = 1; if (eof_flag == 0) { - a = getc(fp); + a = getc(fpin); buffer[strlen(buffer) + 1] = 0; buffer[strlen(buffer)] = a; } @@ -1256,9 +1257,13 @@ FMTA: while ((eof_flag == 0) && (strlen(buffer) < 126)) { if (((a == 13) || (a == 10)) && (old != 13) && (old != 10)) a = 32; if (((old == 13) || (old == 10)) && (isspace(real))) { - scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); + if (fpout) { + fprintf(fpout, "\n"); + } else { + scr_printf("\n"); + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, height); + } c = 1; } if (a > 126) @@ -1266,11 +1271,15 @@ FMTA: while ((eof_flag == 0) && (strlen(buffer) < 126)) { if (a > 32) { if (((strlen(aaa) + c) > (width - 5)) && (strlen(aaa) > (width - 5))) { - scr_printf("\n%s", aaa); + 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; - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); } b = strlen(aaa); aaa[b] = a; @@ -1279,21 +1288,33 @@ FMTA: while ((eof_flag == 0) && (strlen(buffer) < 126)) { if (a == 32) { if ((strlen(aaa) + c) > (width - 5)) { c = 1; - scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); + if (fpout) { + fprintf(fpout, "\n"); + } else { + scr_printf("\n"); + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, height); + } + } + if (fpout) { + fprintf(fpout, "%s ", aaa); + } else { + scr_printf("%s ", aaa); } - scr_printf("%s ", aaa); ++c; c = c + strlen(aaa); strcpy(aaa, ""); goto FMTA; } if ((a == 13) || (a == 10)) { - scr_printf("%s\n", aaa); + if (fpout) { + fprintf(fpout, "%s\n", aaa); + } else { + scr_printf("%s\n", aaa); + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, height); + } c = 1; - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); if (sigcaught) goto OOPS; strcpy(aaa, ""); goto FMTA; @@ -1305,9 +1326,14 @@ OOPS: do { serv_gets(aaa); } while (strcmp(aaa, "000")); -FMTEND: scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); +FMTEND: + if (fpout) { + fprintf(fpout, "\n"); + } else { + scr_printf("\n"); + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, height); + } return (sigcaught); } diff --git a/citadel/commands.h b/citadel/commands.h index 209dd06a6..aff4a8179 100644 --- a/citadel/commands.h +++ b/citadel/commands.h @@ -36,8 +36,8 @@ void newprompt(char *prompt, char *str, int len); void strprompt(char *prompt, char *str, int len); int boolprompt(char *prompt, int prev_val); int intprompt(char *prompt, int ival, int imin, int imax); -int fmout(int width, FILE *fp, char pagin, int height, int starting_lp, - char subst); +int fmout(int width, FILE *fpin, FILE *fpout, char pagin, int height, + int starting_lp, char subst); int getcmd(char *argbuf); void display_help(char *name); void color(int colornum); diff --git a/citadel/messages.c b/citadel/messages.c index 8bfc7a20e..ecbbc5b58 100644 --- a/citadel/messages.c +++ b/citadel/messages.c @@ -50,8 +50,6 @@ struct cittext { }; void sttybbs(int cmd); -int fmout(int width, FILE * fp, char pagin, int height, int starting_lp, - char subst); int haschar(char *st, int ch); int checkpagin(int lp, int pagin, int height); void getline(char *string, int lim); @@ -346,7 +344,8 @@ void citedit(FILE * fp) */ int read_message( long num, /* message number */ - char pagin) /* 0 = normal read, 1 = read with pagination, 2 = header */ + char pagin, /* 0 = normal read, 1 = read with pagination, 2 = header */ + FILE *dest) /* Destination file, NULL for screen */ { char buf[SIZ]; char m_subject[SIZ]; @@ -377,22 +376,30 @@ int read_message( strcpy(node, ""); strcpy(rfca, ""); - scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, screenheight); - scr_printf(" "); - if (pagin == 1) { + if (dest) { + fprintf(dest, "\n "); + } else { + scr_printf("\n"); + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, screenheight); + scr_printf(" "); + } + if (pagin == 1 && !dest) { color(BRIGHT_CYAN); } if (pagin == 2) { while (serv_gets(buf), strcmp(buf, "000")) { if (buf[4] == '=') { - scr_printf("%s\n", buf); - ++lines_printed; - lines_printed = - checkpagin(lines_printed, - pagin, screenheight); + if (dest) { + fprintf(dest, "%s\n", buf); + } else { + scr_printf("%s\n", buf); + ++lines_printed; + lines_printed = + checkpagin(lines_printed, + pagin, screenheight); + } } } sttybbs(0); @@ -411,48 +418,68 @@ int read_message( format_type = atoi(&buf[5]); if ((!strncasecmp(buf, "msgn=", 5)) && (rc_display_message_numbers)) { - color(DIM_WHITE); - scr_printf("["); - color(BRIGHT_WHITE); - scr_printf("#%s", &buf[5]); - color(DIM_WHITE); - scr_printf("] "); + if (dest) { + fprintf(dest, "[#%s] ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("["); + color(BRIGHT_WHITE); + scr_printf("#%s", &buf[5]); + color(DIM_WHITE); + scr_printf("] "); + } } if (!strncasecmp(buf, "from=", 5)) { - color(DIM_WHITE); - scr_printf("from "); - color(BRIGHT_CYAN); - scr_printf("%s ", &buf[5]); + if (dest) { + fprintf(dest, "from %s ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("from "); + color(BRIGHT_CYAN); + scr_printf("%s ", &buf[5]); + } } if (!strncasecmp(buf, "subj=", 5)) strcpy(m_subject, &buf[5]); if (!strncasecmp(buf, "rfca=", 5)) { safestrncpy(rfca, &buf[5], sizeof(rfca) - 5); - color(DIM_WHITE); - scr_printf("<"); - color(BRIGHT_BLUE); - scr_printf("%s", &buf[5]); - color(DIM_WHITE); - scr_printf("> "); + if (dest) { + fprintf(dest, "<%s> ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("<"); + color(BRIGHT_BLUE); + scr_printf("%s", &buf[5]); + color(DIM_WHITE); + scr_printf("> "); + } } if ((!strncasecmp(buf, "hnod=", 5)) && (strcasecmp(&buf[5], serv_info.serv_humannode)) && (strlen(rfca) == 0)) { - color(DIM_WHITE); - scr_printf("("); - color(BRIGHT_WHITE); - scr_printf("%s", &buf[5]); - color(DIM_WHITE); - scr_printf(") "); + if (dest) { + fprintf(dest, "(%s) ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("("); + color(BRIGHT_WHITE); + scr_printf("%s", &buf[5]); + color(DIM_WHITE); + scr_printf(") "); + } } if ((!strncasecmp(buf, "room=", 5)) && (strcasecmp(&buf[5], room_name)) && (strlen(rfca) == 0)) { - color(DIM_WHITE); - scr_printf("in "); - color(BRIGHT_MAGENTA); - scr_printf("%s> ", &buf[5]); + if (dest) { + fprintf(dest, "in %s> ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("in "); + color(BRIGHT_MAGENTA); + scr_printf("%s> ", &buf[5]); + } } if (!strncasecmp(buf, "node=", 5)) { @@ -465,34 +492,58 @@ int read_message( (strcasecmp(&buf[5], serv_info.serv_fqdn))))) { if (strlen(rfca) == 0) { - color(DIM_WHITE); - scr_printf("@"); - color(BRIGHT_YELLOW); - scr_printf("%s ", &buf[5]); + if (dest) { + fprintf(dest, "@%s ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("@"); + color(BRIGHT_YELLOW); + scr_printf("%s ", &buf[5]); + } } } } if (!strncasecmp(buf, "rcpt=", 5)) { - color(DIM_WHITE); - scr_printf("to "); - color(BRIGHT_CYAN); - scr_printf("%s ", &buf[5]); + if (dest) { + fprintf(dest, "to %s ", &buf[5]); + } else { + color(DIM_WHITE); + scr_printf("to "); + color(BRIGHT_CYAN); + scr_printf("%s ", &buf[5]); + } } if (!strncasecmp(buf, "time=", 5)) { fmt_date(now, atol(&buf[5]), 0); - scr_printf("%s ", now); + if (dest) { + fprintf(dest, "%s ", now); + } else { + scr_printf("%s ", now); + } } } if (nhdr == 1) { if (!is_room_aide) { - scr_printf(" ****"); + if (dest) { + fprintf(dest, " ****"); + } else { + scr_printf(" ****"); + } } else { - scr_printf(" %s", from); + if (dest) { + fprintf(dest, " %s", from); + } else { + scr_printf(" %s", from); + } } } - scr_printf("\n"); + if (dest) { + fprintf(dest, "\n"); + } else { + scr_printf("\n"); + } if (strlen(rfca) > 0) { strcpy(reply_to, rfca); @@ -501,40 +552,54 @@ int read_message( node); } - if (pagin == 1) + if (pagin == 1 && !dest) color(BRIGHT_WHITE); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, screenheight); + if (!dest) { + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, screenheight); + } if (strlen(m_subject) > 0) { - scr_printf("Subject: %s\n", m_subject); - ++lines_printed; - lines_printed = - checkpagin(lines_printed, pagin, screenheight); + if (dest) { + fprintf(dest, "Subject: %s\n", m_subject); + } else { + scr_printf("Subject: %s\n", m_subject); + ++lines_printed; + lines_printed = checkpagin(lines_printed, + pagin, screenheight); + } } if (format_type == 0) { - fr = fmout(screenwidth, NULL, + fr = fmout(screenwidth, NULL, dest, ((pagin == 1) ? 1 : 0), screenheight, (-1), 1); } else { while (serv_gets(buf), strcmp(buf, "000")) { if (sigcaught == 0) { + if (dest) { + fprintf(dest, "%s\n", buf); + } else { scr_printf("%s\n", buf); - lines_printed = lines_printed + 1 + - (strlen(buf) / screenwidth); - lines_printed = - checkpagin(lines_printed, pagin, - screenheight); + lines_printed = lines_printed + 1 + + (strlen(buf) / screenwidth); + lines_printed = + checkpagin(lines_printed, pagin, + screenheight); + } } } fr = sigcaught; } - scr_printf("\n"); - scr_flush(); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, screenheight); + if (dest) { + fprintf(dest, "\n"); + } else { + scr_printf("\n"); + scr_flush(); + ++lines_printed; + lines_printed = checkpagin(lines_printed, pagin, screenheight); + } - if (pagin == 1) + if (pagin == 1 && !dest) color(DIM_WHITE); sttybbs(0); return (fr); @@ -647,7 +712,7 @@ int client_make_message(char *filename, /* temporary file name */ if (mode == 0) { fp = fopen(filename, "r"); if (fp != NULL) { - fmout(screenwidth, fp, 0, screenheight, 0, 0); + fmout(screenwidth, fp, NULL, 0, screenheight, 0, 0); beg = ftell(fp); fclose(fp); } else { @@ -750,7 +815,7 @@ MECR: if (mode == 2) { scr_printf("\n"); fp = fopen(filename, "r"); if (fp != NULL) { - fmout(screenwidth, fp, + fmout(screenwidth, fp, NULL, ((userflags & US_PAGINATOR) ? 1 : 0), screenheight, 0, 0); beg = ftell(fp); @@ -1088,6 +1153,7 @@ void readmsgs( char cmd[SIZ]; char targ[ROOMNAMELEN]; char filename[SIZ]; + FILE *dest = NULL; /* Alternate destination other than screen */ if (c < 0) b = (MAXMSGS - 1); @@ -1164,7 +1230,7 @@ RAGAIN: pagin = ((arcflag == 0) } /* now read the message... */ - e = read_message(msg_arr[a], pagin); + e = read_message(msg_arr[a], pagin, dest); /* ...and set the screenwidth back if we have to */ if ((quotflag) || (arcflag)) { @@ -1173,13 +1239,15 @@ RAGAIN: pagin = ((arcflag == 0) RMSGREAD: scr_flush(); highest_msg_read = msg_arr[a]; if (quotflag) { - freopen("/dev/tty", "r+", stdout); + fclose(dest); + dest = NULL; quotflag = 0; enable_color = hold_color; process_quote(); } if (arcflag) { - freopen("/dev/tty", "r+", stdout); + fclose(dest); + dest = NULL; arcflag = 0; enable_color = hold_color; f = fork(); @@ -1340,14 +1408,14 @@ RMSGREAD: scr_flush(); goto RMSGREAD; case 'p': scr_flush(); - freopen(prtfile, "w", stdout); + dest = fopen(prtfile, "w"); arcflag = 1; hold_color = enable_color; enable_color = 0; goto RAGAIN; case 'q': scr_flush(); - freopen(temp2, "w", stdout); + dest = fopen(temp2, "w"); quotflag = 1; hold_color = enable_color; enable_color = 0; @@ -1408,7 +1476,7 @@ RMSGREAD: scr_flush(); } break; case 'h': - read_message(msg_arr[a], READ_HEADER); + read_message(msg_arr[a], READ_HEADER, NULL); goto RMSGREAD; case 'r': savedpos = num_msgs; diff --git a/citadel/rooms.c b/citadel/rooms.c index 55bc1c5ed..7940bb2c2 100644 --- a/citadel/rooms.c +++ b/citadel/rooms.c @@ -41,8 +41,6 @@ void dotgoto(char *towhere, int display_name); void serv_read(char *buf, int bytes); void formout(char *name); int inkey(void); -int fmout(int width, FILE * fp, char pagin, int height, int starting_lp, - char subst); void progress(long int curr, long int cmax); int pattern(char *search, char *patn); int file_checksum(char *filename); @@ -995,7 +993,7 @@ void readinfo(void) return; } - fmout(screenwidth, NULL, + fmout(screenwidth, NULL, NULL, ((userflags & US_PAGINATOR) ? 1 : 0), screenheight, 0, 1); } -- 2.39.2