Doxygen
Loading...
Searching...
No Matches
Preprocessor Class Reference

#include <src/pre.h>

Classes

struct  Private

Public Member Functions

 Preprocessor ()
 ~Preprocessor ()
void processFile (const QCString &fileName, const std::string &input, std::string &output)
void addSearchDir (const QCString &dir)

Private Attributes

std::unique_ptr< Privatep

Detailed Description

Definition at line 27 of file pre.h.

Constructor & Destructor Documentation

◆ Preprocessor()

Preprocessor::Preprocessor ( )

Definition at line 4185 of file pre.l.

4185 : p(std::make_unique<Private>())
4186{
4187 preYYlex_init_extra(&p->state,&p->yyscanner);
4188 addSearchDir(".");
4189}
void addSearchDir(const QCString &dir)
Definition pre.l:4178
std::unique_ptr< Private > p
Definition pre.h:38

References p.

◆ ~Preprocessor()

Preprocessor::~Preprocessor ( )

Definition at line 4191 of file pre.l.

4192{
4193 preYYlex_destroy(p->yyscanner);
4194}

References p.

Member Function Documentation

◆ addSearchDir()

void Preprocessor::addSearchDir ( const QCString & dir)

Definition at line 4178 of file pre.l.

4179{
4180 YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner);
4181 FileInfo fi(dir.str());
4182 if (fi.isDir()) state->pathList.push_back(fi.absFilePath());
4183}
const std::string & str() const
Definition qcstring.h:552

References p.

Referenced by parseFile().

◆ processFile()

void Preprocessor::processFile ( const QCString & fileName,
const std::string & input,
std::string & output )

Definition at line 4196 of file pre.l.

