+ argv = argv[2];
+ }
+ if (argv != NIL) {
+ error("Too many arguments to %s", p->symbol);
+ rvlist(argv);
+ return (NIL);
+ }
+ } else if ( p -> class == FFUNC || p -> class == FPROC ) {
+ /*
+ * formal routines can only have by-value parameters.
+ * this will lose for integer actuals passed to real
+ * formals, and strings which people want blank padded.
+ */
+# ifdef OBJ
+ cnt = 0;
+# endif OBJ
+ for ( ; argv != NIL ; argv = argv[2] ) {
+# ifdef OBJ
+ q = rvalue(argv[1], NIL, RREQ );
+ cnt += even(lwidth(q));
+# endif OBJ
+# ifdef PC
+ /*
+ * structure arguments require lvalues,
+ * scalars use rvalue.
+ */
+ codeoff();
+ p1 = rvalue( argv[1] , NIL , RREQ );
+ codeon();
+ switch( classify( p1 ) ) {
+ case TSTR:
+ if ( p1 -> class == STR && slenflag == 0 ) {
+ if ( opt( 's' ) ) {
+ standard();
+ } else {
+ warning();
+ }
+ error("Implementation can't construct equal length strings");
+ slenflag++;
+ }
+ /* and fall through */
+ case TFILE:
+ case TARY:
+ case TREC:
+ case TSET:
+ q = rvalue( argv[1] , p1 , LREQ );
+ break;
+ case TINT:
+ if ( floatflag == 0 ) {
+ if ( opt( 's' ) ) {
+ standard();
+ } else {
+ warning();
+ }
+ error("Implementation can't coerice integer to real");
+ floatflag++;
+ }
+ /* and fall through */
+ case TSCAL:
+ case TBOOL:
+ case TCHAR:
+ default:
+ q = rvalue( argv[1] , p1 , RREQ );
+ break;
+ }
+ switch( classify( p1 ) ) {
+ case TFILE:
+ case TARY:
+ case TREC:
+ case TSET:
+ case TSTR:
+ putstrop( P2STARG , p2type( p1 ) ,
+ lwidth( p1 ) , align( p1 ) );
+ }
+ /*
+ * if this is the nth (>1) argument,
+ * hang it on the left linear list of arguments
+ */
+ if ( firsttime ) {
+ firsttime = FALSE;
+ } else {
+ putop( P2LISTOP , P2INT );
+ }
+# endif PC
+ }
+ } else {
+ panic("call class");