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

📄 mfbio.c

📁 支持数字元件仿真的SPICE插件
💻 C
📖 第 1 页 / 共 3 页
字号:
     * 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(ioctl(MFBCurrent->fileDesc,TIOCSETP,        (char *) &MFBCurrent->graphTtyb.oldttyb) < 0) return(MFBBADOPT);        if(ioctl(MFBCurrent->fileDesc,TIOCLSET,        (char *) &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(ioctl(1,TIOCSETP,(char *) &MFBCurrent->kybrdTtyb.oldttyb) < 0)        return(MFBBADOPT);        if(ioctl(1,TIOCLSET,(char *) &MFBCurrent->oldstat.kybrdttyw) < 0)        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();#ifndef vms    /*     * 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(ioctl(MFBCurrent->fileDesc,TIOCSETP,        (char *) &MFBCurrent->graphTtyb.oldttyb) < 0) return(MFBBADOPT);        if(ioctl(MFBCurrent->fileDesc,TIOCLSET,        (char *) &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(ioctl(1,TIOCSETP,(char *) &MFBCurrent->kybrdTtyb.oldttyb) < 0)        return(MFBBADOPT);        if(ioctl(1,TIOCLSET,(char *) &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 == NULL){    /*     * 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] = NULL;        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] = NULL;        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] = NULL;        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] = NULL;        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 + -