sassc 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +5 -0
  4. data/ext/libsass/VERSION +1 -1
  5. data/ext/libsass/include/sass/context.h +3 -0
  6. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  7. data/ext/libsass/src/ast.cpp +117 -117
  8. data/ext/libsass/src/ast.hpp +160 -162
  9. data/ext/libsass/src/ast_def_macros.hpp +10 -10
  10. data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
  11. data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
  12. data/ext/libsass/src/ast_helpers.hpp +5 -5
  13. data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
  14. data/ext/libsass/src/ast_sel_super.cpp +52 -52
  15. data/ext/libsass/src/ast_sel_unify.cpp +16 -16
  16. data/ext/libsass/src/ast_sel_weave.cpp +62 -62
  17. data/ext/libsass/src/ast_selectors.cpp +87 -77
  18. data/ext/libsass/src/ast_selectors.hpp +72 -62
  19. data/ext/libsass/src/ast_supports.cpp +35 -35
  20. data/ext/libsass/src/ast_supports.hpp +29 -29
  21. data/ext/libsass/src/ast_values.cpp +58 -58
  22. data/ext/libsass/src/ast_values.hpp +75 -75
  23. data/ext/libsass/src/backtrace.cpp +9 -9
  24. data/ext/libsass/src/backtrace.hpp +5 -5
  25. data/ext/libsass/src/base64vlq.cpp +2 -2
  26. data/ext/libsass/src/base64vlq.hpp +1 -1
  27. data/ext/libsass/src/bind.cpp +17 -17
  28. data/ext/libsass/src/bind.hpp +1 -1
  29. data/ext/libsass/src/c2ast.cpp +3 -3
  30. data/ext/libsass/src/c2ast.hpp +1 -1
  31. data/ext/libsass/src/check_nesting.cpp +36 -36
  32. data/ext/libsass/src/check_nesting.hpp +2 -2
  33. data/ext/libsass/src/color_maps.cpp +5 -5
  34. data/ext/libsass/src/color_maps.hpp +1 -1
  35. data/ext/libsass/src/context.cpp +63 -60
  36. data/ext/libsass/src/context.hpp +33 -33
  37. data/ext/libsass/src/cssize.cpp +30 -29
  38. data/ext/libsass/src/cssize.hpp +13 -13
  39. data/ext/libsass/src/dart_helpers.hpp +5 -5
  40. data/ext/libsass/src/debugger.hpp +127 -128
  41. data/ext/libsass/src/emitter.cpp +12 -12
  42. data/ext/libsass/src/emitter.hpp +10 -10
  43. data/ext/libsass/src/environment.cpp +27 -27
  44. data/ext/libsass/src/environment.hpp +24 -24
  45. data/ext/libsass/src/error_handling.cpp +42 -42
  46. data/ext/libsass/src/error_handling.hpp +38 -50
  47. data/ext/libsass/src/eval.cpp +138 -132
  48. data/ext/libsass/src/eval.hpp +17 -17
  49. data/ext/libsass/src/eval_selectors.cpp +3 -3
  50. data/ext/libsass/src/expand.cpp +70 -64
  51. data/ext/libsass/src/expand.hpp +12 -12
  52. data/ext/libsass/src/extender.cpp +55 -53
  53. data/ext/libsass/src/extender.hpp +14 -14
  54. data/ext/libsass/src/file.cpp +66 -58
  55. data/ext/libsass/src/file.hpp +23 -25
  56. data/ext/libsass/src/fn_colors.cpp +9 -9
  57. data/ext/libsass/src/fn_lists.cpp +18 -18
  58. data/ext/libsass/src/fn_maps.cpp +3 -3
  59. data/ext/libsass/src/fn_miscs.cpp +15 -15
  60. data/ext/libsass/src/fn_numbers.cpp +7 -7
  61. data/ext/libsass/src/fn_selectors.cpp +8 -8
  62. data/ext/libsass/src/fn_strings.cpp +34 -22
  63. data/ext/libsass/src/fn_utils.cpp +29 -26
  64. data/ext/libsass/src/fn_utils.hpp +10 -10
  65. data/ext/libsass/src/inspect.cpp +35 -34
  66. data/ext/libsass/src/inspect.hpp +21 -21
  67. data/ext/libsass/src/lexer.cpp +3 -1
  68. data/ext/libsass/src/listize.cpp +2 -2
  69. data/ext/libsass/src/mapping.hpp +1 -0
  70. data/ext/libsass/src/memory.hpp +12 -0
  71. data/ext/libsass/src/memory/allocator.cpp +48 -0
  72. data/ext/libsass/src/memory/allocator.hpp +138 -0
  73. data/ext/libsass/src/memory/config.hpp +20 -0
  74. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  75. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  76. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
  77. data/ext/libsass/src/operation.hpp +44 -44
  78. data/ext/libsass/src/operators.cpp +18 -18
  79. data/ext/libsass/src/operators.hpp +11 -11
  80. data/ext/libsass/src/ordered_map.hpp +18 -18
  81. data/ext/libsass/src/output.cpp +16 -16
  82. data/ext/libsass/src/output.hpp +5 -5
  83. data/ext/libsass/src/parser.cpp +327 -345
  84. data/ext/libsass/src/parser.hpp +77 -87
  85. data/ext/libsass/src/parser_selectors.cpp +6 -6
  86. data/ext/libsass/src/permutate.hpp +39 -15
  87. data/ext/libsass/src/plugins.cpp +7 -7
  88. data/ext/libsass/src/plugins.hpp +8 -8
  89. data/ext/libsass/src/position.cpp +7 -26
  90. data/ext/libsass/src/position.hpp +44 -21
  91. data/ext/libsass/src/remove_placeholders.cpp +4 -4
  92. data/ext/libsass/src/remove_placeholders.hpp +3 -3
  93. data/ext/libsass/src/sass.cpp +16 -15
  94. data/ext/libsass/src/sass.hpp +9 -5
  95. data/ext/libsass/src/sass_context.cpp +52 -34
  96. data/ext/libsass/src/sass_values.cpp +8 -10
  97. data/ext/libsass/src/settings.hpp +19 -0
  98. data/ext/libsass/src/source.cpp +69 -0
  99. data/ext/libsass/src/source.hpp +95 -0
  100. data/ext/libsass/src/source_data.hpp +32 -0
  101. data/ext/libsass/src/source_map.cpp +22 -18
  102. data/ext/libsass/src/source_map.hpp +12 -9
  103. data/ext/libsass/src/units.cpp +19 -19
  104. data/ext/libsass/src/units.hpp +8 -8
  105. data/ext/libsass/src/utf8_string.cpp +9 -10
  106. data/ext/libsass/src/utf8_string.hpp +7 -6
  107. data/ext/libsass/src/util.cpp +38 -38
  108. data/ext/libsass/src/util.hpp +18 -18
  109. data/ext/libsass/src/util_string.cpp +13 -13
  110. data/ext/libsass/src/util_string.hpp +9 -8
  111. data/ext/libsass/src/values.cpp +12 -12
  112. data/lib/sassc/native.rb +3 -5
  113. data/lib/sassc/version.rb +1 -1
  114. data/test/native_test.rb +4 -4
  115. metadata +14 -5
  116. data/lib/sassc/native/lib_c.rb +0 -21
