variable_map.h 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright (C) 2006-2019 Samuel Newbold
  2. extern const char* WSPACE;
  3. std::string escape(const std::string& src);
  4. std::string word_from_value(const std::string& value);
  5. class Variable_map : private std::map<std::string, std::string> {
  6. typedef std::map<std::string, std::string> Base;
  7. std::set<std::string> checked_vars;
  8. std::set<std::string> local_vars;
  9. std::set<std::string> undefined_vars;
  10. std::set<std::string> used_vars;
  11. Variable_map* parent;
  12. const Variable_map* parent_with(const std::string& key) const;
  13. void export_env(std::vector<char*>& env, const Variable_map* descendant);
  14. public:
  15. typedef Base::iterator iterator;
  16. typedef Base::const_iterator const_iterator;
  17. static Variable_map *global_map;
  18. bool locals_listed;
  19. bool usage_checked;
  20. Variable_map(Variable_map* parent);
  21. void bless_unused_vars();
  22. void bless_unused_vars_without_usage();
  23. ~Variable_map();
  24. const_iterator begin(void) const {return Base::begin();};
  25. const_iterator end(void) const {return Base::end();};
  26. iterator begin(void) {return Base::begin();};
  27. iterator end(void) {return Base::end();};
  28. unsigned size(void) const {return Base::size();};
  29. void add_undefined(const std::string& key, bool is_reassign);
  30. void append_word(const std::string& key, const std::string& value,
  31. bool parent_ok);
  32. template <class In, class Out>
  33. Out copy_to_char_star_star(
  34. In first, In last, Out res, const Variable_map* descendant);
  35. void define(const std::string& key, const std::string& value);
  36. bool exists_with_check(const std::string& key);
  37. bool exists_without_check(const std::string& key) const;
  38. void export_env(std::vector<char*>& env);
  39. const std::string& get(const std::string& key);
  40. void global(const std::string& key, const std::string& value);
  41. void local(const std::string& key, const std::string& value);
  42. void local_declare(const std::string& key);
  43. const std::set<std::string>& locals(void) const {return local_vars;};
  44. void param(const std::string& key, const std::string& value,
  45. bool is_reassign);
  46. void param_or_append_word(const std::string& key, const std::string& value,
  47. bool is_reassign);
  48. Variable_map* nonempty_parent(void);
  49. void set(const std::string& key, const std::string& value);
  50. bool simple_exists(const std::string& key) const {return find(key) != end();}
  51. void unset(const std::string& key);
  52. bool undefined_vars_contains(const std::string& key) const {
  53. return undefined_vars.find(key) != undefined_vars.end();};
  54. bool used_vars_contains(const std::string& key) const {
  55. return used_vars.find(key) != used_vars.end();};
  56. bool checked_vars_contains(const std::string& key) const {
  57. return checked_vars.find(key) != checked_vars.end();};
  58. void used_vars_insert(const std::string& key) {
  59. used_vars.insert(key);}; };
  60. inline bool isargvar(const std::string& focus) {
  61. switch(focus[0]) {
  62. case '*': case '#': case '0': case '1': case '2': case '3': case '4':
  63. case '5': case '6': case '7': case '8': case '9': return true;
  64. default: return false;}}