Doxygen
Loading...
Searching...
No Matches
definition.h File Reference
#include <vector>
#include "types.h"
#include "reflist.h"
#include "construct.h"
#include "requirement.h"
Include dependency graph for definition.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  DocInfo
 Data associated with a detailed description. More...
struct  BriefInfo
 Data associated with a brief description. More...
struct  BodyInfo
 Data associated with description found in the body. More...
class  Definition
 The common base class of all entity definitions found in the sources. More...
class  DefinitionMutable

Functions

DefinitiontoDefinition (DefinitionMutable *dm)
DefinitionMutabletoDefinitionMutable (Definition *d)
bool readCodeFragment (const QCString &fileName, bool isMacro, int &startLine, int &endLine, QCString &result)
 Reads a fragment from file fileName starting with line startLine and ending with line endLine.

Function Documentation

◆ readCodeFragment()

bool readCodeFragment ( const QCString & fileName,
bool isMacro,
int & startLine,
int & endLine,
QCString & result )

Reads a fragment from file fileName starting with line startLine and ending with line endLine.

The result is returned as a string via result. The function returns TRUE if successful and FALSE in case of an error.

Reads a fragment of code from file fileName starting at line startLine and ending at line endLine (inclusive). The fragment is stored in result. If FALSE is returned the code fragment could not be found.

The file is scanned for a opening bracket ('{') from startLine onward The line actually containing the bracket is returned via startLine. The file is scanned for a closing bracket ('}') from endLine backward. The line actually containing the bracket is returned via endLine. Note that for VHDL code the bracket search is not done.

Definition at line 756 of file definition.cpp.

