home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / CMDS / pvic_10a.lzh / SRCE / main.c < prev    next >
C/C++ Source or Header  |  1998-06-09  |  6KB  |  246 lines

  1. #include <stdio.h>
  2. #include "pvic.h"
  3. #include "locdefs.h"
  4.  
  5. int current_lines;
  6. int current_columns;
  7.  
  8. char *real_screen = NULL;    /* What's currently on the screen, a single */
  9. char *next_screen = NULL;    /* What's to be put on the screen. */
  10.  
  11. char *file_name = NULL;        /* Current file name */
  12.  
  13. LPTR *file_memory;        /* Pointer to the first line of the file */
  14.  
  15. LPTR *top_of_file;        /* Line 'above' the start of the file */
  16.  
  17. LPTR *end_of_file;        /* Pointer to the end of the file in 
  18.                 file_memory. (It points to the byte AFTER 
  19.                 the last byte.) */
  20.  
  21. LPTR *top_char;            /* Pointer to the byte in file_memory which 
  22.                 in the upper left corner of the screen. */
  23.  
  24. LPTR *bottom_char;        /* Pointer to the byte in file_memory which is
  25.                 just off the bottom of the screen. */
  26.  
  27. LPTR *cursor_char;        /* Pointer to byte in file_memory at which the 
  28.                 cursor is currently placed. */
  29.  
  30. int cursor_row, cursor_column;    /* Current position of cursor */
  31.  
  32. int cursor_virtual_column;    /* Current virtual column, the column 
  33.                 number of the file's actual line, as 
  34.                 opposed to the column number we're at on 
  35.                 the screen.  This makes a difference on 
  36.                 lines that span more than one screen line. */
  37.  
  38. int wanted_cursor_column = 0;    /* The column we'd like to be at. This is used 
  39.                 try to stay in the same column through up/down 
  40.                 cursor motions. */
  41.  
  42. int set_wanted_cursor_column;    /* If set, then update wanted_cursor_column 
  43.                 the next time through update_cursor() to 
  44.                 the current virtual column. */
  45.  
  46. int current_status = STATUS_NORMAL;    /* This is the current state of the 
  47.                     command interpreter. */
  48.  
  49. int prenum = 0;            /* The (optional) number before a command. */
  50.  
  51. LPTR *start_insert;        /* This is where the latest insert/append 
  52.                 mode started. */
  53.  
  54. int changed = 0;        /* Set to 1 if something in the file has been 
  55.                 changed and not written out. */
  56.  
  57. char redo_buffer[1024];        /* Each command should stuff characters into 
  58.                 this  buffer that will re-execute itself. */
  59.  
  60. char insert_buffer[1024];    /* Each insertion gets stuffed into this buffer. */
  61.  
  62. int insert_n = 0;        /* Number of characters in the current 
  63.                 insertion. */
  64. char *insert_pointer = NULL;
  65.  
  66. int interactive=0;        /* Set (1) when main() is ready to roll. */
  67.  
  68. char **files;            /* List of input files. */
  69. int  number_of_files;    /* Number of input files. */
  70. int  current_file;        /* Number of the current file. */
  71.  
  72. char *shell_name = LOCAL_SHELL;    /* Default shell name */
  73. char **environ_array;    /* Pointer to the environment array */
  74.  
  75.  
  76.  
  77.  
  78. static void usage()
  79. {
  80.     fprintf(stderr, "Usage: vi [file ...]\n");
  81.     fprintf(stderr, "       vi -t tag\n");
  82.     fprintf(stderr, "       vi +[num] file\n");
  83.     fprintf(stderr, "       vi +/pat  file\n");
  84.     exit(1);
  85. }
  86.  
  87.  
  88.  
  89.  
  90. main(argc,argv,env)
  91. int    argc;
  92. char    *argv[];
  93. char    **env;
  94. {
  95.     char *initstr,*getenv();    /* init string from the environment */
  96.     char *tag=NULL;                /* tag from command line */
  97.     char *pat=NULL;                /* pattern from command line */
  98.     int  line=-1;                /* line number from command line */
  99.     char *lp;                    /* pointer for the LINES env.var. */
  100.     char buf[128];                /* buffer for handling init string */
  101.     char *homepath;                /* pointer for the HOME env.var. */
  102.  
  103.     /*
  104.      * Process the command line arguments.
  105.      */
  106.     if (argc > 1) {
  107.         switch (argv[1][0]) {
  108.  
  109.         case '-':            /* -t tag */
  110.             if (argv[1][1] != 't')
  111.                 usage();
  112.  
  113.             if (argv[2] == NULL)
  114.                 usage();
  115.  
  116.             file_name = NULL;
  117.             tag = argv[2];
  118.             number_of_files = 1;
  119.             break;
  120.  
  121.         case '+':            /* +n or +/pat */
  122.             if (argv[1][1] == '/') {
  123.                 if (argv[2] == NULL)
  124.                     usage();
  125.                 file_name = strsave(argv[2]);
  126.                 pat = &(argv[1][1]);
  127.                 number_of_files = 1;
  128.  
  129.             } else if (is_digit(argv[1][1]) || argv[1][1] == '\0') {
  130.                 if (argv[2] == NULL)
  131.                     usage();
  132.                 file_name = strsave(argv[2]);
  133.                 number_of_files = 1;
  134.  
  135.                 line = (is_digit(argv[1][1])) ?
  136.                     atoi(&(argv[1][1])) : 0;
  137.             } else
  138.                 usage();
  139.  
  140.             break;
  141.  
  142.         default:            /* must be a file name */
  143.             file_name = strsave(argv[1]);
  144.             files = &(argv[1]);
  145.             number_of_files = argc - 1;
  146.             break;
  147.         }
  148.     } else {
  149.         file_name = NULL;
  150.         number_of_files = 1;
  151.     }
  152.  
  153.     environ_array = env;    /* Set a global pointer to the environment array */
  154.  
  155.     current_file = 0;
  156.  
  157.      if (number_of_files > 1)
  158.          fprintf(stderr, "%d files to edit\n", number_of_files);
  159.  
  160.     pvic_init();
  161.  
  162.     /*
  163.      * Allocate LPTR structures for all the various position pointers
  164.      */
  165.      if ((file_memory = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  166.          (top_of_file = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  167.          (end_of_file = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  168.          (top_char = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  169.          (bottom_char = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  170.          (cursor_char = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  171.         (start_insert = (LPTR *) malloc(sizeof(LPTR))) == NULL ||
  172.         (alloc_screen() == -1) ) 
  173.     {
  174.         fprintf(stderr, "Can't allocate data structures\n");
  175.         pvic_exit(1);
  176.     }
  177.  
  178.     /* Initialize file_memory, top_of_file, and end_of_file */
  179.     file_alloc();
  180.  
  181.     clear_screen();
  182.  
  183.     /* Read and process the initialisation file if it is defined. */
  184.     if (local_ini_file())
  185.         exit(1);
  186.  
  187.     /* If the EXINIT and/or LINES environment variables are defined
  188.        they override defaults and anything in the initialisation file */
  189.     if ((initstr = getenv("EXINIT")) != NULL) 
  190.     {
  191.         if ((lp = getenv("LINES")) != NULL) 
  192.         {
  193.             sprintf(buf, "%s lines=%s", initstr, lp);
  194.             do_command_line(buf);
  195.         }
  196.         else do_command_line(initstr);
  197.     }
  198.     else
  199.     {
  200.         lp = getenv("LINES");
  201.         if (lp)
  202.         {
  203.             sprintf(buf, "set lines=%s", lp);
  204.             do_command_line(buf);
  205.         }
  206.     }
  207.  
  208.     if (file_name != NULL) 
  209.     {
  210.         if (read_file(file_name, file_memory, (0)))
  211.             file_message("[new file]");
  212.     } 
  213.     else if (tag == NULL)msg("Empty buffer");
  214.  
  215.     set_pc_mark();
  216.  
  217.     if (tag) 
  218.     {
  219.         put_string_into_input_buffer(":ta ");
  220.         put_string_into_input_buffer(tag);
  221.         put_string_into_input_buffer("\n");
  222.  
  223.     }
  224.     else if (pat)
  225.     {
  226.         put_string_into_input_buffer(pat);
  227.         put_string_into_input_buffer("\n");
  228.  
  229.     }
  230.     else if (line >= 0) 
  231.     {
  232.         if (line > 0)put_int_into_input_buffer(line);
  233.         put_string_into_input_buffer("G");
  234.     }
  235.  
  236.     interactive=1;
  237.  
  238.     update_screen(1);
  239.     edit();
  240.  
  241.     pvic_exit(0);
  242.  
  243.     return 1;        /* shouldn't be reached */
  244. }
  245.  
  246.