1
0
Fork 0
forked from len0rd/rockbox

Theme Editor: Added column number to parser error messages

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27477 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Robert Bieber 2010-07-18 00:59:02 +00:00
parent eb52a45a0c
commit 3c4fb8abe4
5 changed files with 37 additions and 15 deletions

View file

@ -30,15 +30,25 @@
/* Global variables for debug output */ /* Global variables for debug output */
int debug_indent_level = 0; int debug_indent_level = 0;
extern int skin_line; extern int skin_line;
extern char* skin_start;
/* Global error variables */ /* Global error variables */
int error_line; int error_line;
int error_col;
char* error_message; char* error_message;
/* Debugging functions */ /* Debugging functions */
void skin_error(enum skin_errorcode error) void skin_error(enum skin_errorcode error, char* cursor)
{ {
error_col = 0;
while(cursor > skin_start && *cursor != '\n')
{
cursor--;
error_col++;
}
error_line = skin_line; error_line = skin_line;
switch(error) switch(error)
@ -91,6 +101,11 @@ int skin_error_line()
return error_line; return error_line;
} }
int skin_error_col()
{
return error_col;
}
char* skin_error_message() char* skin_error_message()
{ {
return error_message; return error_message;
@ -99,6 +114,7 @@ char* skin_error_message()
void skin_clear_errors() void skin_clear_errors()
{ {
error_line = 0; error_line = 0;
error_col = 0;
error_message = NULL; error_message = NULL;
} }

View file

@ -31,8 +31,9 @@ extern "C"
#include "skin_parser.h" #include "skin_parser.h"
#ifndef ROCKBOX #ifndef ROCKBOX
/* Debugging functions */ /* Debugging functions */
void skin_error(enum skin_errorcode error); void skin_error(enum skin_errorcode error, char* cursor);
int skin_error_line(void); int skin_error_line(void);
int skin_error_col(void);
char* skin_error_message(void); char* skin_error_message(void);
void skin_clear_errors(void); void skin_clear_errors(void);
void skin_debug_tree(struct skin_element* root); void skin_debug_tree(struct skin_element* root);

View file

@ -34,6 +34,7 @@
/* Global variables for the parser */ /* Global variables for the parser */
int skin_line = 0; int skin_line = 0;
char* skin_start = 0;
int viewport_line = 0; int viewport_line = 0;
/* Auxiliary parsing functions (not visible at global scope) */ /* Auxiliary parsing functions (not visible at global scope) */
@ -66,6 +67,7 @@ struct skin_element* skin_parse(const char* document)
char* cursor = (char*)document; /*Keeps track of location in the document*/ char* cursor = (char*)document; /*Keeps track of location in the document*/
skin_line = 1; skin_line = 1;
skin_start = (char*)document;
viewport_line = 0; viewport_line = 0;
skin_clear_errors(); skin_clear_errors();
@ -381,7 +383,7 @@ static struct skin_element* skin_parse_sublines_optional(char** document,
if(*cursor != MULTILINESYM && i != sublines - 1) if(*cursor != MULTILINESYM && i != sublines - 1)
{ {
skin_error(MULTILINE_EXPECTED); skin_error(MULTILINE_EXPECTED, cursor);
return NULL; return NULL;
} }
else if(i != sublines - 1) else if(i != sublines - 1)
@ -433,7 +435,7 @@ static int skin_parse_tag(struct skin_element* element, char** document)
if(!tag) if(!tag)
{ {
skin_error(ILLEGAL_TAG); skin_error(ILLEGAL_TAG, cursor);
return 0; return 0;
} }
@ -464,7 +466,7 @@ static int skin_parse_tag(struct skin_element* element, char** document)
/* Checking the number of arguments and allocating args */ /* Checking the number of arguments and allocating args */
if(*cursor != ARGLISTOPENSYM && tag_args[0] != '|') if(*cursor != ARGLISTOPENSYM && tag_args[0] != '|')
{ {
skin_error(ARGLIST_EXPECTED); skin_error(ARGLIST_EXPECTED, cursor);
return 0; return 0;
} }
else else
@ -512,7 +514,7 @@ static int skin_parse_tag(struct skin_element* element, char** document)
/* Making sure we haven't run out of arguments */ /* Making sure we haven't run out of arguments */
if(*tag_args == '\0') if(*tag_args == '\0')
{ {
skin_error(TOO_MANY_ARGS); skin_error(TOO_MANY_ARGS, cursor);
return 0; return 0;
} }
@ -545,7 +547,7 @@ static int skin_parse_tag(struct skin_element* element, char** document)
} }
else else
{ {
skin_error(DEFAULT_NOT_ALLOWED); skin_error(DEFAULT_NOT_ALLOWED, cursor);
return 0; return 0;
} }
} }
@ -554,7 +556,7 @@ static int skin_parse_tag(struct skin_element* element, char** document)
/* Scanning an int argument */ /* Scanning an int argument */
if(!isdigit(*cursor) && *cursor != '-') if(!isdigit(*cursor) && *cursor != '-')
{ {
skin_error(INT_EXPECTED); skin_error(INT_EXPECTED, cursor);
return 0; return 0;
} }
@ -610,12 +612,12 @@ static int skin_parse_tag(struct skin_element* element, char** document)
if(*cursor != ARGLISTSEPERATESYM && i < num_args - 1) if(*cursor != ARGLISTSEPERATESYM && i < num_args - 1)
{ {
skin_error(SEPERATOR_EXPECTED); skin_error(SEPERATOR_EXPECTED, cursor);
return 0; return 0;
} }
else if(*cursor != ARGLISTCLOSESYM && i == num_args - 1) else if(*cursor != ARGLISTCLOSESYM && i == num_args - 1)
{ {
skin_error(CLOSE_EXPECTED); skin_error(CLOSE_EXPECTED, cursor);
return 0; return 0;
} }
else else
@ -639,7 +641,7 @@ static int skin_parse_tag(struct skin_element* element, char** document)
/* Checking for a premature end */ /* Checking for a premature end */
if(*tag_args != '\0' && !optional) if(*tag_args != '\0' && !optional)
{ {
skin_error(INSUFFICIENT_ARGS); skin_error(INSUFFICIENT_ARGS, cursor);
return 0; return 0;
} }
@ -724,7 +726,7 @@ static int skin_parse_conditional(struct skin_element* element, char** document)
/* Counting the children */ /* Counting the children */
if(*(cursor++) != ENUMLISTOPENSYM) if(*(cursor++) != ENUMLISTOPENSYM)
{ {
skin_error(ARGLIST_EXPECTED); skin_error(ARGLIST_EXPECTED, cursor);
return 0; return 0;
} }
bookmark = cursor; bookmark = cursor;
@ -768,12 +770,12 @@ static int skin_parse_conditional(struct skin_element* element, char** document)
if(i < children - 1 && *cursor != ENUMLISTSEPERATESYM) if(i < children - 1 && *cursor != ENUMLISTSEPERATESYM)
{ {
skin_error(SEPERATOR_EXPECTED); skin_error(SEPERATOR_EXPECTED, cursor);
return 0; return 0;
} }
else if(i == children - 1 && *cursor != ENUMLISTCLOSESYM) else if(i == children - 1 && *cursor != ENUMLISTCLOSESYM)
{ {
skin_error(CLOSE_EXPECTED); skin_error(CLOSE_EXPECTED, cursor);
return 0; return 0;
} }
else else

View file

@ -211,7 +211,9 @@ void SkinDocument::cursorChanged()
skin_parse(line.selectedText().toAscii()); skin_parse(line.selectedText().toAscii());
if(skin_error_line() > 0) if(skin_error_line() > 0)
parseStatus = tr("Error on line ") + parseStatus = tr("Error on line ") +
QString::number(line.blockNumber() + 1) + tr(": ") + QString::number(line.blockNumber() + 1)
+ tr(", column ") + QString::number(skin_error_col())
+ tr(": ") +
skin_error_message(); skin_error_message();
statusLabel->setText(parseStatus); statusLabel->setText(parseStatus);
} }

View file

@ -72,6 +72,7 @@ QString ParseTreeModel::changeTree(const char *document)
{ {
QString error = tr("Error on line ") + QString error = tr("Error on line ") +
QString::number(skin_error_line()) QString::number(skin_error_line())
+ tr(", column ") + QString::number(skin_error_col())
+ tr(": ") + QString(skin_error_message()); + tr(": ") + QString(skin_error_message());
return error; return error;
} }