summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp6
-rw-r--r--src/doxygen.cpp137
-rw-r--r--src/reflist.cpp70
-rw-r--r--src/reflist.h30
-rw-r--r--src/search.css14
-rw-r--r--src/search_css.h14
-rw-r--r--src/translator_kr.h36
-rw-r--r--src/util.cpp31
-rw-r--r--src/vhdlcode.l2
9 files changed, 222 insertions, 118 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 26934f1..55cc4f2 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -3089,8 +3089,10 @@ void ClassDef::addListReferences()
{
LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
addRefItem(xrefItems.pointer(),
- fortranOpt?theTranslator->trType(TRUE,TRUE):theTranslator->trClass(TRUE,TRUE),
- getOutputFileBase(),displayName()
+ fortranOpt?theTranslator->trType(TRUE,TRUE):
+ theTranslator->trClass(TRUE,TRUE),
+ getOutputFileBase(),
+ displayName()
);
}
if (m_impl->memberGroupSDict)
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 5a2c5da..d256e8f 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -117,7 +117,7 @@ StringDict Doxygen::namespaceAliasDict(257); // all namespace aliases
StringDict Doxygen::tagDestinationDict(257); // all tag locations
QDict<void> Doxygen::expandAsDefinedDict(257); // all macros that should be expanded
QIntDict<MemberGroupInfo> Doxygen::memGrpInfoDict(1009); // dictionary of the member groups heading
-PageDef *Doxygen::mainPage = 0;
+PageDef *Doxygen::mainPage = 0;
bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page?
QTextStream Doxygen::tagFile;
NamespaceDef *Doxygen::globalScope = 0;
@@ -2791,7 +2791,6 @@ static void buildFunctionList(EntryNav *rootNav)
QCString scope=rootNav->parent()->name(); //stripAnonymousNamespaceScope(root->parent->name);
if (!rname.isEmpty() && scope.find('@')==-1)
{
-
ClassDef *cd=0;
// check if this function's parent is a class
scope=stripTemplateSpecifiersFromScope(scope,FALSE);
@@ -2832,7 +2831,6 @@ static void buildFunctionList(EntryNav *rootNav)
{
isMember=memIndex<ts || memIndex>te;
}
-
}
static QRegExp re("([a-z_A-Z0-9: ]*[ &*]+[ ]*");
@@ -2903,7 +2901,7 @@ static void buildFunctionList(EntryNav *rootNav)
sameNumTemplateArgs = FALSE;
}
}
- if (
+ if (
matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(),
rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
FALSE) &&
@@ -2921,15 +2919,15 @@ static void buildFunctionList(EntryNav *rootNav)
found=(mnd && rnd && nsName==rnsName) || // members are in the same namespace
((mnd==0 && rnd==0 && mfd!=0 && // no external reference and
mfd->absFilePath()==root->fileName // prototype in the same file
- )
- );
+ )
+ );
// otherwise, allow a duplicate global member with the same argument list
if (!found && gd && gd==md->getGroupDef())
{
// member is already in the group, so we don't want to add it again.
found=TRUE;
}
-
+
//printf("combining function with prototype found=%d in namespace %s\n",
// found,nsName.data());
@@ -2956,6 +2954,8 @@ static void buildFunctionList(EntryNav *rootNav)
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
md->setDocsForDefinition(!root->proto);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(rfd);
if (md->briefDescription().isEmpty() && !root->brief.isEmpty())
{
@@ -2982,6 +2982,13 @@ static void buildFunctionList(EntryNav *rootNav)
{
//printf("both members are grouped\n");
}
+
+ // if md is a declaration and root is the corresponding
+ // definition, then turn md into a definition.
+ if (md->isPrototype() && !root->proto)
+ {
+ md->setPrototype(FALSE);
+ }
}
}
}
@@ -2991,7 +2998,7 @@ static void buildFunctionList(EntryNav *rootNav)
Debug::print(Debug::Functions,0," --> new function %s found!\n",rname.data());
//printf("New function type=`%s' name=`%s' args=`%s' bodyLine=%d\n",
// root->type.data(),rname.data(),root->args.data(),root->bodyLine);
-
+
// new global function
ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
QCString name=removeRedundantWhiteSpace(rname);
@@ -3270,7 +3277,7 @@ static void transferArgumentDocumentation(ArgumentList *decAl,ArgumentList *defA
static void transferFunctionDocumentation()
{
- //printf("transferFunctionDocumentation()\n");
+ //printf("---- transferFunctionDocumentation()\n");
// find matching function declaration and definitions.
MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
@@ -3283,6 +3290,7 @@ static void transferFunctionDocumentation()
/* find a matching function declaration and definition for this function */
for (;(mdec=mni1.current());++mni1)
{
+ //printf("mdec=%s isPrototype()=%d\n",mdec->name().data(),mdec->isPrototype());
if (mdec->isPrototype() ||
(mdec->isVariable() && mdec->isExternal())
)
@@ -4661,6 +4669,18 @@ static void addListReferences()
}
//----------------------------------------------------------------------
+
+static void generateXRefPages()
+{
+ QDictIterator<RefList> di(*Doxygen::xrefLists);
+ RefList *rl;
+ for (di.toFirst();(rl=di.current());++di)
+ {
+ rl->generatePage();
+ }
+}
+
+//----------------------------------------------------------------------
// Copy the documentation in entry `root' to member definition `md' and
// set the function declaration of the member to `funcDecl'. If the boolean
// over_load is set the standard overload text is added.
@@ -4695,7 +4715,7 @@ static void addMemberDocs(EntryNav *rootNav,
// TODO determine scope based on root not md
Definition *rscope = md->getOuterScope();
-
+
LockingPtr<ArgumentList> mdAl = md->argumentList();
if (al)
{
@@ -4729,42 +4749,12 @@ static void addMemberDocs(EntryNav *rootNav,
}
else
{
- //printf("Adding docs md->docs=`%s' root->docs=`%s'!\n",
- // md->documentation().data(),root->doc.data());
- // documentation outside a compound overrides the documentation inside it
-
-#if 0
- if ( /* !md->isStatic() && !root->stat && do not replace doc of a static */
- (
- md->documentation().isEmpty() || /* no docs yet */
- (rootNav->parent()->name().isEmpty() && /* or overwrite prototype docs */
- !root->proto && md->isPrototype() /* with member definition docs */
- )
- ) && !root->doc.isEmpty()
- )
-#endif
- {
- //printf("overwrite!\n");
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
+ //printf("overwrite!\n");
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
- //printf("Adding brief md->brief=`%s' root->brief=`%s'!\n",
- // md->briefDescription().data(),root->brief.data());
- // brief descriptions inside a compound override the documentation
- // outside it
-#if 0
- if ( /* !md->isStatic() && !root->stat && do not replace doc of static */
- (
- md->briefDescription().isEmpty() || /* no docs yet */
- !rootNav->parent()->name().isEmpty() /* member of a class */
- ) && !root->brief.isEmpty()
- )
-#endif
- {
- //printf("overwrite!\n");
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- }
+ //printf("overwrite!\n");
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
if (
(md->inbodyDocumentation().isEmpty() ||
@@ -4785,14 +4775,12 @@ static void addMemberDocs(EntryNav *rootNav,
//printf("setInitializer\n");
md->setInitializer(root->initializer);
}
-
+
md->setMaxInitLines(root->initLines);
if (rfd)
{
-
if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1)
- // || (md->isVariable() && !root->explicitExternal)
)
{
//printf("Setting new body segment [%d,%d]\n",root->bodyLine,root->endBodyLine);
@@ -4904,7 +4892,7 @@ static bool findGlobalMember(EntryNav *rootNav,
NamespaceDef *rnd = 0;
if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName);
-
+
LockingPtr<ArgumentList> mdAl = md->argumentList();
bool matching=
(mdAl==0 && root->argList->count()==0) ||
@@ -4972,7 +4960,10 @@ static bool findGlobalMember(EntryNav *rootNav,
{
if (root->type!="friend class" &&
root->type!="friend struct" &&
- root->type!="friend union")
+ root->type!="friend union" &&
+ (!Config_getBool("TYPEDEF_HIDES_STRUCT") ||
+ root->type.find("typedef ")==-1)
+ )
{
warn(root->fileName,root->startLine,
"Warning: documented function `%s' was not declared or defined.",decl
@@ -6582,27 +6573,30 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
// enum
e->loadEntry(g_storage);
Entry *root = e->entry();
- MemberDef *fmd=new MemberDef(
- root->fileName,root->startLine,
- root->type,root->name,root->args,0,
- Public, Normal,root->stat,Member,
- MemberDef::EnumValue,0,0);
- if (md->getClassDef()) fmd->setMemberClass(md->getClassDef());
- else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef());
- else if (md->getFileDef()) fmd->setFileDef(md->getFileDef());
- fmd->setOuterScope(md->getOuterScope());
- fmd->setTagInfo(e->tagInfo());
- fmd->setDocumentation(root->doc,root->docFile,root->docLine);
- fmd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- fmd->addSectionsToDefinition(root->anchors);
- fmd->setInitializer(root->initializer);
- fmd->setMaxInitLines(root->initLines);
- fmd->setMemberGroupId(root->mGrpId);
- fmd->setExplicitExternal(root->explicitExternal);
- if (fmd)
+ if (md->qualifiedName()==rootNav->name()) // enum value scope matches that of the enum
{
- md->insertEnumField(fmd);
- fmd->setEnumScope(md);
+ MemberDef *fmd=new MemberDef(
+ root->fileName,root->startLine,
+ root->type,root->name,root->args,0,
+ Public, Normal,root->stat,Member,
+ MemberDef::EnumValue,0,0);
+ if (md->getClassDef()) fmd->setMemberClass(md->getClassDef());
+ else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef());
+ else if (md->getFileDef()) fmd->setFileDef(md->getFileDef());
+ fmd->setOuterScope(md->getOuterScope());
+ fmd->setTagInfo(e->tagInfo());
+ fmd->setDocumentation(root->doc,root->docFile,root->docLine);
+ fmd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ fmd->addSectionsToDefinition(root->anchors);
+ fmd->setInitializer(root->initializer);
+ fmd->setMaxInitLines(root->initLines);
+ fmd->setMemberGroupId(root->mGrpId);
+ fmd->setExplicitExternal(root->explicitExternal);
+ if (fmd)
+ {
+ md->insertEnumField(fmd);
+ fmd->setEnumScope(md);
+ }
}
e->releaseEntry();
}
@@ -10190,8 +10184,9 @@ void parseInput()
msg("Adding source references...\n");
addSourceReferences();
- msg("Adding todo/test/bug list items...\n");
+ msg("Adding xrefitems...\n");
addListReferences();
+ generateXRefPages();
if (Config_getBool("SHOW_DIRECTORIES") && Config_getBool("DIRECTORY_GRAPH"))
{
diff --git a/src/reflist.cpp b/src/reflist.cpp
index da53f04..3f5c527 100644
--- a/src/reflist.cpp
+++ b/src/reflist.cpp
@@ -16,7 +16,9 @@
*
*/
+#include <stdio.h>
#include "reflist.h"
+#include "util.h"
/*! Create a list of items that are cross referenced with documentation blocks
* @param listName String representing the name of the list.
@@ -27,7 +29,8 @@ RefList::RefList(const char *listName,
const char *pageTitle,
const char *secTitle
)
-{
+{
+ m_itemList = 0;
m_dict = 0;
m_dictIterator = 0;
m_id = 0;
@@ -37,10 +40,10 @@ RefList::RefList(const char *listName,
}
/*! Destroy the todo list. Currently not called! */
-RefList::~RefList()
-{
- delete m_dictIterator;
- delete m_dict;
+RefList::~RefList()
+{
+ delete m_dictIterator;
+ delete m_dict;
}
/*! Adds a new item to the list.
@@ -50,7 +53,7 @@ int RefList::addRefItem()
{
if (m_dict==0)
{
- m_dict = new QIntDict<RefItem>(1009);
+ m_dict = new QIntDict<RefItem>(1009);
m_dict->setAutoDelete(TRUE);
m_dictIterator = new QIntDictIterator<RefItem>(*m_dict);
}
@@ -69,7 +72,7 @@ RefItem *RefList::getRefItem(int itemId)
return m_dict ? m_dict->find(itemId) : 0;
}
-/*! Returns the first item in the dictionary or 0 if
+/*! Returns the first item in the dictionary or 0 if
* non is available.
* Items are not sorted.
*/
@@ -103,3 +106,56 @@ QCString RefList::sectionTitle() const
return m_secTitle;
}
+void RefList::insertIntoList(const char *key,RefItem *item)
+{
+ if (m_itemList==0)
+ {
+ m_itemList = new SortedRefItems(1009);
+ }
+ RefItem *ri = m_itemList->find(key);
+ if (ri==0)
+ {
+ m_itemList->append(key,item);
+ }
+ else // item already added to the list (i.e. multiple item for the same
+ // entity)
+ {
+ if (ri!=item)
+ {
+ ri->extraItems.append(item);
+ }
+ }
+}
+
+void RefList::generatePage()
+{
+ if (m_itemList==0) return;
+ m_itemList->sort();
+ SDict<RefItem>::Iterator it(*m_itemList);
+ RefItem *item;
+ for (it.toFirst();(item=it.current());++it)
+ {
+ QCString doc;
+ doc = "\\anchor ";
+ doc += item->listAnchor;
+ doc += " <dl><dt>";
+ doc += item->prefix;
+ doc += " \\_internalref ";
+ doc += item->name;
+ doc += " \"";
+ doc += item->title;
+ doc += "\"";
+ if (!item->args.isEmpty()) doc += item->args;
+ doc += "</dt>\n<dd>";
+ doc += item->text;
+ QListIterator<RefItem> li(item->extraItems);
+ RefItem *extraItem;
+ for (li.toFirst();(extraItem=li.current());++li)
+ {
+ doc += "<p>" + extraItem->text;
+ }
+ doc += "</dd></dl>\n";
+ addRelatedPage(m_listName,m_pageTitle,doc,0,m_listName,1,0,0,0);
+ }
+}
+
diff --git a/src/reflist.h b/src/reflist.h
index f9ba9ea..8c71869 100644
--- a/src/reflist.h
+++ b/src/reflist.h
@@ -21,15 +21,36 @@
#include "qtbc.h"
#include <qintdict.h>
-//#include "outputgen.h"
+#include <qlist.h>
+#include "sortdict.h"
/*! This struct represents an item in the list of references. */
struct RefItem
{
- RefItem() : written(FALSE) {}
+ RefItem() /*: written(FALSE)*/ {}
QCString text; //!< text of the item.
QCString listAnchor; //!< anchor in the list
- bool written;
+
+ QCString prefix; //!< type prefix for the name
+ QCString name; //!< name of the entity containing the reference
+ QCString title; //!< display name of the entity
+ QCString args; //!< optional arguments for the entity (if function)
+ //bool written;
+ QList<RefItem> extraItems; //!< more items belonging to the same entity
+};
+
+/*! List of items sorted by title */
+class SortedRefItems : public SDict<RefItem>
+{
+ public:
+ SortedRefItems(int size=17) : SDict<RefItem>(size) {}
+ virtual ~SortedRefItems() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ RefItem *r1 = (RefItem*)item1;
+ RefItem *r2 = (RefItem*)item2;
+ return stricmp(r1->title,r2->title);
+ }
};
/*! @brief List of cross-referenced items
@@ -57,12 +78,15 @@ class RefList
const char *pageTitle,const char *secTitle
);
~RefList();
+ void insertIntoList(const char *key,RefItem *item);
+ void generatePage();
private:
int m_id;
QCString m_listName;
QCString m_pageTitle;
QCString m_secTitle;
+ SortedRefItems *m_itemList;
QIntDict<RefItem> *m_dict;
QIntDictIterator<RefItem> *m_dictIterator;
};
diff --git a/src/search.css b/src/search.css
index 0ef06d9..d263b97 100644
--- a/src/search.css
+++ b/src/search.css
@@ -1,6 +1,6 @@
/*---------------- Search Box */
-#MSearchBox {
+#MSearchBox {
padding: 0px;
margin: 0px;
border: none;
@@ -18,24 +18,14 @@
background-color: #FFFFFF;
font-style: normal;
cursor: text;
- padding: 0px 1px;
+ padding: 1px 1px;
margin: 0px 6px 0px 0px;
border: none;
outline: none;
vertical-align: middle;
}
-#MSearchBox.MSearchBoxInactive:hover #MSearchField {
- background-color: #FFFFFF;
- padding: 0px 1px;
- margin: 0px 6px 0px 0px;
- border: none;
-}
.MSearchBoxActive #MSearchField {
- background-color: #FFFFFF;
color: #000000;
- padding: 0px 1px;
- margin: 0px 6px 0px 0px;
- border: none;
}
#MSearchSelect {
float : none;
diff --git a/src/search_css.h b/src/search_css.h
index 65ffed2..6282236 100644
--- a/src/search_css.h
+++ b/src/search_css.h
@@ -1,6 +1,6 @@
"/*---------------- Search Box */\n"
"\n"
-"#MSearchBox { \n"
+"#MSearchBox {\n"
" padding: 0px;\n"
" margin: 0px;\n"
" border: none;\n"
@@ -18,24 +18,14 @@
" background-color: #FFFFFF;\n"
" font-style: normal;\n"
" cursor: text;\n"
-" padding: 0px 1px;\n"
+" padding: 1px 1px;\n"
" margin: 0px 6px 0px 0px;\n"
" border: none;\n"
" outline: none;\n"
" vertical-align: middle;\n"
"}\n"
-"#MSearchBox.MSearchBoxInactive:hover #MSearchField {\n"
-" background-color: #FFFFFF;\n"
-" padding: 0px 1px;\n"
-" margin: 0px 6px 0px 0px;\n"
-" border: none;\n"
-"}\n"
".MSearchBoxActive #MSearchField {\n"
-" background-color: #FFFFFF;\n"
" color: #000000;\n"
-" padding: 0px 1px;\n"
-" margin: 0px 6px 0px 0px;\n"
-" border: none;\n"
"}\n"
"#MSearchSelect {\n"
" float : none;\n"
diff --git a/src/translator_kr.h b/src/translator_kr.h
index dbc72e8..8cc1d23 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -50,7 +50,7 @@
Translator class (by the local maintainer) when the localized
translator is made up-to-date again.
*/
-class TranslatorKorean : public TranslatorAdapter_1_6_0
+class TranslatorKorean : public Translator
{
protected:
friend class TranslatorAdapterBase;
@@ -1794,6 +1794,40 @@ class TranslatorKorean : public TranslatorAdapter_1_6_0
return "ŸÀÔ ÇÑÁ¤ÀÚµé";
}
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" °ü°è";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "·ÎµùÁß...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Àü¿ª À̸§°ø°£";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "°Ë»öÁß...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "ÀÏÄ¡ÇÏ´Â°Í ¾øÀ½";
+ }
+
};
#endif
diff --git a/src/util.cpp b/src/util.cpp
index d349b8d..b823d50 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -5822,8 +5822,7 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
//----------------------------------------------------------------------------
void addRefItem(const QList<ListItemInfo> *sli,
- const char *prefix,
- const char *name,const char *title,const char *args)
+ const char *prefix, const char *name,const char *title,const char *args)
{
//printf("addRefItem(sli=%p,prefix=%s,name=%s,title=%s,args=%s)\n",sli,prefix,name,title,args);
if (sli)
@@ -5833,22 +5832,35 @@ void addRefItem(const QList<ListItemInfo> *sli,
for (slii.toFirst();(lii=slii.current());++slii)
{
RefList *refList = Doxygen::xrefLists->find(lii->type);
- if (refList &&
+ if (refList
+#if 0
+ &&
(
// either not a built-in list or the list is enabled
- (lii->type!="todo" || Config_getBool("GENERATE_TODOLIST")) &&
- (lii->type!="test" || Config_getBool("GENERATE_TESTLIST")) &&
- (lii->type!="bug" || Config_getBool("GENERATE_BUGLIST")) &&
+ (lii->type!="todo" || Config_getBool("GENERATE_TODOLIST")) &&
+ (lii->type!="test" || Config_getBool("GENERATE_TESTLIST")) &&
+ (lii->type!="bug" || Config_getBool("GENERATE_BUGLIST")) &&
(lii->type!="deprecated" || Config_getBool("GENERATE_DEPRECATEDLIST"))
- )
+ )
+#endif
)
{
RefItem *item = refList->getRefItem(lii->itemId);
ASSERT(item!=0);
- printf("anchor=%s written=%d\n",item->listAnchor.data(),item->written);
+
+ item->prefix = prefix;
+ item->name = name;
+ item->title = title;
+ item->args = args;
+
+ refList->insertIntoList(title,item);
+
+#if 0
+
+ //printf("anchor=%s written=%d\n",item->listAnchor.data(),item->written);
//if (item->written) return;
- QCString doc(1000);
+ QCString doc;
doc = "\\anchor ";
doc += item->listAnchor;
doc += " <dl><dt>";
@@ -5864,6 +5876,7 @@ void addRefItem(const QList<ListItemInfo> *sli,
doc += "</dd></dl>\n";
addRelatedPage(refList->listName(),refList->pageTitle(),doc,0,refList->listName(),1,0,0,0);
//item->written=TRUE;
+#endif
}
}
}
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index 42e657d..c5df9f0 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -337,7 +337,7 @@ static void writeWord(const char *word,const char* curr_class=0,bool classLink=F
static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE)
{
if (text==0) return;
- printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
const char *p=text,*sp=p;
char c;
bool done=FALSE;