#include "stdio.h" #include "ed.h" /* * List all of the active * buffers. First update the special * buffer that holds the list. Next make * sure at least 1 window is displaying the * buffer list, splitting the screen if this * is what it takes. Lastly, repaint all of * the windows that are displaying the * list. Bound to "C-X C-B". */ ovmain(x, f, n) { /* register WINDOW *wp; */ register BUFFER *bp; register int s; if ( x ) return ( usebuf( x, f, n )); if ( ! usebuf( 2, 0, 0 )) return ( 0 ); if ((s=makelist()) != TRUE) return (s); #ifdef NEVER if (blistp->b_nwnd == 0) { /* Not on screen yet. */ if ((wp=wpopup()) == NULL) return (FALSE); bp = wp->w_bufp; if (--bp->b_nwnd == 0) { bp->b_dotp = wp->w_dotp; bp->b_doto = wp->w_doto; bp->b_markp = wp->w_markp; bp->b_marko = wp->w_marko; } wp->w_bufp = blistp; ++blistp->b_nwnd; } #endif #ifdef NEVER while (wp != NULL) { if (wp->w_bufp == blistp) { wp->w_linep = wp->w_dotp = lforw(blistp->b_linep); wp->w_markp = wp->w_doto = wp->w_marko = 0; wp->w_flag |= WFMODE|WFHARD; } wp = wp->w_wndp; } #endif return (TRUE); } /* * This routine rebuilds the * text in the special secret buffer * that holds the buffer list. It is called * by the list buffers command. Return TRUE * if everything works. Return FALSE if there * is an error (if there is no memory). */ makelist() { register char *cp1; register char *cp2; register int c; register BUFFER *bp; register LINE *lp; register int nbytes; register int s; register int type; char b[6+1]; char line[128]; int nbuff; nbuff = 0; blistp->b_flag &= ~BFCHG; /* Don't complain! */ if ((s=bclear(blistp)) != TRUE) /* Blow old text away */ return (s); blistp->b_fname[0] = 0; if (addline(" C Size Buffer File") == FALSE || addline(" - ---- ------ ----") == FALSE) return (FALSE); bp = bheadp; /* For all buffers */ while (bp != NULL) { if ( bp->b_flag & BFTEMP ) { bp = bp->b_bufp; /* Skip magic ones. */ continue; } cp1 = &line[-1]; /* Start at left edge */ cp2 = &b[0]; itoa( cp2, 3, ++nbuff ); /* 6 digit buffer size. */ while (*++cp1 = *cp2++); *cp1 = ' '; /* Gap. */ *++cp1 = ( bp->b_flag & BFCHG ) ? '*' : ' '; /* "*" if changed */ *++cp1 = ' '; /* Gap. */ nbytes = 0; /* Count bytes in buf. */ lp = lforw(bp->b_linep); while (lp != bp->b_linep) { nbytes += llength(lp)+1; lp = lforw(lp); } cp2 = &b[0]; itoa( cp2, 6, nbytes ); /* 6 digit buffer size. */ while (*++cp1 = *cp2++); *cp1 = ' '; /* Gap. */ cp2 = &bp->b_bname[0]; /* Buffer name */ while (*++cp1 = *cp2++); cp2 = &bp->b_fname[0]; /* File name */ if (*cp2 != 0) { while (cp1 < &line[4+1+1+6+1+NBUFN+1]) *cp1++ = ' '; while ( *cp1++ = *cp2++ ); } *cp1 = 0; if (addline(line) == FALSE) return (FALSE); bp = bp->b_bufp; } return (TRUE); /* All done */ } /* * The argument "text" points to * a string. Append this line to the * buffer list buffer. Handcraft the EOL * on the end. Return TRUE if it worked and * FALSE if you ran out of room. */ addline(text) char *text; { register LINE *lp; register int ntext; ntext = strlen(text); if ((lp=lalloc(ntext)) == NULL) return (FALSE); blockmv( &lp->l_text[0], text, ntext ); /**** for (i=0; il_bp = blistp->b_linep->l_bp )->l_fp = lp; ( lp->l_fp = blistp->b_linep )->l_bp = lp; if (blistp->b_dotp == blistp->b_linep) /* If "." is at the end */ blistp->b_dotp = lp; /* move it to new line */ return (TRUE); } itoa(buf, width, num) register char buf[]; register int width; register int num; { buf[width] = 0; /* End of string. */ clear( buf, width, ' ' ); while (num >= 10) { /* Conditional digits. */ buf[--width] = (num%10) + '0'; num /= 10; } buf[--width] = num + '0'; /* Always 1 digit. */ #ifdef NEVER while (width != 0) /* Pad with blanks. */ buf[--width] = ' '; #endif } /* * Attach a buffer to a window. The * values of dot and mark come from the buffer * if the use count is 0. Otherwise, they come * from some other window. */ usebuf( x, f, n) { register BUFFER *bp; register WINDOW *wp; register int s; char bufn[NBUFN]; if ( x == 1 ) { /* "next buffer" */ bp = curbp->b_bufp; if ( bp == NULL ) bp = bheadp; } else if ( x == 2 ) { if ( ( bp = bfind( "[List]", TRUE, BFTEMP )) == NULL ) return ( 0 ); } else { /* normal usebuffer() routine. */ if ((s=mlreply("Use buffer: ", bufn, NBUFN)) != TRUE) return (s); if ((bp=bfind(bufn, TRUE, 0)) == NULL) return (FALSE); } if (--curbp->b_nwnd == 0) { /* Last use. */ /**** curbp->b_dotp = curwp->w_dotp; ****/ /**** curbp->b_doto = curwp->w_doto; ****/ /**** curbp->b_markp = curwp->w_markp; ****/ /**** curbp->b_marko = curwp->w_marko; ****/ blockmv( curbp, curwp, 8 ); } curbp = bp; /* Switch. */ curwp->w_bufp = bp; curwp->w_linep = bp->b_linep; /* For macros, ignored. */ curwp->w_flag |= WFMODE|WFFORCE|WFHARD; /* Quite nasty. */ if (bp->b_nwnd++ == 0) { /* First use. */ blockmv( curwp, curbp, 8 ); #ifdef NEVER curwp->w_dotp = bp->b_dotp; curwp->w_doto = bp->b_doto; curwp->w_markp = bp->b_markp; curwp->w_marko = bp->b_marko; #endif return (TRUE); } wp = wheadp; /* Look for old. */ while (wp != NULL) { if (wp!=curwp && wp->w_bufp==bp) { blockmv( curwp, curbp, 8 ); #ifdef NEVER curwp->w_dotp = wp->w_dotp; curwp->w_doto = wp->w_doto; curwp->w_markp = wp->w_markp; curwp->w_marko = wp->w_marko; #endif break; } wp = wp->w_wndp; } return (TRUE); }  .