Ejemplo n.º 1
0
  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;
	}
      }
  }