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: }

Defined functions

cat_file defined in line 162; used 2 times
main defined in line 175; never used

Defined variables

ac defined in line 16; used 10 times
av defined in line 17; used 5 times
curr_ac defined in line 18; used 12 times
editor defined in line 20; used 5 times
is_tty defined in line 14; used 3 times
new_file defined in line 13; used 5 times
Last modified: 1986-04-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1519
Valid CSS Valid XHTML 1.0 Strict