@@ -36,19 +36,19 @@ namespace Sass {
36
36
 
37
37
  public: // methods
38
38
  // load one specific plugin
39
- bool load_plugin(const std::string& path);
39
+ bool load_plugin(const sass::string& path);
40
40
  // load all plugins from a directory
41
- size_t load_plugins(const std::string& path);
41
+ size_t load_plugins(const sass::string& path);
42
42
 
43
43
  public: // public accessors
44
- const std::vector<Sass_Importer_Entry> get_headers(void) { return headers; }
45
- const std::vector<Sass_Importer_Entry> get_importers(void) { return importers; }
46
- const std::vector<Sass_Function_Entry> get_functions(void) { return functions; }
44
+ const sass::vector<Sass_Importer_Entry> get_headers(void) { return headers; }
45
+ const sass::vector<Sass_Importer_Entry> get_importers(void) { return importers; }
46
+ const sass::vector<Sass_Function_Entry> get_functions(void) { return functions; }
47
47
 
48
48
  private: // private vars
49
- std::vector<Sass_Importer_Entry> headers;
50
- std::vector<Sass_Importer_Entry> importers;
51
- std::vector<Sass_Function_Entry> functions;
49
+ sass::vector<Sass_Importer_Entry> headers;
50
+ sass::vector<Sass_Importer_Entry> importers;
51
+ sass::vector<Sass_Function_Entry> functions;
52
52
 
53
53
  };
