Commit 55c20f98 by Andrew Nesbitt

Updated libsass

parent 39bb89f9
...@@ -11,7 +11,7 @@ CPP_FILES = \ ...@@ -11,7 +11,7 @@ CPP_FILES = \
prelexer.cpp prelexer.cpp
libsass: libsass_objs libsass: libsass_objs
ar rs libsass.a \ ar rvs libsass.a \
sass_interface.o \ sass_interface.o \
context.o \ context.o \
functions.o \ functions.o \
...@@ -24,7 +24,7 @@ libsass: libsass_objs ...@@ -24,7 +24,7 @@ libsass: libsass_objs
prelexer.o prelexer.o
libsass_objs: sass_interface.cpp $(CPP_FILES) libsass_objs: sass_interface.cpp $(CPP_FILES)
g++ -O2 -c -combine sass_interface.cpp $(CPP_FILES) g++ -O2 -Wall -c -combine sass_interface.cpp $(CPP_FILES)
clean: clean:
rm -rf *.o *.a rm -rf *.o *.a
\ No newline at end of file
...@@ -52,8 +52,7 @@ namespace Sass { ...@@ -52,8 +52,7 @@ namespace Sass {
Context::~Context() Context::~Context()
{ {
int i; for (size_t i = 0; i < source_refs.size(); ++i) {
for (i = 0; i < source_refs.size(); ++i) {
delete[] source_refs[i]; delete[] source_refs[i];
} }
// cerr << "Deallocated " << i << " source string(s)." << endl; // cerr << "Deallocated " << i << " source string(s)." << endl;
...@@ -117,4 +116,4 @@ namespace Sass { ...@@ -117,4 +116,4 @@ namespace Sass {
register_function(not_descriptor, not_impl); register_function(not_descriptor, not_impl);
} }
} }
\ No newline at end of file
...@@ -40,14 +40,14 @@ namespace Sass { ...@@ -40,14 +40,14 @@ namespace Sass {
}; };
struct Context { struct Context {
string sass_path;
string css_path;
vector<string> include_paths;
Environment global_env; Environment global_env;
map<pair<string, size_t>, Function> function_env; map<pair<string, size_t>, Function> function_env;
vector<char*> source_refs; // all the source c-strings vector<char*> source_refs; // all the source c-strings
vector<vector<Node>*> registry; // all the child vectors vector<vector<Node>*> registry; // all the child vectors
vector<string> include_paths;
size_t ref_count; size_t ref_count;
string sass_path;
string css_path;
void collect_include_paths(const char* paths_str); void collect_include_paths(const char* paths_str);
Context(const char* paths_str = 0); Context(const char* paths_str = 0);
......
...@@ -139,9 +139,11 @@ namespace Sass { ...@@ -139,9 +139,11 @@ namespace Sass {
case expanded: case expanded:
root.emit_expanded_css(output, ""); root.emit_expanded_css(output, "");
break; break;
default:
break;
} }
string retval(output.str()); string retval(output.str());
if (!retval.empty()) retval.resize(retval.size()-1); if (!retval.empty()) retval.resize(retval.size()-1);
return retval; return retval;
} }
} }
\ No newline at end of file
...@@ -85,6 +85,8 @@ namespace Sass { ...@@ -85,6 +85,8 @@ namespace Sass {
catch (string& path) { catch (string& path) {
read_error("error reading file \"" + path + "\""); read_error("error reading file \"" + path + "\"");
} }
// unreached statement
return Node(Node::none);
} }
Node Document::parse_mixin_definition() Node Document::parse_mixin_definition()
...@@ -370,10 +372,9 @@ namespace Sass { ...@@ -370,10 +372,9 @@ namespace Sass {
else if (peek< exactly<'['> >(position)) { else if (peek< exactly<'['> >(position)) {
return parse_attribute_selector(); return parse_attribute_selector();
} }
else { syntax_error("invalid selector after " + lexed.to_string());
syntax_error("invalid selector after " + lexed.to_string()); // unreached statement
} return Node(Node::none);}
}
Node Document::parse_pseudo() { Node Document::parse_pseudo() {
if (lex< pseudo_not >()) { if (lex< pseudo_not >()) {
...@@ -420,9 +421,9 @@ namespace Sass { ...@@ -420,9 +421,9 @@ namespace Sass {
else if (lex < sequence< pseudo_prefix, identifier > >()) { else if (lex < sequence< pseudo_prefix, identifier > >()) {
return Node(Node::pseudo, line_number, lexed); return Node(Node::pseudo, line_number, lexed);
} }
else { syntax_error("unrecognized pseudo-class or pseudo-element");
syntax_error("unrecognized pseudo-class or pseudo-element"); // unreached statement
} return Node(Node::none);
} }
Node Document::parse_attribute_selector() Node Document::parse_attribute_selector()
...@@ -477,7 +478,7 @@ namespace Sass { ...@@ -477,7 +478,7 @@ namespace Sass {
block.has_statements = true; block.has_statements = true;
} }
else { else {
for (int i = 0; i < imported_tree.size(); ++i) { for (size_t i = 0; i < imported_tree.size(); ++i) {
if (imported_tree[i].type == Node::comment || if (imported_tree[i].type == Node::comment ||
imported_tree[i].type == Node::rule) { imported_tree[i].type == Node::rule) {
block[0].has_statements = true; block[0].has_statements = true;
...@@ -503,16 +504,7 @@ namespace Sass { ...@@ -503,16 +504,7 @@ namespace Sass {
block << parse_propset(); block << parse_propset();
block[0].has_statements = true; block[0].has_statements = true;
} }
// else if (look_for_rule(position)) { else if (lookahead_for_selector(position)) {
// block << parse_rule();
// block.has_statements = true;
// semicolon = true;
// }
// else if (!peek< exactly<';'> >()) {
// block << parse_ruleset();
// block.has_blocks = true;
// }
else if (const char* p = lookahead_for_selector(position)) {
block << parse_ruleset(definition); block << parse_ruleset(definition);
block[0].has_blocks = true; block[0].has_blocks = true;
} }
...@@ -834,6 +826,8 @@ namespace Sass { ...@@ -834,6 +826,8 @@ namespace Sass {
} }
syntax_error("error reading values after " + lexed.to_string()); syntax_error("error reading values after " + lexed.to_string());
// unreached statement
return Node(Node::none);
} }
extern const char hash_lbrace[] = "#{"; extern const char hash_lbrace[] = "#{";
...@@ -852,7 +846,8 @@ namespace Sass { ...@@ -852,7 +846,8 @@ namespace Sass {
Node schema(Node::string_schema, context.registry, line_number, 1); Node schema(Node::string_schema, context.registry, line_number, 1);
while (i < str.end) { while (i < str.end) {
if (p = find_first_in_interval< sequence< negate< exactly<'\\'> >, exactly<hash_lbrace> > >(i, str.end)) { p = find_first_in_interval< sequence< negate< exactly<'\\'> >, exactly<hash_lbrace> > >(i, str.end);
if (p) {
if (i < p) schema << Node(Node::identifier, line_number, Token::make(i, p)); // accumulate the preceding segment if it's nonempty if (i < p) schema << Node(Node::identifier, line_number, Token::make(i, p)); // accumulate the preceding segment if it's nonempty
const char* j = find_first_in_interval< exactly<rbrace> >(p, str.end); // find the closing brace const char* j = find_first_in_interval< exactly<rbrace> >(p, str.end); // find the closing brace
if (j) { if (j) {
...@@ -1122,4 +1117,4 @@ namespace Sass { ...@@ -1122,4 +1117,4 @@ namespace Sass {
// //
// return p; // return p;
// } // }
// } // }
\ No newline at end of file
...@@ -45,7 +45,7 @@ namespace Sass { ...@@ -45,7 +45,7 @@ namespace Sass {
} break; } break;
case Node::root: { case Node::root: {
for (int i = 0; i < expr.size(); ++i) { for (size_t i = 0; i < expr.size(); ++i) {
eval(expr[i], env, f_env, registry); eval(expr[i], env, f_env, registry);
} }
return expr; return expr;
...@@ -54,7 +54,7 @@ namespace Sass { ...@@ -54,7 +54,7 @@ namespace Sass {
case Node::block: { case Node::block: {
Environment current; Environment current;
current.link(env); current.link(env);
for (int i = 0; i < expr.size(); ++i) { for (size_t i = 0; i < expr.size(); ++i) {
eval(expr[i], current, f_env, registry); eval(expr[i], current, f_env, registry);
} }
return expr; return expr;
...@@ -63,7 +63,7 @@ namespace Sass { ...@@ -63,7 +63,7 @@ namespace Sass {
case Node::assignment: { case Node::assignment: {
Node val(expr[1]); Node val(expr[1]);
if (val.type == Node::comma_list || val.type == Node::space_list) { if (val.type == Node::comma_list || val.type == Node::space_list) {
for (int i = 0; i < val.size(); ++i) { for (size_t i = 0; i < val.size(); ++i) {
if (val[i].eval_me) val[i] = eval(val[i], env, f_env, registry); if (val[i].eval_me) val[i] = eval(val[i], env, f_env, registry);
} }
} }
...@@ -83,7 +83,7 @@ namespace Sass { ...@@ -83,7 +83,7 @@ namespace Sass {
case Node::rule: { case Node::rule: {
Node rhs(expr[1]); Node rhs(expr[1]);
if (rhs.type == Node::comma_list || rhs.type == Node::space_list) { if (rhs.type == Node::comma_list || rhs.type == Node::space_list) {
for (int i = 0; i < rhs.size(); ++i) { for (size_t i = 0; i < rhs.size(); ++i) {
if (rhs[i].eval_me) rhs[i] = eval(rhs[i], env, f_env, registry); if (rhs[i].eval_me) rhs[i] = eval(rhs[i], env, f_env, registry);
} }
} }
...@@ -104,7 +104,7 @@ namespace Sass { ...@@ -104,7 +104,7 @@ namespace Sass {
case Node::disjunction: { case Node::disjunction: {
Node result; Node result;
for (int i = 0; i < expr.size(); ++i) { for (size_t i = 0; i < expr.size(); ++i) {
// if (expr[i].type == Node::relation || // if (expr[i].type == Node::relation ||
// expr[i].type == Node::function_call && expr[0].content.token.to_string() == "not") { // expr[i].type == Node::function_call && expr[0].content.token.to_string() == "not") {
result = eval(expr[i], env, f_env, registry); result = eval(expr[i], env, f_env, registry);
...@@ -116,7 +116,7 @@ namespace Sass { ...@@ -116,7 +116,7 @@ namespace Sass {
case Node::conjunction: { case Node::conjunction: {
Node result; Node result;
for (int i = 0; i < expr.size(); ++i) { for (size_t i = 0; i < expr.size(); ++i) {
result = eval(expr[i], env, f_env, registry); result = eval(expr[i], env, f_env, registry);
if (result.type == Node::boolean && result.content.boolean_value == false) return result; if (result.type == Node::boolean && result.content.boolean_value == false) return result;
} }
...@@ -142,6 +142,9 @@ namespace Sass { ...@@ -142,6 +142,9 @@ namespace Sass {
case Node::gte: return (lhs >= rhs) ? T : F; case Node::gte: return (lhs >= rhs) ? T : F;
case Node::lt: return (lhs < rhs) ? T : F; case Node::lt: return (lhs < rhs) ? T : F;
case Node::lte: return (lhs <= rhs) ? T : F; case Node::lte: return (lhs <= rhs) ? T : F;
default:
eval_error("unknown comparison operator " + expr.content.token.to_string(), expr.line_number, expr.file_name);
return Node(Node::none);
} }
} break; } break;
...@@ -150,7 +153,7 @@ namespace Sass { ...@@ -150,7 +153,7 @@ namespace Sass {
acc << eval(expr[0], env, f_env, registry); acc << eval(expr[0], env, f_env, registry);
Node rhs(eval(expr[2], env, f_env, registry)); Node rhs(eval(expr[2], env, f_env, registry));
accumulate(expr[1].type, acc, rhs, registry); accumulate(expr[1].type, acc, rhs, registry);
for (int i = 3; i < expr.size(); i += 2) { for (size_t i = 3; i < expr.size(); i += 2) {
Node rhs(eval(expr[i+1], env, f_env, registry)); Node rhs(eval(expr[i+1], env, f_env, registry));
accumulate(expr[i].type, acc, rhs, registry); accumulate(expr[i].type, acc, rhs, registry);
} }
...@@ -163,7 +166,7 @@ namespace Sass { ...@@ -163,7 +166,7 @@ namespace Sass {
acc << eval(expr[0], env, f_env, registry); acc << eval(expr[0], env, f_env, registry);
Node rhs(eval(expr[2], env, f_env, registry)); Node rhs(eval(expr[2], env, f_env, registry));
accumulate(expr[1].type, acc, rhs, registry); accumulate(expr[1].type, acc, rhs, registry);
for (int i = 3; i < expr.size(); i += 2) { for (size_t i = 3; i < expr.size(); i += 2) {
Node rhs(eval(expr[i+1], env, f_env, registry)); Node rhs(eval(expr[i+1], env, f_env, registry));
accumulate(expr[i].type, acc, rhs, registry); accumulate(expr[i].type, acc, rhs, registry);
} }
...@@ -248,7 +251,7 @@ namespace Sass { ...@@ -248,7 +251,7 @@ namespace Sass {
case Node::string_schema: case Node::string_schema:
case Node::value_schema: { case Node::value_schema: {
// cerr << "evaluating schema of size " << expr.size() << endl; // cerr << "evaluating schema of size " << expr.size() << endl;
for (int i = 0; i < expr.size(); ++i) { for (size_t i = 0; i < expr.size(); ++i) {
expr[i] = eval(expr[i], env, f_env, registry); expr[i] = eval(expr[i], env, f_env, registry);
} }
return expr; return expr;
...@@ -258,6 +261,8 @@ namespace Sass { ...@@ -258,6 +261,8 @@ namespace Sass {
return expr; return expr;
} }
} }
return expr;
} }
Node accumulate(Node::Type op, Node& acc, Node& rhs, vector<vector<Node>*>& registry) Node accumulate(Node::Type op, Node& acc, Node& rhs, vector<vector<Node>*>& registry)
...@@ -367,13 +372,13 @@ namespace Sass { ...@@ -367,13 +372,13 @@ namespace Sass {
Node body(mixin[2].clone(registry)); Node body(mixin[2].clone(registry));
Environment bindings; Environment bindings;
// bind arguments // bind arguments
for (int i = 0, j = 0; i < args.size(); ++i) { for (size_t i = 0, j = 0; i < args.size(); ++i) {
if (args[i].type == Node::assignment) { if (args[i].type == Node::assignment) {
Node arg(args[i]); Node arg(args[i]);
Token name(arg[0].content.token); Token name(arg[0].content.token);
// check that the keyword arg actually names a formal parameter // check that the keyword arg actually names a formal parameter
bool valid_param = false; bool valid_param = false;
for (int k = 0; k < params.size(); ++k) { for (size_t k = 0; k < params.size(); ++k) {
Node param_k = params[k]; Node param_k = params[k];
if (param_k.type == Node::assignment) param_k = param_k[0]; if (param_k.type == Node::assignment) param_k = param_k[0];
if (arg[0] == param_k) { if (arg[0] == param_k) {
...@@ -400,7 +405,7 @@ namespace Sass { ...@@ -400,7 +405,7 @@ namespace Sass {
} }
} }
// plug the holes with default arguments if any // plug the holes with default arguments if any
for (int i = 0; i < params.size(); ++i) { for (size_t i = 0; i < params.size(); ++i) {
if (params[i].type == Node::assignment) { if (params[i].type == Node::assignment) {
Node param(params[i]); Node param(params[i]);
Token name(param[0].content.token); Token name(param[0].content.token);
...@@ -411,7 +416,7 @@ namespace Sass { ...@@ -411,7 +416,7 @@ namespace Sass {
} }
// lexically link the new environment and eval the mixin's body // lexically link the new environment and eval the mixin's body
bindings.link(env.global ? *env.global : env); bindings.link(env.global ? *env.global : env);
for (int i = 0; i < body.size(); ++i) { for (size_t i = 0; i < body.size(); ++i) {
body[i] = eval(body[i], bindings, f_env, registry); body[i] = eval(body[i], bindings, f_env, registry);
} }
return body; return body;
...@@ -421,7 +426,7 @@ namespace Sass { ...@@ -421,7 +426,7 @@ namespace Sass {
{ {
map<Token, Node> bindings; map<Token, Node> bindings;
// bind arguments // bind arguments
for (int i = 0, j = 0; i < args.size(); ++i) { for (size_t i = 0, j = 0; i < args.size(); ++i) {
if (args[i].type == Node::assignment) { if (args[i].type == Node::assignment) {
Node arg(args[i]); Node arg(args[i]);
Token name(arg[0].content.token); Token name(arg[0].content.token);
...@@ -436,4 +441,4 @@ namespace Sass { ...@@ -436,4 +441,4 @@ namespace Sass {
return f(bindings, registry); return f(bindings, registry);
} }
} }
\ No newline at end of file
...@@ -568,12 +568,11 @@ namespace Sass { ...@@ -568,12 +568,11 @@ namespace Sass {
else if (!n1.is_numeric() && !n2.is_numeric()) { else if (!n1.is_numeric() && !n2.is_numeric()) {
eval_error("arguments to comparable must be numeric", n1.line_number, n1.file_name); eval_error("arguments to comparable must be numeric", n1.line_number, n1.file_name);
} }
else {
Node F(Node::boolean); Node F(Node::boolean);
F.line_number = n1.line_number; F.line_number = n1.line_number;
F.content.boolean_value = false; F.content.boolean_value = false;
return F; return F;
}
} }
// Boolean Functions /////////////////////////////////////////////////// // Boolean Functions ///////////////////////////////////////////////////
...@@ -597,4 +596,4 @@ namespace Sass { ...@@ -597,4 +596,4 @@ namespace Sass {
} }
} }
\ No newline at end of file
...@@ -30,7 +30,7 @@ namespace Sass { ...@@ -30,7 +30,7 @@ namespace Sass {
while (d[len+1]) ++len; while (d[len+1]) ++len;
parameters.reserve(len); parameters.reserve(len);
for (int i = 0; i < len; ++i) { for (size_t i = 0; i < len; ++i) {
const char* p = d[i+1]; const char* p = d[i+1];
Token name(Token::make(p, p + std::strlen(p))); Token name(Token::make(p, p + std::strlen(p)));
parameters.push_back(name); parameters.push_back(name);
......
...@@ -190,7 +190,7 @@ namespace Sass { ...@@ -190,7 +190,7 @@ namespace Sass {
Node& operator+=(const Node& n) Node& operator+=(const Node& n)
{ {
for (int i = 0; i < n.size(); ++i) { for (size_t i = 0; i < n.size(); ++i) {
content.children->push_back(n[i]); content.children->push_back(n[i]);
} }
return *this; return *this;
...@@ -278,4 +278,4 @@ namespace Sass { ...@@ -278,4 +278,4 @@ namespace Sass {
~Node() { ++destructed; } ~Node() { ++destructed; }
}; };
} }
\ No newline at end of file
...@@ -25,7 +25,7 @@ namespace Sass { ...@@ -25,7 +25,7 @@ namespace Sass {
case space_list: case space_list:
case expression: case expression:
case term: { case term: {
for (int i = 0; i < size(); ++i) { for (size_t i = 0; i < size(); ++i) {
if (at(i) == rhs[i]) continue; if (at(i) == rhs[i]) continue;
else return false; else return false;
} }
...@@ -101,4 +101,4 @@ namespace Sass { ...@@ -101,4 +101,4 @@ namespace Sass {
bool Node::operator>=(const Node& rhs) const bool Node::operator>=(const Node& rhs) const
{ return !(*this < rhs); } { return !(*this < rhs); }
} }
\ No newline at end of file
...@@ -388,8 +388,8 @@ namespace Sass { ...@@ -388,8 +388,8 @@ namespace Sass {
template<prelexer mx> template<prelexer mx>
const char* find_first_in_interval(const char* beg, const char* end) { const char* find_first_in_interval(const char* beg, const char* end) {
while ((beg < end) && *beg) { while ((beg < end) && *beg) {
const char* p; const char* p = mx(beg);
if (p = mx(beg)) return p; if (p) return p;
++beg; ++beg;
} }
return 0; return 0;
......
...@@ -13,26 +13,28 @@ extern "C" { ...@@ -13,26 +13,28 @@ extern "C" {
using namespace std; using namespace std;
sass_context* sass_new_context() sass_context* sass_new_context()
{ return (sass_context*) malloc(sizeof(sass_context)); } { return (sass_context*) calloc(1, sizeof(sass_context)); }
void sass_free_context(sass_context* ctx) void sass_free_context(sass_context* ctx)
{ {
free(ctx->output_string); if (ctx->output_string)
free(ctx->output_string);
free(ctx); free(ctx);
} }
sass_file_context* sass_new_file_context() sass_file_context* sass_new_file_context()
{ return (sass_file_context*) malloc(sizeof(sass_file_context)); } { return (sass_file_context*) calloc(1, sizeof(sass_file_context)); }
void sass_free_file_context(sass_file_context* ctx) void sass_free_file_context(sass_file_context* ctx)
{ {
free(ctx->output_string); if (ctx->output_string)
free(ctx->output_string);
free(ctx); free(ctx);
} }
sass_folder_context* sass_new_folder_context() sass_folder_context* sass_new_folder_context()
{ return (sass_folder_context*) malloc(sizeof(sass_folder_context)); } { return (sass_folder_context*) calloc(1, sizeof(sass_folder_context)); }
static char* process_document(Sass::Document& doc, int style) static char* process_document(Sass::Document& doc, int style)
{ {
using namespace Sass; using namespace Sass;
...@@ -47,8 +49,7 @@ extern "C" { ...@@ -47,8 +49,7 @@ extern "C" {
// cerr << "Destructions:\t" << Node::destructed << endl; // cerr << "Destructions:\t" << Node::destructed << endl;
// cerr << "Registry size:\t" << doc.context.registry.size() << endl; // cerr << "Registry size:\t" << doc.context.registry.size() << endl;
int i; for (size_t i = 0; i < doc.context.registry.size(); ++i) {
for (i = 0; i < doc.context.registry.size(); ++i) {
delete doc.context.registry[i]; delete doc.context.registry[i];
} }
// cerr << "Deallocations:\t" << i << endl; // cerr << "Deallocations:\t" << i << endl;
...@@ -133,4 +134,4 @@ extern "C" { ...@@ -133,4 +134,4 @@ extern "C" {
return 1; return 1;
} }
} }
\ No newline at end of file
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
extern "C" { extern "C" {
#endif #endif
#define SASS_STYLE_NESTED 0; #define SASS_STYLE_NESTED 0
#define SASS_STYLE_EXPANDED 1; #define SASS_STYLE_EXPANDED 1
#define SASS_STYLE_COMPACT 2; #define SASS_STYLE_COMPACT 2
#define SASS_STYLE_COMPRESSED 3; #define SASS_STYLE_COMPRESSED 3
struct sass_options { struct sass_options {
int output_style; int output_style;
...@@ -36,9 +36,9 @@ struct sass_folder_context { ...@@ -36,9 +36,9 @@ struct sass_folder_context {
char* error_message; char* error_message;
}; };
struct sass_context* sass_new_context (); struct sass_context* sass_new_context (void);
struct sass_file_context* sass_new_file_context (); struct sass_file_context* sass_new_file_context (void);
struct sass_folder_context* sass_new_folder_context (); struct sass_folder_context* sass_new_folder_context (void);
void sass_free_context (struct sass_context* ctx); void sass_free_context (struct sass_context* ctx);
void sass_free_file_context (struct sass_file_context* ctx); void sass_free_file_context (struct sass_file_context* ctx);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment