home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / less2 / part1 / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  4.7 KB  |  294 lines

  1. /*
  2.  * Entry point, initialization, miscellaneous routines.
  3.  */
  4.  
  5. #include "less.h"
  6. #include "position.h"
  7. #include <setjmp.h>
  8.  
  9. public int    ispipe;
  10. public jmp_buf    main_loop;
  11. public char *    first_cmd;
  12. public char *    every_first_cmd;
  13. public int    new_file;
  14. public int    is_tty;
  15. public char     current_file[128];
  16. public int ac;
  17. public char **av;
  18. public int curr_ac;
  19. #if EDITOR
  20. public char *    editor;
  21. #endif
  22.  
  23. extern int file;
  24. extern int nbufs;
  25. extern int sigs;
  26. extern int quit_at_eof;
  27. extern int p_nbufs, f_nbufs;
  28. extern int back_scroll;
  29. extern int top_scroll;
  30. extern int sc_height;
  31.  
  32.  
  33. /*
  34.  * Edit a new file.
  35.  * Filename "-" means standard input.
  36.  * No filename means the "current" file, from the command line.
  37.  */
  38.     public void
  39. edit(filename)
  40.     char *filename;
  41. {
  42.     register int f;
  43.     char message[100];
  44.     static int any_edited = 0;
  45.     static int hold_scroll = 0;
  46.  
  47.     if (filename == NULL || *filename == '\0')
  48.     {
  49.         if (curr_ac >= ac)
  50.         {
  51.             error("No current file");
  52.             return;
  53.         }
  54.         filename = av[curr_ac];
  55.     }
  56.     if (strcmp(filename, "-") == 0)
  57.         f = 0;    /* Standard input */
  58.     else if ((f = open(filename, 0)) < 0)
  59.     {
  60.         sprintf(message, "Cannot open %.*s", 
  61.             error_width()-13, filename);
  62.         if (any_edited)
  63.             error(message);
  64.         else
  65.         {
  66.             puts(message);
  67.             hold_scroll = 1;
  68.         }
  69.         return;
  70.     }
  71.  
  72.     if (isatty(f))
  73.     {
  74.         /*
  75.          * Not really necessary to call this an error,
  76.          * but if the control terminal (for commands)
  77.          * and the input file (for data) are the same,
  78.          * we get weird results at best.
  79.          */
  80.         error("Can't take input from a terminal");
  81.         if (f > 0)
  82.             close(f);
  83.         return;
  84.     }
  85.  
  86.     /*
  87.      * Close the current input file and set up to use the new one.
  88.      */
  89.     if (file > 0)
  90.         close(file);
  91.     new_file = 1;
  92.     strcpy(current_file, filename);
  93.     ispipe = (f == 0);
  94.     file = f;
  95.     ch_init( (ispipe) ? p_nbufs : f_nbufs );
  96.     init_mark();
  97.     if (every_first_cmd != NULL)
  98.         first_cmd = every_first_cmd;
  99.     if (is_tty)
  100.     {
  101.         any_edited = 1;
  102.         if (hold_scroll)
  103.         {
  104.             /*
  105.              * Before erasing the screen contents,
  106.              * display the file name and ask for a keystroke.
  107.              */
  108.             error(filename);
  109.             hold_scroll = 0;
  110.         }
  111.         if (first_cmd == NULL || *first_cmd == '\0')
  112.         {
  113.             /* 
  114.              * Display the first screen. 
  115.              */
  116.             jump_back(1);
  117.         } else
  118.         {
  119.             /* 
  120.              * The first_cmd will hopefully redisplay the
  121.              * screen, so we need not display anything yet.
  122.              * Indicate there is nothing yet on the screen. 
  123.              */
  124.             pos_clear();
  125.         }
  126.     }
  127. }
  128.  
  129. /*
  130.  * Edit the next file in the command line list.
  131.  */
  132.     public void
  133. next_file(n)
  134.     int n;
  135. {
  136.     if (curr_ac + n >= ac)
  137.     {
  138.         if (quit_at_eof)
  139.             quit();
  140.         error("No (N-th) next file");
  141.     } else
  142.         edit(av[curr_ac += n]);
  143. }
  144.  
  145. /*
  146.  * Edit the previous file in the command line list.
  147.  */
  148.     public void
  149. prev_file(n)
  150.     int n;
  151. {
  152.     if (curr_ac - n < 0)
  153.         error("No (N-th) previous file");
  154.     else
  155.         edit(av[curr_ac -= n]);
  156. }
  157.  
  158. /*
  159.  * Copy a file directly to standard output.
  160.  * Used if standard output is not a tty.
  161.  */
  162.     static void
  163. cat_file()
  164. {
  165.     register int c;
  166.  
  167.     while ((c = ch_forw_get()) != EOF)
  168.         putc(c);
  169.     flush();
  170. }
  171.  
  172. /*
  173.  * Entry point.
  174.  */
  175. main(argc, argv)
  176.     int argc;
  177.     char *argv[];
  178. {
  179.     char *getenv();
  180.  
  181.  
  182.     /*
  183.      * Process command line arguments and LESS environment arguments.
  184.      * Command line arguments override environment arguments.
  185.      */
  186.     init_option();
  187.     scan_option(getenv("LESS"));
  188.     argv++;
  189.     while ( (--argc > 0) && 
  190.         (argv[0][0] == '-' || argv[0][0] == '+') && 
  191.         argv[0][1] != '\0')
  192.         scan_option(*argv++);
  193.  
  194. #if EDITOR
  195.     editor = getenv("EDITOR");
  196.     if (editor == NULL || *editor == '\0')
  197.         editor = EDIT_PGM;
  198. #endif
  199.  
  200.     /*
  201.      * Set up list of files to be examined.
  202.      */
  203.     ac = argc;
  204.     av = argv;
  205.     curr_ac = 0;
  206.  
  207.     /*
  208.      * Set up terminal, etc.
  209.      */
  210.     is_tty = isatty(1);
  211.     if (!is_tty)
  212.     {
  213.         /*
  214.          * Output is not a tty.
  215.          * Just copy the input file(s) to output.
  216.          */
  217.         if (ac < 1)
  218.         {
  219.             edit("-");
  220.             cat_file();
  221.         } else
  222.         {
  223.             do
  224.             {
  225.                 edit((char *)NULL);
  226.                 if (file >= 0)
  227.                     cat_file();
  228.             } while (++curr_ac < ac);
  229.         }
  230.         exit(0);
  231.     }
  232.  
  233.     raw_mode(1);
  234.     get_term();
  235.     open_getc();
  236.     init();
  237.  
  238.     if (back_scroll < 0)
  239.     {
  240.         /* {{ KLUDGE }} */
  241.         back_scroll = sc_height-1;
  242.         if (top_scroll)
  243.             back_scroll--;
  244.     }
  245.  
  246.     if (setjmp(main_loop))
  247.         quit();
  248.     init_signals();
  249.  
  250.     /*
  251.      * Select the first file to examine.
  252.      */
  253.     if (ac < 1)
  254.         edit("-");    /* Standard input */
  255.     else 
  256.     {
  257.         /*
  258.          * Try all the files named as command arguments.
  259.          * We are simply looking for one which can be
  260.          * opened without error.
  261.          */
  262.         do
  263.         {
  264.             edit((char *)NULL);
  265.             if (file >= 0)
  266.                 /* We can open this file. */
  267.                 break;
  268.             putc('\n');  flush();
  269.         } while (++curr_ac < ac);
  270.     }
  271.  
  272.     if (file >= 0)
  273.         commands();
  274.     quit();
  275. }
  276.  
  277. /*
  278.  * Exit the program.
  279.  */
  280.     public void
  281. quit()
  282. {
  283.     /*
  284.      * Put cursor at bottom left corner, clear the line,
  285.      * reset the terminal modes, and exit.
  286.      */
  287.     lower_left();
  288.     clear_eol();
  289.     deinit();
  290.     flush();
  291.     raw_mode(0);
  292.     exit(0);
  293. }
  294.