4197{
4198 AUTO_TRACE("fileName={}",fileName);
4199 yyscan_t yyscanner = p->yyscanner;
4200 YY_EXTRA_TYPE state = preYYget_extra(p->yyscanner);
4201 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
4202
4203#ifdef FLEX_DEBUG
4204 preYYset_debug(Debug::isFlagSet(Debug::Lex_pre)?1:0,yyscanner);
4205#endif
4206
4207 DebugLex debugLex(Debug::Lex_pre, __FILE__, qPrint(fileName));
4208 //printf("##########################\n%s\n####################\n",
4209 // qPrint(input));
4210
4211 state->macroExpansion = Config_getBool(MACRO_EXPANSION);
4212 state->expandOnlyPredef = Config_getBool(EXPAND_ONLY_PREDEF);
4213 state->skip=FALSE;
4214 state->curlyCount=0;
4215 state->lexRulesPart=false;
4216 state->nospaces=FALSE;
4217 state->inputBuf=&input;
4218 state->inputBufPos=0;
4219 state->outputBuf=&output;
4220 state->includeStack.clear();
4221 state->expandedDict.clear();
4222 state->contextDefines.clear();
4223 state->pragmaSet.clear();
4224 while (!state->condStack.empty()) state->condStack.pop();
4225
4226 setFileName(yyscanner,fileName);
4227
4228 state->inputFileDef = state->yyFileDef;
4229 //yyextra->defineManager.startContext(state->fileName);
4230
4231 initPredefined(yyscanner,fileName);
4232
4233 state->yyLineNr = 1;
4234 state->yyColNr = 1;
4235 state->ifcount = 0;
4236
4237 BEGIN( Start );
4238
4239 state->expectGuard = guessSection(fileName).isHeader();
4240 state->guardName.clear();
4241 state->lastGuardName.clear();
4242 state->guardExpr.clear();
4243
4244 preYYlex(yyscanner);
4245
4246 while (!state->condStack.empty())
4247 {
4248 const std::unique_ptr<preYY_CondCtx> &ctx = state->condStack.top();
4249 QCString sectionInfo = " ";
4250 if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label '%s' ",qPrint(ctx->sectionId.stripWhiteSpace()));
4251 warn(ctx->fileName,ctx->lineNr,"Conditional section{}does not have "
4252 "a corresponding \\endcond command within this file.",sectionInfo);
4253 state->condStack.pop();
4254 }
4255 // make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829)
4256 forceEndCondSection(yyscanner);
4257
4258 if (!state->levelGuard.empty())
4259 {
4260 warn(state->fileName,state->yyLineNr,"More #if's than #endif's found (might be in an included file).");
4261 }
4262
4264 {
4265 std::lock_guard<std::mutex> lock(g_debugMutex);
4266 Debug::print(Debug::Preprocessor,0,"Preprocessor output of {} (size: {} bytes):\n",fileName,output.size());
4267 std::string contents;
4269 {
4270 contents=output;
4271 }
4272 else // need to add line numbers
4273 {
4274 int line=1;
4275 bool startOfLine = true;
4276 size_t content_size = output.size() +
4277 output.size()*6/40; // assuming 40 chars per line on average
4278 // and 6 chars extra for the line number
4279 contents.reserve(content_size);
4280 size_t pos=0;
4281 while (pos<output.size())
4282 {
4283 if (startOfLine)
4284 {
4285 char lineNrStr[15];
4286 snprintf(lineNrStr,15,"%05d ",line++);
4287 contents+=lineNrStr;
4288 }
4289 contents += output[pos];
4290 startOfLine = output[pos]=='\n';
4291 pos++;
4292 }
4293 }
4294 char end[2]={0,0};
4295 if (!contents.empty() && contents[contents.length()-1]!='\n')
4296 {
4297 end[0]='\n';
4298 }
4299 Debug::print(Debug::Preprocessor,0,"---------\n{}{}---------\n",contents,end);
4300 if (yyextra->contextDefines.size()>0)
4301 {
4302 Debug::print(Debug::Preprocessor,0,"Macros accessible in this file ({}):\n", fileName);
4303 Debug::print(Debug::Preprocessor,0,"---------\n");
4304 for (auto &kv : yyextra->contextDefines)
4305 {
4306 Debug::print(Debug::Preprocessor,0,"{} ",kv.second.name);
4307 }
4308 for (auto &kv : yyextra->localDefines)
4309 {
4310 Debug::print(Debug::Preprocessor,0,"{} ",kv.second.name);
4311 }
4312 Debug::print(Debug::Preprocessor,0,"\n---------\n");
4313 }
4314 else
4315 {
4316 Debug::print(Debug::Preprocessor,0,"No macros accessible in this file ({}).\n", fileName);
4317 }
4318 }
4319
4320 {
4321 std::lock_guard<std::mutex> lock(g_updateGlobals);
4322 for (const auto &inc : state->includeRelations)
4323 {
4324 auto toKind = [](bool local,bool imported) -> IncludeKind
4325 {
4326 if (local)
4327 {
4328 if (imported)
4329 {
4331 }
4333 }
4334 else if (imported)
4335 {
4337 }
4339 };
4340 if (inc->fromFileDef)
4341 {
4342 inc->fromFileDef->addIncludeDependency(inc->toFileDef,inc->includeName,toKind(inc->local,inc->imported));
4343 }
4344 if (inc->toFileDef && inc->fromFileDef)
4345 {
4346 inc->toFileDef->addIncludedByDependency(inc->fromFileDef,inc->fromFileDef->docName(),toKind(inc->local,inc->imported));
4347 }
4348 }
4349 // add the macro definition for this file to the global map
4350 Doxygen::macroDefinitions.emplace(state->fileName.str(),std::move(state->macroDefinitions));
4351 }
4352
4353 //yyextra->defineManager.endContext();
4354}
@ NoLineNo
Definition debug.h:42
@ Lex_pre
Definition debug.h:64
@ Preprocessor
Definition debug.h:30
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
static DefinesPerFileList macroDefinitions
Definition doxygen.h:134
QCString & sprintf(const char *format,...)
Definition qcstring.cpp:29
yyguts_t * yyscan_t
Definition code.l:24
#define Config_getBool(name)
Definition config.h:33
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
#define AUTO_TRACE(...)
Definition docnode.cpp:47
IncludeKind
Definition filedef.h:47
@ IncludeLocal
Definition filedef.h:50
@ ImportSystemObjC
Definition filedef.h:51
@ ImportLocalObjC
Definition filedef.h:52
@ IncludeSystem
Definition filedef.h:49
#define warn(file, line, fmt,...)
Definition message.h:97
static void initPredefined(yyscan_t yyscanner, const QCString &fileName)
Definition pre.l:4051
static void setFileName(yyscan_t yyscanner, const QCString &name)
Definition pre.l:2231
static void forceEndCondSection(yyscan_t yyscanner)
Definition pre.l:3907
static std::mutex g_updateGlobals
Definition pre.l:233
static std::mutex g_debugMutex
Definition pre.l:231
const char * qPrint(const char *s)
Definition qcstring.h:687
#define FALSE
Definition qcstring.h:34
EntryType guessSection(const QCString &name)
Definition util.cpp:338

References FALSE, Debug::isFlagSet(), Debug::Lex_pre, and p.

Referenced by parseFile().

Member Data Documentation

◆ p

std::unique_ptr<Private> Preprocessor::p
private

Definition at line 38 of file pre.h.

Referenced by addSearchDir(), Preprocessor(), processFile(), and ~Preprocessor().


The documentation for this class was generated from the following files: