home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / cpm / emacs / emacssrc.lzh / ovreadin.c < prev    next >
C/C++ Source or Header  |  1992-03-11  |  3KB  |  110 lines

  1. #include "stdio.h"
  2. #include "ed.h"
  3.  
  4. /*
  5.  * Read file "fname" into the current
  6.  * buffer, blowing away any text found there. Called
  7.  * by both the read and visit commands. Return the final
  8.  * status of the read. Also called by the mainline,
  9.  * to read in a file specified on the command line as
  10.  * an argument.
  11.  */
  12. extern FILE * ffp;
  13. #define fname ((char *)0x80)
  14.  
  15. ovmain( flag )
  16. {
  17.     register LINE    *lp1;
  18.     register LINE    *lp2;
  19.     register int    i;
  20.     register WINDOW    *wp;
  21.     register BUFFER    *bp;
  22.     register int    s;
  23.     register int    nbytes;
  24.     register int    nline;
  25.     char        line[NLINE+1];
  26.  
  27.     if (flag && ((s=bclear(bp=curbp)) != TRUE))/* Might be old.    */
  28.         return (s);
  29.     bp->b_flag &= ~(BFTEMP|BFCHG);
  30.     if (flag) strcpy(bp->b_fname, fname);
  31.     if (( ffp = fopen(fname, "r" )) == NULL)
  32.     {    mlwrite( "[New file]" );
  33.         goto out;
  34.     }
  35.     mlwrite("[Reading]");
  36.     nline = 0;
  37.     while ( fgets( line, NLINE, ffp) != NULL )
  38.     {    nbytes = strlen(line);
  39.         while ( ( s = line[ nbytes - 1 ] ) == '\n' || s == '\r' )
  40.             if ( --nbytes <= 0 ) break;
  41.         if ( nbytes == strlen( line ))
  42.             mlwrite( "Long Line" );
  43.         
  44.         if ((lp1=xlalloc(nbytes)) == NULL)
  45.         {    s = FIOERR;        /* Keep message on the    */
  46.             break;            /* display.        */
  47.         }
  48.         lp2 = (flag) ? lback(curbp->b_linep) :
  49.             (( curwp->w_doto == 0 )
  50.             ? curwp->w_dotp->l_fp 
  51.             : curwp->w_dotp );
  52.         lp1->l_fp = lp2->l_fp;
  53.         lp2->l_fp = lp1;
  54.         lp1->l_bp = lp2;
  55.         lp1->l_fp->l_bp = lp1;
  56.         curwp->w_dotp = lp1;
  57.         curwp->w_doto = 0;
  58.  
  59.         /* for (i=0; i<nbytes; ++i)
  60.         **    lputc(lp1, i, line[i]);
  61.         */
  62.         blockmv( &lp1->l_text[0], &line[0], nbytes );
  63.  
  64.         ++nline;
  65.     }
  66.     fclose(ffp);        /* Ignore errors.    */
  67.     if (s == FIOEOF)    /* Don't zap message!    */
  68.     {    mlwrite("[Read %d lines]", nline);
  69.     }
  70. out:
  71.     for (wp=wheadp; wp!=NULL; wp=wp->w_wndp)
  72.     {    if (wp->w_bufp == curbp)
  73.         {    wp->w_linep = lforw(curbp->b_linep);
  74.             wp->w_dotp  = ( flag )
  75.                 ? lforw(curbp->b_linep)
  76.                 : curwp->w_dotp;
  77.             wp->w_doto  = 
  78.             wp->w_markp = 
  79.             wp->w_marko = 0;
  80.             wp->w_flag |= WFMODE|WFHARD;
  81.         }
  82.     }
  83.     if (s == FIOERR)            /* False if error.    */
  84.         return (FALSE);
  85.     return (TRUE);
  86. }
  87.  
  88. /*
  89.  * This routine allocates a block
  90.  * of memory large enough to hold a LINE
  91.  * containing "used" characters. The block is
  92.  * always rounded up a bit. Return a pointer
  93.  * to the new block, or NULL if there isn't
  94.  * any memory left. Print a message in the
  95.  * message line if no space.
  96.  */
  97. LINE    *
  98. xlalloc(size)
  99. int    size;
  100. {
  101.     register LINE    *lp;
  102.  
  103.     if ((lp = (LINE *) malloc(( sizeof(LINE)-1 ) +size)) == NULL)
  104.     {    mlwrite("No memory");
  105.         return (NULL);
  106.     }
  107.     lp->l_size = lp->l_used = size;
  108.     return (lp);
  109. }
  110.