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

📄 edbasic.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
        } 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. */#if IBM_TBC#pragma argsused#endifgloble int filename(  void *theEnv,  int f,  int n)  {        register WINDOW *wp;        register int    s;        char            fname[NFILEN];        if ((s=mlreply(theEnv,"Name: ", fname, NFILEN)) == ABORT)                return (s);        if (s == FALSE)                genstrcpy(curbp->b_fname, "");        else                genstrcpy(curbp->b_fname, fname);        wp = wheadp;                            /* Update mode lines.   */        while (wp != NULL) {                if (wp->w_bufp == curbp)                        wp->w_flag |= WFMODE;                wp = wp->w_wndp;        }        return (TRUE);  }/* ======================================================================= *                   Low level File I/O commands * ======================================================================= */static FILE    *ffp;                 /* File pointer, all functions. *//* * The routines in this section do the low level read and write of ASCII * files from the disk. All of the knowledge about files is here. A better * message writing scheme should be used. *//* * Open a file for reading. */globle int ffropen(char    *fn){        if ((ffp=fopen(fn, "r")) == NULL)                return (FIOFNF);        return (FIOSUC);}/* * Open a file for writing. Return TRUE if all is well, and FALSE on error * (cannot create). */globle int ffwopen(char    *fn){#if     VAX_VMS        register int    fd;        if ((fd=creat(fn, 0666, "rfm=var", "rat=cr")) < 0        || (ffp=fdopen(fd, "w")) == NULL) {#else        if ((ffp=fopen(fn, "w")) == NULL) {#endif                mlwrite("Cannot open file for writing");                return (FIOERR);        }        return (FIOSUC);}/* * Close a file. Should look at the status in all systems. */globle int ffclose(){#if     UNIX_7 || UNIX_V        if (fclose(ffp) != FALSE) {                mlwrite("Error closing file");                return(FIOERR);        }#else        fclose(ffp);#endif        return (FIOSUC);}/* * Write a line to the already opened file. The "buf" points to the buffer, * and the "nbuf" is its length, less the free newline. Return the status. * Check only at the newline. */globle int ffputline(char    buf[],int nbuf){        register int    i;        for (i = 0; i < nbuf; ++i)                fputc(buf[i]&0xFF, ffp);        fputc('\n', ffp);        if (ferror(ffp)) {                mlwrite("Write I/O error");                return (FIOERR);        }        return (FIOSUC);}/* * Read a line from a file, and store the bytes in the supplied buffer. The * "nbuf" is the length of the buffer. Complain about long lines and lines * at the end of the file that don't have a newline present. Check for I/O * errors too. Return status. */globle int ffgetline(char   buf[],int nbuf){        register int    c;        register int    i;        i = 0;        while ((c = fgetc(ffp)) != EOF && c != '\n') {                if (i >= nbuf-1) {                        mlwrite("File has long line");                        return (FIOERR);                }                buf[i++] = (char) c;        }        if (c == EOF) {                if (ferror(ffp)) {                        mlwrite("File read error");                        return (FIOERR);                }                if (i != 0) {                        mlwrite("File has funny line at EOF");                        return (FIOERR);                }                return (FIOEOF);        }        buf[i] = 0;        return (FIOSUC);}/* ======================================================================= *                    LOW LEVEL TERMINAL I/O COMMANDS * ======================================================================= *//* * The functions in this section negotiate with the operating system for * characters, and write characters in a barely buffered fashion on the * display. All operating systems. *//* * This function is called once to set up the terminal device streams. * On VMS, it translates SYS$INPUT until it finds the terminal, then assigns * a channel to it and sets it raw. */globle void ttopen(){#if	VAX_VMS	struct  dsc$descriptor  idsc;	struct  dsc$descriptor  odsc;	char	oname[40];	int	iosb[2];	int	status;	odsc.dsc$a_pointer = "SYS$INPUT";	odsc.dsc$w_length  = strlen(odsc.dsc$a_pointer);	odsc.dsc$b_dtype	= DSC$K_DTYPE_T;	odsc.dsc$b_class	= DSC$K_CLASS_S;	idsc.dsc$b_dtype	= DSC$K_DTYPE_T;	idsc.dsc$b_class	= DSC$K_CLASS_S;	do {		idsc.dsc$a_pointer = odsc.dsc$a_pointer;		idsc.dsc$w_length  = odsc.dsc$w_length;		odsc.dsc$a_pointer = &oname[0];		odsc.dsc$w_length  = sizeof(oname);		status = LIB$SYS_TRNLOG(&idsc, &odsc.dsc$w_length, &odsc);		if (status!=SS$_NORMAL && status!=SS$_NOTRAN)			exit(status);		if (oname[0] == 0x1B) {			odsc.dsc$a_pointer += 4;			odsc.dsc$w_length  -= 4;		}	} while (status == SS$_NORMAL);	status = SYS$ASSIGN(&odsc, &iochan, 0, 0);	if (status != SS$_NORMAL)		exit(status);	status = SYS$QIOW(EFN, iochan, IO$_SENSEMODE, iosb, 0, 0,			  oldmode, sizeof(oldmode), 0, 0, 0, 0);	if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)		exit(status);	newmode[0] = oldmode[0];	newmode[1] = oldmode[1] | TT$M_PASSALL | TT$M_NOECHO;        newmode[1] &= ~(TT$M_TTSYNC|TT$M_HOSTSYNC);        newmode[2] = oldmode[2] | TT2$M_PASTHRU;	status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,			  newmode, sizeof(newmode), 0, 0, 0, 0);	if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)		exit(status);#endif#if	UNIX_7 || UNIX_V        ioctl(1,TIOCGETP,&ostate);        ioctl(1,TIOCGETP,&nstate);	/* gtty(1, &ostate);	*/		/* save old state */	/* gtty(1, &nstate);	*/ 		/* get base of new state */	nstate.sg_flags |= RAW;	nstate.sg_flags &= ~(ECHO|CRMOD);	/* no echo for now... */	/* stty(1, &nstate);	*/		/* set mode */        ioctl(1,TIOCSETP,&nstate);#endif}/* * This function gets called just before we go back home to the command * interpreter. On VMS it puts the terminal back in a reasonable state. */globle void ttclose(){#if	VAX_VMS	int	status;	int	iosb[1];	ttflush();	status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,		 oldmode, sizeof(oldmode), 0, 0, 0, 0);	if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)		exit(status);	status = SYS$DASSGN(iochan);	if (status != SS$_NORMAL)		exit(status);#endif#if	UNIX_7 || UNIX_V	/* stty(1, &ostate); */        ioctl(1,TIOCSETP,&ostate);#endif}/* * Write a character to the display. On VMS, terminal output is buffered, and * we just put the characters in the big array, after checking for overflow. * Ditto on MS-DOS (use the very very raw console output routine). */#if IBM_TBC#pragma argsused#endifgloble void ttputc(int c){#if	VAX_VMS	if (nobuf >= NOBUF)		ttflush();	obuf[nobuf++] = c;#endif#if	UNIX_7 || UNIX_V	fputc(c, stdout);#endif}/* * Flush terminal buffer. Does real work where the terminal output is buffered * up. A no-operation on systems where byte at a time terminal I/O is done. */globle void ttflush(){#if	VAX_VMS	int	status;	int	iosb[2];	status = SS$_NORMAL;	if (nobuf != 0) {		status = SYS$QIOW(EFN, iochan, IO$_WRITELBLK|IO$M_NOFORMAT,			 iosb, 0, 0, obuf, nobuf, 0, 0, 0, 0);		if (status == SS$_NORMAL)			status = iosb[0] & 0xFFFF;		nobuf = 0;	}#endif#if	UNIX_7 || UNIX_V	fflush(stdout);#endif}/* * Read a character from the terminal, performing no editing and doing no echo * at all. More complex in VMS that almost anyplace else, which figures. */globle int ttgetc(){#if	VAX_VMS	int	status;	int	iosb[2];    	long term[2];       /*Terminator block for I/O*/	while (ibufi >= nibuf) {		ibufi = 0;		term[0] = 0;		term[1] = 0;		status = SYS$QIOW(EFN, iochan,			  IO$_READLBLK|IO$M_TIMED|IO$M_NOFILTR|IO$M_PURGE,			 iosb, 0, 0, ibuf, NIBUF, 0, term, 0, 0);		if (status != SS$_NORMAL)			exit(status);		status = iosb[0] & 0xFFFF;		if (status!=SS$_NORMAL && status!=SS$_TIMEOUT)			exit(status);		nibuf = (iosb[0]>>16) + (iosb[1]>>16);		if (nibuf == 0) {         	   status = SYS$QIOW(EFN, iochan,IO$_READLBLK|                                     IO$M_NOFILTR|IO$M_PURGE,			             iosb, 0, 0, ibuf, 1, 0, term, 0, 0);		   if (status != SS$_NORMAL)                     exit(status);		   status = (iosb[0]&0xFFFF);		   if (status != SS$_NORMAL)		     exit(status);		   nibuf = (iosb[0]>>16) + (iosb[1]>>16);		}	}        if (ibuf[ibufi] == ESC)          {           status = SYS$QIOW(EFN,iochan,IO$_READLBLK|IO$M_NOFILTR|IO$M_TIMED,                             iosb,0,0,ibuf+1,4,0,term,0,0);           nibuf = (iosb[0]>>16) + (iosb[1]>>16) + 1;           if ((status == SS$_NORMAL) && (nibuf > 1))             return(parse_esc_seq());           if ((status != SS$_NORMAL) && (status != SS$_TIMEOUT))             exit(status);          }        return (ibuf[ibufi++] & 0xFF);	  /* Allow multinational  */#endif#if     IBM_MSC || IBM_TBC || IBM_GCC	return (fgetc(stdin));           /* NOTE: This won't really work */#endif                              /* See file EDTERM.C for good code */#if	UNIX_7 || UNIX_V	return(fgetc(stdin));#endif}#if VAX_VMS/********************************//*PARSES ESCAPE SEQUENCES       *//********************************/globle int parse_esc_seq() {	int index, num;	index = ibufi + 1;	if ((ibuf[index] != '[') && (ibuf[index] != 'O')) {	    if ((ibuf[index] >= 'a') && (ibuf[index] <= 'z'))		ibuf[index] = ibuf[index] - ('a' - 'A');	    if ((ibuf[index] >= '\000') && (ibuf[index] <= '\037'))		ibuf[index] = COTL | ibuf[index];	    ibufi = nibuf + 1;  	    return (META | ibuf[index]);	}	if (ibuf[index] == '[') index++;	ibufi = nibuf + 1;	switch (ibuf[index]) {	case 'A' : return(COTL | 'P');		   break;	case 'B' : return(COTL | 'N');		   break;	case 'C' : return(COTL | 'F');		   break;	case 'D' : return(COTL | 'B');		   break;	case '1' : case '2' : case '3' :	case '4' : case '5' : case '6' :		   if (ibuf[index + 1] != TERM)		       num = (ibuf[index] - 48)*10 + (ibuf[++index] -48);		   else num = ibuf[index] - 48;		   switch (num) {                   case 1 : return(COTL | 'S');			     break;                   case 2 : return(COTL | 'Y');			     break;                   case 3 : return(COTL | 'W');			     break;                   case 4 : return(COTL | '@');			     break;                   case 5 : return(META | 'V');			     break;                   case 6 : return(COTL | 'V');			     break;		   default : return BADKEY;		   }		   break;	default  : return BADKEY;	}	     return(TRUE);    }#endif#endif

⌨️ 快捷键说明

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