sassc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +24 -0
  8. data/Rakefile +21 -0
  9. data/ext/libsass/.editorconfig +15 -0
  10. data/ext/libsass/.gitattributes +2 -0
  11. data/ext/libsass/.gitignore +61 -0
  12. data/ext/libsass/.travis.yml +38 -0
  13. data/ext/libsass/COPYING +25 -0
  14. data/ext/libsass/INSTALL +1 -0
  15. data/ext/libsass/LICENSE +25 -0
  16. data/ext/libsass/Makefile +223 -0
  17. data/ext/libsass/Makefile.am +145 -0
  18. data/ext/libsass/Readme.md +93 -0
  19. data/ext/libsass/appveyor.yml +76 -0
  20. data/ext/libsass/ast.cpp +581 -0
  21. data/ext/libsass/ast.hpp +1949 -0
  22. data/ext/libsass/ast_def_macros.hpp +16 -0
  23. data/ext/libsass/ast_factory.hpp +87 -0
  24. data/ext/libsass/ast_fwd_decl.hpp +72 -0
  25. data/ext/libsass/b64/cencode.h +32 -0
  26. data/ext/libsass/b64/encode.h +77 -0
  27. data/ext/libsass/backtrace.hpp +81 -0
  28. data/ext/libsass/base64vlq.cpp +43 -0
  29. data/ext/libsass/base64vlq.hpp +28 -0
  30. data/ext/libsass/bind.cpp +187 -0
  31. data/ext/libsass/bind.hpp +18 -0
  32. data/ext/libsass/cencode.c +102 -0
  33. data/ext/libsass/color_names.hpp +324 -0
  34. data/ext/libsass/configure.ac +130 -0
  35. data/ext/libsass/constants.cpp +144 -0
  36. data/ext/libsass/constants.hpp +145 -0
  37. data/ext/libsass/context.cpp +507 -0
  38. data/ext/libsass/context.hpp +150 -0
  39. data/ext/libsass/contextualize.cpp +157 -0
  40. data/ext/libsass/contextualize.hpp +65 -0
  41. data/ext/libsass/copy_c_str.cpp +13 -0
  42. data/ext/libsass/copy_c_str.hpp +5 -0
  43. data/ext/libsass/debug.hpp +39 -0
  44. data/ext/libsass/environment.hpp +75 -0
  45. data/ext/libsass/error_handling.cpp +28 -0
  46. data/ext/libsass/error_handling.hpp +28 -0
  47. data/ext/libsass/eval.cpp +1149 -0
  48. data/ext/libsass/eval.hpp +80 -0
  49. data/ext/libsass/expand.cpp +430 -0
  50. data/ext/libsass/expand.hpp +77 -0
  51. data/ext/libsass/extconf.rb +6 -0
  52. data/ext/libsass/extend.cpp +1962 -0
  53. data/ext/libsass/extend.hpp +50 -0
  54. data/ext/libsass/file.cpp +291 -0
  55. data/ext/libsass/file.hpp +18 -0
  56. data/ext/libsass/functions.cpp +1565 -0
  57. data/ext/libsass/functions.hpp +187 -0
  58. data/ext/libsass/inspect.cpp +727 -0
  59. data/ext/libsass/inspect.hpp +108 -0
  60. data/ext/libsass/json.cpp +1411 -0
  61. data/ext/libsass/json.hpp +117 -0
  62. data/ext/libsass/kwd_arg_macros.hpp +23 -0
  63. data/ext/libsass/m4/.gitkeep +0 -0
  64. data/ext/libsass/mapping.hpp +17 -0
  65. data/ext/libsass/memory_manager.hpp +54 -0
  66. data/ext/libsass/node.cpp +251 -0
  67. data/ext/libsass/node.hpp +122 -0
  68. data/ext/libsass/operation.hpp +153 -0
  69. data/ext/libsass/output_compressed.cpp +401 -0
  70. data/ext/libsass/output_compressed.hpp +95 -0
  71. data/ext/libsass/output_nested.cpp +364 -0
  72. data/ext/libsass/output_nested.hpp +108 -0
  73. data/ext/libsass/parser.cpp +2016 -0
  74. data/ext/libsass/parser.hpp +264 -0
  75. data/ext/libsass/paths.hpp +69 -0
  76. data/ext/libsass/position.hpp +22 -0
  77. data/ext/libsass/posix/getopt.c +562 -0
  78. data/ext/libsass/posix/getopt.h +95 -0
  79. data/ext/libsass/prelexer.cpp +688 -0
  80. data/ext/libsass/prelexer.hpp +513 -0
  81. data/ext/libsass/remove_placeholders.cpp +59 -0
  82. data/ext/libsass/remove_placeholders.hpp +43 -0
  83. data/ext/libsass/res/resource.rc +35 -0
  84. data/ext/libsass/sass.cpp +33 -0
  85. data/ext/libsass/sass.h +60 -0
  86. data/ext/libsass/sass2scss.cpp +834 -0
  87. data/ext/libsass/sass2scss.h +110 -0
  88. data/ext/libsass/sass_context.cpp +709 -0
  89. data/ext/libsass/sass_context.h +120 -0
  90. data/ext/libsass/sass_functions.cpp +137 -0
  91. data/ext/libsass/sass_functions.h +90 -0
  92. data/ext/libsass/sass_interface.cpp +277 -0
  93. data/ext/libsass/sass_interface.h +97 -0
  94. data/ext/libsass/sass_util.cpp +136 -0
  95. data/ext/libsass/sass_util.hpp +259 -0
  96. data/ext/libsass/sass_values.cpp +337 -0
  97. data/ext/libsass/sass_values.h +124 -0
  98. data/ext/libsass/script/bootstrap +10 -0
  99. data/ext/libsass/script/branding +10 -0
  100. data/ext/libsass/script/ci-build-libsass +72 -0
  101. data/ext/libsass/script/ci-install-compiler +4 -0
  102. data/ext/libsass/script/ci-install-deps +19 -0
  103. data/ext/libsass/script/ci-report-coverage +25 -0
  104. data/ext/libsass/script/coveralls-debug +32 -0
  105. data/ext/libsass/script/spec +5 -0
  106. data/ext/libsass/script/tap-driver +652 -0
  107. data/ext/libsass/script/tap-runner +1 -0
  108. data/ext/libsass/source_map.cpp +133 -0
  109. data/ext/libsass/source_map.hpp +46 -0
  110. data/ext/libsass/subset_map.hpp +145 -0
  111. data/ext/libsass/support/libsass.pc.in +11 -0
  112. data/ext/libsass/test-driver +127 -0
  113. data/ext/libsass/test/test_node.cpp +98 -0
  114. data/ext/libsass/test/test_paths.cpp +29 -0
  115. data/ext/libsass/test/test_selector_difference.cpp +28 -0
  116. data/ext/libsass/test/test_specificity.cpp +28 -0
  117. data/ext/libsass/test/test_subset_map.cpp +472 -0
  118. data/ext/libsass/test/test_superselector.cpp +71 -0
  119. data/ext/libsass/test/test_unification.cpp +33 -0
  120. data/ext/libsass/to_c.cpp +61 -0
  121. data/ext/libsass/to_c.hpp +44 -0
  122. data/ext/libsass/to_string.cpp +29 -0
  123. data/ext/libsass/to_string.hpp +32 -0
  124. data/ext/libsass/token.hpp +32 -0
  125. data/ext/libsass/units.cpp +54 -0
  126. data/ext/libsass/units.hpp +10 -0
  127. data/ext/libsass/utf8.h +34 -0
  128. data/ext/libsass/utf8/checked.h +327 -0
  129. data/ext/libsass/utf8/core.h +329 -0
  130. data/ext/libsass/utf8/unchecked.h +228 -0
  131. data/ext/libsass/utf8_string.cpp +102 -0
  132. data/ext/libsass/utf8_string.hpp +36 -0
  133. data/ext/libsass/util.cpp +189 -0
  134. data/ext/libsass/util.hpp +26 -0
  135. data/ext/libsass/win/libsass.filters +291 -0
  136. data/ext/libsass/win/libsass.sln +28 -0
  137. data/ext/libsass/win/libsass.vcxproj +255 -0
  138. data/lib/sassc.rb +6 -0
  139. data/lib/sassc/engine.rb +13 -0
  140. data/lib/sassc/native.rb +44 -0
  141. data/lib/sassc/native/native_context_api.rb +140 -0
  142. data/lib/sassc/native/native_functions_api.rb +41 -0
  143. data/lib/sassc/native/sass_input_style.rb +11 -0
  144. data/lib/sassc/native/sass_output_style.rb +10 -0
  145. data/lib/sassc/native/sass_value.rb +95 -0
  146. data/lib/sassc/native/string_list.rb +8 -0
  147. data/lib/sassc/version.rb +3 -0
  148. data/sassc.gemspec +43 -0
  149. data/test/smoke_test.rb +171 -0
  150. data/test/test_helper.rb +4 -0
  151. metadata +281 -0
