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

📄 mfbio.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    /*     * Put terminal in the state that existed before MFBOpen     */    if(MFBCurrent->deviceType == TTY) {    /*     * Output initialization end string     */    MFBGenCode(MFBFORMAT.endSequence);    /*     * Flush the buffer     */    MFBUpdate();#ifdef HAS_TTY_    /*     * Reset graphics tty options     *     * NOTE: we must reset these options in just the opposite order     * in which they were set.  The user might have opened his own     * terminal, in which case the fileDesc is not unity, but we     * are still setting the standard i/o device.     */        /* the isatty() is necessary because user may be piping output */    if(isatty(MFBCurrent->fileDesc)){        /*        if(chmod(MFBCurrent->name,        MFBCurrent->oldstat.graphstat.st_mode) < 0) return(MFBBADOPT);        */        if(ioset(MFBCurrent->fileDesc, &MFBCurrent->graphTtyb.oldttyb) < 0)	    return(MFBBADOPT);        if(iosetl(MFBCurrent->fileDesc, &MFBCurrent->oldstat.graphttyw) < 0)	    return(MFBBADOPT);        }        /* the isatty() is necessary because user may be piping output */    if(MFBCurrent->fileDesc != 1 && isatty(1)){        /*        if(chmod(ttyname(2),MFBCurrent->oldstat.kybrdstat.st_mode) < 0)        return(MFBBADOPT);        */	if (ioset(1, &MFBCurrent->kybrdTtyb.oldttyb) < 0)	    return(MFBBADOPT);	if (iosetl(1, &MFBCurrent->oldstat.kybrdttyw) < 0)	    return(MFBBADOPT);        return(MFBBADOPT);        }#endif    /*     * don't close stdout     */    if(MFBCurrent->fileDesc != 1)        if(close(MFBCurrent->fileDesc) < 0)        return(MFBBADDEV);    }    /*     * Deinitialize the mfb structure     */    MFBCurrent->initializedBool = false;    free((char *) MFBCurrent);    return(MFBOK);    }intMFBHalt(){    /*     * Notes:     *    Called to disable the graphics sequence.     *    Has same effect as MFBHalt, except that the MFBCurrent is not freed.     *     *    PERFECT FOR SUSPENDING A JOB IN UNIX!     */    /*     * Put terminal in the state that existed before MFBOpen     */    if(MFBCurrent->deviceType == TTY) {    /*     * Clear the output buffer     */    MFBUpdate();    /*     * Output initialization end string     */    MFBGenCode(MFBFORMAT.endSequence);    /*     * Flush the buffer     */    MFBUpdate();#ifdef HAS_TTY_    /*     * Reset graphics tty options     *     * NOTE: we must reset these options in just the opposite order     * in which they were set.  The user might have opened his own     * terminal, in which case the fileDesc is not unity, but we     * are still setting the standard i/o device.     */    /* the isatty() is necessary because user may be piping output */    if(isatty(MFBCurrent->fileDesc)){        /*        if(chmod(MFBCurrent->name,        MFBCurrent->oldstat.graphstat.st_mode) < 0) return(MFBBADOPT);        */        if(ioset(MFBCurrent->fileDesc, &MFBCurrent->graphTtyb.oldttyb) < 0)	    return(MFBBADOPT);        if(iosetl(MFBCurrent->fileDesc, &MFBCurrent->oldstat.graphttyw) < 0)	    return(MFBBADOPT);        }    /* the isatty() is necessary because user may be piping output */    if(MFBCurrent->fileDesc != 1 && isatty(1)){        /*        if(chmod(ttyname(2),MFBCurrent->oldstat.kybrdstat.st_mode) < 0)        return(MFBBADOPT);        */        if(ioset(1, &MFBCurrent->kybrdTtyb.oldttyb) < 0)	    return(MFBBADOPT);        if(iosetl(1, &MFBCurrent->oldstat.kybrdttyw) < 0)	    return(MFBBADOPT);        }#endif    MFBCurrent->ttyIsSet = false;    }    return(MFBOK);    } /***************************************************************************** * *                     INPUT ROUTINES * *****************************************************************************/intMFBPoint(x,y,key,button)    int *x,*y,*button;    char *key;    /*     * Notes:     *    None at this time.     */    {    int status;    int retrnd;    if(!MFBCurrent->PointingDeviceBool)    return(MFBNOPNT);    if((retrnd = MFBFlushInput()) < 0)    return(retrnd);    /*     * Enable Pointing Device     */    MFBCurrent->X = MFBCurrent->cursorColor1Id;    MFBCurrent->Y = MFBCurrent->cursorColor2Id;    MFBGenCode(MFBFORMAT.enablePointingDevice);    MFBCurrent->X = MFBCurrent->Y = -1;    MFBCurrent->Z = MFBCurrent->T = 0;    /*     * If Read Will Cause Immediate Transfer,Wait For a Character     */    if(MFBCurrent->readImmediateBool) {    MFBUpdate();    MFBCurrent->Z = (*MFBCurrent->dsply_getchar)();    }    /*     * Trigger Pointing Device Read     */    MFBGenCode(MFBFORMAT.readPointingDevice);    /*     * And Flush The Buffer     */    MFBUpdate();    /*     * Read and Format Cursor Data     */    /* MFBDecode returns >= 0 if OK, character barfed on if ERROR. */    status  = MFBDecode(MFBFORMAT.formatPointingDevice);    *button = MFBCurrent->T;    *key    = (char)MFBCurrent->Z;    *x    = MFBCurrent->X;    *y    = MFBCurrent->Y;         /*     * Disable Pointing Device     */    MFBGenCode(MFBFORMAT.disablePointingDevice);    /*     * MFBPoint may destroy last x/y,so be safe about it.     */    MFBCurrent->lastX  = MFBCurrent->lastY  = -1;    if((retrnd = MFBFlushInput()) < 0)    return(retrnd);    if(status >= 0) {    /* character returned */    *key = (char)status;    return(MFBOK);    }    else if(status == MFBCAPNOFORMAT)    return(MFBNOPTFT);    else if(status == MFBCAPOK)    return(MFBOK);    else    return(MFBPNTERR);    }char*MFBKeyboard(x,y,background,foreground)    int x,y;    int background;    int foreground;    {    /*     * Notes:     *    Read type-in from keyboard until user types return key.      *    Do rub-out processing--rub out and ctrl-h keys.     */    int Int1;    int X,Y;    int MaxX,MaxY;    int OldTextMode;    int OldForeground;    int OldFillPattern;    static char MFBTypeIn[161];    char c[2];    if(MFBCurrent->deviceType != TTY)    return(NULL);    Int1 = 0;    c[1] = NULL;    OldTextMode = MFBCurrent->textMode;    OldForeground = MFBCurrent->fgColorId;    OldFillPattern = MFBCurrent->fillPattern;    MFBSetFillPattern(0);    MFBSetTextMode(true);    MFBSetColor(foreground);    if(MFBFORMAT.keyboardStart == NULL ||	    *MFBFORMAT.keyboardStart == 0) {	/*	 * NAIVE KEYBOARD	 */	if(!MFBCurrent->textPositionableBool)	    return(NULL);	MaxX = MFBCurrent->maxX - MFBCurrent->keyboardXOffset;	MaxY = MFBCurrent->maxY - MFBCurrent->keyboardYOffset;	/* echo characters using graphtext */	X = x + MFBCurrent->keyboardXOffset;	Y = y + MFBCurrent->keyboardYOffset;	for(;;){	    X += (MFBCurrent->fontWidth + MFBCurrent->fontXOffset);	    MFBUpdate();	    if((*c = (*MFBCurrent->kybrd_getchar)()) == 13 || *c == 10){	    MFBTypeIn[Int1] = 0;	    break;	    }	    else if(*c == 8 || *c == 0177){    /* ctrl-h or del */	    X -= (MFBCurrent->fontWidth + MFBCurrent->fontXOffset);	    if(Int1 > 0){              /* can't bs further . . . */		MFBSetColor(background);		MFBBox(X+MFBCurrent->keyboardXOffset,		Y+MFBCurrent->keyboardYOffset-MFBCurrent->fontYOffset,		X+MFBCurrent->keyboardXOffset+MFBCurrent->fontWidth		    +MFBCurrent->fontXOffset,		Y+MFBCurrent->keyboardYOffset+MFBCurrent->fontHeight);		MFBSetColor(foreground);		X -= (MFBCurrent->fontWidth + MFBCurrent->fontXOffset);		Int1--;		}	    }	    else if(*c == 24 || *c == 21){  /* ctrl-x or ctrl-u */	    MFBSetColor(background);	    MFBBox(x+MFBCurrent->keyboardXOffset,		Y+MFBCurrent->keyboardYOffset-MFBCurrent->fontYOffset,		X+MFBCurrent->keyboardXOffset,		Y+MFBCurrent->keyboardYOffset+MFBCurrent->fontHeight);	    MFBSetColor(foreground);	    X = x + MFBCurrent->keyboardXOffset;	    Int1 = 0;	    }	    else if(*c == 27){  /* esc */		MFBText(" ESCAPE",X,Y,0);		MFBTypeIn[0] = 0;		Int1 = 0;		break;	    } else{		MFBTypeIn[Int1++] = *c;		X = MFBmin(MaxX,X);		Y = MFBmin(MaxY,Y);		if(*c >= ' ' && *c <= '~')		    MFBText(c,X,Y,0);		else		    MFBText("^",X,Y,0);	    }	}    }    else {	MFBCurrent->X = x + MFBCurrent->keyboardXOffset;	MFBCurrent->Y = y + MFBCurrent->keyboardYOffset;	MFBGenCode(MFBFORMAT.keyboardStart);	MFBPutchar(' ');	for(;;){	    MFBPutchar(' ');	    MFBGenCode(MFBFORMAT.keyboardBackspace);	    MFBUpdate();	    if((*c = (*MFBCurrent->kybrd_getchar)()) == 13 || *c == 10){		MFBTypeIn[Int1] = 0;		break;	    }	    else if(*c == 8 || *c == 0177){	    if(Int1 == 0)   /* can't bs further . . . */		MFBPutchar(7);	    else{		MFBPutchar(' ');		MFBGenCode(MFBFORMAT.keyboardBackspace);		MFBGenCode(MFBFORMAT.keyboardBackspace);		Int1--;		}	    }	    else if(*c == 24 || *c == 21){  /* ctrl-x or ctrl-u */	    for(; Int1 > 0; Int1--){		MFBPutchar(' ');		MFBGenCode(MFBFORMAT.keyboardBackspace);		MFBGenCode(MFBFORMAT.keyboardBackspace);		}	    MFBPutchar(' ');	    MFBGenCode(MFBFORMAT.keyboardBackspace);	    }	    else if(*c == 27){  /* esc */		MFBTypeIn[0] = 0;		break;	    }	    else{		MFBTypeIn[Int1++] = *c;		if(*c >= ' ' && *c <= '~')		    MFBPutchar(*c);		else		    MFBPutchar('^');	    }	}	MFBGenCode(MFBFORMAT.keyboardEnd);    }    MFBSetTextMode(OldTextMode);    MFBSetColor(OldForeground);    MFBSetFillPattern(OldFillPattern);    /*     * MFBKeyboard may destroy last x/y,so be safe about it.     */    MFBCurrent->lastX = MFBCurrent->lastY  = -1;    return(MFBTypeIn);    }/***************************************************************************** * *      ERROR HANDLING ROUTINES * *****************************************************************************/char *MFBError(errnum)    int errnum;    {    int i;    static char result[200];    for(i = 0; i < NUMERRORS; i++) {    if(errors[i].errnum == errnum) {        (void) strcpy(result,errors[i].message);        return(result);        }    }    (void) sprintf(result,"Illegal Error Number %d in MFBError!",errnum);    return(result);    }

⌨️ 快捷键说明

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