cprover
mode.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@cs.cmu.edu
6 
7 \*******************************************************************/
8 
9 #include "mode.h"
10 
11 #include <list>
12 #include <memory>
13 #include <set>
14 
15 #ifdef _WIN32
16 #include <cstring>
17 #endif
18 
19 #include <util/language.h>
20 
22 {
24  std::set<std::string> extensions;
26 };
27 
28 typedef std::list<language_entryt> languagest;
30 
32 {
33  languages.push_back(language_entryt());
34  std::unique_ptr<languaget> l(factory());
35  languages.back().factory=factory;
36  languages.back().extensions=l->extensions();
37  languages.back().mode=l->id();
38 }
39 
41 {
42  for(languagest::const_iterator it=languages.begin();
43  it!=languages.end();
44  it++)
45  if(mode==it->mode)
46  return it->factory();
47 
48  return nullptr;
49 }
50 
51 languaget *get_language_from_filename(const std::string &filename)
52 {
53  std::size_t ext_pos=filename.rfind('.');
54 
55  if(ext_pos==std::string::npos)
56  return nullptr;
57 
58  std::string extension=
59  std::string(filename, ext_pos+1, std::string::npos);
60 
61  if(extension=="")
62  return nullptr;
63 
64  for(languagest::const_iterator
65  l_it=languages.begin();
66  l_it!=languages.end();
67  l_it++)
68  {
69  #ifdef _WIN32
70  for(std::set<std::string>::const_iterator
71  e_it=l_it->extensions.begin();
72  e_it!=l_it->extensions.end();
73  e_it++)
74  if(_stricmp(extension.c_str(), e_it->c_str())==0)
75  return l_it->factory();
76  #else
77  if(l_it->extensions.find(extension)!=l_it->extensions.end())
78  return l_it->factory();
79  #endif
80  }
81 
82  return nullptr;
83 }
84 
86 {
87  assert(!languages.empty());
88  return languages.front().factory();
89 }
irep_idt mode
Definition: mode.cpp:25
virtual std::set< std::string > extensions() const
Definition: language.h:84
virtual std::string id() const
Definition: language.h:82
Abstract interface to support a programming language.
languaget * get_default_language()
Definition: mode.cpp:85
languaget * get_language_from_mode(const irep_idt &mode)
Definition: mode.cpp:40
language_factoryt factory
Definition: mode.cpp:23
languaget * get_language_from_filename(const std::string &filename)
Definition: mode.cpp:51
std::list< language_entryt > languagest
Definition: mode.cpp:28
void register_language(language_factoryt factory)
Definition: mode.cpp:31
languagest languages
Definition: mode.cpp:29
languaget *(* language_factoryt)()
Definition: mode.h:21
std::set< std::string > extensions
Definition: mode.cpp:24