Forked from
gmsh / gmsh
14697 commits behind the upstream repository.
-
Christophe Geuzaine authoredChristophe Geuzaine authored
FunctionManager.cpp 1.93 KiB
// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to <gmsh@geuz.org>.
#include <map>
#include <stdio.h>
#include <stack>
#include <string.h>
#include "FunctionManager.h"
struct ltstr
{
bool operator() (const char *s1, const char *s2)const
{
return strcmp(s1, s2) < 0;
}
};
class File_Position
{
public:
int lineno;
fpos_t position;
FILE *file;
std::string filename;
};
class mystack
{
public:
std::stack<File_Position> s;
};
class mymap
{
public:
std::map<char*, File_Position, ltstr> m;
};
FunctionManager *FunctionManager::instance = 0;
FunctionManager::FunctionManager()
{
functions = new mymap;
calls = new mystack;
}
FunctionManager *FunctionManager::Instance()
{
if(!instance) {
instance = new FunctionManager;
}
return instance;
}
int FunctionManager::enterFunction(char *name, FILE ** f, std::string &filename,
int &lno) const
{
if(functions->m.find(name) == functions->m.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 = (functions->m)[name];
fsetpos(fp.file, &fp.position);
*f = fp.file;
filename = fp.filename;
lno = fp.lineno;
return 1;
}
int FunctionManager::leaveFunction(FILE ** f, std::string &filename, 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;
return 1;
}
int FunctionManager::createFunction(char *name, FILE * f, std::string &filename,
int lno)
{
File_Position fp;
fp.file = f;
fp.filename = filename;
fp.lineno = lno;
fgetpos(fp.file, &fp.position);
(functions->m)[name] = fp;
return 1;
}