void print_vmsCompat( EnvT* e, int* parOffset) { // SA: handling special VMS-compatibility syntax, e.g.: print, '$(F)', 100 // (if FORMAT not defined, more than 2 params, first param is scalar string // and begins with "$(" then first param minus "$" is treated as FORMAT) if (e->GetKW(0) == NULL && e->NParam() > 1 + *parOffset) { BaseGDL* par = e->GetParDefined(*parOffset); if (par->Type() == GDL_STRING && par->Scalar() && (*static_cast<DStringGDL*>(par))[0].compare(0,2,"$(") == 0) { e->SetKeyword("FORMAT", new DStringGDL((*static_cast<DStringGDL*>(par))[0].c_str()+1)); (*parOffset)++; } } }
void print_os( ostream* os, EnvT* e, int parOffset, SizeT width) { // FORMAT keyword if( e->GetKW( 0) != NULL) { DString fmtString; e->AssureScalarKW<DStringGDL>( 0, fmtString); if( fmtString != "") { try { RefFMTNode fmtAST = GetFMTAST( fmtString); #ifdef GDL_DEBUG antlr::print_tree pt; cout << "Format parser output:" << endl; pt.pr_tree(static_cast<antlr::RefAST>(fmtAST)); cout << "Format Parser end." << endl; #endif // formatted output ignores WIDTH FMTOut Formatter( fmtAST, os, e, parOffset); return; } catch( antlr::ANTLRException& ex) { e->Throw( ex.getMessage()); } } } //else // default-format output { int nParam = e->NParam(); if( nParam == parOffset) { (*os) << endl; return; } BaseGDL* par; bool lastParScalar = false; BaseGDL* parOffsetPar = e->GetPar( parOffset); bool anyArrayBefore = false; if( parOffsetPar != NULL) anyArrayBefore = parOffsetPar->Rank() > 0; SizeT actPos = 0; for( SizeT i=parOffset; i<nParam; i++) { if( i > parOffset) lastParScalar = /*par->Type() == GDL_STRING &&*/ par->Scalar(); par=e->GetPar( i); if( par == NULL) // allowed here: NullGDL::GetSingleInstance()) e->Throw("Variable is undefined: "+e->GetParString( i)); if (lastParScalar && anyArrayBefore && par->Rank() != 0) (*os) << endl; // e.g. print,[1],1,[1] anyArrayBefore |= par->Rank() != 0; par->ToStream( *os, width, &actPos); // debug // (*os) << flush; } bool singleNullChar = (par->Type() == GDL_STRING && !lastParScalar && (nParam-parOffset)>1 && (*static_cast<DStringGDL*>(par))[0] == ""); // } if( (par->Dim().Rank() == 0 && !singleNullChar) || par->Type() == GDL_STRUCT) { (*os) << endl; } } }