char * format_editorial(char *s, int width, int flags, HANDLE_S **handlesp, gf_io_t pc) { gf_io_t gc; int *margin; EDITORIAL_S es; URL_HILITE_S uh; /* ASSUMPTION #2,341: All MIME-decoding is done by now */ gf_set_readc(&gc, s, strlen(s), CharStar, 0); margin = format_view_margin(); if(flags & FM_NOINDENT) margin[0] = margin[1] = 0; /* safety net */ if(width - (margin[0] + margin[1]) < 5){ margin[0] = margin[1] = 0; if(width < 5) width = 80; } width -= (margin[0] + margin[1]); if(width > 40){ width -= 12; es.prelen = MAX(2, MIN(margin[0] + 6, sizeof(es.prefix) - 3)); snprintf(es.prefix, sizeof(es.prefix), "%s[ ", repeat_char(es.prelen - 2, ' ')); es.postlen = 2; strncpy(es.postfix, " ]", sizeof(es.postfix)); es.postfix[sizeof(es.postfix)-1] = '\0'; } else if(width > 20){ width -= 6; es.prelen = MAX(2, MIN(margin[0] + 3, sizeof(es.prefix) - 3)); snprintf(es.prefix, sizeof(es.prefix), "%s[ ", repeat_char(es.prelen - 2, ' ')); es.postlen = 2; strncpy(es.postfix, " ]", sizeof(es.postfix)); es.postfix[sizeof(es.postfix)-1] = '\0'; } else{ width -= 2; strncpy(es.prefix, "[", sizeof(es.prefix)); es.prefix[sizeof(es.prefix)-1] = '\0'; strncpy(es.postfix, "]", sizeof(es.postfix)); es.postfix[sizeof(es.postfix)-1] = '\0'; es.prelen = 1; es.postlen = 1; } es.do_color = (!(flags & FM_NOCOLOR) && (flags & FM_DISPLAY) && pico_usingcolor()); gf_filter_init(); /* catch urls */ if((F_ON(F_VIEW_SEL_URL, ps_global) || F_ON(F_VIEW_SEL_URL_HOST, ps_global) || F_ON(F_SCAN_ADDR, ps_global)) && handlesp){ gf_link_filter(gf_line_test, gf_line_test_opt(url_hilite, gf_url_hilite_opt(&uh,handlesp,0))); } gf_link_filter(gf_wrap, gf_wrap_filter_opt(width, width, NULL, 0, (handlesp ? GFW_HANDLES : GFW_NONE))); gf_link_filter(gf_line_test, gf_line_test_opt(quote_editorial, &es)); /* If not for display, change to local end of line */ if(!(flags & FM_DISPLAY)) gf_link_filter(gf_nvtnl_local, NULL); return(gf_pipe(gc, pc)); }
/* * dfilter - pipe the data from the given storage object thru the * global display filter and into whatever the putchar's * function points to. * * Input is assumed to be UTF-8. * That's converted to user's locale and passed to rawcmd. * That's converted back to UTF-8 and passed through aux_filters. */ char * dfilter(char *rawcmd, STORE_S *input_so, gf_io_t output_pc, FILTLIST_S *aux_filters) { char *status = NULL, *cmd, *resultf = NULL, *tmpfile = NULL; int key = 0, silent = 0; if((cmd = expand_filter_tokens(rawcmd,NULL,&tmpfile,&resultf,NULL,&key,NULL, &silent)) != NULL){ suspend_busy_cue(); #ifndef _WINDOWS if(!silent){ ps_global->mangled_screen = 1; ClearScreen(); } fflush(stdout); #endif /* * If it was requested that the interaction take place via * a tmpfile, fill it with text from our input_so, and let * system_pipe handle the rest. Session key and tmp file * mode support additions based loosely on a patch * supplied by Thomas Stroesslin <*****@*****.**> */ if(tmpfile){ PIPE_S *filter_pipe; FILE *fp; gf_io_t gc, pc; STORE_S *tmpf_so; /* write the tmp file */ so_seek(input_so, 0L, 0); if((tmpf_so = so_get(FileStar, tmpfile, WRITE_ACCESS|OWNER_ONLY|WRITE_TO_LOCALE)) != NULL){ if(key){ so_puts(tmpf_so, filter_session_key()); so_puts(tmpf_so, NEWLINE); } /* copy input to tmp file */ gf_set_so_readc(&gc, input_so); gf_set_so_writec(&pc, tmpf_so); gf_filter_init(); status = gf_pipe(gc, pc); gf_clear_so_readc(input_so); gf_clear_so_writec(tmpf_so); if(so_give(&tmpf_so) != 0 && status == NULL) status = error_description(errno); /* prepare the terminal in case the filter uses it */ if(status == NULL){ if((filter_pipe = open_system_pipe(cmd, NULL, NULL, PIPE_USER | (silent ? PIPE_SILENT : (F_ON(F_DISABLE_TERM_RESET_DISP, ps_global) ? 0 : PIPE_RESET)), 0, pipe_callback, NULL)) != NULL){ if(close_system_pipe(&filter_pipe, NULL, pipe_callback) == 0){ /* pull result out of tmp file */ if((fp = our_fopen(tmpfile, "rb")) != NULL){ gf_set_readc(&gc, fp, 0L, FileStar, READ_FROM_LOCALE); gf_filter_init(); if(aux_filters) for( ; aux_filters->filter; aux_filters++) gf_link_filter(aux_filters->filter, aux_filters->data); status = gf_pipe(gc, output_pc); fclose(fp); } else status = "Can't read result of display filter"; } else status = "Filter command returned error."; } else status = "Can't open pipe for display filter"; } our_unlink(tmpfile); } else status = "Can't open display filter tmp file"; } else if((status = gf_filter(cmd, key ? filter_session_key() : NULL, input_so, output_pc, aux_filters, silent, F_ON(F_DISABLE_TERM_RESET_DISP, ps_global), pipe_callback)) != NULL){ unsigned long ch; fprintf(stdout,"\r\n%s Hit return to continue.", status); fflush(stdout); while((ch = read_char(300)) != ctrl('M') && ch != NO_OP_IDLE) putchar(BELL); } if(resultf){ if(name_file_size(resultf) > 0L) display_output_file(resultf, "Filter", NULL, DOF_BRIEF); fs_give((void **)&resultf); } resume_busy_cue(0); #ifndef _WINDOWS if(!silent) ClearScreen(); #endif fs_give((void **)&cmd); } return(status); }