Annotation of 43BSD/contrib/mh/miscellany/less/main.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.