758{
759 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
760 QCString filter = getFileFilter(fileName,TRUE);
761 bool usePipe = !filter.isEmpty() && filterSourceFiles;
762 int tabSize = Config_getInt(TAB_SIZE);
763 SrcLangExt lang = getLanguageFromFileName(fileName);
764 const int blockSize = 4096;
765 std::string str;
767 static_cast<size_t>(std::max(1,startLine)),
768 static_cast<size_t>(std::max({1,startLine,endLine})),str);
769 //printf("readCodeFragment(%s,startLine=%d,endLine=%d)=\n[[[\n%s]]]\n",qPrint(fileName),startLine,endLine,qPrint(str));
770
771 bool found = lang==SrcLangExt::VHDL ||
772 lang==SrcLangExt::Python ||
773 lang==SrcLangExt::Fortran ||
774 isMacro;
775 // for VHDL, Python, and Fortran no bracket search is possible
776 char *p=str.data();
777 if (p && *p)
778 {
779 char c=0;
780 int col=0;
781 int lineNr=startLine;
782 // skip until the opening bracket or lonely : is found
783 char cn=0;
784 while (*p && !found)
785 {
786 int pc=0;
787 while ((c=*p++)!='{' && c!=':' && c!='=' && c!=0)
788 {
789 //printf("parsing char '%c'\n",c);
790 if (c=='\n')
791 {
792 lineNr++;
793 col = 0;
794 }
795 else if (c=='\t')
796 {
797 col+=tabSize - (col%tabSize);
798 }
799 else if (pc=='/' && c=='/') // skip single line comment
800 {
801 while ((c=*p++)!='\n' && c!=0);
802 if (c == '\n')
803 {
804 lineNr++;
805 col = 0;
806 }
807 }
808 else if (pc=='/' && c=='*') // skip C style comment
809 {
810 while (((c=*p++)!='/' || pc!='*') && c!=0)
811 {
812 if (c == '\n')
813 {
814 lineNr++;
815 col = 0;
816 }
817 pc=c;
818 }
819 }
820 else
821 {
822 col++;
823 }
824 pc = c;
825 }
826 if (c==':')
827 {
828 cn=*p++;
829 if (cn!=':') found=TRUE;
830 }
831 else if (c=='=')
832 {
833 cn=*p++;
834 if (cn=='>') // C# Expression body
835 {
836 found=TRUE;
837 }
838 }
839 else if (c=='{')
840 {
841 found=TRUE;
842 }
843 else if (c==0)
844 {
845 break;
846 }
847 }
848 //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
849 if (found)
850 {
851 // For code with more than one line,
852 // fill the line with spaces until we are at the right column
853 // so that the opening brace lines up with the closing brace
854 if (endLine!=startLine)
855 {
856 QCString spaces;
857 spaces.fill(' ',col);
858 result+=spaces;
859 }
860 // copy until end of line
861 if (c) result+=c;
862 startLine=lineNr;
863 if (c==':' || c=='=')
864 {
865 result+=cn;
866 if (cn=='\n') lineNr++;
867 }
868 char lineStr[blockSize];
869 do
870 {
871 //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
872 int size_read=0;
873 do
874 {
875 // read up to blockSize-1 non-zero characters
876 int i=0;
877 while ((c=*p) && i<blockSize-1)
878 {
879 lineStr[i++]=c;
880 p++;
881 if (c=='\n') break; // stop at end of the line
882 }
883 lineStr[i]=0;
884 size_read=i;
885 result+=lineStr; // append line to the output
886 } while (size_read == (blockSize-1)); // append more if line does not fit in buffer
887 lineNr++;
888 } while (*p);
889
890 // strip stuff after closing bracket
891 int newLineIndex = result.findRev('\n');
892 int braceIndex = result.findRev('}');
893 if (braceIndex > newLineIndex)
894 {
895 result.resize(static_cast<size_t>(braceIndex+1));
896 }
897 endLine=lineNr-1;
898 }
899 if (usePipe)
900 {
901 Debug::print(Debug::FilterOutput, 0, "Filter output\n");
902 Debug::print(Debug::FilterOutput,0,"-------------\n{}\n-------------\n",result);
903 }
904 }
905 QCString encoding = getEncoding(FileInfo(fileName.str()));
906 if (encoding!="UTF-8")
907 {
908 std::string encBuf = result.str();
909 bool ok = transcodeCharacterStringToUTF8(encBuf,encoding.data());
910 if (ok)
911 {
912 result = encBuf;
913 }
914 else
915 {
916 err("failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
917 fileName,startLine,endLine,encoding);
918
919 }
920 }
921 if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
922 //printf("readCodeFragment(%d-%d)=%s\n",startLine,endLine,qPrint(result));
923 return found;
924}
@ FilterOutput
Definition debug.h:38
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
static FilterCache & instance()
bool getFileContents(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:593
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
void resize(size_t newlen)
Definition qcstring.h:180
QCString fill(char c, int len=-1)
Fills a string with a predefined character.
Definition qcstring.h:193
const std::string & str() const
Definition qcstring.h:552
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
#define Config_getInt(name)
Definition config.h:34
#define Config_getBool(name)
Definition config.h:33
#define err(fmt,...)
Definition message.h:127
#define TRUE
Definition qcstring.h:37
SrcLangExt
Definition types.h:207
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5191
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
Definition util.cpp:1433
QCString getEncoding(const FileInfo &fi)
Definition util.cpp:5691
QCString getFileFilter(const QCString &name, bool isSourceCode)
Definition util.cpp:1399

References QCString::at(), Config_getBool, Config_getInt, QCString::data(), err, QCString::fill(), Debug::FilterOutput, QCString::findRev(), getEncoding(), FilterCache::getFileContents(), getFileFilter(), getLanguageFromFileName(), FilterCache::instance(), QCString::isEmpty(), QCString::length(), Debug::print(), QCString::resize(), QCString::str(), transcodeCharacterStringToUTF8(), and TRUE.

Referenced by VhdlDocGen::createFlowChart(), DefinitionMutable::toDefinition_(), and DefinitionImpl::writeInlineCode().

◆ toDefinition()

◆ toDefinitionMutable()

DefinitionMutable * toDefinitionMutable ( Definition * d)