1 #if !defined(lint) && !defined(DOS)
2 static char rcsid
[] = "$Id: main.c 1184 2008-12-16 23:52:15Z hubert@u.washington.edu $";
6 * ========================================================================
7 * Copyright 2006-2008 University of Washington
8 * Copyright 2013-2017 Eduardo Chappa
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * ========================================================================
20 * Program: Main stand-alone Pine Composer routines
25 * 08 Jan 92 - removed PINE defines to simplify compiling
27 * 08 Apr 92 - removed PINE stub calls
32 #include "../c-client/mail.h"
33 #include "../c-client/rfc822.h"
34 #include "../c-client/utf8.h"
35 #include "../pith/osdep/collate.h"
36 #include "../pith/charconv/filesys.h"
37 #include "../pith/charconv/utf8.h"
38 #include "../pith/conf.h"
41 * Useful internal prototypes
44 int pico_file_drop(int, int, char *);
48 * this isn't defined in the library, because it's a pine global
49 * which we use for GetKey's timeout
54 int my_timer_period
= (300 * 1000);
57 * function key mappings
59 static UCS fkm
[12][2] = {
78 char *pico_args(int, char **, int *, int *, int *);
79 void pico_args_help(void);
80 void pico_vers_help(void);
81 void pico_display_args_err(char *, char **, int);
83 PCOLORS
*pico_set_global_colors(int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
84 void display_color_codes(void);
85 #endif /* ! _WINDOWS */
87 /* TRANSLATORS: An error message about an unknown flag (option)
88 on the command line */
89 char args_pico_missing_flag
[] = N_("unknown flag \"%c\"");
90 /* TRANSLATORS: error message about command line */
91 char args_pico_missing_arg
[] = N_("missing or empty argument to \"%c\" flag");
92 char args_pico_missing_num
[] = N_("non numeric argument for \"%c\" flag");
93 char args_pico_missing_color
[] = N_("missing color for \"%s\" flag");
94 char args_pico_missing_charset
[] = N_("missing character set for \"%s\" flag");
95 char args_pico_input_charset
[] = N_("input character set \"%s\" is unsupported");
96 char args_pico_output_charset
[] = N_("output character set \"%s\" is unsupported");
98 char *args_pico_args
[] = {
99 /* TRANSLATORS: little help printed out when incorrect arguments
100 are given to pico program. */
101 N_("Possible Starting Arguments for Pico editor:"),
103 N_("\tArgument\t\tMeaning"),
104 N_("\t -e \t\tComplete - allow file name completion"),
105 N_("\t -k \t\tCut - let ^K cut from cursor position to end of line"),
106 N_("\t -a \t\tShowDot - show dot files in file browser"),
107 N_("\t -j \t\tGoto - allow 'Goto' command in file browser"),
108 N_("\t -g \t\tShow - show cursor in file browser"),
109 N_("\t -m \t\tMouse - turn on mouse support"),
110 N_("\t -x \t\tNoKeyhelp - suppress keyhelp"),
111 N_("\t -p \t\tPreserveStartStop - preserve \"start\"(^Q) and \"stop\"(^S) characters"),
112 N_("\t -q \t\tTermdefWins - termcap or terminfo takes precedence over defaults"),
113 N_("\t -Q <quotestr> \tSet quote string (eg. \"> \") esp. for composing email"),
114 N_("\t -d \t\tRebind - let delete key delete current character"),
115 N_("\t -f \t\tKeys - force use of function keys"),
116 N_("\t -b \t\tReplace - allow search and replace"),
117 N_("\t -h \t\tHelp - give this list of options"),
118 N_("\t -r[#cols] \tFill - set fill column to #cols columns, default=72"),
119 N_("\t -n[#s] \tMail - notify about new mail every #s seconds, default=180"),
120 N_("\t -s <speller> \tSpeller - specify alternative speller"),
121 N_("\t -t \t\tShutdown - enable special shutdown mode"),
122 N_("\t -o <dir>\tOperation - specify the operating directory"),
123 N_("\t -z \t\tSuspend - allow use of ^Z suspension"),
124 N_("\t -w \t\tNoWrap - turn off word wrap"),
125 N_("\t -W <wordseps> \tSet word separators other than whitespace"),
127 N_("\t -dcs <display_character_set> \tdefault uses LANG or LC_CTYPE from environment"),
128 N_("\t -kcs <keyboard_character_set> \tdefaults to display_character_set"),
129 N_("\t -syscs\t\tuse system-supplied translation routines"),
130 #endif /* ! _WINDOWS */
132 N_("\t -cnf color \tforeground color"),
133 N_("\t -cnb color \tbackground color"),
134 N_("\t -crf color \treverse foreground color"),
135 N_("\t -crb color \treverse background color"),
136 #endif /* _WINDOWS */
137 N_("\t -color_code \tdisplay number codes for different colors"),
138 N_("\t -ncolors number \tnumber of colors for screen (8, 16, or 256)"),
139 N_("\t -ntfc number \tnumber of color of foreground text"),
140 N_("\t -ntbc number \tnumber of color of the background"),
141 N_("\t -rtfc number \tnumber of color of reverse text"),
142 N_("\t -rtbc number \tnumber of color of reverse background"),
143 N_("\t -tbfc number \tnumber of color of foreground (text) of the title bar"),
144 N_("\t -tbbc number \tnumber of color of background of the title bar"),
145 N_("\t -klfc number \tnumber of color of foreground (text) of the key label"),
146 N_("\t -klbc number \tnumber of color of background of the key label"),
147 N_("\t -knfc number \tnumber of color of foreground (text) of the key name"),
148 N_("\t -knbc number \tnumber of color of background of the key name"),
149 N_("\t -stfc number \tnumber of color of foreground (text) of the status line"),
150 N_("\t -stbc number \tnumber of color of background of the status line"),
151 N_("\t -prfc number \tnumber of color of foreground (text) of a prompt"),
152 N_("\t -prbc number \tnumber of color of background of a prompt"),
153 N_("\t -q1fc number \tnumber of color of foreground (text) of level one of quoted text"),
154 N_("\t -q1bc number \tnumber of color of background of level one of quoted text"),
155 N_("\t -q2fc number \tnumber of color of foreground (text) of level two of quoted text"),
156 N_("\t -q2bc number \tnumber of color of background of level two of quoted text"),
157 N_("\t -q3fc number \tnumber of color of foreground (text) of level three of quoted text"),
158 N_("\t -q3bc number \tnumber of color of background of level three of quoted text"),
159 N_("\t -sbfc number \tnumber of color of foreground of signature block text"),
160 N_("\t -sbbc number \tnumber of color of background of signature block text"),
161 N_("\t +[line#] \tLine - start on line# line, default=1"),
162 N_("\t -v \t\tView - view file"),
163 N_("\t -no_setlocale_collate\tdo not do setlocale(LC_COLLATE)"),
164 N_("\t -version\tPico version number"),
166 N_("\t All arguments may be followed by a file name to display."),
173 * main standalone pico routine
177 app_main (int argc
, char *argv
[])
180 main(int argc
, char *argv
[])
187 int viewflag
= FALSE
; /* are we starting in view mode?*/
188 int starton
= 0; /* where's dot to begin with? */
189 int setlocale_collate
= 1;
190 char bname
[NBUFN
]; /* buffer name of file to read */
191 char *file_to_edit
= NULL
;
192 char *display_charmap
= NULL
, *dc
;
193 char *keyboard_charmap
= NULL
;
198 utf8_parameters(SET_UCS4WIDTH
, (void *) pith_ucs4width
);
199 #endif /* _WINDOWS */
201 set_input_timeout(600);
202 Pmaster
= NULL
; /* turn OFF composer functionality */
206 * Read command line flags before initializing, otherwise, we never
207 * know to init for f_keys...
209 file_to_edit
= pico_args(argc
, argv
, &starton
, &viewflag
, &setlocale_collate
);
211 set_collation(setlocale_collate
, 1);
213 #define cpstr(s) strcpy((char *)fs_get(1+strlen(s)), s)
216 init_utf8_display(1, NULL
);
220 if(display_character_set
)
221 display_charmap
= cpstr(display_character_set
);
222 #if HAVE_LANGINFO_H && defined(CODESET)
223 else if((dc
= nl_langinfo_codeset_wrapper()) != NULL
)
224 display_charmap
= cpstr(dc
);
228 display_charmap
= cpstr("US-ASCII");
230 if(keyboard_character_set
)
231 keyboard_charmap
= cpstr(keyboard_character_set
);
233 keyboard_charmap
= cpstr(display_charmap
);
236 if(use_system_translation
){
237 #if PREREQ_FOR_SYS_TRANSLATION
239 /* This modifies its arguments */
240 if(setup_for_input_output(use_system
, &display_charmap
, &keyboard_charmap
,
241 &input_cs
, &err
) == -1){
242 fprintf(stderr
, "%s\n", err
? err
: "trouble with character set");
246 fprintf(stderr
, "%s\n", err
);
247 fs_give((void **) &err
);
253 if(setup_for_input_output(use_system
, &display_charmap
, &keyboard_charmap
,
254 &input_cs
, &err
) == -1){
255 fprintf(stderr
, "%s\n", err
? err
: "trouble with character set");
259 fprintf(stderr
, "%s\n", err
);
260 fs_give((void **) &err
);
264 if(keyboard_charmap
){
265 set_locale_charmap(keyboard_charmap
);
266 free((void *) keyboard_charmap
);
270 free((void *) display_charmap
);
275 * There are a couple arguments that we need to be sure
276 * are converted for internal use.
279 alt_speller
= cpstr(fname_to_utf8(alt_speller
));
281 if(opertree
&& opertree
[0]){
282 strncpy(opertree
, fname_to_utf8(opertree
), sizeof(opertree
));
283 opertree
[sizeof(opertree
)-1] = '\0';
286 if(glo_quote_str_orig
)
287 glo_quote_str
= utf8_to_ucs4_cpystr(fname_to_utf8(glo_quote_str_orig
));
289 if(glo_wordseps_orig
)
290 glo_wordseps
= utf8_to_ucs4_cpystr(fname_to_utf8(glo_wordseps_orig
));
293 file_to_edit
= cpstr(fname_to_utf8(file_to_edit
));
297 #if defined(DOS) || defined(OS2)
298 if(file_to_edit
){ /* strip quotes? */
301 if(strchr("'\"", file_to_edit
[0])
302 && (l
= strlen(file_to_edit
)) > 1
303 && file_to_edit
[l
-1] == file_to_edit
[0]){
304 file_to_edit
[l
-1] = '\0'; /* blat trailing quote */
305 file_to_edit
++; /* advance past leading quote */
310 if(!vtinit()) /* Displays. */
313 strncpy(bname
, "main", sizeof(bname
)); /* default buffer name */
314 bname
[sizeof(bname
)-1] = '\0';
315 edinit(bname
); /* Buffers, windows. */
317 update(); /* let the user know we are here */
318 sgarbf
= TRUE
; /* next update, repaint all */
321 mswin_setwindow(NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
323 mswin_showcaret(1); /* turn on for main window */
324 mswin_allowpaste(MSWIN_PASTE_FULL
);
325 mswin_setclosetext("Use the ^X command to exit Pico.");
326 mswin_setscrollcallback (pico_scroll_callback
);
329 #if defined(USE_TERMCAP) || defined(USE_TERMINFO) || defined(VMS)
330 if(kbesc
== NULL
){ /* will arrow keys work ? */
331 (*term
.t_putchar
)('\007');
332 emlwrite("Warning: keypad keys may be non-functional", NULL
);
334 #endif /* USE_TERMCAP/USE_TERMINFO/VMS */
336 if(file_to_edit
){ /* Any file to edit? */
338 makename(bname
, file_to_edit
); /* set up a buffer for this file */
340 bp
= curbp
; /* read in first file */
341 makename(bname
, file_to_edit
);
342 strncpy(bp
->b_bname
, bname
, sizeof(bp
->b_bname
));
343 bp
->b_bname
[sizeof(bp
->b_bname
)-1] = '\0';
345 if(strlen(file_to_edit
) >= NFILEN
){
348 snprintf(buf
, sizeof(buf
), "Filename \"%.10s...\" too long", file_to_edit
);
353 strncpy(bp
->b_fname
, file_to_edit
, sizeof(bp
->b_fname
));
354 bp
->b_fname
[sizeof(bp
->b_fname
)-1] = '\0';
355 if (((gmode
&MDTREE
) && !in_oper_tree(file_to_edit
)) ||
356 readin(file_to_edit
, (viewflag
==FALSE
), TRUE
) == ABORT
) {
357 if ((gmode
&MDTREE
) && !in_oper_tree(file_to_edit
)){
360 emlwrite(_("Can't read file from outside of %s"), &eml
);
368 strncpy(bp
->b_bname
, "main", sizeof(bp
->b_bname
));
369 bp
->b_bname
[sizeof(bp
->b_bname
)-1] = '\0';
370 strncpy(bp
->b_fname
, "", sizeof(bp
->b_fname
));
371 bp
->b_fname
[sizeof(bp
->b_fname
)-1] = '\0';
374 bp
->b_dotp
= bp
->b_linep
;
377 if (viewflag
) /* set the view mode */
378 bp
->b_mode
|= MDVIEW
;
381 /* setup to process commands */
382 lastflag
= 0; /* Fake last flags. */
383 curbp
->b_mode
|= gmode
; /* and set default modes*/
385 curwp
->w_flag
|= WFMODE
; /* and force an update */
390 eml
.s
= comatose(get_input_timeout());
391 emlwrite(_("Checking for new mail every %s seconds"), &eml
);
395 forwline(0, starton
- 1); /* move dot to specified line */
400 pico_set_colorp(Pcolors
->ntcp
, PSC_NONE
);
404 if(km_popped
== 0) /* cause bottom three lines to be repainted */
405 curwp
->w_flag
|= WFHARD
;
408 if(km_popped
){ /* temporarily change to cause menu to be painted */
410 curwp
->w_ntrows
-= 2;
411 curwp
->w_flag
|= WFMODE
;
412 movecursor(term
.t_nrow
-2, 0); /* clear status line, too */
416 update(); /* Fix up the screen */
419 curwp
->w_ntrows
+= 2;
424 /* New mouse function for real mouse text seletion. */
425 register_mfunc(mouse_in_pico
, 2, 0, term
.t_nrow
- (term
.t_mrow
+ 1),
428 mouse_in_content(KEY_MOUSE
, -1, -1, 0, 0);
429 register_mfunc(mouse_in_content
, 2, 0, term
.t_nrow
- (term
.t_mrow
+ 1),
434 mswin_setdndcallback (pico_file_drop
);
435 mswin_mousetrackcallback(pico_cursor
);
440 clear_mfunc(mouse_in_pico
);
442 clear_mfunc(mouse_in_content
);
446 mswin_cleardndcallback ();
447 mswin_mousetrackcallback(NULL
);
450 if(timeoutset
&& (c
== NODATA
|| time_to_check())){
452 emlwrite(_("You may possibly have new mail."), NULL
);
463 /* clear bottom three lines */
471 if(mpresf
){ /* erase message line? */
472 if(mpresf
++ > MESSDELAY
)
480 clear_mfunc(mouse_in_content
);
483 execute(normalize_cmd(c
, fkm
, 1), f
, n
);
489 display_color_codes(void)
492 int i
, j
, k
, l
, a
, len
, len_entry
, row
;
494 COLOR_PAIR
*lastc
= NULL
, *newcp
;
497 /* this is the format "SPACE COLORED_SPACES = CODE SPACE" */
498 vtterminalinfo(gmode
& MDTCAPWINS
);
500 (*term
.t_rev
)(FALSE
);
502 pico_toggle_color(1);
503 if((ncolors
= pico_count_in_color_table()) <= 0){
504 fprintf(stderr
, "%s", "Your screen does not support colors\r\n");
509 if(term
.t_ncol
< 62 || term
.t_nrow
< 23){
510 fprintf(stderr
, "%s", "Screen must have at least 24 rows and 63 columns\r\n");
515 fprintf(stdout
, "%s", "The code of a color is the number in the same row plus\r\n");
516 fprintf(stdout
, "%s", "the number in the same column as that color.\r\n\r\n");
518 lastc
= pico_get_cur_color();
520 case 8: pico_set_color_options(COLOR_ANSI8_OPT
|COLOR_TRANS_OPT
); break;
521 case 16: pico_set_color_options(COLOR_ANSI16_OPT
|COLOR_TRANS_OPT
); break;
522 case 256: pico_set_color_options(COLOR_ANSI256_OPT
|COLOR_TRANS_OPT
); break;
523 default : fprintf(stderr
, "Unknown number of colors %d\n", ncolors
);
529 for(k
= -1; 16*k
< ncolors
; k
++){
530 for(l
= -1; l
< ncolors
; l
++){
534 fprintf(stdout
, "%s", " ");
536 fprintf(stdout
, "%3d", l
);
541 pico_toggle_color(1);
542 fprintf(stdout
, "%3d ", k
);
545 if(ncolors
|| l
< 8){
547 newcp
= new_color_pair(colorx(0), colorx(i
));
548 pico_set_colorp(newcp
, PSC_NONE
);
549 fprintf(stdout
, "%s", SPACES
);
550 pico_set_colorp(lastc
, PSC_NONE
);
555 pico_toggle_color(0);
557 fprintf(stdout
, " (%d colors)", ncolors
);
558 if(k
!= -1 || ncolors
== 8)
559 fprintf(stdout
, "%s", "\r\n");
562 fprintf(stdout
, "%s", "Codes for terminal with 256 colors:\r\n");
564 for(k
= -1; 36*k
< ncolors
; k
++){
565 for(l
= -1; l
< ncolors
&& l
< 16; l
++){
568 fprintf(stdout
, "%s", " ");
570 fprintf(stdout
, "%3d", l
);
574 pico_toggle_color(1);
575 fprintf(stdout
, "%3d ", 36*k
);
579 newcp
= new_color_pair(colorx(0), colorx(i
));
580 pico_set_colorp(newcp
, PSC_NONE
);
581 fprintf(stdout
, "%s", SPACES
);
582 pico_set_colorp(lastc
, PSC_NONE
);
586 pico_toggle_color(0);
587 fprintf(stdout
, "%s", "\r\n");
590 for(k
= -1; 16 + 36*k
< ncolors
; k
++){
591 for(l
= -1; l
< ncolors
&& l
< a
; l
++){
594 fprintf(stdout
, "%s", " ");
596 fprintf(stdout
, "%3d", l
);
600 pico_toggle_color(1);
601 fprintf(stdout
, "%3d ", 16 + 36*k
);
605 newcp
= new_color_pair(colorx(0), colorx(i
));
606 pico_set_colorp(newcp
, PSC_NONE
);
607 fprintf(stdout
, "%s", SPACES
);
608 pico_set_colorp(lastc
, PSC_NONE
);
612 pico_toggle_color(0);
613 fprintf(stdout
, "%s", "\r\n");
616 pico_set_colorp(lastc
, PSC_NONE
);
618 #endif /* ! _WINDOWS */
622 * Parse the command line args.
626 * starton -- place to return starton value
627 * viewflag -- place to return viewflag value
629 * Result: command arguments parsed
630 * possible printing of help for command line
631 * various global flags set
632 * returns the name of any file to open, else NULL
635 pico_args(int ac
, char **av
, int *starton
, int *viewflag
, int *setlocale_collate
)
639 char tmp_1k_buf
[1000]; /* tmp buf to contain err msgs */
641 int ncolors
, ntfc
, ntbc
, rtfc
, rtbc
;
642 int tbfc
, tbbc
, klfc
, klbc
, knfc
, knbc
, stfc
, stbc
, prfc
, prbc
;
643 int q1fc
, q1bc
, q2fc
, q2bc
, q3fc
, q3bc
, sbfc
, sbbc
;
646 ntfc
= ntbc
= rtfc
= rtbc
= tbfc
= tbbc
= klfc
= klbc
= knfc
=
647 knbc
= stfc
= stbc
= prfc
= prbc
= q1fc
= q1bc
= q2fc
= q2bc
=
648 q3fc
= q3bc
= sbfc
= sbbc
= -1;
649 #endif /* ! _WINDOWS */
652 /* while more arguments with leading - or + */
653 while(--ac
> 0 && (**++av
== '-' || **av
== '+')){
660 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_arg
), '+');
661 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
666 if(!isdigit((unsigned char)str
[0])){
667 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_num
), '+');
668 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
673 *starton
= atoi(str
);
678 /* while more chars in this argument */
681 if(strcmp(*av
, "version") == 0){
684 #ifndef _WINDOWS /* color configuration disabled in Windows at this time */
685 else if(strcmp(*av
, "ntfc") == 0
686 || strcmp(*av
, "ntbc") == 0
687 || strcmp(*av
, "rtfc") == 0
688 || strcmp(*av
, "rtbc") == 0
689 || strcmp(*av
, "tbfc") == 0
690 || strcmp(*av
, "tbbc") == 0
691 || strcmp(*av
, "klfc") == 0
692 || strcmp(*av
, "klbc") == 0
693 || strcmp(*av
, "knfc") == 0
694 || strcmp(*av
, "knbc") == 0
695 || strcmp(*av
, "stfc") == 0
696 || strcmp(*av
, "stbc") == 0
697 || strcmp(*av
, "prfc") == 0
698 || strcmp(*av
, "prbc") == 0
699 || strcmp(*av
, "q1fc") == 0
700 || strcmp(*av
, "q1bc") == 0
701 || strcmp(*av
, "q2fc") == 0
702 || strcmp(*av
, "q2bc") == 0
703 || strcmp(*av
, "q3fc") == 0
704 || strcmp(*av
, "q3bc") == 0
705 || strcmp(*av
, "sbfc") == 0
706 || strcmp(*av
, "sbbc") == 0
707 || strcmp(*av
, "ncolors") == 0){
712 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_arg
), '-');
713 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
718 if(!isdigit((unsigned char)**av
)){
719 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_num
), '-');
720 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
723 if(strcmp(str
, "ntfc") == 0) ntfc
= atoi(*av
);
724 else if (strcmp(str
, "ntbc") == 0) ntbc
= atoi(*av
);
725 else if (strcmp(str
, "rtfc") == 0) rtfc
= atoi(*av
);
726 else if (strcmp(str
, "rtbc") == 0) rtbc
= atoi(*av
);
727 else if (strcmp(str
, "tbfc") == 0) tbfc
= atoi(*av
);
728 else if (strcmp(str
, "tbbc") == 0) tbbc
= atoi(*av
);
729 else if (strcmp(str
, "klfc") == 0) klfc
= atoi(*av
);
730 else if (strcmp(str
, "klbc") == 0) klbc
= atoi(*av
);
731 else if (strcmp(str
, "knfc") == 0) knfc
= atoi(*av
);
732 else if (strcmp(str
, "knbc") == 0) knbc
= atoi(*av
);
733 else if (strcmp(str
, "stfc") == 0) stfc
= atoi(*av
);
734 else if (strcmp(str
, "stbc") == 0) stbc
= atoi(*av
);
735 else if (strcmp(str
, "prfc") == 0) prfc
= atoi(*av
);
736 else if (strcmp(str
, "prbc") == 0) prbc
= atoi(*av
);
737 else if (strcmp(str
, "q1fc") == 0) q1fc
= atoi(*av
);
738 else if (strcmp(str
, "q1bc") == 0) q1bc
= atoi(*av
);
739 else if (strcmp(str
, "q2fc") == 0) q2fc
= atoi(*av
);
740 else if (strcmp(str
, "q2bc") == 0) q2bc
= atoi(*av
);
741 else if (strcmp(str
, "q3fc") == 0) q3fc
= atoi(*av
);
742 else if (strcmp(str
, "q3bc") == 0) q3bc
= atoi(*av
);
743 else if (strcmp(str
, "sbfc") == 0) sbfc
= atoi(*av
);
744 else if (strcmp(str
, "sbbc") == 0) sbbc
= atoi(*av
);
745 else if (strcmp(str
, "ncolors") == 0) ncolors
= atoi(*av
);
746 if(!strcmp(str
, "ncolors")){
748 case 8: pico_set_color_options(COLOR_ANSI8_OPT
|COLOR_TRANS_OPT
); break;
749 case 16: pico_set_color_options(COLOR_ANSI16_OPT
|COLOR_TRANS_OPT
); break;
750 case 256: pico_set_color_options(COLOR_ANSI256_OPT
|COLOR_TRANS_OPT
); break;
751 default : snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _("Unsupported number of colors: %d"), ncolors
);
752 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
759 else if(strcmp(*av
, "color_codes") == 0){
760 display_color_codes();
763 #endif /* ! _WINDOWS */
764 else if(strcmp(*av
, "no_setlocale_collate") == 0){
765 *setlocale_collate
= 0;
769 else if(strcmp(*av
, "syscs") == 0){
770 use_system_translation
= !use_system_translation
;
773 #endif /* ! _WINDOWS */
775 else if(strcmp(*av
, "cnf") == 0
776 || strcmp(*av
, "cnb") == 0
777 || strcmp(*av
, "crf") == 0
778 || strcmp(*av
, "crb") == 0){
780 char *cmd
= *av
; /* save it to use below */
787 else if(cmd
[2] == 'b')
790 else if(cmd
[1] == 'r'){
793 else if(cmd
[2] == 'b')
798 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_color
), cmd
);
799 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
805 #endif /* _WINDOWS */
807 else if(strcmp(*av
, "dcs") == 0 || strcmp(*av
, "kcs") == 0){
811 if(strcmp(*av
, "dcs") == 0){
812 display_character_set
= *++av
;
813 if(!output_charset_is_supported(display_character_set
)){
814 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_output_charset
), display_character_set
);
815 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
820 keyboard_character_set
= *++av
;
821 if(!input_charset_is_supported(keyboard_character_set
)){
822 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_input_charset
), keyboard_character_set
);
823 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
829 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_charset
), cmd
);
830 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
836 #endif /* ! _WINDOWS */
839 * Single char options.
843 * These don't take arguments.
846 gmode
^= MDDOTSOK
; /* show dot files */
851 * Make MDREPLACE always on instead
852 * Don't leave this to allow turning off of MDREPLACE because the
853 * polarity of -b will have changed. Don't think anybody wants to
856 gmode
^= MDREPLACE
; /* -b for replace string in where is command */
859 case 'd': /* -d for rebind delete key */
860 bindtokey(0x7f, forwdel
);
862 case 'e': /* file name completion */
865 case 'f': /* -f for function key use */
868 case 'g': /* show-cursor in file browser */
874 case 'j': /* allow "Goto" in file browser */
877 case 'k': /* kill from dot */
880 case 'm': /* turn on mouse support */
884 preserve_start_stop
= 1;
886 case 'q': /* -q for termcap takes precedence */
889 case 't': /* special shutdown mode */
891 rebindfunc(wquit
, quickexit
);
893 case 'v': /* -v for View File */
895 *viewflag
= !*viewflag
;
896 break; /* break back to inner-while */
897 case 'w': /* -w turn off word wrap */
900 case 'x': /* suppress keyhelp */
901 sup_keyhelp
= !sup_keyhelp
;
903 case 'z': /* -z to suspend */
908 * These do take arguments.
910 case 'r': /* set fill column */
911 case 'n': /* -n for new mail notification */
912 case 's' : /* speller */
913 case 'o' : /* operating tree */
914 case 'Q' : /* Quote string */
915 case 'W' : /* Word separators */
926 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_arg
), c
);
927 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
938 strncpy(opertree
, str
, NLINE
);
942 glo_quote_str_orig
= str
;
945 glo_wordseps_orig
= str
;
951 if(!isdigit((unsigned char)str
[0])){
952 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_num
), c
);
953 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
958 if((userfillcol
= atoi(str
)) < 1)
963 set_input_timeout(180);
964 if(set_input_timeout(atoi(str
)) < 30)
965 set_input_timeout(180);
974 snprintf(tmp_1k_buf
, sizeof(tmp_1k_buf
), _(args_pico_missing_flag
), c
);
975 pico_display_args_err(tmp_1k_buf
, NULL
, 1);
986 Pcolors
= pico_set_global_colors(ncolors
, ntfc
, ntbc
, rtfc
, rtbc
,
987 tbfc
, tbbc
, klfc
, klbc
, knfc
, knbc
, stfc
, stbc
, prfc
, prbc
,
988 q1fc
, q1bc
, q2fc
, q2bc
, q3fc
, q3bc
, sbfc
, sbbc
);
991 pico_toggle_color(1);
992 #endif /* ! _WINDOWS */
994 /* return the first filename for editing */
1004 pico_set_global_colors(int nc
, int ntfg
, int ntbg
, int rtfg
, int rtbg
,
1005 int tbfg
, int tbbg
, int klfg
, int klbg
,
1006 int knfg
, int knbg
, int stfg
, int stbg
, int prfg
, int prbg
,
1007 int q1fg
, int q1bg
, int q2fg
, int q2bg
, int q3fg
, int q3bg
,
1010 PCOLORS
*pcolors
= NULL
;
1013 if(nc
!= 0 && nc
!= 8 && nc
!= 16 && nc
!= 256){
1014 fprintf(stderr
, "number of colors must be either 8, 16 or 256\n");
1019 if(ntfg
!= -1 || ntbg
!= -1 || tbfg
!= -1 || tbbg
!= -1 ||
1020 klfg
!= -1 || klbg
!= -1 || knfg
!= -1 || knbg
!= -1 ||
1021 stfg
!= -1 || stbg
!= -1 || prfg
!= -1 || prbg
!= -1 ||
1022 q1fg
!= -1 || q1bg
!= -1 || q2fg
!= -1 || q1bg
!= -1 ||
1023 q3fg
!= -1 || q3bg
!= -1 || sbfg
!= -1 || sbbg
!= -1 ||
1024 rtfg
!= -1 || rtbg
!= -1){
1025 fprintf(stderr
, "can not specify color numbers without specifying number of colors\n");
1029 return pcolors
; /* no colors used */
1032 if(ntfg
>= nc
|| ntbg
>= nc
|| tbfg
>= nc
|| tbbg
>= nc
1033 || klfg
>= nc
|| klbg
>= nc
|| knfg
>= nc
|| knbg
>= nc
1034 || stfg
>= nc
|| stbg
>= nc
|| prfg
>= nc
|| prbg
>= nc
1035 || q1fg
>= nc
|| q1bg
>= nc
|| q2fg
>= nc
|| q2bg
>= nc
1036 || q3fg
>= nc
|| q3bg
>= nc
|| sbfg
>= nc
|| sbbg
>= nc
1037 || rtfg
>= nc
|| rtbg
>= nc
){
1038 fprintf(stderr
, "Error: specified a color bigger than number of colors\n");
1042 /* Finally, we set up colors */
1043 pico_toggle_color(0);
1045 case 8: pico_set_color_options(COLOR_ANSI8_OPT
|COLOR_TRANS_OPT
); break;
1046 case 16: pico_set_color_options(COLOR_ANSI16_OPT
|COLOR_TRANS_OPT
); break;
1047 case 256: pico_set_color_options(COLOR_ANSI256_OPT
|COLOR_TRANS_OPT
); break;
1048 default : break; /* impossible case */
1050 pico_toggle_color(1);
1052 pcolors
= (PCOLORS
*) malloc(sizeof(PCOLORS
));
1053 memset((void *)pcolors
, 0, sizeof(PCOLORS
));
1054 /* ignore bad pair settings, also we set tbcp backwards because it will
1055 * be reversed later in the modeline function, so tbcp->fg is actually
1056 * tbcp->bg and viceversa.
1058 if(ntfg
>= 0 && ntbg
>= 0){ /* set normal text color */
1059 fg
= colorx(ntfg
); bg
= colorx(ntbg
);
1060 pcolors
->ntcp
= new_color_pair(fg
, bg
);
1064 /* reverse means reverse of normal text */
1065 if((rtfg
< 0 || rtbg
< 0) && (ntfg
>= 0 && ntbg
>= 0)){
1069 if(rtfg
>= 0 && rtbg
>= 0){ /* set reverse text color */
1070 fg
= colorx(rtfg
); bg
= colorx(rtbg
);
1071 pcolors
->rtcp
= new_color_pair(fg
, bg
);
1075 /* If the user does not specify this, we will set up all
1076 * backgrounds for text to the normal text background
1079 if(knbg
< 0) knbg
= ntbg
;
1080 if(q1bg
< 0) q1bg
= ntbg
;
1081 if(q2bg
< 0) q2bg
= ntbg
;
1082 if(q3bg
< 0) q3bg
= ntbg
;
1083 if(sbbg
< 0) sbbg
= ntbg
;
1085 if(rtfg
>= 0 && rtbg
>= 0){ /* set default reverse */
1086 if(tbfg
< 0 || tbbg
< 0){ /* set titlebar colors to reverse color if any missing*/
1087 tbfg
= rtfg
; tbbg
= rtbg
;
1089 if(klfg
< 0 || klbg
< 0){ /* set key label colors */
1090 klfg
= rtfg
; klbg
= rtbg
;
1092 if(stfg
< 0 || stbg
< 0){ /* set status colors */
1093 stfg
= rtfg
; stbg
= rtbg
;
1095 if(prfg
>= 0 && prbg
>= 0){ /* set prompt colors */
1096 prfg
= rtfg
; prbg
= rtbg
;
1099 if(tbfg
>= 0 && tbbg
>= 0) /* set titlebar colors */
1100 pcolors
->tbcp
= new_color_pair(colorx(tbbg
), colorx(tbfg
));
1101 if(klfg
>= 0 && klbg
>= 0) /* set key label colors */
1102 pcolors
->klcp
= new_color_pair(colorx(klfg
), colorx(klbg
));
1103 if(knfg
>= 0 && knbg
>= 0) /* set key name colors */
1104 pcolors
->kncp
= new_color_pair(colorx(knfg
), colorx(knbg
));
1105 if(stfg
>= 0 && stbg
>= 0) /* set status colors */
1106 pcolors
->stcp
= new_color_pair(colorx(stfg
), colorx(stbg
));
1107 if(prfg
>= 0 && prbg
>= 0) /* set prompt colors */
1108 pcolors
->prcp
= new_color_pair(colorx(prfg
), colorx(prbg
));
1109 if(q1fg
>= 0 && q1bg
>= 0) /* set quote level 1 colors */
1110 pcolors
->qlcp
= new_color_pair(colorx(q1fg
), colorx(q1bg
));
1111 if(q2fg
>= 0 && q2bg
>= 0) /* set quote level 2 colors */
1112 pcolors
->qllcp
= new_color_pair(colorx(q2fg
), colorx(q2bg
));
1113 if(q3fg
>= 0 && q3bg
>= 0) /* set quote level 3 colors */
1114 pcolors
->qlllcp
= new_color_pair(colorx(q3fg
), colorx(q3bg
));
1115 if(sbfg
>= 0 && sbbg
>= 0) /* set signature block colors */
1116 pcolors
->sbcp
= new_color_pair(colorx(sbfg
), colorx(sbbg
));
1118 if(pico_usingcolor())
1119 pico_set_normal_color();
1123 #endif /* ! _WINDOWS */
1130 pico_file_drop(int x
, int y
, char *filename
)
1133 * if current buffer is unchanged
1134 * *or* "new buffer" and no current text
1136 if(((curwp
->w_bufp
->b_flag
& BFCHG
) == 0)
1137 || (curwp
->w_bufp
->b_fname
[0] == '\0'
1138 && curwp
->w_bufp
->b_linep
== lforw(curwp
->w_bufp
->b_linep
)
1139 && curwp
->w_doto
== 0)){
1140 register BUFFER
*bp
= curwp
->w_bufp
;
1143 makename(bname
, filename
);
1144 strncpy(bp
->b_bname
, bname
, sizeof(bp
->b_bname
));
1145 bp
->b_bname
[sizeof(bp
->b_bname
)-1] = '\0';
1146 strncpy(bp
->b_fname
, filename
, sizeof(bp
->b_fname
));
1147 bp
->b_fname
[sizeof(bp
->b_fname
)-1] = '\0';
1148 bp
->b_flag
&= ~BFCHG
; /* turn off change bit */
1149 if (readin(filename
, 1, 1) == ABORT
) {
1150 strncpy(bp
->b_bname
, "", sizeof(bp
->b_bname
));
1151 bp
->b_bname
[sizeof(bp
->b_bname
)-1] = '\0';
1152 strncpy(bp
->b_fname
, "", sizeof(bp
->b_fname
));
1153 bp
->b_fname
[sizeof(bp
->b_fname
)-1] = '\0';
1156 bp
->b_dotp
= bp
->b_linep
;
1163 curwp
->w_flag
|= WFHARD
;
1166 emlwrite("Inserted dropped file \"%s\"", &eml
);
1169 curwp
->w_flag
|= WFHARD
;
1170 update(); /* restore cursor */
1176 /*----------------------------------------------------------------------
1177 print a few lines of help for command line arguments
1181 Result: prints help messages
1182 ----------------------------------------------------------------------*/
1184 pico_args_help(void)
1191 /** print out possible starting arguments... **/
1193 for(a
=args_pico_args
; a
&& *a
; a
++){
1195 pico_display_args_err(NULL
, pp
, 0);
1203 pico_vers_help(void)
1208 snprintf(v0
, sizeof(v0
), "Pico %.50s", version
);
1212 pico_display_args_err(NULL
, v
, 0);
1217 /*----------------------------------------------------------------------
1218 write argument error to the display...
1222 Result: prints help messages
1223 ----------------------------------------------------------------------*/
1225 pico_display_args_err(char *s
, char **a
, int err
)
1227 char errstr
[256], *errp
;
1228 FILE *fp
= err
? stderr
: stdout
;
1230 char tmp_20k_buf
[SIZEOF_20KBUF
];
1235 snprintf(errp
= errstr
, sizeof(errstr
), _("Argument Error: %.200s"), s
);
1241 mswin_messagebox(errp
, err
);
1244 strncpy(tmp_20k_buf
, *a
++, SIZEOF_20KBUF
);
1245 tmp_20k_buf
[SIZEOF_20KBUF
-1] = '\0';
1247 strncat(tmp_20k_buf
, "\n", SIZEOF_20KBUF
-strlen(tmp_20k_buf
)-1);
1248 tmp_20k_buf
[SIZEOF_20KBUF
-1] = '\0';
1249 strncat(tmp_20k_buf
, *a
++, SIZEOF_20KBUF
-strlen(tmp_20k_buf
)-1);
1250 tmp_20k_buf
[SIZEOF_20KBUF
-1] = '\0';
1253 mswin_messagebox(tmp_20k_buf
, err
);
1257 fprintf(fp
, "%s\n", errp
);
1260 fprintf(fp
, "%s\n", *a
++);