Select Git revision
-
Kevin Jacques authoredKevin Jacques authored
MacroManager.cpp 2.63 KiB
// GetDP - Copyright (C) 1997-2015 P. Dular, C. Geuzaine
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to the public mailing list <getdp@onelab.info>.
#include <stdio.h>
#include <map>
#include <stack>
#include <string>
#include "MacroManager.h"
extern std::string getdp_yystring;
class File_Position
{
public:
long int lineno;
fpos_t position;
FILE *file;
std::string filename;
};
class mystack
{
public:
std::stack<File_Position> s;
};
class mymap
{
public:
std::map<std::string, File_Position> inFile;
std::map<std::string, std::string> inString;
};
MacroManager *MacroManager::_instance = 0;
MacroManager::MacroManager()
{
_macros = new mymap;
_calls = new mystack;
}
MacroManager *MacroManager::Instance()
{
if(!_instance) {
_instance = new MacroManager;
}
return _instance;
}
void MacroManager::clear()
{
_macros->inFile.clear();
_macros->inString.clear();
}
int MacroManager::enterMacro(const std::string &name, FILE **f,
std::string &filename, long int &lno) const
{
if(_macros->inFile.find(name) == _macros->inFile.end())
return 0;
File_Position fpold;
fpold.lineno = lno;
fpold.filename = filename;
fpold.file = *f;
fgetpos(fpold.file, &fpold.position);
_calls->s.push(fpold);
File_Position fp = (_macros->inFile)[name];
fsetpos(fp.file, &fp.position);
*f = fp.file;
filename = fp.filename;
lno = fp.lineno;
return 1;
}
int MacroManager::leaveMacro(FILE **f, std::string &filename, long int &lno)
{
if(!_calls->s.size())
return 0;
File_Position fp;
fp = _calls->s.top();
_calls->s.pop();
fsetpos(fp.file, &fp.position);
*f = fp.file;
filename = fp.filename;
// lno = fp.lineno;
// To fix: bad line number after leaving macro if not -1
lno = fp.lineno - 1;
return 1;
}
int MacroManager::createMacro(const std::string &name, FILE *f,
const std::string &filename, long int lno)
{
if(_macros->inFile.find(name) != _macros->inFile.end())
return 0;
File_Position fp;
fp.file = f;
fp.filename = filename;
fp.lineno = lno;
fgetpos(fp.file, &fp.position);
(_macros->inFile)[name] = fp;
return 1;
}
int MacroManager::createStringMacro(const std::string &name,
const std::string &value)
{
if(_macros->inString.find(name) != _macros->inString.end())
return 0;
(_macros->inString)[name] = value;
return 1;
}
int MacroManager::enterStringMacro(const std::string &name) const
{
if(_macros->inString.find(name) == _macros->inString.end())
return 0;
getdp_yystring = (_macros->inString)[name];
return 1;
}