⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edbasic.c

📁 NASA 开发使用的一个专家系统
💻 C
📖 第 1 页 / 共 4 页
字号:
{        register LINE   *flp;        register LINE   *blp;        long    fsize;        long    bsize;        if (curwp->w_markp == NULL) {                mlwrite("No mark set in this window");                return (FALSE);        }        if (curwp->w_dotp == curwp->w_markp) {                rp->r_linep = curwp->w_dotp;                if (curwp->w_doto < curwp->w_marko) {                        rp->r_offset = curwp->w_doto;                        rp->r_size = (long) (curwp->w_marko-curwp->w_doto);                } else {                        rp->r_offset = curwp->w_marko;                        rp->r_size = (long) (curwp->w_doto-curwp->w_marko);                }                return (TRUE);        }        blp = curwp->w_dotp;        bsize = (long) curwp->w_doto;        flp = curwp->w_dotp;        fsize = (long) (llength(flp)-curwp->w_doto+1);        while (flp!=curbp->b_linep || lback(blp)!=curbp->b_linep) {                if (flp != curbp->b_linep) {                        flp = lforw(flp);                        if (flp == curwp->w_markp) {                                rp->r_linep = curwp->w_dotp;                                rp->r_offset = curwp->w_doto;                                rp->r_size = fsize+curwp->w_marko;                                return (TRUE);                        }                        fsize += llength(flp)+1;                }                if (lback(blp) != curbp->b_linep) {                        blp = lback(blp);                        bsize += llength(blp)+1;                        if (blp == curwp->w_markp) {                                rp->r_linep = blp;                                rp->r_offset = curwp->w_marko;                                rp->r_size = bsize - curwp->w_marko;                                return (TRUE);                        }                }        }        mlwrite("Bug: lost mark");        return (FALSE);}/* ======================================================================= *                   HIGH LEVEL FILE I/O COMMANDS * ======================================================================= *//* * Read a file into the current * buffer. This is really easy; all you do it * find the name of the file, and call the standard * "read a file into the current buffer" code. * Bound to "C-X C-R". * * Changed calling code to "C-X C-V" to be * more like the Zmacs editor on Symbolics. CJC 7/28/86 */#if IBM_TBC#pragma argsused#endifgloble int fileread(f, n)int f,n;{        register int    s;        char            fname[NFILEN];        if ((s=mlreply("Visit file: ", fname, NFILEN)) != TRUE)                return (s);        return (readin(fname));}/* * Select a file for editing. * Look around to see if you can find the * fine in another buffer; if you can find it * just switch to the buffer. If you cannot find * the file, create a new buffer, read in the * text, and switch to the new buffer. * Bound to C-X C-V. * * Changed calling code to "C-X C-F" (Find File) to be * more like the Zmacs editor on Symbolics. CJC 7/28/86 */#if IBM_TBC#pragma argsused#endifgloble int filevisit(f, n)int f,n;{        register int    s;        char            fname[NFILEN];        if ((s=mlreply("Find file: ", fname, NFILEN)) != TRUE)                return (s);	filevisit_guts(fname);	return(TRUE);}globle int filevisit_guts(fname)char fname[];{        register BUFFER *bp;        register WINDOW *wp;        register LINE   *lp;        register int    i;        register int    s;        char            bname[NBUFN];        for (bp=bheadp; bp!=NULL; bp=bp->b_bufp) {                if ((bp->b_flag&BFTEMP)==0 && strcmp(bp->b_fname, fname)==0) {                        if (--curbp->b_nwnd == 0) {                                curbp->b_dotp  = curwp->w_dotp;                                curbp->b_doto  = curwp->w_doto;                                curbp->b_markp = curwp->w_markp;                                curbp->b_marko = curwp->w_marko;                        }                        curbp = bp;                        curwp->w_bufp  = bp;                        if (bp->b_nwnd++ == 0) {                                curwp->w_dotp  = bp->b_dotp;                                curwp->w_doto  = bp->b_doto;                                curwp->w_markp = bp->b_markp;                                curwp->w_marko = bp->b_marko;                        } else {                                wp = wheadp;                                while (wp != NULL) {                                        if (wp!=curwp && wp->w_bufp==bp) {                                                curwp->w_dotp  = wp->w_dotp;                                                curwp->w_doto  = wp->w_doto;                                                curwp->w_markp = wp->w_markp;                                                curwp->w_marko = wp->w_marko;                                                break;                                        }                                        wp = wp->w_wndp;                                }                        }                        lp = curwp->w_dotp;                        i = curwp->w_ntrows/2;                        while (i-- && lback(lp)!=curbp->b_linep)                                lp = lback(lp);                        curwp->w_linep = lp;                        curwp->w_flag |= WFMODE|WFHARD;                        mlwrite("[Old buffer]");                        return (TRUE);                }        }        makename(bname, fname);                 /* New buffer name.     */        while ((bp=bfind(bname, FALSE, 0)) != NULL) {                s = mlreply("Buffer name: ", bname, NBUFN);                if (s == ABORT)                 /* ^G to just quit      */                        return (s);                if (s == FALSE) {               /* CR to clobber it     */                        makename(bname, fname);                        break;                }        }        if (bp==NULL && (bp=bfind(bname, TRUE, 0))==NULL) {                mlwrite("Cannot create buffer");                return (FALSE);        }        if (--curbp->b_nwnd == 0) {             /* Undisplay.           */                curbp->b_dotp = curwp->w_dotp;                curbp->b_doto = curwp->w_doto;                curbp->b_markp = curwp->w_markp;                curbp->b_marko = curwp->w_marko;        }        strcpy(lastbufn, curbp->b_bname);       /* Set last buufer name */        curbp = bp;                             /* Switch to it.        */        curwp->w_bufp = bp;        curbp->b_nwnd++;        return (readin(fname));                 /* Read it in.          */}/* * Read file "fname" into the current * buffer, blowing away any text found there. Called * by both the read and visit commands. Return the final * status of the read. Also called by the mainline, * to read in a file specified on the command line as * an argument. */globle int readin(fname)char    fname[];{        register LINE   *lp1;        register LINE   *lp2;        register int    i;        register WINDOW *wp;        register BUFFER *bp;        register int    s;        register int    nbytes;        register int    nline;        char            line[NLINE];        bp = curbp;                             /* Cheap.               */        if ((s=bclear(bp)) != TRUE)             /* Might be old.        */                return (s);        bp->b_flag &= ~(BFTEMP|BFCHG);        strcpy(bp->b_fname, fname);        if ((s=ffropen(fname)) == FIOERR)       /* Hard file open.      */                goto out;        if (s == FIOFNF) {                      /* File not found.      */                mlwrite("[New file]");                goto out;        }        mlwrite("[Reading file]");        nline = 0;        while ((s=ffgetline(line, NLINE)) == FIOSUC) {                nbytes = strlen(line);                if ((lp1=lalloc(nbytes)) == NULL) {                        s = FIOERR;             /* Keep message on the  */                        break;                  /* display.             */                }                lp2 = lback(curbp->b_linep);                lp2->l_fp = lp1;                lp1->l_fp = curbp->b_linep;                lp1->l_bp = lp2;                curbp->b_linep->l_bp = lp1;                for (i=0; i<nbytes; ++i)                        lputc(lp1, i, line[i]);                ++nline;        }        ffclose();                              /* Ignore errors.       */        if (s == FIOEOF) {                      /* Don't zap message!   */                if (nline == 1)                        mlwrite("[Read 1 line]");                else                        mlwrite("[Read %d lines]", nline);        }out:        for (wp=wheadp; wp!=NULL; wp=wp->w_wndp) {                if (wp->w_bufp == curbp) {                        wp->w_linep = lforw(curbp->b_linep);                        wp->w_dotp  = lforw(curbp->b_linep);                        wp->w_doto  = 0;                        wp->w_markp = NULL;                        wp->w_marko = 0;                        wp->w_flag |= WFMODE|WFHARD;                }        }        if (s == FIOERR)                        /* False if error.      */                return (FALSE);        return (TRUE);}/* * Take a file name, and from it * fabricate a buffer name. This routine knows * about the syntax of file names on the target system. * I suppose that this information could be put in * a better place than a line of code. */globle int makename(bname, fname)char    bname[];char    fname[];{        register char   *cp1;        register char   *cp2;        cp1 = &fname[0];        while (*cp1 != 0)                ++cp1;#if     VAX_VMS        while (cp1!=&fname[0] && cp1[-1]!=':' && cp1[-1]!=']')                --cp1;#endif#if     IBM_MSC || IBM_TBC || IBM_ZTC || IBM_ICB || IBM_SC || IBM_GCC        while (cp1!=&fname[0] && cp1[-1]!=':' && cp1[-1]!='\\')                --cp1;#endif#if     UNIX_7 || UNIX_V        while (cp1!=&fname[0] && cp1[-1]!='/')                --cp1;#endif        cp2 = &bname[0];        while (cp2!=&bname[NBUFN-1] && *cp1!=0 && *cp1!=';')                *cp2++ = *cp1++;        *cp2 = 0;	return(TRUE);}/* * Ask for a file name, and write the * contents of the current buffer to that file. * Update the remembered file name and clear the * buffer changed flag. This handling of file names * is different from the earlier versions, and * is more compatable with Gosling EMACS than * with ITS EMACS. Bound to "C-X C-W". * * Modified to allow current file name as default. CJC 7/28/86 */#if IBM_TBC#pragma argsused#endifgloble int filewrite(f, n)int f,n;{        register WINDOW *wp;        register int    s;        char            fname[NFILEN];        char            prompt[NFILEN + 15];        sprintf(prompt,"Write file [%s]: ",curbp->b_fname);        if ((s=mlreply(prompt, fname, NFILEN)) != TRUE) {                if (s == FALSE)                   strcpy(fname, curbp->b_fname);                else                   return (s);                }        if ((s=writeout(fname)) == TRUE) {                strcpy(curbp->b_fname, fname);                curbp->b_flag &= ~BFCHG;                wp = wheadp;                    /* Update mode lines.   */                while (wp != NULL) {                        if (wp->w_bufp == curbp)                                wp->w_flag |= WFMODE;                        wp = wp->w_wndp;                }        }        return (s);}/* * Save the contents of the current * buffer in its associatd file. Do nothing * if nothing has changed (this may be a bug, not a * feature). Error if there is no remembered file * name for the buffer. Bound to "C-X C-S". May * get called by "C-Z". */#if IBM_TBC#pragma argsused#endifgloble int filesave(f, n)int f,n;{        register WINDOW *wp;        register int    s;        if ((curbp->b_flag&BFCHG) == 0)         /* Return, no changes.  */                return (TRUE);        if (curbp->b_fname[0] == 0) {           /* Must have a name.    */                mlwrite("No file name");                return (FALSE);        }        if ((s=writeout(curbp->b_fname)) == TRUE) {                curbp->b_flag &= ~BFCHG;                wp = wheadp;                    /* Update mode lines.   */                while (wp != NULL) {                        if (wp->w_bufp == curbp)                                wp->w_flag |= WFMODE;                        wp = wp->w_wndp;                }        }        return (s);}/* * This function performs the details of file * writing. Uses the file management routines in the * "fileio.c" package. The number of lines written is * displayed. Sadly, it looks inside a LINE; provide * a macro for this. Most of the grief is error * checking of some sort. */globle int writeout(fn)char    *fn;{        register int    s;        register LINE   *lp;        register int    nline;        if ((s=ffwopen(fn)) != FIOSUC)          /* Open writes message. */                return (FALSE);        lp = lforw(curbp->b_linep);             /* First line.          */        nline = 0;                              /* Number of lines.     */        while (lp != curbp->b_linep) {                if ((s=ffputline(&lp->l_text[0], llength(lp))) != FIOSUC)                        break;                ++nline;                lp = lforw(lp);        }        if (s == FIOSUC) {                      /* No write error.      */                s = ffclose();                if (s == FIOSUC) {              /* No close error.      */                        if (nline == 1)                                mlwrite("[Wrote 1 line]");                        else                                mlwrite("[Wrote %d lines]", nline);                }        } else                                  /* Ignore close error   */                ffclose();                      /* if a write error.    */        if (s != FIOSUC)                        /* Some sort of error.  */                return (FALSE);        return (TRUE);}/* * The command allows the user * to modify the file name associated with * the current buffer. It is like the "f" command * in UNIX "ed". The operation is simple; just zap * the name in the BUFFER structure, and mark the windows * as needing an update. You can type a blank line at the * prompt if you wish. * * Bound to "C-X C-R" for Rename buffer! * Changed 7/28/86 by CJC.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -