* Deactivate some color code from Pico (as standalone editor) until
[alpine.git] / pico / main.c
bloba4f73b1a8bae1a71bd408fdb6ef144a39fa99f5b
1 #if !defined(lint) && !defined(DOS)
2 static char rcsid[] = "$Id: main.c 1184 2008-12-16 23:52:15Z hubert@u.washington.edu $";
3 #endif
5 /*
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
23 * WEEMACS/PICO NOTES:
25 * 08 Jan 92 - removed PINE defines to simplify compiling
27 * 08 Apr 92 - removed PINE stub calls
31 #include "headers.h"
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
43 #ifdef _WINDOWS
44 int pico_file_drop(int, int, char *);
45 #endif
48 * this isn't defined in the library, because it's a pine global
49 * which we use for GetKey's timeout
51 int timeoutset = 0;
54 int my_timer_period = (300 * 1000);
57 * function key mappings
59 static UCS fkm[12][2] = {
60 { F1, (CTRL|'G')},
61 { F2, (CTRL|'X')},
62 { F3, (CTRL|'O')},
63 { F4, (CTRL|'J')},
64 { F5, (CTRL|'R')},
65 { F6, (CTRL|'W')},
66 { F7, (CTRL|'Y')},
67 { F8, (CTRL|'V')},
68 { F9, (CTRL|'K')},
69 { F10, (CTRL|'U')},
70 { F11, (CTRL|'C')},
71 #ifdef SPELLER
72 { F12, (CTRL|'T')}
73 #else
74 { F12, (CTRL|'D')}
75 #endif
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);
82 #ifndef _WINDOWS
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"),
126 #ifndef _WINDOWS
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 */
131 #ifdef _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"),
165 "",
166 N_("\t All arguments may be followed by a file name to display."),
168 NULL
173 * main standalone pico routine
175 #ifdef _WINDOWS
177 app_main (int argc, char *argv[])
178 #else
180 main(int argc, char *argv[])
181 #endif
183 UCS c;
184 register int f;
185 register int n;
186 register BUFFER *bp;
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;
194 int use_system = 0;
195 char *err = NULL;
197 #ifndef _WINDOWS
198 utf8_parameters(SET_UCS4WIDTH, (void *) pith_ucs4width);
199 #endif /* _WINDOWS */
201 set_input_timeout(600);
202 Pmaster = NULL; /* turn OFF composer functionality */
203 km_popped = 0;
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)
215 #ifdef _WINDOWS
216 init_utf8_display(1, NULL);
217 #else /* UNIX */
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);
225 #endif
227 if(!display_charmap)
228 display_charmap = cpstr("US-ASCII");
230 if(keyboard_character_set)
231 keyboard_charmap = cpstr(keyboard_character_set);
232 else
233 keyboard_charmap = cpstr(display_charmap);
236 if(use_system_translation){
237 #if PREREQ_FOR_SYS_TRANSLATION
238 use_system++;
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");
243 exit(1);
245 else if(err){
246 fprintf(stderr, "%s\n", err);
247 fs_give((void **) &err);
249 #endif
252 if(!use_system){
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");
256 exit(1);
258 else if(err){
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);
269 if(display_charmap)
270 free((void *) display_charmap);
272 #endif /* UNIX */
275 * There are a couple arguments that we need to be sure
276 * are converted for internal use.
278 if(alt_speller)
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));
292 if(file_to_edit)
293 file_to_edit = cpstr(fname_to_utf8(file_to_edit));
295 #undef cpstr
297 #if defined(DOS) || defined(OS2)
298 if(file_to_edit){ /* strip quotes? */
299 int l;
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 */
308 #endif
310 if(!vtinit()) /* Displays. */
311 exit(1);
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 */
320 #ifdef _WINDOWS
321 mswin_setwindow(NULL, NULL, NULL, NULL, NULL, NULL);
322 mswin_showwindow();
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);
327 #endif
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){
346 char buf[128];
348 snprintf(buf, sizeof(buf), "Filename \"%.10s...\" too long", file_to_edit);
349 emlwrite(buf, NULL);
350 file_to_edit = NULL;
352 else{
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)){
358 EML eml;
359 eml.s = opertree;
360 emlwrite(_("Can't read file from outside of %s"), &eml);
363 file_to_edit = NULL;
367 if(!file_to_edit){
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;
375 bp->b_doto = 0;
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 */
387 if(timeoutset){
388 EML eml;
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 */
397 while(1){
399 if(Pcolors)
400 pico_set_colorp(Pcolors->ntcp, PSC_NONE);
402 if(km_popped){
403 km_popped--;
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 */
409 term.t_mrow = 2;
410 curwp->w_ntrows -= 2;
411 curwp->w_flag |= WFMODE;
412 movecursor(term.t_nrow-2, 0); /* clear status line, too */
413 peeol();
416 update(); /* Fix up the screen */
417 if(km_popped){
418 term.t_mrow = 0;
419 curwp->w_ntrows += 2;
422 #ifdef MOUSE
423 #ifdef EX_MOUSE
424 /* New mouse function for real mouse text seletion. */
425 register_mfunc(mouse_in_pico, 2, 0, term.t_nrow - (term.t_mrow + 1),
426 term.t_ncol);
427 #else
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),
430 term.t_ncol);
431 #endif
432 #endif
433 #ifdef _WINDOWS
434 mswin_setdndcallback (pico_file_drop);
435 mswin_mousetrackcallback(pico_cursor);
436 #endif
437 c = GetKey();
438 #ifdef MOUSE
439 #ifdef EX_MOUSE
440 clear_mfunc(mouse_in_pico);
441 #else
442 clear_mfunc(mouse_in_content);
443 #endif
444 #endif
445 #ifdef _WINDOWS
446 mswin_cleardndcallback ();
447 mswin_mousetrackcallback(NULL);
448 #endif
450 if(timeoutset && (c == NODATA || time_to_check())){
451 if(pico_new_mail())
452 emlwrite(_("You may possibly have new mail."), NULL);
455 if(km_popped)
456 switch(c){
457 case NODATA:
458 case (CTRL|'L'):
459 km_popped++;
460 break;
462 default:
463 /* clear bottom three lines */
464 mlerase();
465 break;
468 if(c == NODATA)
469 continue;
471 if(mpresf){ /* erase message line? */
472 if(mpresf++ > MESSDELAY)
473 mlerase();
476 f = FALSE;
477 n = 1;
479 #ifdef MOUSE
480 clear_mfunc(mouse_in_content);
481 #endif
482 /* Do it. */
483 execute(normalize_cmd(c, fkm, 1), f, n);
487 #ifndef _WINDOWS
488 void
489 display_color_codes(void)
491 #define SPACES " "
492 int i, j, k, l, a, len, len_entry, row;
493 int ncolors;
494 COLOR_PAIR *lastc = NULL, *newcp;
495 char *fg;
497 /* this is the format "SPACE COLORED_SPACES = CODE SPACE" */
498 vtterminalinfo(gmode & MDTCAPWINS);
499 (*term.t_open)();
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");
505 exit(1);
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");
511 exit(1);
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();
519 switch(ncolors){
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);
524 exit(1);
525 break;
528 if(ncolors != 256){
529 for(k = -1; 16*k < ncolors; k++){
530 for(l = -1; l < ncolors; l++){
531 if(k == -1){
532 if(ncolors == 8){
533 if(l == -1)
534 fprintf(stdout, "%s", " ");
535 else
536 fprintf(stdout, "%3d", l);
539 else{
540 if(l == -1){
541 pico_toggle_color(1);
542 fprintf(stdout, "%3d ", k);
544 else{
545 if(ncolors || l < 8){
546 i = 16*k + l;
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);
556 if(k == 0)
557 fprintf(stdout, " (%d colors)", ncolors);
558 if(k != -1 || ncolors == 8)
559 fprintf(stdout, "%s", "\r\n");
561 } else {
562 fprintf(stdout, "%s", "Codes for terminal with 256 colors:\r\n");
563 a = 16;
564 for(k = -1; 36*k < ncolors; k++){
565 for(l = -1; l < ncolors && l < 16; l++){
566 if(k == -1){
567 if(l == -1)
568 fprintf(stdout, "%s", " ");
569 else
570 fprintf(stdout, "%3d", l);
572 else{
573 if(l == -1){
574 pico_toggle_color(1);
575 fprintf(stdout, "%3d ", 36*k);
577 else{
578 i = 36*k + l;
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");
589 a = 20;
590 for(k = -1; 16 + 36*k < ncolors; k++){
591 for(l = -1; l < ncolors && l < a; l++){
592 if(k == -1){
593 if(l == -1)
594 fprintf(stdout, "%s", " ");
595 else
596 fprintf(stdout, "%3d", l);
598 else{
599 if(l == -1){
600 pico_toggle_color(1);
601 fprintf(stdout, "%3d ", 16 + 36*k);
603 else{
604 i = 16 + 36*k + l;
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.
624 * Args ac
625 * av
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
634 char *
635 pico_args(int ac, char **av, int *starton, int *viewflag, int *setlocale_collate)
637 int c, usage = 0;
638 char *str;
639 char tmp_1k_buf[1000]; /* tmp buf to contain err msgs */
640 #ifndef _WINDOWS
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;
645 ncolors = 0;
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 */
651 Loop:
652 /* while more arguments with leading - or + */
653 while(--ac > 0 && (**++av == '-' || **av == '+')){
654 if(**av == '+'){
655 if(*++*av)
656 str = *av;
657 else if(--ac)
658 str = *++av;
659 else{
660 snprintf(tmp_1k_buf, sizeof(tmp_1k_buf), _(args_pico_missing_arg), '+');
661 pico_display_args_err(tmp_1k_buf, NULL, 1);
662 usage++;
663 goto Loop;
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);
669 usage++;
672 if(starton)
673 *starton = atoi(str);
675 goto Loop;
678 /* while more chars in this argument */
679 else while(*++*av){
681 if(strcmp(*av, "version") == 0){
682 pico_vers_help();
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){
708 str = *av;
709 if(--ac)
710 ++av;
711 else{
712 snprintf(tmp_1k_buf, sizeof(tmp_1k_buf), _(args_pico_missing_arg), '-');
713 pico_display_args_err(tmp_1k_buf, NULL, 1);
714 usage++;
715 goto Loop;
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);
721 usage++;
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")){
747 switch(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);
753 exit(1);
754 break;
757 goto Loop;
759 else if(strcmp(*av, "color_codes") == 0){
760 display_color_codes();
761 exit(0);
763 #endif /* ! _WINDOWS */
764 else if(strcmp(*av, "no_setlocale_collate") == 0){
765 *setlocale_collate = 0;
766 goto Loop;
768 #ifndef _WINDOWS
769 else if(strcmp(*av, "syscs") == 0){
770 use_system_translation = !use_system_translation;
771 goto Loop;
773 #endif /* ! _WINDOWS */
774 #ifdef _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 */
782 if(--ac){
783 str = *++av;
784 if(cmd[1] == 'n'){
785 if(cmd[2] == 'f')
786 pico_nfcolor(str);
787 else if(cmd[2] == 'b')
788 pico_nbcolor(str);
790 else if(cmd[1] == 'r'){
791 if(cmd[2] == 'f')
792 pico_rfcolor(str);
793 else if(cmd[2] == 'b')
794 pico_rbcolor(str);
797 else{
798 snprintf(tmp_1k_buf, sizeof(tmp_1k_buf), _(args_pico_missing_color), cmd);
799 pico_display_args_err(tmp_1k_buf, NULL, 1);
800 usage++;
803 goto Loop;
805 #endif /* _WINDOWS */
806 #ifndef _WINDOWS
807 else if(strcmp(*av, "dcs") == 0 || strcmp(*av, "kcs") == 0){
808 char *cmd = *av;
810 if(--ac){
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);
816 usage++;
819 else{
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);
824 usage++;
828 else{
829 snprintf(tmp_1k_buf, sizeof(tmp_1k_buf), _(args_pico_missing_charset), cmd);
830 pico_display_args_err(tmp_1k_buf, NULL, 1);
831 usage++;
834 goto Loop;
836 #endif /* ! _WINDOWS */
839 * Single char options.
841 switch(c = **av){
843 * These don't take arguments.
845 case 'a':
846 gmode ^= MDDOTSOK; /* show dot files */
847 break;
848 case 'b':
849 #ifdef notdef
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
854 * turn it off.
856 gmode ^= MDREPLACE; /* -b for replace string in where is command */
857 #endif
858 break;
859 case 'd': /* -d for rebind delete key */
860 bindtokey(0x7f, forwdel);
861 break;
862 case 'e': /* file name completion */
863 gmode ^= MDCMPLT;
864 break;
865 case 'f': /* -f for function key use */
866 gmode ^= MDFKEY;
867 break;
868 case 'g': /* show-cursor in file browser */
869 gmode ^= MDSHOCUR;
870 break;
871 case 'h':
872 usage++;
873 break;
874 case 'j': /* allow "Goto" in file browser */
875 gmode ^= MDGOTO;
876 break;
877 case 'k': /* kill from dot */
878 gmode ^= MDDTKILL;
879 break;
880 case 'm': /* turn on mouse support */
881 gmode ^= MDMOUSE;
882 break;
883 case 'p':
884 preserve_start_stop = 1;
885 break;
886 case 'q': /* -q for termcap takes precedence */
887 gmode ^= MDTCAPWINS;
888 break;
889 case 't': /* special shutdown mode */
890 gmode ^= MDTOOL;
891 rebindfunc(wquit, quickexit);
892 break;
893 case 'v': /* -v for View File */
894 case 'V':
895 *viewflag = !*viewflag;
896 break; /* break back to inner-while */
897 case 'w': /* -w turn off word wrap */
898 gmode ^= MDWRAP;
899 break;
900 case 'x': /* suppress keyhelp */
901 sup_keyhelp = !sup_keyhelp;
902 break;
903 case 'z': /* -z to suspend */
904 gmode ^= MDSSPD;
905 break;
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 */
916 if(*++*av)
917 str = *av;
918 else if(--ac)
919 str = *++av;
920 else{
921 if(c == 'r')
922 str= "72";
923 else if(c == 'n')
924 str = "180";
925 else{
926 snprintf(tmp_1k_buf, sizeof(tmp_1k_buf), _(args_pico_missing_arg), c);
927 pico_display_args_err(tmp_1k_buf, NULL, 1);
928 usage++;
929 goto Loop;
933 switch(c){
934 case 's':
935 alt_speller = str;
936 break;
937 case 'o':
938 strncpy(opertree, str, NLINE);
939 gmode ^= MDTREE;
940 break;
941 case 'Q':
942 glo_quote_str_orig = str;
943 break;
944 case 'W':
945 glo_wordseps_orig = str;
946 break;
948 /* numeric args */
949 case 'r':
950 case 'n':
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);
954 usage++;
957 if(c == 'r'){
958 if((userfillcol = atoi(str)) < 1)
959 userfillcol = 72;
961 else{
962 timeoutset = 1;
963 set_input_timeout(180);
964 if(set_input_timeout(atoi(str)) < 30)
965 set_input_timeout(180);
968 break;
971 goto Loop;
973 default: /* huh? */
974 snprintf(tmp_1k_buf, sizeof(tmp_1k_buf), _(args_pico_missing_flag), c);
975 pico_display_args_err(tmp_1k_buf, NULL, 1);
976 usage++;
977 break;
982 if(usage)
983 pico_args_help();
985 #ifndef _WINDOWS
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);
990 if(Pcolors)
991 pico_toggle_color(1);
992 #endif /* ! _WINDOWS */
994 /* return the first filename for editing */
995 if(ac > 0)
996 return(*av);
997 else
998 return(NULL);
1002 #ifndef _WINDOWS
1003 PCOLORS *
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,
1008 int sbfg, int sbbg)
1010 PCOLORS *pcolors = NULL;
1011 char *fg, *bg;
1013 if(nc != 0 && nc != 8 && nc != 16 && nc != 256){
1014 fprintf(stderr, "number of colors must be either 8, 16 or 256\n");
1015 exit(1);
1018 if(nc == 0){
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");
1026 exit(1);
1028 else
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");
1039 exit(1);
1042 /* Finally, we set up colors */
1043 pico_toggle_color(0);
1044 switch(nc){
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);
1061 pico_nfcolor(fg);
1062 pico_nbcolor(bg);
1064 /* reverse means reverse of normal text */
1065 if((rtfg < 0 || rtbg < 0) && (ntfg >= 0 && ntbg >= 0)){
1066 rtfg = ntbg;
1067 rtbg = ntfg;
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);
1072 pico_rfcolor(fg);
1073 pico_rbcolor(bg);
1075 /* If the user does not specify this, we will set up all
1076 * backgrounds for text to the normal text background
1078 if(ntbg >= 0){
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();
1121 return pcolors;
1123 #endif /* ! _WINDOWS */
1125 #ifdef _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;
1141 char bname[NBUFN];
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;
1157 bp->b_doto = 0;
1159 else{
1160 EML eml;
1162 ifile(filename);
1163 curwp->w_flag |= WFHARD;
1164 update();
1165 eml.s = filename;
1166 emlwrite("Inserted dropped file \"%s\"", &eml);
1169 curwp->w_flag |= WFHARD;
1170 update(); /* restore cursor */
1171 return(1);
1173 #endif
1176 /*----------------------------------------------------------------------
1177 print a few lines of help for command line arguments
1179 Args: none
1181 Result: prints help messages
1182 ----------------------------------------------------------------------*/
1183 void
1184 pico_args_help(void)
1186 char **a;
1187 char *pp[2];
1189 pp[1] = NULL;
1191 /** print out possible starting arguments... **/
1193 for(a=args_pico_args; a && *a; a++){
1194 pp[0] = _(*a);
1195 pico_display_args_err(NULL, pp, 0);
1198 exit(1);
1202 void
1203 pico_vers_help(void)
1205 char v0[100];
1206 char *v[2];
1208 snprintf(v0, sizeof(v0), "Pico %.50s", version);
1209 v[0] = v0;
1210 v[1] = NULL;
1212 pico_display_args_err(NULL, v, 0);
1213 exit(1);
1217 /*----------------------------------------------------------------------
1218 write argument error to the display...
1220 Args: none
1222 Result: prints help messages
1223 ----------------------------------------------------------------------*/
1224 void
1225 pico_display_args_err(char *s, char **a, int err)
1227 char errstr[256], *errp;
1228 FILE *fp = err ? stderr : stdout;
1229 #ifdef _WINDOWS
1230 char tmp_20k_buf[SIZEOF_20KBUF];
1231 #endif
1234 if(err && s)
1235 snprintf(errp = errstr, sizeof(errstr), _("Argument Error: %.200s"), s);
1236 else
1237 errp = s;
1239 #ifdef _WINDOWS
1240 if(errp)
1241 mswin_messagebox(errp, err);
1243 if(a && *a){
1244 strncpy(tmp_20k_buf, *a++, SIZEOF_20KBUF);
1245 tmp_20k_buf[SIZEOF_20KBUF-1] = '\0';
1246 while(a && *a){
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);
1255 #else
1256 if(errp)
1257 fprintf(fp, "%s\n", errp);
1259 while(a && *a)
1260 fprintf(fp, "%s\n", *a++);
1261 #endif