void InPrint(Tree T) { if(T){ InPrint(T -> Left); printf("%c ", T -> Element); InPrint(T -> Right); } }
int main(void) { Tree T = PreBuild(); printf("PrePrint:\t"); PrePrint(T); printf("\n"); printf("InPrint:\t"); InPrint(T); printf("\n"); printf("InPrint_Iter:\t"); InPrint_Iterative(T); printf("\n"); printf("PostPrint:\t"); PostPrint(T); printf("\n"); printf("LevelPrint:\t"); LevelPrint(T); printf("\n"); ListDirectory(T); return 0; }
/*! Dumps the contents of a documentation block to stdout. * @note This function will call itself recursively. * @param doc The root of the documentation tree. * @param level The indent level. */ void DumpDoc(IDoc *doc,int level) { if (doc==0) return; QString indent; indent.fill(' ',level); //printf(" doc node kind=`%d'\n",doc->kind()); switch (doc->kind()) { case IDoc::Para: { InPrint(("<para>\n")); IDocPara *par = dynamic_cast<IDocPara*>(doc); ASSERT(par!=0); IDocIterator *di = par->contents(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</para>\n")); } break; case IDoc::Text: { IDocText *txt = dynamic_cast<IDocText*>(doc); ASSERT(txt!=0); InPrint(("<text value=`%s' markup=%d headingLevel=%d/>\n", txt->text()->latin1(),txt->markup(),txt->headingLevel())); } break; case IDoc::MarkupModifier: { IDocMarkupModifier *md = dynamic_cast<IDocMarkupModifier*>(doc); ASSERT(md!=0); InPrint(("<markup modifier enabled=%d markup=%d headingLevel=%d/>\n", md->enabled(),md->markup(),md->headingLevel())); } break; case IDoc::ItemizedList: { InPrint(("<itemized list>\n")); IDocItemizedList *list = dynamic_cast<IDocItemizedList*>(doc); ASSERT(list!=0); IDocIterator *di = list->elements(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</itemized list>\n")); } break; case IDoc::OrderedList: { InPrint(("<ordered list>\n")); IDocOrderedList *list = dynamic_cast<IDocOrderedList*>(doc); ASSERT(list!=0); IDocIterator *di = list->elements(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</ordered list>\n")); } break; case IDoc::ListItem: { InPrint(("<list item>\n")); IDocListItem *li = dynamic_cast<IDocListItem*>(doc); ASSERT(li!=0); IDocIterator *di = li->contents(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</list item>\n")); } break; case IDoc::ParameterItem: { IDocParameterItem *item = dynamic_cast<IDocParameterItem*>(doc); InPrint(("<parameter item>\n")); IDocIterator *di = item->paramNames(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); DumpDoc(item->description(),level+1); InPrint(("</parameter item>\n")); } break; case IDoc::ParameterList: { IDocParameterList *list = dynamic_cast<IDocParameterList*>(doc); InPrint(("<parameter list type=%d>\n",list->sectType())); IDocIterator *di = list->params(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</parameter list>\n")); ASSERT(list!=0); } break; case IDoc::Parameter: { IDocParameter *par = dynamic_cast<IDocParameter*>(doc); ASSERT(par!=0); InPrint(("<parameter name=%s/>\n",par->name()->latin1())); } break; case IDoc::SimpleSect: { IDocSimpleSect *ss = dynamic_cast<IDocSimpleSect*>(doc); ASSERT(ss!=0); InPrint(("<simplesect type=%s>\n",ss->typeString()->latin1())); DumpDoc(ss->title(),level+1); DumpDoc(ss->description(),level+1); InPrint(("<simplesect/>\n")); } break; case IDoc::Title: { InPrint(("<title>\n")); IDocTitle *t = dynamic_cast<IDocTitle*>(doc); ASSERT(t!=0); IDocIterator *di = t->title(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } InPrint(("<title/>\n")); } break; case IDoc::Ref: { IDocRef *ref = dynamic_cast<IDocRef*>(doc); ASSERT(ref!=0); InPrint(("<ref id=%s text=%s/>\n", ref->refId()->latin1(),ref->text()->latin1())); } break; case IDoc::VariableList: { InPrint(("<variablelist>\n")); IDocVariableList *vl = dynamic_cast<IDocVariableList*>(doc); ASSERT(vl!=0); IDocIterator *di = vl->entries(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("<variablelist/>\n")); } break; case IDoc::VariableListEntry: { IDocVariableListEntry *vle = dynamic_cast<IDocVariableListEntry*>(doc); ASSERT(vle!=0); ILinkedTextIterator *lti = vle->term(); QString term = linkedTextToString(lti); lti->release(); InPrint(("<variablelistentry term=%s>\n",term.latin1())); DumpDoc(vle->description(),level+1); InPrint(("<variablelistentry/>\n")); } break; case IDoc::HRuler: { IDocHRuler *hr = dynamic_cast<IDocHRuler*>(doc); ASSERT(hr!=0); InPrint(("<hruler/>\n")); } break; case IDoc::LineBreak: { IDocLineBreak *lb = dynamic_cast<IDocLineBreak*>(doc); ASSERT(lb!=0); InPrint(("<linebreak/>\n")); } break; case IDoc::ULink: { IDocULink *ul = dynamic_cast<IDocULink*>(doc); ASSERT(ul!=0); InPrint(("<ulink url=`%s' text=`%s'/>\n",ul->url()->latin1(),ul->text()->latin1())); } break; case IDoc::EMail: { IDocEMail *em = dynamic_cast<IDocEMail*>(doc); ASSERT(em!=0); InPrint(("<email address=`%s'/>\n",em->address()->latin1())); } break; case IDoc::Link: { IDocLink *lk = dynamic_cast<IDocLink*>(doc); ASSERT(lk!=0); InPrint(("<link refid=`%s' text=`%s'/>\n",lk->refId()->latin1(),lk->text()->latin1())); } break; case IDoc::ProgramListing: { IDocProgramListing *pl = dynamic_cast<IDocProgramListing*>(doc); ASSERT(pl!=0); InPrint(("<programlisting>\n")); IDocIterator *cli = pl->codeLines(); IDoc *cl; for (cli->toFirst();(cl=cli->current());cli->toNext()) { DumpDoc(cl,level+1); } cli->release(); InPrint(("</programlisting>\n")); } break; case IDoc::CodeLine: { IDocCodeLine *cl = dynamic_cast<IDocCodeLine*>(doc); ASSERT(cl!=0); InPrint(("<codeline lineNumber=%d refId=`%s'>\n",cl->lineNumber(),cl->refId()->latin1())); IDocIterator *cei = cl->codeElements(); IDoc *ce; for (cei->toFirst();(ce=cei->current());cei->toNext()) { DumpDoc(ce,level+1); } cei->release(); InPrint(("</codeline>\n")); } break; case IDoc::Highlight: { IDocHighlight *hl = dynamic_cast<IDocHighlight*>(doc); ASSERT(hl!=0); InPrint(("<highlight kind=%d>\n",hl->kind())); IDocIterator *cei = hl->codeElements(); IDoc *ce; for (cei->toFirst();(ce=cei->current());cei->toNext()) { DumpDoc(ce,level+1); } cei->release(); InPrint(("</highlight>\n")); } break; case IDoc::Formula: { IDocFormula *fm = dynamic_cast<IDocFormula*>(doc); ASSERT(fm!=0); InPrint(("<formula id=`%s' text=`%s'/>\n",fm->id()->latin1(),fm->text()->latin1())); } break; case IDoc::Image: { IDocImage *img = dynamic_cast<IDocImage*>(doc); ASSERT(img!=0); InPrint(("<image name=`%s' caption=`%s'/>\n",img->name()->latin1(),img->caption()->latin1())); } break; case IDoc::DotFile: { IDocDotFile *df = dynamic_cast<IDocDotFile*>(doc); ASSERT(df!=0); InPrint(("<dotfile name=`%s' caption=`%s'/>\n",df->name()->latin1(),df->caption()->latin1())); } break; case IDoc::IndexEntry: { IDocIndexEntry *ie = dynamic_cast<IDocIndexEntry*>(doc); ASSERT(ie!=0); InPrint(("<indexentry primary=`%s' secondary=`%s'/>\n",ie->primary()->latin1(),ie->secondary()->latin1())); } break; case IDoc::Table: { IDocTable *tbl = dynamic_cast<IDocTable*>(doc); ASSERT(tbl!=0); InPrint(("<table numcols=%d caption=`%s'>\n",tbl->numColumns(),tbl->caption()->latin1())); IDocIterator *ri = tbl->rows(); IDoc *row; for (ri->toFirst();(row=ri->current());ri->toNext()) { DumpDoc(row,level+1); } ri->release(); InPrint(("</table>\n")); } break; case IDoc::Row: { IDocRow *row = dynamic_cast<IDocRow*>(doc); ASSERT(row!=0); InPrint(("<row>\n")); IDocIterator *ei = row->entries(); IDoc *e; for (ei->toFirst();(e=ei->current());ei->toNext()) { DumpDoc(e,level+1); } ei->release(); InPrint(("</row>\n")); } break; case IDoc::Entry: { IDocEntry *ent = dynamic_cast<IDocEntry*>(doc); ASSERT(ent!=0); InPrint(("<entry>\n")); IDocIterator *di = ent->contents(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</entry>\n")); } break; case IDoc::Section: { IDocSection *sec = dynamic_cast<IDocSection*>(doc); ASSERT(sec!=0); InPrint(("<section id=`%s' level=%d>\n", sec->id()->latin1(),sec->level())); DumpDoc(sec->title(),level+1); IDocIterator *di = sec->paragraphs(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di=sec->subSections(); for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } IDocInternal *intern = sec->internal(); if (intern) { DumpDoc(intern,level+1); } InPrint(("</section>\n")); } break; case IDoc::Internal: { IDocInternal *intern = dynamic_cast<IDocInternal*>(doc); ASSERT(intern!=0); InPrint(("<internal>\n")); IDocIterator *di = intern->paragraphs(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di=intern->subSections(); for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } InPrint(("</internal>\n")); } break; case IDoc::Copy: { IDocCopy *cpy = dynamic_cast<IDocCopy*>(doc); ASSERT(cpy!=0); InPrint(("<copydoc>\n")); IDocIterator *di = cpy->contents(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("<copydoc/>\n")); } break; case IDoc::TocItem: { IDocTocItem *ti = dynamic_cast<IDocTocItem*>(doc); ASSERT(ti!=0); InPrint(("<tocitem id=\"%s\" title=\"%s\"/>\n", ti->id()->latin1(),ti->title()->latin1())); } break; case IDoc::TocList: { IDocTocList *tl = dynamic_cast<IDocTocList*>(doc); ASSERT(tl!=0); InPrint(("<toclist>\n")); IDocIterator *di = tl->elements(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("<toclist/>\n")); } break; case IDoc::Verbatim: { IDocVerbatim *vt = dynamic_cast<IDocVerbatim*>(doc); ASSERT(vt!=0); const char *s=0; switch (vt->type()) { case IDocVerbatim::Verbatim: s="verbatim"; break; case IDocVerbatim::HtmlOnly: s="htmlonly"; break; case IDocVerbatim::LatexOnly: s="latexonly"; break; default: printf("Invalid verbatim type!\n"); } InPrint(("<verbatim %s>\n",s)); InPrint(("%s",vt->text()->latin1())); InPrint(("</verbatim>\n")); } break; case IDoc::Anchor: { IDocAnchor *anc = dynamic_cast<IDocAnchor*>(doc); ASSERT(anc!=0); InPrint(("<anchor id='%s'/>\n",anc->id()->latin1())); } break; case IDoc::Symbol: { IDocSymbol *sym = dynamic_cast<IDocSymbol*>(doc); ASSERT(sym!=0); InPrint(("<symbol type=%s letter=%c/>\n", sym->typeString()->latin1(),sym->letter())); } break; case IDoc::Root: { InPrint(("<root>\n")); IDocRoot *root = dynamic_cast<IDocRoot*>(doc); ASSERT(root!=0); IDocIterator *di = root->contents(); IDoc *pdoc; for (di->toFirst();(pdoc=di->current());di->toNext()) { DumpDoc(pdoc,level+1); } di->release(); InPrint(("</root>\n")); } break; default: printf("Found unsupported node type %d!\n",doc->kind()); break; } }