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

📄 pcproc.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
					fmtspec += CONPREC;					fmt = 'e';					break;				case VARWIDTH:					fmtspec += VARPREC;					fmt = 'e';					break;				case CONWIDTH + CONPREC:				case CONWIDTH + VARPREC:					field -= REALSPC;					if (field < 1)						field = 1;				}				format[0] = ' ';				fmtstart = 1 - REALSPC;				break;			case TSTR:				(void) constval( alv );				switch ( classify( con.ctype ) ) {				    case TCHAR:					typ = TCHAR;					goto tchar;				    case TSTR:					strptr = con.cpval;					for (strnglen = 0;  *strptr++;  strnglen++) /* void */;					strptr = con.cpval;					break;				    default:					strnglen = width(ap);					break;				}				fmt = 's';				strfmt = fmtspec;				if (fmtspec == NIL) {					fmtspec = SKIP;					break;				}				if (fmtspec & CONWIDTH) {					if (field <= strnglen)						fmtspec = SKIP;					else						field -= strnglen;				}				break;			default:				error("Can't write %ss to a text file", clnames[typ]);				continue;			}			/*			 * Generate the format string			 */			switch (fmtspec) {			default:				panic("fmt2");			case NIL:				if (fmt == 'c') {					if ( opt( 't' ) ) {					    putleaf( PCC_ICON , 0 , 0						, PCCM_ADDTYPE( PCCTM_FTN|PCCT_INT , PCCTM_PTR )						, "_WRITEC" );					    putRV((char *) 0 , cbn , CURFILEOFFSET ,						    NLOCAL , PCCTM_PTR|PCCT_STRTY );					    (void) stkrval( alv , NLNIL , (long) RREQ );					    putop( PCC_CM , PCCT_INT );					} else {					    putleaf( PCC_ICON , 0 , 0						, PCCM_ADDTYPE( PCCTM_FTN|PCCT_INT , PCCTM_PTR )						, "_fputc" );					    (void) stkrval( alv , NLNIL ,							(long) RREQ );					}					putleaf( PCC_ICON , 0 , 0					    , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					    , "_ACTFILE" );					putRV((char *) 0, cbn , CURFILEOFFSET ,						NLOCAL , PCCTM_PTR|PCCT_STRTY );					putop( PCC_CALL , PCCT_INT );					putop( PCC_CM , PCCT_INT );					putop( PCC_CALL , PCCT_INT );					putdot( filename , line );				} else  {					sprintf(&format[1], "%%%c", fmt);					goto fmtgen;				}			case SKIP:				break;			case CONWIDTH:				sprintf(&format[1], "%%%1D%c", field, fmt);				goto fmtgen;			case VARWIDTH:				sprintf(&format[1], "%%*%c", fmt);				goto fmtgen;			case CONWIDTH + CONPREC:				sprintf(&format[1], "%%%1D.%1D%c", field, prec, fmt);				goto fmtgen;			case CONWIDTH + VARPREC:				sprintf(&format[1], "%%%1D.*%c", field, fmt);				goto fmtgen;			case VARWIDTH + CONPREC:				sprintf(&format[1], "%%*.%1D%c", prec, fmt);				goto fmtgen;			case VARWIDTH + VARPREC:				sprintf(&format[1], "%%*.*%c", fmt);			fmtgen:				if ( opt( 't' ) ) {				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_WRITEF" );				    putRV((char *) 0 , cbn , CURFILEOFFSET ,					    NLOCAL , PCCTM_PTR|PCCT_STRTY );				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_ACTFILE" );				    putRV((char *) 0 , cbn , CURFILEOFFSET ,					    NLOCAL , PCCTM_PTR|PCCT_STRTY );				    putop( PCC_CALL , PCCT_INT );				    putop( PCC_CM , PCCT_INT );				} else {				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_fprintf" );				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_ACTFILE" );				    putRV((char *) 0 , cbn , CURFILEOFFSET ,					    NLOCAL , PCCTM_PTR|PCCT_STRTY );				    putop( PCC_CALL , PCCT_INT );				}				putCONG( &format[ fmtstart ]					, strlen( &format[ fmtstart ] )					, LREQ );				putop( PCC_CM , PCCT_INT );				if ( fmtspec & VARWIDTH ) {					/*					 * either					 *	,(temp=width,MAX(temp,...)),					 * or					 *	, MAX( width , ... ) ,					 */				    if ( ( typ == TDOUBLE &&						al->wexpr_node.expr3 == TR_NIL )					|| typ == TSTR ) {					soffset_flag = TRUE;					soffset = sizes[cbn].curtmps;					tempnlp = tmpalloc((long) (sizeof(long)),						nl+T4INT, REGOK);					putRV((char *) 0 , cbn ,					    tempnlp -> value[ NL_OFFS ] ,					    tempnlp -> extra_flags , PCCT_INT );					ap = stkrval( al->wexpr_node.expr2 ,						NLNIL , (long) RREQ );					putop( PCC_ASSIGN , PCCT_INT );					putleaf( PCC_ICON , 0 , 0					    , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					    , "_MAX" );					putRV((char *) 0 , cbn ,					    tempnlp -> value[ NL_OFFS ] ,					    tempnlp -> extra_flags , PCCT_INT );				    } else {					if (opt('t')					    || typ == TSTR || typ == TDOUBLE) {					    putleaf( PCC_ICON , 0 , 0						,PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT, PCCTM_PTR )						,"_MAX" );					}					ap = stkrval( al->wexpr_node.expr2,						NLNIL , (long) RREQ );				    }				    if (ap == NLNIL)					    continue;				    if (isnta(ap,"i")) {					    error("First write width must be integer, not %s", nameof(ap));					    continue;				    }				    switch ( typ ) {				    case TDOUBLE:					putleaf( PCC_ICON , REALSPC , 0 , PCCT_INT , (char *) 0 );					putop( PCC_CM , PCCT_INT );					putleaf( PCC_ICON , 1 , 0 , PCCT_INT , (char *) 0 );					putop( PCC_CM , PCCT_INT );					putop( PCC_CALL , PCCT_INT );					if ( al->wexpr_node.expr3 == TR_NIL ) {						/*						 * finish up the comma op						 */					    putop( PCC_COMOP , PCCT_INT );					    fmtspec &= ~VARPREC;					    putop( PCC_CM , PCCT_INT );					    putleaf( PCC_ICON , 0 , 0						, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )						, "_MAX" );					    putRV((char *) 0 , cbn ,						tempnlp -> value[ NL_OFFS ] ,						tempnlp -> extra_flags ,						PCCT_INT );					    putleaf( PCC_ICON ,						5 + EXPOSIZE + REALSPC ,						0 , PCCT_INT , (char *) 0 );					    putop( PCC_CM , PCCT_INT );					    putleaf( PCC_ICON , 1 , 0 , PCCT_INT , (char *) 0 );					    putop( PCC_CM , PCCT_INT );					    putop( PCC_CALL , PCCT_INT );					}					putop( PCC_CM , PCCT_INT );					break;				    case TSTR:					putleaf( PCC_ICON , strnglen , 0 , PCCT_INT , (char *) 0 );					putop( PCC_CM , PCCT_INT );					putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );					putop( PCC_CM , PCCT_INT );					putop( PCC_CALL , PCCT_INT );					putop( PCC_COMOP , PCCT_INT );					putop( PCC_CM , PCCT_INT );					break;				    default:					if (opt('t')) {					    putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );					    putop( PCC_CM , PCCT_INT );					    putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );					    putop( PCC_CM , PCCT_INT );					    putop( PCC_CALL , PCCT_INT );					}					putop( PCC_CM , PCCT_INT );					break;				    }				}				/*				 * If there is a variable precision,				 * evaluate it 				 */				if (fmtspec & VARPREC) {					if (opt('t')) {					putleaf( PCC_ICON , 0 , 0					    , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					    , "_MAX" );					}					ap = stkrval( al->wexpr_node.expr3 ,						NLNIL , (long) RREQ );					if (ap == NIL)						continue;					if (isnta(ap,"i")) {						error("Second write width must be integer, not %s", nameof(ap));						continue;					}					if (opt('t')) {					    putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );					    putop( PCC_CM , PCCT_INT );					    putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );					    putop( PCC_CM , PCCT_INT );					    putop( PCC_CALL , PCCT_INT );					}				 	putop( PCC_CM , PCCT_INT );				}				/*				 * evaluate the thing we want printed.				 */				switch ( typ ) {				case TPTR:				case TCHAR:				case TINT:				    (void) stkrval( alv , NLNIL , (long) RREQ );				    putop( PCC_CM , PCCT_INT );				    break;				case TDOUBLE:				    ap = stkrval( alv , NLNIL , (long) RREQ );				    if (isnta(ap, "d")) {					sconv(p2type(ap), PCCT_DOUBLE);				    }				    putop( PCC_CM , PCCT_INT );				    break;				case TSCAL:				case TBOOL:				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_NAM" );				    ap = stkrval( alv , NLNIL , (long) RREQ );				    sprintf( format , PREFIXFORMAT , LABELPREFIX					    , listnames( ap ) );				    putleaf( PCC_ICON , 0 , 0 ,					(int) (PCCTM_PTR | PCCT_CHAR), format );				    putop( PCC_CM , PCCT_INT );				    putop( PCC_CALL , PCCT_INT );				    putop( PCC_CM , PCCT_INT );				    break;				case TSTR:				    putCONG( "" , 0 , LREQ );				    putop( PCC_CM , PCCT_INT );				    break;				default:				    panic("fmt3");				    break;				}				putop( PCC_CALL , PCCT_INT );				putdot( filename , line );			}			/*			 * Write the string after its blank padding			 */			if (typ == TSTR ) {				if ( opt( 't' ) ) {				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_WRITES" );				    putRV((char *) 0 , cbn , CURFILEOFFSET ,					    NLOCAL , PCCTM_PTR|PCCT_STRTY );				    ap = stkrval(alv, NLNIL , (long) RREQ );				    putop( PCC_CM , PCCT_INT );				} else {				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_fwrite" );				    ap = stkrval(alv, NLNIL , (long) RREQ );				}				if (strfmt & VARWIDTH) {					    /*					     *	min, inline expanded as					     *	temp < len ? temp : len					     */					putRV((char *) 0 , cbn ,					    tempnlp -> value[ NL_OFFS ] ,					    tempnlp -> extra_flags , PCCT_INT );					putleaf( PCC_ICON , strnglen , 0 , PCCT_INT , (char *) 0 );					putop( PCC_LT , PCCT_INT );					putRV((char *) 0 , cbn ,					    tempnlp -> value[ NL_OFFS ] ,					    tempnlp -> extra_flags , PCCT_INT );					putleaf( PCC_ICON , strnglen , 0 , PCCT_INT , (char *) 0 );					putop( PCC_COLON , PCCT_INT );					putop( PCC_QUEST , PCCT_INT );				} else {					if (   ( fmtspec & SKIP )					    && ( strfmt & CONWIDTH ) ) {						strnglen = field;					}					putleaf( PCC_ICON , strnglen , 0 , PCCT_INT , (char *) 0 );				}				putop( PCC_CM , PCCT_INT );				putleaf( PCC_ICON , 1 , 0 , PCCT_INT , (char *) 0 );				putop( PCC_CM , PCCT_INT );				putleaf( PCC_ICON , 0 , 0				    , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )				    , "_ACTFILE" );				putRV((char *) 0, cbn , CURFILEOFFSET , NLOCAL ,					PCCTM_PTR|PCCT_STRTY );				putop( PCC_CALL , PCCT_INT );				putop( PCC_CM , PCCT_INT );				putop( PCC_CALL , PCCT_INT );				putdot( filename , line );			}			if (soffset_flag) {				tmpfree(&soffset);				soffset_flag = FALSE;			}		}		/*		 * Done with arguments.		 * Handle writeln and		 * insufficent number of args.		 */		switch (p->value[0] &~ NSTAND) {			case O_WRITEF:				if (argc == 0)					error("Write requires an argument");				break;			case O_MESSAGE:				if (argc == 0)					error("Message requires an argument");			case O_WRITLN:				if (filetype != nl+T1CHAR)					error("Can't 'writeln' a non text file");				if ( opt( 't' ) ) {				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_WRITLN" );				    putRV((char *) 0 , cbn , CURFILEOFFSET ,					    NLOCAL , PCCTM_PTR|PCCT_STRTY );				} else {				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_fputc" );				    putleaf( PCC_ICON , '\n' , 0 , (int) PCCT_CHAR , (char *) 0 );				    putleaf( PCC_ICON , 0 , 0					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_ACTFILE" );				    putRV((char *) 0 , cbn , CURFILEOFFSET ,					    NLOCAL , PCCTM_PTR|PCCT_STRTY );				    putop( PCC_CALL , PCCT_INT );				    putop( PCC_CM , PCCT_INT );				}				putop( PCC_CALL , PCCT_INT );				putdot( filename , line );				break;		}		return;	case O_READ4:	case O_READLN:		/*		 * Set up default		 * file "input".		 */		file = NIL;		filetype = nl+T1CHAR;		/*		 * Determine the file implied		 * for the read and generate		 * code to make it the active file.		 */		if (argv != TR_NIL) {			codeoff();			ap = stkrval(argv->list_node.list, NLNIL, (long) RREQ );			codeon();			if (ap == NLNIL)				argv = argv->list_node.next;			if (ap != NLNIL && ap->class == FILET) {				/*				 * Got "read(f, ...", make				 * f the active file, and save				 * it and its type for use in				 * processing the rest of the				 * arguments to read.				 */				file = argv->list_node.list;				filetype = ap->type;				putRV((char *) 0, cbn , CURFILEOFFSET , NLOCAL ,					PCCTM_PTR|PCCT_STRTY );				putleaf( PCC_ICON , 0 , 0 					, PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )					, "_UNIT" );				(void) stklval(argv->list_node.list, NOFLAGS);				putop( PCC_CALL , PCCT_INT );				putop( PCC_ASSIGN , PCCTM_PTR|PCCT_STRTY );				putdot( filename , line );				argv = argv->list_node.next;				argc--;			} else {				/*				 * Default is read from				 * standard input.				 */				putRV((char *) 0, cbn , CURFILEOFFSET , NLOCAL ,					PCCTM_PTR|PCCT_STRTY );				putLV( "_input" , 0 , 0 , NGLOBAL ,					PCCTM_PTR|PCCT_STRTY );				putop( PCC_ASSIGN , PCCTM_PTR|PCCT_STRTY );				putdot( filename , line );				input->nl_flags |= NUSED;			}		} else {			putRV((char *) 0, cbn , CURFILEOFFSET , NLOCAL ,				PCCTM_PTR|PCCT_STRTY );			putLV( "_input" , 0 , 0 , NGLOBAL , PCCTM_PTR|PCCT_STRTY );			putop( PCC_ASSIGN , PCCTM_PTR|PCCT_STRTY );			putdot( filename , line );			input->nl_flags |= NUSED;		}		/*		 * Loop and process each		 * of the arguments.		 */		for (; argv != TR_NIL; argv = argv->list_node.next) {			/*			 * Get the address of the target			 * on the stack.			 */			al = argv->list_node.list;			if (al == TR_NIL)				continue;			if (al->tag != T_VAR) {				error("Arguments to %s must be variables, not expressions", p->symbol);				continue;			}			codeoff();			ap = stklval(al, MOD|ASGN|NOUSE);			codeon();			if (ap == NLNIL)				continue;			if (filetype != nl+T1CHAR) {				/*				 * Generalized read, i.e.				 * from a non-textfile.				 */				if (incompat(filetype, ap, argv->list_node.list )) {					error("Type mismatch in read from non-text file");					continue;				}				/*				 * var := file ^;				 */				ap = lvalue( al , MOD | ASGN | NOUSE , RREQ );				if ( isa( ap , "bsci" ) ) {					precheck( ap , "_RANG4" , "_RSNG4" );				}				putleaf( PCC_ICON , 0 , 0				    , (int) (PCCM_ADDTYPE(					PCCM_ADDTYPE(					    PCCM_ADDTYPE(						p2type( filetype ) , PCCTM_PTR )					    , PCCTM_FTN )					, PCCTM_PTR ))				    , "_FNIL" );				if (file != NIL)					(void) stklval(file, NOFLAGS);				else /* Magic */					putRV( "_input" , 0 , 0 , NGLOBAL ,						PCCTM_PTR | PCCT_STRTY );				putop(PCC_CALL, PCCM_ADDTYPE(p2type(filetype), PCCTM_PTR));				switch ( classify( filetype ) ) {				    case TBOOL:				    case TCHAR:				    case TINT:				    case TSCAL:				    case TDOUBLE:				    case TPTR:					putop( PCCOM_UNARY PCC_MUL						, p2type( filetype ) );				}				switch ( classify( filetype ) ) {				    case TBOOL:				    case TCHAR:				    case TINT:				    case TSCAL:					    postcheck(ap, filetype);					    sconv(p2type(filetype), p2type(ap));						/* and fall through */				    case TDOUBLE:				    case TPTR:					    putop( PCC_ASSIGN , p2type( ap ) );					    putdot( filename , line );					    break;				    default:					    putstrop(PCC_STASG,						    PCCM_ADDTYPE(p2type(ap), PCCTM_PTR),						    (int) lwidth(ap),						    align(ap));					    putdot( filename , line );					    break;				}				/*				 * get(file);

⌨️ 快捷键说明

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