/* Actual Printing method */ JD_IMETHODIMP PluginPrint::Print() { if (mPrintInfo->mode == JDPluginMode_Full) { return FullPrint(); } else { return EmbedPrint(); } }
void Write(wostream &f, Var x) { if(StrQ(x)) { const wchar *s = CStr(x).c_str(); size_t n = wcslen(s); for(size_t i = 0; i < n; ++i) FullPrint(s[i],f); f << std::endl; } else if(VecQ(x)) { size_t n = Size(x); for(size_t i = 0; i < n; ++i) Print(Pretty(At(x,i)),f); f << std::endl; } else Println(x,f); }
void FullPrint(Var x, wostream &f) { switch(Type(x)) { case TYPE(obj): Print(((obj_t*)x)->normal(), f); break; case TYPE(int): case TYPE(rat): case TYPE(flt): Print(x,f); break; case TYPE(str): { f << L'"'; const wchar *s = CStr(x).c_str(); size_t n = wcslen(s); for(size_t i = 0; i < n; ++i) FullPrint(s[i],f); f << L'"'; } break; case TYPE(sym): { var c = Context(x); if(c != Context() && std::find( ContextPath.top().begin(), ContextPath.top().end(),c) == ContextPath.top().end()) { const wchar *s = ContextName[c]; size_t n = wcslen(s); for(size_t i = 0; i < n; ++i) FullPrint(s[i],f); } const wchar *s = Name(x); size_t n = wcslen(s); for(size_t i = 0; i < n; ++i) FullPrint(s[i],f); } break; case TYPE(vec): { vec_t::rep_t &rep = CVec(x); f << L"List["; size_t n = rep.size(); if(n > 0) { FullPrint(rep[0],f); for(size_t i = 1; i < n; ++i) { f << L','; FullPrint(rep[i],f); } } f << L']'; } break; case TYPE(ex): { ex_t::rep_t &rep = CEx(x); FullPrint(rep.first,f); f << L'['; size_t n = Size(rep.second); if(n > 0) { FullPrint(At(rep.second,0),f); for(size_t i = 1; i < n; ++i) { f << L','; FullPrint(At(rep.second,i),f); } } f << L']'; } break; } }