54
54
 
@@ -3,6 +3,7 @@
3
3
  #include "sass.hpp"
4
4
 
5
5
  #include "position.hpp"
6
+ #include "source.hpp"
6
7
 
7
8
  namespace Sass {
8
9
 
@@ -18,7 +19,7 @@ namespace Sass {
18
19
  *this = inc(string, string + strlen(string));
19
20
  }
20
21
 
21
- Offset::Offset(const std::string& text)
22
+ Offset::Offset(const sass::string& text)
22
23
  : line(0), column(0)
23
24
  {
24
25
  *this = inc(text.c_str(), text.c_str() + text.size());
@@ -56,7 +57,7 @@ namespace Sass {
56
57
  // skip over 10xxxxxx
57
58
  // is 1st bit not set
58
59
  if ((chr & 128) == 0) {
59
- // regular ascii char
60
+ // regular ASCII char
60
61
  column += 1;
61
62
  }
62
63
  // is 2nd bit not set
@@ -117,14 +118,11 @@ namespace Sass {
117
118
  : Offset(line, column), file(file) { }
118
119
 
119
120
 
120
- ParserState::ParserState(const char* path, const char* src, const size_t file)
121
- : Position(file, 0, 0), path(path), src(src), offset(0, 0), token() { }
121
+ SourceSpan::SourceSpan(const char* path)
122
+ : source(SASS_MEMORY_NEW(SynthFile, path)), position(0, 0), offset(0, 0) { }
122
123
 
123
- ParserState::ParserState(const char* path, const char* src, const Position& position, Offset offset)
124
- : Position(position), path(path), src(src), offset(offset), token() { }
125
-
126
- ParserState::ParserState(const char* path, const char* src, const Token& token, const Position& position, Offset offset)
127
- : Position(position), path(path), src(src), offset(offset), token(token) { }
124
+ SourceSpan::SourceSpan(SourceDataObj source, const Offset& position, const Offset& offset)
125
+ : source(source), position(position), offset(offset) { }
128
126
 
129
127
  Position Position::add(const char* begin, const char* end)
130
128
  {
@@ -164,21 +162,4 @@ namespace Sass {
164
162
  return Offset(line - off.line, off.line == line ? column - off.column : column);
165
163
  }
166
164
 
167
- /* not used anymore - remove?
168
- std::ostream& operator<<(std::ostream& strm, const Offset& off)
169
- {
170
- if (off.line == string::npos) strm << "-1:"; else strm << off.line << ":";
171
- if (off.column == string::npos) strm << "-1"; else strm << off.column;
172
- return strm;
173
- } */
174
-
175
- /* not used anymore - remove?
176
- std::ostream& operator<<(std::ostream& strm, const Position& pos)
177
- {
178
- if (pos.file != string::npos) strm << pos.file << ":";
179
- if (pos.line == string::npos) strm << "-1:"; else strm << pos.line << ":";
180
- if (pos.column == string::npos) strm << "-1"; else strm << pos.column;
181
- return strm;
182
- } */
183
-
184
165
  }
@@ -3,7 +3,8 @@
3
3
 
4
4
  #include <string>
5
5
  #include <cstring>
6
- // #include <iostream>
6
+ #include "source_data.hpp"
7
+ #include "ast_fwd_decl.hpp"
7
8
 
8
9
  namespace Sass {
9
10
 
@@ -13,7 +14,7 @@ namespace Sass {
13
14
  public: // c-tor
14
15
  Offset(const char chr);
15
16
  Offset(const char* string);
16
- Offset(const std::string& text);
17
+ Offset(const sass::string& text);
17
18
  Offset(const size_t line, const size_t column);
18
19
 
19
20
  // return new position, incremented by the given string
@@ -85,37 +86,59 @@ namespace Sass {
85
86
  : prefix(p), begin(b), end(e) { }
86
87
 
87
88
  size_t length() const { return end - begin; }
88
- std::string ws_before() const { return std::string(prefix, begin); }
89
- std::string to_string() const { return std::string(begin, end); }
90
- std::string time_wspace() const {
91
- std::string str(to_string());
92
- std::string whitespaces(" \t\f\v\n\r");
89
+ sass::string ws_before() const { return sass::string(prefix, begin); }
90
+ sass::string to_string() const { return sass::string(begin, end); }
91
+ sass::string time_wspace() const {
92
+ sass::string str(to_string());
93
+ sass::string whitespaces(" \t\f\v\n\r");
93
94
  return str.erase(str.find_last_not_of(whitespaces)+1);
94
95
  }
95
96
 
96
97
  operator bool() { return begin && end && begin >= end; }
97
- operator std::string() { return to_string(); }
98
+ operator sass::string() { return to_string(); }
98
99
 
99
100
  bool operator==(Token t) { return to_string() == t.to_string(); }
100
101
  };
101
102
 
102
- class ParserState : public Position {
103
+ class SourceSpan {
103
104
 
104
- public: // c-tor
105
- ParserState(const char* path, const char* src = 0, const size_t file = std::string::npos);
106
- ParserState(const char* path, const char* src, const Position& position, Offset offset = Offset(0, 0));
107
- ParserState(const char* path, const char* src, const Token& token, const Position& position, Offset offset = Offset(0, 0));
105
+ public:
108
106
 
109
- public: // down casts
110
- Offset off() { return *this; }
111
- Position pos() { return *this; }
112
- ParserState pstate() { return *this; }
107
+ SourceSpan(const char* path);
113
108
 
114
- public:
115
- const char* path;
116
- const char* src;
109
+ SourceSpan(SourceDataObj source,
110
+ const Offset& position = Offset(0, 0),
111
+ const Offset& offset = Offset(0, 0));
112
+
113
+ const char* getPath() const {
114
+ return source->getPath();
115
+ }
116
+
117
+ const char* getRawData() const {
118
+ return source->getRawData();
119
+ }
120
+
121
+ Offset getPosition() const {
122
+ return position;
123
+ }
124
+
125
+ size_t getLine() const {
126
+ return position.line + 1;
127
+ }
128
+
129
+ size_t getColumn() const {
130
+ return position.column + 1;
131
+ }
132
+
133
+ size_t getSrcId() const {
134
+ return source == nullptr
135
+ ? std::string::npos
136
+ : source->getSrcId();
137
+ }
138
+
139
+ SourceDataObj source;
140
+ Offset position;
117
141
  Offset offset;
118
- Token token;
119
142
 
120
143
  };
121
144
 
@@ -18,7 +18,7 @@ namespace Sass {
18
18
 
19
19
  void Remove_Placeholders::remove_placeholders(SimpleSelector* simple)
20
20
  {
21
- if (Pseudo_Selector * pseudo = simple->getPseudoSelector()) {
21
+ if (PseudoSelector * pseudo = simple->getPseudoSelector()) {
22
22
  if (pseudo->selector()) remove_placeholders(pseudo->selector());
23
23
  }
24
24
  }
@@ -60,7 +60,7 @@ namespace Sass {
60
60
  if (rule->block()) operator()(rule->block());
61
61
  }
62
62
 
63
- void Remove_Placeholders::operator()(Ruleset* r)
63
+ void Remove_Placeholders::operator()(StyleRule* r)
64
64
  {
65
65
  if (SelectorListObj sl = r->selector()) {
66
66
  // Set the new placeholder selector list
@@ -73,12 +73,12 @@ namespace Sass {
73
73
  }
74
74
  }
75
75
 
76
- void Remove_Placeholders::operator()(Supports_Block* m)
76
+ void Remove_Placeholders::operator()(SupportsRule* m)
77
77
  {
78
78
  if (m->block()) operator()(m->block());
79
79
  }
80
80
 
81
- void Remove_Placeholders::operator()(Directive* a)
81
+ void Remove_Placeholders::operator()(AtRule* a)
82
82
  {
83
83
  if (a->block()) a->block()->perform(this);
84
84
  }
@@ -21,10 +21,10 @@ namespace Sass {
21
21
  ~Remove_Placeholders() { }
22
22
 
23
23
  void operator()(Block*);
24
- void operator()(Ruleset*);
24
+ void operator()(StyleRule*);
25
25
  void operator()(CssMediaRule*);
26
- void operator()(Supports_Block*);
27
- void operator()(Directive*);
26
+ void operator()(SupportsRule*);
27
+ void operator()(AtRule*);
28
28
 
29
29
  // ignore missed types
30
30
  template <typename U>
@@ -17,9 +17,9 @@
17
17
  namespace Sass {
18
18
 
19
19
  // helper to convert string list to vector
20
- std::vector<std::string> list2vec(struct string_list* cur)
20
+ sass::vector<sass::string> list2vec(struct string_list* cur)
21
21
  {
22
- std::vector<std::string> list;
22
+ sass::vector<sass::string> list;
23
23
  while (cur) {
24
24
  list.push_back(cur->string);
25
25
  cur = cur->next;
@@ -46,6 +46,7 @@ extern "C" {
46
46
 
47
47
  char* ADDCALL sass_copy_c_string(const char* str)
48
48
  {
49
+ if (str == nullptr) return nullptr;
49
50
  size_t len = strlen(str) + 1;
50
51
  char* cpy = (char*) sass_alloc_memory(len);
51
52
  std::memcpy(cpy, str, len);
@@ -61,14 +62,14 @@ extern "C" {
61
62
  // caller must free the returned memory
62
63
  char* ADDCALL sass_string_quote (const char *str, const char quote_mark)
63
64
  {
64
- std::string quoted = quote(str, quote_mark);
65
+ sass::string quoted = quote(str, quote_mark);
65
66
  return sass_copy_c_string(quoted.c_str());
66
67
  }
67
68
 
68
69
  // caller must free the returned memory
69
70
  char* ADDCALL sass_string_unquote (const char *str)
70
71
  {
71
- std::string unquoted = unquote(str);
72
+ sass::string unquoted = unquote(str);
72
73
  return sass_copy_c_string(unquoted.c_str());
73
74
  }
74
75
 
@@ -76,13 +77,13 @@ extern "C" {
76
77
  {
77
78
  // get the last import entry to get current base directory
78
79
  Sass_Import_Entry import = sass_compiler_get_last_import(compiler);
79
- const std::vector<std::string>& incs = compiler->cpp_ctx->include_paths;
80
+ const sass::vector<sass::string>& incs = compiler->cpp_ctx->include_paths;
80
81
  // create the vector with paths to lookup
81
- std::vector<std::string> paths(1 + incs.size());
82
+ sass::vector<sass::string> paths(1 + incs.size());
82
83
  paths.push_back(File::dir_name(import->abs_path));
83
84
  paths.insert( paths.end(), incs.begin(), incs.end() );
84
85
  // now resolve the file path relative to lookup paths
85
- std::string resolved(File::find_include(file, paths));
86
+ sass::string resolved(File::find_include(file, paths));
86
87
  return sass_copy_c_string(resolved.c_str());
87
88
  }
88
89
 
@@ -90,13 +91,13 @@ extern "C" {
90
91
  {
91
92
  // get the last import entry to get current base directory
92
93
  Sass_Import_Entry import = sass_compiler_get_last_import(compiler);
93
- const std::vector<std::string>& incs = compiler->cpp_ctx->include_paths;
94
+ const sass::vector<sass::string>& incs = compiler->cpp_ctx->include_paths;
94
95
  // create the vector with paths to lookup
95
- std::vector<std::string> paths(1 + incs.size());
96
+ sass::vector<sass::string> paths(1 + incs.size());
96
97
  paths.push_back(File::dir_name(import->abs_path));
97
98
  paths.insert( paths.end(), incs.begin(), incs.end() );
98
99
  // now resolve the file path relative to lookup paths
99
- std::string resolved(File::find_file(file, paths));
100
+ sass::string resolved(File::find_file(file, paths));
100
101
  return sass_copy_c_string(resolved.c_str());
101
102
  }
102
103
 
@@ -105,8 +106,8 @@ extern "C" {
105
106
  // this has the original resolve logic for sass include
106
107
  char* ADDCALL sass_find_include (const char* file, struct Sass_Options* opt)
107
108
  {
108
- std::vector<std::string> vec(list2vec(opt->include_paths));
109
- std::string resolved(File::find_include(file, vec));
109
+ sass::vector<sass::string> vec(list2vec(opt->include_paths));
110
+ sass::string resolved(File::find_include(file, vec));
110
111
  return sass_copy_c_string(resolved.c_str());
111
112
  }
112
113
 
@@ -114,8 +115,8 @@ extern "C" {
114
115
  // Incs array has to be null terminated!
115
116
  char* ADDCALL sass_find_file (const char* file, struct Sass_Options* opt)
116
117
  {
117
- std::vector<std::string> vec(list2vec(opt->include_paths));
118
- std::string resolved(File::find_file(file, vec));
118
+ sass::vector<sass::string> vec(list2vec(opt->include_paths));
119
+ sass::string resolved(File::find_file(file, vec));
119
120
  return sass_copy_c_string(resolved.c_str());
120
121
  }
121
122
 
@@ -136,7 +137,7 @@ extern "C" {
136
137
  namespace Sass {
137
138
 
138
139
  // helper to aid dreaded MSVC debug mode
139
- char* sass_copy_string(std::string str)
140
+ char* sass_copy_string(sass::string str)
140
141
  {
141
142
  // In MSVC the following can lead to segfault:
142
143
  // sass_copy_c_string(stream.str().c_str());
@@ -11,7 +11,7 @@
11
11
  #pragma warning(disable : 4005)
12
12
  #endif
13
13
 
14
- // aplies to MSVC and MinGW
14
+ // applies to MSVC and MinGW
15
15
  #ifdef _WIN32
16
16
  // we do not want the ERROR macro
17
17
  # ifndef NOGDI
@@ -48,13 +48,17 @@
48
48
  #endif
49
49
 
50
50
 
51
- // include C-API header
51
+ // Include C-API header
52
52
  #include "sass/base.h"
53
53
 
54
+ // Include allocator
55
+ #include "memory.hpp"
56
+
54
57
  // For C++ helper
55
58
  #include <string>
59
+ #include <vector>
56
60
 
57
- // output behaviours
61
+ // output behavior
58
62
  namespace Sass {
59
63
 
60
64
  // create some C++ aliases for the most used options
@@ -69,11 +73,11 @@ namespace Sass {
69
73
 
70
74
  // helper to aid dreaded MSVC debug mode
71
75
  // see implementation for more details
72
- char* sass_copy_string(std::string str);
76
+ char* sass_copy_string(sass::string str);
73
77
 
74
78
  }
75
79
 
76
- // input behaviours
80
+ // input behaviors
77
81
  enum Sass_Input_Style {
78
82
  SASS_CONTEXT_NULL,
79
83
  SASS_CONTEXT_FILE,
@@ -10,17 +10,17 @@
10
10
 
11
11
  // C++ helper
12
12
  namespace Sass {
13
- // see sass_copy_c_string(std::string str)
14
- static inline JsonNode* json_mkstream(const std::stringstream& stream)
13
+ // see sass_copy_c_string(sass::string str)
14
+ static inline JsonNode* json_mkstream(const sass::ostream& stream)
15
15
  {
16
16
  // hold on to string on stack!
17
- std::string str(stream.str());
17
+ sass::string str(stream.str());
18
18
  return json_mkstring(str.c_str());
19
19
  }
20
20
 
21
- static void handle_string_error(Sass_Context* c_ctx, const std::string& msg, int severety)
21
+ static void handle_string_error(Sass_Context* c_ctx, const sass::string& msg, int severety)
22
22
  {
23
- std::stringstream msg_stream;
23
+ sass::ostream msg_stream;
24
24
  JsonNode* json_err = json_mkobject();
25
25
  msg_stream << "Internal Error: " << msg << std::endl;
26
26
  json_append_member(json_err, "status", json_mknumber(severety));
@@ -41,9 +41,9 @@ namespace Sass {
41
41
  throw;
42
42
  }
43
43
  catch (Exception::Base& e) {
44
- std::stringstream msg_stream;
45
- std::string cwd(Sass::File::get_cwd());
46
- std::string msg_prefix(e.errtype());
44
+ sass::ostream msg_stream;
45
+ sass::string cwd(Sass::File::get_cwd());
46
+ sass::string msg_prefix(e.errtype());
47
47
  bool got_newline = false;
48
48
  msg_stream << msg_prefix << ": ";
49
49
  const char* msg = e.what();
@@ -55,7 +55,7 @@ namespace Sass {
55
55
  got_newline = true;
56
56
  }
57
57
  else if (got_newline) {
58
- msg_stream << std::string(msg_prefix.size() + 2, ' ');
58
+ msg_stream << sass::string(msg_prefix.size() + 2, ' ');
59
59
  got_newline = false;
60
60
  }
61
61
  msg_stream << *msg;
@@ -65,24 +65,25 @@ namespace Sass {
65
65
 
66
66
  if (e.traces.empty()) {
67
67
  // we normally should have some traces, still here as a fallback
68
- std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
69
- msg_stream << std::string(msg_prefix.size() + 2, ' ');
70
- msg_stream << " on line " << e.pstate.line + 1 << " of " << rel_path << "\n";
68
+ sass::string rel_path(Sass::File::abs2rel(e.pstate.getPath(), cwd, cwd));
69
+ msg_stream << sass::string(msg_prefix.size() + 2, ' ');
70
+ msg_stream << " on line " << e.pstate.getLine() << " of " << rel_path << "\n";
71
71
  }
72
72
  else {
73
- std::string rel_path(Sass::File::abs2rel(e.pstate.path, cwd, cwd));
73
+ sass::string rel_path(Sass::File::abs2rel(e.pstate.getPath(), cwd, cwd));
74
74
  msg_stream << traces_to_string(e.traces, " ");
75
75
  }
76
76
 
77
77
  // now create the code trace (ToDo: maybe have util functions?)
78
- if (e.pstate.line != std::string::npos &&
79
- e.pstate.column != std::string::npos &&
80
- e.pstate.src != nullptr) {
81
- size_t lines = e.pstate.line;
78
+ if (e.pstate.position.line != sass::string::npos &&
79
+ e.pstate.position.column != sass::string::npos &&
80
+ e.pstate.source != nullptr) {
81
+ Offset offset(e.pstate.position);
82
+ size_t lines = offset.line;
82
83
  // scan through src until target line
83
84
  // move line_beg pointer to line start
84
85
  const char* line_beg;
85
- for (line_beg = e.pstate.src; *line_beg != '\0'; ++line_beg) {
86
+ for (line_beg = e.pstate.getRawData(); *line_beg != '\0'; ++line_beg) {
86
87
  if (lines == 0) break;
87
88
  if (*line_beg == '\n') --lines;
88
89
  }
@@ -96,12 +97,12 @@ namespace Sass {
96
97
  size_t move_in = 0; size_t shorten = 0;
97
98
  size_t left_chars = 42; size_t max_chars = 76;
98
99
  // reported excerpt should not exceed `max_chars` chars
99
- if (e.pstate.column > line_len) left_chars = e.pstate.column;
100
- if (e.pstate.column > left_chars) move_in = e.pstate.column - left_chars;
100
+ if (offset.column > line_len) left_chars = offset.column;
101
+ if (offset.column > left_chars) move_in = offset.column - left_chars;
101
102
  if (line_len > max_chars + move_in) shorten = line_len - move_in - max_chars;
102
103
  utf8::advance(line_beg, move_in, line_end);
103
104
  utf8::retreat(line_end, shorten, line_beg);
104
- std::string sanitized; std::string marker(e.pstate.column - move_in, '-');
105
+ sass::string sanitized; sass::string marker(offset.column - move_in, '-');
105
106
  utf8::replace_invalid(line_beg, line_end, std::back_inserter(sanitized));
106
107
  msg_stream << ">> " << sanitized << "\n";
107
108
  msg_stream << " " << marker << "^\n";
@@ -109,9 +110,9 @@ namespace Sass {
109
110
 
110
111
  JsonNode* json_err = json_mkobject();
111
112
  json_append_member(json_err, "status", json_mknumber(1));
112
- json_append_member(json_err, "file", json_mkstring(e.pstate.path));
113
- json_append_member(json_err, "line", json_mknumber((double)(e.pstate.line + 1)));
114
- json_append_member(json_err, "column", json_mknumber((double)(e.pstate.column + 1)));
113
+ json_append_member(json_err, "file", json_mkstring(e.pstate.getPath()));
114
+ json_append_member(json_err, "line", json_mknumber((double)(e.pstate.getLine())));
115
+ json_append_member(json_err, "column", json_mknumber((double)(e.pstate.getColumn())));
115
116
  json_append_member(json_err, "message", json_mkstring(e.what()));
116
117
  json_append_member(json_err, "formatted", json_mkstream(msg_stream));
117
118
  try { c_ctx->error_json = json_stringify(json_err, " "); }
@@ -119,23 +120,23 @@ namespace Sass {
119
120
  c_ctx->error_message = sass_copy_string(msg_stream.str());
120
121
  c_ctx->error_text = sass_copy_c_string(e.what());
121
122
  c_ctx->error_status = 1;
122
- c_ctx->error_file = sass_copy_c_string(e.pstate.path);
123
- c_ctx->error_line = e.pstate.line + 1;
124
- c_ctx->error_column = e.pstate.column + 1;
125
- c_ctx->error_src = sass_copy_c_string(e.pstate.src);
123
+ c_ctx->error_file = sass_copy_c_string(e.pstate.getPath());
124
+ c_ctx->error_line = e.pstate.getLine();
125
+ c_ctx->error_column = e.pstate.getColumn();
126
+ c_ctx->error_src = sass_copy_c_string(e.pstate.getRawData());
126
127
  c_ctx->output_string = 0;
127
128
  c_ctx->source_map_string = 0;
128
129
  json_delete(json_err);
129
130
  }
130
131
  catch (std::bad_alloc& ba) {
131
- std::stringstream msg_stream;
132
+ sass::ostream msg_stream;
132
133
  msg_stream << "Unable to allocate memory: " << ba.what();
133
134
  handle_string_error(c_ctx, msg_stream.str(), 2);
134
135
  }
135
136
  catch (std::exception& e) {
136
137
  handle_string_error(c_ctx, e.what(), 3);
137
138
  }
138
- catch (std::string& e) {
139
+ catch (sass::string& e) {
139
140
  handle_string_error(c_ctx, e, 4);
140
141
  }
141
142
  catch (const char* e) {
@@ -169,8 +170,8 @@ namespace Sass {
169
170
  try {
170
171
 
171
172
  // get input/output path from options
172
- std::string input_path = safe_str(c_ctx->input_path);
173
- std::string output_path = safe_str(c_ctx->output_path);
173
+ sass::string input_path = safe_str(c_ctx->input_path);
174
+ sass::string output_path = safe_str(c_ctx->output_path);
174
175
 
175
176
  // maybe skip some entries of included files
176
177
  // we do not include stdin for data contexts
@@ -279,8 +280,8 @@ extern "C" {
279
280
  // reset error position
280
281
  c_ctx->error_file = 0;
281
282
  c_ctx->error_src = 0;
282
- c_ctx->error_line = std::string::npos;
283
- c_ctx->error_column = std::string::npos;
283
+ c_ctx->error_line = sass::string::npos;
284
+ c_ctx->error_column = sass::string::npos;
284
285
 
285
286
  // allocate a new compiler instance
286
287
  void* ctxmem = calloc(1, sizeof(struct Sass_Compiler));
@@ -702,6 +703,23 @@ extern "C" {
702
703
  return cur->string;
703
704
  }
704
705
 
706
+ // Push function for plugin paths (no manipulation support for now)
707
+ size_t ADDCALL sass_option_get_plugin_path_size(struct Sass_Options* options)
708
+ {
709
+ size_t len = 0;
710
+ struct string_list* cur = options->plugin_paths;
711
+ while (cur) { len++; cur = cur->next; }
712
+ return len;
713
+ }
714
+
715
+ // Push function for plugin paths (no manipulation support for now)
716
+ const char* ADDCALL sass_option_get_plugin_path(struct Sass_Options* options, size_t i)
717
+ {
718
+ struct string_list* cur = options->plugin_paths;
719
+ while (i) { i--; cur = cur->next; }
720
+ return cur->string;
721
+ }
722
+
705
723
  // Push function for plugin paths (no manipulation support for now)
706
724
  void ADDCALL sass_option_push_plugin_path(struct Sass_Options* options, const char* path)
707
725
  {