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

📄 format.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic char *sccsid = "@(#)format.c	4.1	ULTRIX	7/3/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1986 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//**************************************************************************			Modification History** 001 - David Metsky, 4-JUN-1986*	Bug fix to prevent adb from dying when asked to print a floating*	point number between 0x8000 and 0x80ff.  The fix just scans the*	input and prints a warning message instead if there is a*	problem.**************************************************************************//* * *	UNIX debugger * */#include "defs.h"MSG		BADMOD;MSG		NOFORK;MSG		ADWRAP;INT		mkfault;CHAR		*lp;L_INT		maxoff;ADDR		sigint;ADDR		sigqit;STRING		errflg;CHAR		lastc,peekc;L_INT		dot;INT		dotinc;L_INT		expv;L_INT		var[];STRING		fphack;rdfp(){	return(lastc= *fphack++);}scanform(icount,ifp,itype,ptype)L_INT		icount;STRING		ifp;{	STRING		fp;	CHAR		modifier;	INT		fcount, init=1;	L_INT		savdot;	BOOL exact;	BOOL doit = 1;	WHILE icount	DO  fp=ifp;	    savdot=dot; init=0;	    IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff	    THEN printf("\n%s:%16t",cursym->n_un.n_name);	    FI	    /*now loop over format*/	    WHILE *fp ANDF errflg==0	    DO  IF digit(modifier = *fp)		THEN fcount = 0;			WHILE digit(modifier = *fp++)			DO fcount *= 10;			   fcount += modifier-'0';			OD			fp--;		ELSE fcount = 1;		FI		IF *fp==0 THEN break; FI		IF exact ANDF dot==savdot ANDF itype==ISP ANDF cursym->n_un.n_name[0]=='_' ANDF *fp=='i'		THEN exform(1,"x",itype,ptype); fp++; printc(EOR); /* entry mask */		ELSE fp=exform(fcount,fp,itype,ptype);		FI	    OD	    dotinc=dot-savdot;	    dot=savdot;	    IF errflg	    THEN IF icount<0		 THEN errflg=0; break;		 ELSE error(errflg);		 FI	    FI	    IF --icount	    THEN dot=inkdot(dotinc);	    FI	    IF mkfault THEN error(0); FI	OD}STRINGexform(fcount,ifp,itype,ptype)INT		fcount;STRING		ifp;{	/* execute single format item `fcount' times	 * sets `dotinc' and moves `dot'	 * returns address of next format item	 */	POS		w;	L_INT		savdot, wx;	STRING		fp;	CHAR		c, modifier, longpr;	L_REAL		fw;	struct{		L_INT	sa;		INT	sb,sc;	};	WHILE fcount>0	DO	fp = ifp; c = *fp;		longpr=(c>='A')&(c<='Z')|(c=='f')|(c=='4')|(c=='p');		IF itype==NSP ORF *fp=='a'		THEN wx=dot; w=dot;		ELSE w=get(dot,itype);		     IF longpr		     THEN wx=itol(get(inkdot(2),itype),w);		     ELSE wx=w;		     FI		FI		IF c=='F'		THEN fw.sb=get(inkdot(4),itype);		     fw.sc=get(inkdot(6),itype);		FI		IF errflg THEN return(fp); FI		IF mkfault THEN error(0); FI		var[0]=wx;		modifier = *fp++;		dotinc=(longpr?4:2);;		IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI		switch(modifier) {		    case SP: case TB:			break;		    case 't': case 'T':			printf("%T",fcount); return(fp);		    case 'r': case 'R':			printf("%M",fcount); return(fp);		    case 'a':			psymoff(dot,ptype,":%16t"); dotinc=0; break;		    case 'p':			psymoff(var[0],ptype,"%16t"); break;		    case 'u':			printf("%-8u",w); break;		    case 'U':			printf("%-16U",wx); break;		    case 'c': case 'C':			IF modifier=='C'			THEN printesc(w&LOBYTE);			ELSE printc(w&LOBYTE);			FI			dotinc=1; break;		    case 'b': case 'B':			printf("%-8o", w&LOBYTE); dotinc=1; break;			case '1':			printf("%-8r", w&LOBYTE); dotinc=1; break;			case '2':		    case 'w':			printf("%-8r", w); break;			case '4':		    case 'W':			printf("%-16R", wx); break;		    case 's': case 'S':			savdot=dot; dotinc=1;			WHILE (c=get(dot,itype)&LOBYTE) ANDF errflg==0			DO dot=inkdot(1);			   IF modifier == 'S'			   THEN printesc(c);			   ELSE printc(c);			   FI			   endline();			OD			dotinc=dot-savdot+1; dot=savdot; break;		    case 'x':			printf("%-8x",w); break;		    case 'X':			printf("%-16X", wx); break;		    case 'Y':			printf("%-24Y", wx); break;		    case 'q':			printf("%-8q", w); break;		    case 'Q':			printf("%-16Q", wx); break;		    case 'o':			printf("%-8o", w); break;		    case 'O':			printf("%-16O", wx); break;		    case 'i':			printins(0,itype,w); printc(EOR); break;		    case 'd':			printf("%-8d", w); break;		    case 'D':			printf("%-16D", wx); break;		    case 'f':			fw = 0;			fw.sa = wx;			if ((wx & ~0xFFFF00FF) == 0x8000)   /* 001 DM */			    printf("value is illegal floating point number\n");			else			    printf("%-16.9f", fw);			dotinc=4;			break;		    case 'F':			fw.sa = wx;			if ((wx & ~0xFFFF00FF) == 0x8000)   /* 001 DM */			    printf("value is illegal floating point number\n");			else			    printf("%-32.18F", fw);			dotinc=8; break;		    case 'n': case 'N':			printc('\n'); dotinc=0; break;		    case '"':			dotinc=0;			WHILE *fp != '"' ANDF *fp			DO printc(*fp++); OD			IF *fp THEN fp++; FI			break;		    case '^':			dot=inkdot(-dotinc*fcount); return(fp);		    case '+':			dot=inkdot(fcount); return(fp);		    case '-':			dot=inkdot(-fcount); return(fp);		    default: error(BADMOD);		}		IF itype!=NSP		THEN	dot=inkdot(dotinc);		FI		fcount--; endline();	OD	return(fp);}shell(){#ifndef EDDT	INT		rc, status, unixpid;	STRING		argp = lp;	STRING		getenv(), shell = getenv("SHELL");#ifdef VFORK	char		oldstlp;#endif	if (shell == 0)		shell = "/bin/sh";	WHILE lastc!=EOR DO rdc(); OD#ifndef VFORK	IF (unixpid=fork())==0#else	oldstlp = *lp;	IF (unixpid=vfork())==0#endif	THEN	signal(SIGINT,sigint); signal(SIGQUIT,sigqit);		*lp=0; execl(shell, "sh", "-c", argp, 0);		_exit(16);#ifndef VFORK	ELIF unixpid == -1#else	ELIF *lp = oldstlp, unixpid == -1#endif	THEN	error(NOFORK);	ELSE	signal(SIGINT,1);		WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE		signal(SIGINT,sigint);		prints("!"); lp--;	FI#endif}printesc(c){	c &= STRIP;	IF c==0177 THEN printf("^?");	ELIF c<SP	THEN printf("^%c", c + '@');	ELSE printc(c);	FI}L_INT	inkdot(incr){	L_INT		newdot;	newdot=dot+incr;	IF (dot NEQ newdot) >> 24 THEN error(ADWRAP); FI	return(newdot);}digit(c){	return c >= '0' && c <= '9';}

⌨️ 快捷键说明

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