ppScope.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Filename: ppScope.h
  2. // Created by: drose (25Sep00)
  3. //
  4. ////////////////////////////////////////////////////////////////////
  5. #ifndef PPSCOPE_H
  6. #define PPSCOPE_H
  7. #include "ppremake.h"
  8. #include <map>
  9. #include <vector>
  10. class PPNamedScopes;
  11. class PPDirectory;
  12. class PPSubroutine;
  13. ///////////////////////////////////////////////////////////////////
  14. // Class : PPScope
  15. // Description : Defines a (possibly nested) scope for variable
  16. // definitions. Variables may be defined in a
  17. // system-wide variable file, in a template file, or in
  18. // an individual source file.
  19. ////////////////////////////////////////////////////////////////////
  20. class PPScope {
  21. public:
  22. typedef map<string, PPScope *> MapVariableDefinition;
  23. PPScope(PPNamedScopes *named_scopes);
  24. PPNamedScopes *get_named_scopes();
  25. void set_parent(PPScope *parent);
  26. PPScope *get_parent();
  27. void define_variable(const string &varname, const string &definition);
  28. bool set_variable(const string &varname, const string &definition);
  29. void define_map_variable(const string &varname, const string &definition);
  30. void define_map_variable(const string &varname, const string &key_varname,
  31. const string &scope_names);
  32. void add_to_map_variable(const string &varname, const string &key,
  33. PPScope *scope);
  34. void define_formals(const string &subroutine_name,
  35. const vector<string> &formals, const string &actuals);
  36. string get_variable(const string &varname);
  37. string expand_variable(const string &varname);
  38. MapVariableDefinition &find_map_variable(const string &varname);
  39. PPDirectory *get_directory();
  40. void set_directory(PPDirectory *directory);
  41. string expand_string(const string &str);
  42. string expand_self_reference(const string &str, const string &varname);
  43. static void push_scope(PPScope *scope);
  44. static PPScope *pop_scope();
  45. static PPScope *get_bottom_scope();
  46. static PPScope *get_enclosing_scope(int n);
  47. void tokenize_params(const string &str, vector<string> &tokens,
  48. bool expand);
  49. bool tokenize_numeric_pair(const string &str, double &a, double &b);
  50. bool tokenize_ints(const string &str, vector<int> &tokens);
  51. size_t scan_to_whitespace(const string &str, size_t start = 0);
  52. static string format_int(int num);
  53. static MapVariableDefinition _null_map_def;
  54. private:
  55. class ExpandedVariable {
  56. public:
  57. string _varname;
  58. ExpandedVariable *_next;
  59. };
  60. bool p_set_variable(const string &varname, const string &definition);
  61. bool p_get_variable(const string &varname, string &result);
  62. string r_expand_string(const string &str, ExpandedVariable *expanded);
  63. string r_scan_variable(const string &str, size_t &vp);
  64. string r_expand_variable(const string &str, size_t &vp,
  65. PPScope::ExpandedVariable *expanded);
  66. string expand_variable_nested(const string &varname,
  67. const string &scope_names);
  68. string expand_isfullpath(const string &params);
  69. string expand_osfilename(const string &params);
  70. string expand_unixfilename(const string &params);
  71. string expand_unixshortname(const string &params);
  72. string expand_cygpath_w(const string &params);
  73. string expand_cygpath_p(const string &params);
  74. string expand_wildcard(const string &params);
  75. string expand_isdir(const string &params);
  76. string expand_isfile(const string &params);
  77. string expand_libtest(const string &params);
  78. string expand_bintest(const string &params);
  79. string expand_shell(const string &params);
  80. string expand_standardize(const string &params);
  81. string expand_canonical(const string &params);
  82. string expand_length(const string &params);
  83. string expand_substr(const string &params);
  84. string expand_findstring(const string &params);
  85. string expand_dir(const string &params);
  86. string expand_notdir(const string &params);
  87. string expand_suffix(const string &params);
  88. string expand_basename(const string &params);
  89. string expand_makeguid(const string &params);
  90. string expand_word(const string &params);
  91. string expand_wordlist(const string &params);
  92. string expand_words(const string &params);
  93. string expand_firstword(const string &params);
  94. string expand_patsubst(const string &params, bool separate_words);
  95. string expand_filter(const string &params);
  96. string expand_filter_out(const string &params);
  97. string expand_wordsubst(const string &params);
  98. string expand_subst(const string &params);
  99. string expand_join(const string &params);
  100. string expand_sort(const string &params);
  101. string expand_unique(const string &params);
  102. string expand_matrix(const string &params);
  103. string expand_if(const string &params);
  104. string expand_defined(const string &params);
  105. string expand_eq(const string &params);
  106. string expand_ne(const string &params);
  107. string expand_eqn(const string &params);
  108. string expand_nen(const string &params);
  109. string expand_ltn(const string &params);
  110. string expand_len(const string &params);
  111. string expand_gtn(const string &params);
  112. string expand_gen(const string &params);
  113. string expand_plus(const string &params);
  114. string expand_minus(const string &params);
  115. string expand_times(const string &params);
  116. string expand_divide(const string &params);
  117. string expand_modulo(const string &params);
  118. string expand_not(const string &params);
  119. string expand_or(const string &params);
  120. string expand_and(const string &params);
  121. string expand_upcase(const string &params);
  122. string expand_downcase(const string &params);
  123. string expand_cdefine(const string &params);
  124. string expand_closure(const string &params);
  125. string expand_unmapped(const string &params);
  126. string expand_dependencies(const string &params);
  127. string expand_foreach(const string &params);
  128. string expand_forscopes(const string &params);
  129. string expand_function(const string &funcname, const PPSubroutine *sub,
  130. const string &params);
  131. string expand_map_variable(const string &varname, const string &params);
  132. string expand_map_variable(const string &varname, const string &expression,
  133. const vector<string> &keys);
  134. void
  135. r_expand_matrix(vector<string> &results,
  136. const vector<vector<string> > &words,
  137. int index, const string &prefix);
  138. MapVariableDefinition &
  139. p_find_map_variable(const string &varname);
  140. void glob_string(const string &str, vector<string> &results);
  141. PPNamedScopes *_named_scopes;
  142. PPDirectory *_directory;
  143. typedef map<string, string> Variables;
  144. Variables _variables;
  145. typedef map<string, MapVariableDefinition> MapVariables;
  146. MapVariables _map_variables;
  147. PPScope *_parent_scope;
  148. typedef vector<PPScope *> ScopeStack;
  149. static ScopeStack _scope_stack;
  150. };
  151. #endif