home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / most-3.2 / part01 / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-13  |  7.3 KB  |  328 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #ifndef VMS
  4. #include <fcntl.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #else
  8. #include <unixio.h>
  9. #include <types.h>
  10. #include <stat.h>
  11. #endif
  12.  
  13. #ifndef O_RDONLY
  14. #define O_RDONLY 0
  15. #endif
  16.   
  17. #include "externs.h"
  18. #include "file.h"
  19. #include "keym.h"  
  20. #include "buffer.h"
  21. #include "window.h"
  22.  
  23. char *FILE_RING[500];
  24. char C_DIR[80];                 /* current working dir */
  25. int NUM_FILES;
  26.  
  27. extern int SCREEN_WIDTH;
  28.  
  29. int insert_file(char *file)
  30. {
  31.     struct stat st;
  32.     int i,n,size, fd, dsize;
  33.     unsigned char *pos;
  34.  
  35.     if (file[0] == '\0')        /* assume stdin */
  36.       {
  37.           fd = 0;
  38.           strcpy(BUF->file,"(Standard Input)");
  39.       }
  40.     else
  41.       {
  42.           stat(file, &st);
  43.           if (st.st_mode & S_IFDIR)  /* S_IFDIR = 0040000 */
  44.             {
  45. #ifndef VMS
  46.                 get_dir(file);
  47. #endif                
  48.                 return(1);
  49.             }
  50.           size = st.st_size;
  51. #ifdef VMS          
  52.           /* VMS share options (shr=put) suggested by Henk D. Davids <hdavids@mswe.dnet.ms.philips.nl> */
  53.           /* VMS share options (shr=upi,get,put) suggested by Mark Pizzolato <mark@infocomm.com> */
  54.           fd = open(file,O_RDONLY,"ctx=rec","mbf=8","mbc=16","rop=RAH","shr=upi,get,put");
  55. #else
  56.           fd = open(file,O_RDONLY);
  57. #endif          
  58.       }
  59.     
  60.     
  61.     if (fd >= 0)
  62.       {
  63.           if (!fd) size = 16384;
  64.           BEG = BUF->beg = (unsigned char *) malloc(size);
  65.           n = 0;
  66.           pos = BUF->beg;
  67.           dsize = size;
  68.           while ((i = read(fd, (char *) pos, size - n)) > 0 )
  69.             {
  70.                 n += i;
  71.                 if ((fd == 0) && (size == n))
  72.                   {
  73.                       size += dsize;
  74.                       BEG = (unsigned char *) realloc(BEG,size * sizeof(char));
  75.                       pos = BEG + n;
  76.                   }
  77.                 else pos += i;
  78.             }
  79.           BUF->end = pos;
  80.           BUF->beg = BEG;
  81.           close(fd);
  82.           return (1);
  83.       }
  84.     return(0);
  85. }
  86.  
  87. int find_file(char *file)
  88. {
  89.     Buffer *new_buf, *old_buf;
  90.     int a,n;
  91.     unsigned char *pos;
  92.     
  93.     
  94.     new_buf = create_buffer(file);
  95.     old_buf = switch_to_buffer(new_buf);
  96.     
  97.     if (insert_file(file) == 0)
  98.       {
  99.           message("File could not be opened.",1);
  100.           BUF->beg = (unsigned char *) "File could Not be opened.";
  101.           BUF->end = BUF->beg + strlen((char *) BUF->beg);
  102.       }
  103.     BEG = BUF->beg;
  104.     EOB = BUF->end;
  105.     if (!MOST_B_OPT && !MOST_K_OPT)
  106.       for (pos = BEG; (pos < (BEG + 32)) && (pos < EOB); pos++)
  107.       {
  108.           if ((*pos == 0) || (*pos > 127)) MOST_B_OPT = 1;
  109.       }
  110.     
  111.     n = count_lines(BEG,EOB);
  112.     
  113.     NUM_LINES = n;
  114.     C_POS = BEG;
  115.     C_LINE = 1;
  116.     COLUMN = 1;
  117.     return(1);
  118. }
  119.  
  120. /* if the file is visible in a window, move to the window and return 1
  121.    else return 0 */
  122. int file_visible(char *file)
  123. {
  124.     Window *w;
  125.     w = WIN;
  126.     WIN = TOP_WIN;
  127.     do
  128.       {
  129.           if (!strcmp(WIN->buf->file,file))
  130.             {
  131.                 set_window(WIN);
  132.                 return(1);
  133.             }
  134.           WIN = WIN->next;
  135.       }
  136.     while (WIN != TOP_WIN);
  137.     WIN = w;
  138.     return(0);
  139. }
  140.  
  141.  
  142. void find_file_in_window(char *file)
  143. {
  144.     if (file_visible(file)) return;
  145.     
  146.     if (-1 == access(file,0))        /* does it exist? */
  147.       message("File not found.",1);
  148.     else if (-1 == access(file,4))   /* can we read it? */
  149.       message("File exists but not readable.",1);
  150.     else 
  151.       {
  152.           free_window_buffer();
  153.           (void) find_file(file);
  154.  
  155.           window_buffer();
  156.           CURS_ROW = WIN->curs_line = 1;
  157.           CURS_POS = WIN->curs_pos = C_POS;
  158.           CURS_COL = WIN->curs_col = 1;
  159.  
  160.           redraw_window();
  161.           update_status(0);
  162.       }
  163. }
  164.  
  165.  
  166.  
  167. int next_file(int *j)
  168. {
  169.     char mbuf[132], ch, *curr_file;
  170.     int i;
  171.     
  172.     mbuf[0] = '\0';
  173.     select_minibuffer();
  174.     delete_line(1);
  175.  
  176.     for (i = 0; i < SCREEN_WIDTH; i++) MINI_BUF[i] = ' ';
  177.  
  178.     if (*j >= NUM_FILES) *j = 0;
  179.     curr_file = FILE_RING[*j];
  180.     strcat(mbuf,"Next file: ");
  181.     strcat(mbuf, curr_file);
  182.     fputs(mbuf,stdout);
  183.     fputc('\r',stdout);
  184.     fflush(stdout);
  185.     while(ch = mbuf[i], ch != '\0') i++;
  186.     while(i < SCREEN_WIDTH) mbuf[i++] = ' ';
  187.     mbuf[i] = '\0';
  188.     strcpy((char *) MINI_BUF,mbuf);
  189.     while (1)
  190.       {
  191.           ch = getkey();
  192.           if (ch != '\033') break;
  193.           if (ch = getkey(), (ch != 'O') && (ch != '[')) continue;
  194.           if (ch = getkey(), (ch != 'A') && (ch != 'B')) continue;
  195.           
  196.           if (ch == 'B')
  197.             {
  198.                 if (*j == 0) *j = NUM_FILES;
  199.                 (*j)--;
  200.             }
  201.           else  /* ch == 'A' */
  202.             {
  203.                 (*j)++;
  204.                 if (*j == NUM_FILES) *j = 0;
  205.             }
  206.           curr_file = FILE_RING[*j];
  207.           mbuf[0] = '\0';
  208.           strcat(mbuf,"Next file: ");
  209.           strcat(mbuf, curr_file);
  210.           i = 0;
  211.           while(ch = mbuf[i], ch != '\0') i++;
  212.           while(i < SCREEN_WIDTH) mbuf[i++] = ' ';
  213.           mbuf[i] = '\0';
  214.           
  215.           smart_puts(mbuf,MINI_BUF,stdout);
  216.           fputc('\r',stdout);
  217.           strcpy((char *) MINI_BUF,mbuf);
  218.           fflush(stdout);
  219.       }
  220.     delete_line(1);
  221.     exit_minibuffer();
  222.     MINI_BUF[0] = 0;
  223.     (*j)++;
  224.     if ((ch == 'Q') || (ch == 'q')) return(-1);
  225.     
  226.     find_file_in_window(curr_file);
  227.     return(0);
  228. }
  229.  
  230. /* extracts directory from file string, returns false if no dir */
  231. int head(char *file, char *dir)
  232. {
  233.     int n;
  234.     (void) strcpy(dir,file);
  235.     n = strlen(file) - 1;
  236. #ifdef VMS    
  237.     while((n > -1) && (file[n] != ']') && (file[n] != ':')) n--;
  238. #else    
  239.     while((n > -1) && file[n] != '/') n--;
  240. #endif
  241.     n++;
  242.     dir[n] = '\0';
  243.     return(n);
  244. }
  245.  
  246. /* returns a pointer to the tail of file */
  247. int tail(char *filed, char **filep)
  248. {
  249.     int n;
  250.     n = strlen(filed) - 1;
  251. #ifdef VMS    
  252.     while((n > -1) && (filed[n] != ']') || (filed[n] != ':')) n--;
  253. #else    
  254.     while((n > -1) && filed[n] != '/') n--;
  255. #endif
  256.     n++;
  257.     *filep = (filed + n);
  258.     return(n);
  259. }
  260.  
  261. /* assume path is big enough to hold new expanded version */
  262. int expand_path(char *path)
  263. {
  264.     int n;
  265.     /* really cheat here-- let system do it.  The path must exist!! */
  266.     if (chdir(path))
  267.       {
  268.           message(path,1);
  269.           return(0);
  270.       }
  271.     else
  272.       {
  273.           get_cdir(path);
  274.           chdir(C_DIR);
  275. #ifndef VMS
  276.           n = strlen(path);
  277.           if (path[n-1] == '/') return(1);
  278.           path[n++] = '/'; path[n] = 0;
  279. #endif
  280.       }
  281.     return(1);
  282. }
  283.  
  284.  
  285.  
  286. void cd()
  287. {
  288.     char tmp_dir[80];
  289.     int n;
  290.     
  291.     strcpy(tmp_dir,C_DIR);
  292.     if (read_from_minibuffer("cd: ",C_DIR) == -1) return;
  293.     if (!chdir(C_DIR))
  294.       {
  295.           get_cdir(C_DIR);         /* expands ../ etc... */
  296.           n = strlen(C_DIR);
  297. #ifndef VMS
  298.           if (C_DIR[n-1] == '/') return;
  299.           C_DIR[n++] = '/'; C_DIR[n] = 0;
  300. #endif          
  301.           return;
  302.       }
  303.     strcpy(C_DIR,tmp_dir);
  304.     chdir(C_DIR);
  305.     message("Unable to change directory.",1);
  306. }
  307.  
  308. void user_get_file()
  309. {
  310.     char path[80], file[80], *name;
  311.     
  312.     if (!head(WIN->buf->file,file))
  313.       strcpy(file,C_DIR);
  314.  
  315.     if (read_from_minibuffer("Find File: ",file) == -1) return;
  316.  
  317.     if (head(file,path))
  318.       {
  319.           expand_path(path);
  320.           tail(file,&name);
  321.           strcat(path,name);
  322.           name = path;
  323.       }
  324.     else name = file;
  325.     find_file_in_window(name);
  326. }
  327.  
  328.