@@ -0,0 +1 @@
1
+ $@ | tapout tap
@@ -0,0 +1,133 @@
1
+ #include "source_map.hpp"
2
+ #include "json.hpp"
3
+
4
+ #ifndef SASS_CONTEXT
5
+ #include "context.hpp"
6
+ #endif
7
+
8
+ #include <string>
9
+ #include <sstream>
10
+ #include <cstddef>
11
+ #include <iomanip>
12
+
13
+ namespace Sass {
14
+ using std::ptrdiff_t;
15
+ SourceMap::SourceMap(const string& file) : current_position(Position(1, 1)), file(file) { }
16
+
17
+ string SourceMap::generate_source_map(Context &ctx) {
18
+
19
+ const bool include_sources = ctx.source_map_contents;
20
+ const vector<string> includes = ctx.include_links;
21
+ const vector<const char*> sources = ctx.sources;
22
+
23
+ JsonNode *json_srcmap = json_mkobject();
24
+
25
+ json_append_member(json_srcmap, "version", json_mknumber(3));
26
+
27
+ const char *include = file.c_str();
28
+ JsonNode *json_include = json_mkstring(include);
29
+ json_append_member(json_srcmap, "file", json_include);
30
+
31
+ JsonNode *json_includes = json_mkarray();
32
+ for (size_t i = 0; i < source_index.size(); ++i) {
33
+ const char *include = includes[source_index[i]].c_str();
34
+ JsonNode *json_include = json_mkstring(include);
35
+ json_append_element(json_includes, json_include);
36
+ }
37
+ json_append_member(json_srcmap, "sources", json_includes);
38
+
39
+ JsonNode *json_contents = json_mkarray();
40
+ if (include_sources) {
41
+ for (size_t i = 0; i < source_index.size(); ++i) {
42
+ const char *content = sources[source_index[i]];
43
+ JsonNode *json_content = json_mkstring(content);
44
+ json_append_element(json_contents, json_content);
45
+ }
46
+ }
47
+ json_append_member(json_srcmap, "sourcesContent", json_contents);
48
+
49
+ string mappings = serialize_mappings();
50
+ JsonNode *json_mappings = json_mkstring(mappings.c_str());
51
+ json_append_member(json_srcmap, "mappings", json_mappings);
52
+
53
+ JsonNode *json_names = json_mkarray();
54
+ // so far we have no implementation for names
55
+ // no problem as we do not alter any identifiers
56
+ json_append_member(json_srcmap, "names", json_names);
57
+
58
+ char *str = json_stringify(json_srcmap, "\t");
59
+ string result = string(str);
60
+ free(str);
61
+ json_delete(json_srcmap);
62
+ return result;
63
+ }
64
+
65
+ string SourceMap::serialize_mappings() {
66
+ string result = "";
67
+
68
+ size_t previous_generated_line = 0;
69
+ size_t previous_generated_column = 0;
70
+ size_t previous_original_line = 0;
71
+ size_t previous_original_column = 0;
72
+ size_t previous_original_file = 0;
73
+ for (size_t i = 0; i < mappings.size(); ++i) {
74
+ const size_t generated_line = mappings[i].generated_position.line - 1;
75
+ const size_t generated_column = mappings[i].generated_position.column - 1;
76
+ const size_t original_line = mappings[i].original_position.line - 1;
77
+ const size_t original_column = mappings[i].original_position.column - 1;
78
+ const size_t original_file = mappings[i].original_position.file - 1;
79
+
80
+ if (generated_line != previous_generated_line) {
81
+ previous_generated_column = 0;
82
+ if (generated_line > previous_generated_line) {
83
+ result += std::string(generated_line - previous_generated_line, ';');
84
+ previous_generated_line = generated_line;
85
+ }
86
+ }
87
+ else if (i > 0) {
88
+ result += ",";
89
+ }
90
+
91
+ // generated column
92
+ result += base64vlq.encode(static_cast<int>(generated_column) - static_cast<int>(previous_generated_column));
93
+ previous_generated_column = generated_column;
94
+ // file
95
+ result += base64vlq.encode(static_cast<int>(original_file) - static_cast<int>(previous_original_file));
96
+ previous_original_file = original_file;
97
+ // source line
98
+ result += base64vlq.encode(static_cast<int>(original_line) - static_cast<int>(previous_original_line));
99
+ previous_original_line = original_line;
100
+ // source column
101
+ result += base64vlq.encode(static_cast<int>(original_column) - static_cast<int>(previous_original_column));
102
+ previous_original_column = original_column;
103
+ }
104
+
105
+ return result;
106
+ }
107
+
108
+ void SourceMap::remove_line()
109
+ {
110
+ // prevent removing non existing lines
111
+ if (current_position.line > 1) {
112
+ current_position.line -= 1;
113
+ current_position.column = 1;
114
+ }
115
+ }
116
+
117
+ void SourceMap::update_column(const string& str)
118
+ {
119
+ const ptrdiff_t new_line_count = std::count(str.begin(), str.end(), '\n');
120
+ current_position.line += new_line_count;
121
+ if (new_line_count > 0) {
122
+ current_position.column = str.size() - str.find_last_of('\n');
123
+ } else {
124
+ current_position.column += str.size();
125
+ }
126
+ }
127
+
128
+ void SourceMap::add_mapping(AST_Node* node)
129
+ {
130
+ mappings.push_back(Mapping(node->position(), current_position));
131
+ }
132
+
133
+ }
@@ -0,0 +1,46 @@
1
+ #define SASS_SOURCE_MAP
2
+
3
+ #include <vector>
4
+
5
+ #ifndef SASS_MAPPING
6
+ #include "mapping.hpp"
7
+ #endif
8
+
9
+ #ifndef SASS_AST
10
+ #include "ast.hpp"
11
+ #endif
12
+
13
+ #ifndef SASSS_BASE64VLQ
14
+ #include "base64vlq.hpp"
15
+ #endif
16
+
17
+
18
+
19
+ namespace Sass {
20
+ using std::vector;
21
+
22
+ struct Context;
23
+
24
+ class SourceMap {
25
+
26
+ public:
27
+ vector<size_t> source_index;
28
+ SourceMap(const string& file);
29
+
30
+ void remove_line();
31
+ void update_column(const string& str);
32
+ void add_mapping(AST_Node* node);
33
+
34
+ string generate_source_map(Context &ctx);
35
+
36
+ private:
37
+
38
+ string serialize_mappings();
39
+
40
+ vector<Mapping> mappings;
41
+ Position current_position;
42
+ string file;
43
+ Base64VLQ base64vlq;
44
+ };
45
+
46
+ }
@@ -0,0 +1,145 @@
1
+ #define SASS_SUBSET_MAP
2
+
3
+ #include <vector>
4
+ #include <map>
5
+ #include <set>
6
+ #include <algorithm>
7
+ #include <iterator>
8
+ #include <iostream>
9
+ #include <sstream>
10
+
11
+ // using namespace std;
12
+
13
+ // template<typename T>
14
+ // string vector_to_string(vector<T> v)
15
+ // {
16
+ // stringstream buffer;
17
+ // buffer << "[";
18
+
19
+ // if (!v.empty())
20
+ // { buffer << v[0]; }
21
+ // else
22
+ // { buffer << "]"; }
23
+
24
+ // if (v.size() == 1)
25
+ // { buffer << "]"; }
26
+ // else
27
+ // {
28
+ // for (size_t i = 1, S = v.size(); i < S; ++i) buffer << ", " << v[i];
29
+ // buffer << "]";
30
+ // }
31
+
32
+ // return buffer.str();
33
+ // }
34
+
35
+ // template<typename T>
36
+ // string set_to_string(set<T> v)
37
+ // {
38
+ // stringstream buffer;
39
+ // buffer << "[";
40
+ // typename set<T>::iterator i = v.begin();
41
+ // if (!v.empty())
42
+ // { buffer << *i; }
43
+ // else
44
+ // { buffer << "]"; }
45
+
46
+ // if (v.size() == 1)
47
+ // { buffer << "]"; }
48
+ // else
49
+ // {
50
+ // for (++i; i != v.end(); ++i) buffer << ", " << *i;
51
+ // buffer << "]";
52
+ // }
53
+
54
+ // return buffer.str();
55
+ // }
56
+
57
+ namespace Sass {
58
+ using namespace std;
59
+
60
+ template<typename F, typename S, typename T>
61
+ struct triple {
62
+ F first;
63
+ S second;
64
+ T third;
65
+
66
+ triple(const F& f, const S& s, const T& t) : first(f), second(s), third(t) { }
67
+ };
68
+
69
+ template<typename F, typename S, typename T>
70
+ triple<F, S, T> make_triple(const F& f, const S& s, const T& t)
71
+ { return triple<F, S, T>(f, s, t); }
72
+
73
+ template<typename K, typename V>
74
+ class Subset_Map {
75
+ private:
76
+ vector<V> values_;
77
+ map<K, vector<triple<vector<K>, set<K>, size_t> > > hash_;
78
+ public:
79
+ void put(const vector<K>& s, const V& value);
80
+ vector<pair<V, vector<K> > > get_kv(const vector<K>& s);
81
+ vector<V> get_v(const vector<K>& s);
82
+ bool empty() { return values_.empty(); }
83
+ void clear() { values_.clear(); hash_.clear(); }
84
+ };
85
+
86
+ template<typename K, typename V>
87
+ void Subset_Map<K, V>::put(const vector<K>& s, const V& value)
88
+ {
89
+ if (s.empty()) throw "internal error: subset map keys may not be empty";
90
+ size_t index = values_.size();
91
+ values_.push_back(value);
92
+ set<K> ss;
93
+ for (size_t i = 0, S = s.size(); i < S; ++i)
94
+ { ss.insert(s[i]); }
95
+ for (size_t i = 0, S = s.size(); i < S; ++i)
96
+ {
97
+ hash_[s[i]];
98
+ hash_[s[i]].push_back(make_triple(s, ss, index));
99
+ }
100
+ }
101
+
102
+ template<typename K, typename V>
103
+ vector<pair<V, vector<K> > > Subset_Map<K, V>::get_kv(const vector<K>& s)
104
+ {
105
+ vector<K> sorted = s;
106
+ sort(sorted.begin(), sorted.end());
107
+ vector<pair<size_t, vector<K> > > indices;
108
+ for (size_t i = 0, S = s.size(); i < S; ++i) {
109
+ // cerr << "looking for " << s[i] << endl;
110
+ if (!hash_.count(s[i])) {
111
+ // cerr << "didn't find " << s[i] << endl;
112
+ continue;
113
+ }
114
+ vector<triple<vector<K>, set<K>, size_t> > subsets = hash_[s[i]];
115
+ // cerr << "length of subsets: " << subsets.size() << endl;
116
+ for (size_t j = 0, T = subsets.size(); j < T; ++j) {
117
+ if (!includes(sorted.begin(), sorted.end(), subsets[j].second.begin(), subsets[j].second.end())) {
118
+ // cout << vector_to_string(s) << " doesn't include " << set_to_string(subsets[j].second) << endl;
119
+ continue;
120
+ }
121
+ indices.push_back(make_pair(subsets[j].third, subsets[j].first));
122
+ // cerr << "pushed " << subsets[j].third << " and " << vector_to_string(subsets[j].first) << " onto indices" << endl;
123
+ }
124
+ }
125
+ sort(indices.begin(), indices.end());
126
+ typename vector<pair<size_t, vector<K> > >::iterator indices_end = unique(indices.begin(), indices.end());
127
+ indices.resize(distance(indices.begin(), indices_end));
128
+
129
+ vector<pair<V, vector<K> > > results;
130
+ for (size_t i = 0, S = indices.size(); i < S; ++i) {
131
+ results.push_back(make_pair(values_[indices[i].first], indices[i].second));
132
+ }
133
+ return results;
134
+ }
135
+
136
+ template<typename K, typename V>
137
+ vector<V> Subset_Map<K, V>::get_v(const vector<K>& s)
138
+ {
139
+ vector<pair<V, vector<K> > > kvs = get_kv(s);
140
+ vector<V> results;
141
+ for (size_t i = 0, S = kvs.size(); i < S; ++i) results.push_back(kvs[i].first);
142
+ return results;
143
+ }
144
+
145
+ }
@@ -0,0 +1,11 @@
1
+ prefix=@prefix@
2
+ exec_prefix=@exec_prefix@
3
+ libdir=@libdir@
4
+ includedir=@includedir@
5
+
6
+ Name: libsass
7
+ URL: https://github.com/sass/libsass
8
+ Description: A C implementation of a Sass compiler
9
+ Version: @VERSION@
10
+ Libs: -L${libdir} -lsass
11
+ Cflags: -I${includedir}
@@ -0,0 +1,127 @@
1
+ #! /bin/sh
2
+ # test-driver - basic testsuite driver script.
3
+
4
+ scriptversion=2012-06-27.10; # UTC
5
+
6
+ # Copyright (C) 2011-2013 Free Software Foundation, Inc.
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2, or (at your option)
11
+ # any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+
21
+ # As a special exception to the GNU General Public License, if you
22
+ # distribute this file as part of a program that contains a
23
+ # configuration script generated by Autoconf, you may include it under
24
+ # the same distribution terms that you use for the rest of that program.
25
+
26
+ # This file is maintained in Automake, please report
27
+ # bugs to <bug-automake@gnu.org> or send patches to
28
+ # <automake-patches@gnu.org>.
29
+
30
+ # Make unconditional expansion of undefined variables an error. This
31
+ # helps a lot in preventing typo-related bugs.
32
+ set -u
33
+
34
+ usage_error ()
35
+ {
36
+ echo "$0: $*" >&2
37
+ print_usage >&2
38
+ exit 2
39
+ }
40
+
41
+ print_usage ()
42
+ {
43
+ cat <<END
44
+ Usage:
45
+ test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
46
+ [--expect-failure={yes|no}] [--color-tests={yes|no}]
47
+ [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
48
+ The '--test-name', '--log-file' and '--trs-file' options are mandatory.
49
+ END
50
+ }
51
+
52
+ # TODO: better error handling in option parsing (in particular, ensure
53
+ # TODO: $log_file, $trs_file and $test_name are defined).
54
+ test_name= # Used for reporting.
55
+ log_file= # Where to save the output of the test script.
56
+ trs_file= # Where to save the metadata of the test run.
57
+ expect_failure=no
58
+ color_tests=no
59
+ enable_hard_errors=yes
60
+ while test $# -gt 0; do
61
+ case $1 in
62
+ --help) print_usage; exit $?;;
63
+ --version) echo "test-driver $scriptversion"; exit $?;;
64
+ --test-name) test_name=$2; shift;;
65
+ --log-file) log_file=$2; shift;;
66
+ --trs-file) trs_file=$2; shift;;
67
+ --color-tests) color_tests=$2; shift;;
68
+ --expect-failure) expect_failure=$2; shift;;
69
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
70
+ --) shift; break;;
71
+ -*) usage_error "invalid option: '$1'";;
72
+ esac
73
+ shift
74
+ done
75
+
76
+ if test $color_tests = yes; then
77
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
78
+ red='' # Red.
79
+ grn='' # Green.
80
+ lgn='' # Light green.
81
+ blu='' # Blue.
82
+ mgn='' # Magenta.
83
+ std='' # No color.
84
+ else
85
+ red= grn= lgn= blu= mgn= std=
86
+ fi
87
+
88
+ do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
89
+ trap "st=129; $do_exit" 1
90
+ trap "st=130; $do_exit" 2
91
+ trap "st=141; $do_exit" 13
92
+ trap "st=143; $do_exit" 15
93
+
94
+ # Test script is run here.
95
+ "$@" >$log_file 2>&1
96
+ estatus=$?
97
+ if test $enable_hard_errors = no && test $estatus -eq 99; then
98
+ estatus=1
99
+ fi
100
+
101
+ case $estatus:$expect_failure in
102
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
103
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
104
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
105
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
106
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
107
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
108
+ esac
109
+
110
+ # Report outcome to console.
111
+ echo "${col}${res}${std}: $test_name"
112
+
113
+ # Register the test result, and other relevant metadata.
114
+ echo ":test-result: $res" > $trs_file
115
+ echo ":global-test-result: $res" >> $trs_file
116
+ echo ":recheck: $recheck" >> $trs_file
117
+ echo ":copy-in-global-log: $gcopy" >> $trs_file
118
+
119
+ # Local Variables:
120
+ # mode: shell-script
121
+ # sh-indentation: 2
122
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
123
+ # time-stamp-start: "scriptversion="
124
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
125
+ # time-stamp-time-zone: "UTC"
126
+ # time-stamp-end: "; # UTC"
127
+ # End: