📄 pcproc.c
字号:
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 + -