Вот сейчас по Ъ-way
This commit is contained in:
parent
ba528486cb
commit
b175af9da4
|
@ -10,21 +10,8 @@
|
||||||
/* unnecessary includes */
|
/* unnecessary includes */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
enum tex_parse_err {
|
|
||||||
TEX_PARSING_NOERROR = 0,
|
|
||||||
TEX_PARSING_ERROR_UNDEF,
|
|
||||||
TEX_PARSING_ERROR_STACKOVERFLOW
|
|
||||||
};
|
|
||||||
|
|
||||||
char * const TEX_PARSING_ERROR_UNDEF_STR = "unknown parsing error";
|
|
||||||
char * const TEX_PARSING_ERROR_STACKOVERFLOW_STR = "parser stack overflow";
|
|
||||||
|
|
||||||
int parse_table(const char *table_source, size_t len, struct table_s *table, struct xerror_s *error)
|
int parse_table(const char *table_source, size_t len, struct table_s *table, struct xerror_s *error)
|
||||||
{
|
{
|
||||||
char *tag = NULL;/*,
|
|
||||||
*brpar = NULL;*/
|
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
if (!len)
|
if (!len)
|
||||||
len = strlen(table_source);
|
len = strlen(table_source);
|
||||||
|
|
||||||
|
@ -33,6 +20,8 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
IN_UNDEF = 0, // undefined place
|
IN_UNDEF = 0, // undefined place
|
||||||
IN_COMMENT, // any comment
|
IN_COMMENT, // any comment
|
||||||
IN_TAG, // any tag
|
IN_TAG, // any tag
|
||||||
|
IN_TAG_UNKNOWN, // unknown tag
|
||||||
|
IN_SPACE, // space, \tag { for example
|
||||||
IN_TAGPARM, // in \tag{} curly braces
|
IN_TAGPARM, // in \tag{} curly braces
|
||||||
IN_TAG_BEGIN,
|
IN_TAG_BEGIN,
|
||||||
IN_TAG_CLINE,
|
IN_TAG_CLINE,
|
||||||
|
@ -50,14 +39,16 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
|
|
||||||
} where_stack[MAX_TEX_STACK_LEVEL] = {IN_UNDEF};
|
} where_stack[MAX_TEX_STACK_LEVEL] = {IN_UNDEF};
|
||||||
|
|
||||||
|
char *tag = NULL;
|
||||||
|
size_t i = 0;
|
||||||
size_t tex_level = 0;
|
size_t tex_level = 0;
|
||||||
|
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
|
|
||||||
/* stack checking */
|
/* stack checking */
|
||||||
if (tex_level + 1 == MAX_TEX_STACK_LEVEL) {
|
if (tex_level + 1 == MAX_TEX_STACK_LEVEL) {
|
||||||
error->code = TEX_PARSING_ERROR_STACKOVERFLOW;
|
error->code = (int)i;
|
||||||
error->message = TEX_PARSING_ERROR_STACKOVERFLOW_STR;
|
error->message = "stack overflow";
|
||||||
return error->code;
|
return error->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,8 +66,8 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
where_stack[++tex_level] = IN_COMMENT;
|
where_stack[++tex_level] = IN_COMMENT;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
error->code = TEX_PARSING_ERROR_UNDEF;
|
error->code = (int)i;
|
||||||
error->message = TEX_PARSING_ERROR_UNDEF_STR;
|
error->message = "unexpected symbol (IN_UDEF)";
|
||||||
return error->code;
|
return error->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,12 +83,12 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
if (isalnum(c)) {
|
if (isalnum(c)) {
|
||||||
tag = zalloc_append8_str(tag, c);
|
tag = zalloc_append8_str(tag, c);
|
||||||
|
|
||||||
} else if (!tag && c == '\\')) { // newline tag
|
} else if (!tag && c == '\\') { // newline tag
|
||||||
where_stack[tex_level--] = IN_UNDEF;
|
where_stack[tex_level--] = IN_UNDEF;
|
||||||
|
|
||||||
} else if (!tag) {
|
} else if (!tag) {
|
||||||
error->code = TEX_PARSING_ERROR_UNDEF;
|
error->code = (int)i;
|
||||||
error->message = TEX_PARSING_ERROR_UNDEF_STR;
|
error->message = "empty tag (IN_TAG)";
|
||||||
return error->code;
|
return error->code;
|
||||||
|
|
||||||
} else if (!strcmp(tag, TEX_TAG_BEGIN)) {
|
} else if (!strcmp(tag, TEX_TAG_BEGIN)) {
|
||||||
|
@ -155,32 +146,37 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
printf("\\%s\n", tag);
|
printf("\\%s\n", tag);
|
||||||
tag = zfree_null(tag);
|
tag = zfree_null(tag);
|
||||||
|
|
||||||
|
} else if (c == '%') {
|
||||||
|
printf("\\%s\n", tag);
|
||||||
|
tag = zfree_null(tag);
|
||||||
|
where_stack[tex_level] = IN_TAG_UNKNOWN;
|
||||||
|
where_stack[++tex_level] = IN_COMMENT;
|
||||||
|
|
||||||
|
} else if (c == '{' || c == '[') {
|
||||||
|
printf("\\%s\n", tag);
|
||||||
|
tag = zfree_null(tag);
|
||||||
|
where_stack[tex_level] = IN_TAG_UNKNOWN;
|
||||||
|
where_stack[++tex_level] = IN_TAGPARM;
|
||||||
|
|
||||||
|
} else if (isspace(c)) { // \tag { for example
|
||||||
|
printf("\\%s\n", tag);
|
||||||
|
tag = zfree_null(tag);
|
||||||
|
where_stack[tex_level] = IN_TAG_UNKNOWN;
|
||||||
|
where_stack[++tex_level] = IN_SPACE;
|
||||||
|
|
||||||
} else { // unknown tag
|
} else { // unknown tag
|
||||||
printf("\\%s\n", tag);
|
printf("\\%s\n", tag);
|
||||||
tag = zfree_null(tag);
|
tag = zfree_null(tag);
|
||||||
|
where_stack[tex_level] = IN_TAG_UNKNOWN;
|
||||||
} else if (c == '{' || c == '[') {
|
|
||||||
where_stack[++tex_level] = IN_TAGPARM;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else if (isspace(c)) {
|
|
||||||
|
|
||||||
} else if (c == '{' || c == '[') {
|
|
||||||
where_stack[++tex_level] = IN_TAGPARM;
|
|
||||||
|
|
||||||
} else if (c == '%') {
|
|
||||||
where_stack[++tex_level] = IN_COMMENT;
|
|
||||||
|
|
||||||
} else if (!tag) {
|
|
||||||
error->code = TEX_PARSING_ERROR_UNDEF;
|
|
||||||
error->message = TEX_PARSING_ERROR_UNDEF_STR;
|
|
||||||
return error->code;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IN_SPACE:
|
||||||
|
if (isspace(c)) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
where_stack[tex_level--] = IN_UNDEF;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IN_TAGPARM:
|
case IN_TAGPARM:
|
||||||
|
@ -194,18 +190,25 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
tag = zfree_null(tag);
|
tag = zfree_null(tag);
|
||||||
where_stack[++tex_level] = IN_TAG;
|
where_stack[++tex_level] = IN_TAG;
|
||||||
|
|
||||||
|
} else if (isspace(c)) {
|
||||||
|
where_stack[++tex_level] = IN_SPACE;
|
||||||
|
|
||||||
|
} else if (c == '%') {
|
||||||
|
where_stack[++tex_level] = IN_COMMENT;
|
||||||
|
|
||||||
} else if (isprint(c)) {
|
} else if (isprint(c)) {
|
||||||
//~ brpar = zalloc_append8_str(brpar, c); // ???????
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
error->code = TEX_PARSING_ERROR_UNDEF;
|
error->code = (int)i;
|
||||||
error->message = TEX_PARSING_ERROR_UNDEF_STR;
|
error->message = "unexpected symbol (IN_TAGPARM)";
|
||||||
return error->code;
|
return error->code;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IN_TAG_BEGIN:
|
case IN_TAG_UNKNOWN:
|
||||||
if (c == '{' || c == '[') { // tag params
|
if (isspace(c)) {
|
||||||
|
|
||||||
|
} else if (c == '{' || c == '[') { // tag params
|
||||||
where_stack[++tex_level] = IN_TAGPARM;
|
where_stack[++tex_level] = IN_TAGPARM;
|
||||||
|
|
||||||
} else if (c == '\\') { // new tag
|
} else if (c == '\\') { // new tag
|
||||||
|
@ -216,10 +219,34 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (isspace(c)) {
|
} else if (isspace(c)) {
|
||||||
|
where_stack[++tex_level] = IN_SPACE;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
error->code = TEX_PARSING_ERROR_UNDEF;
|
error->code = (int)i;
|
||||||
error->message = TEX_PARSING_ERROR_UNDEF_STR;
|
error->message = "unexpected symbol (IN_TAG_UNKNOWN)";
|
||||||
|
return error->code;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IN_TAG_BEGIN:
|
||||||
|
if (isspace(c)) {
|
||||||
|
|
||||||
|
} else if (c == '{' || c == '[') { // tag params
|
||||||
|
where_stack[++tex_level] = IN_TAGPARM;
|
||||||
|
|
||||||
|
} else if (c == '\\') { // new tag
|
||||||
|
tag = zfree_null(tag);
|
||||||
|
where_stack[tex_level] = IN_TAG;
|
||||||
|
|
||||||
|
if (FALSE) { // longtable
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (isspace(c)) {
|
||||||
|
where_stack[++tex_level] = IN_SPACE;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
error->code = (int)i;
|
||||||
|
error->message = "unexpected symbol (IN_TAG_BEGIN)";
|
||||||
return error->code;
|
return error->code;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -273,8 +300,8 @@ int parse_table(const char *table_source, size_t len, struct table_s *table, str
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error->code = TEX_PARSING_ERROR_UNDEF;
|
error->code = (int)i;
|
||||||
error->message = TEX_PARSING_ERROR_UNDEF_STR;
|
error->message = "unknown error";
|
||||||
return error->code;
|
return error->code;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ long_line_column=72
|
||||||
[files]
|
[files]
|
||||||
current_page=1
|
current_page=1
|
||||||
FILE_NAME_0=1029;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table_test.c;0
|
FILE_NAME_0=1029;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table_test.c;0
|
||||||
FILE_NAME_1=2132;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table.c;0
|
FILE_NAME_1=1575;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table.c;0
|
||||||
FILE_NAME_2=119;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table.h;0
|
FILE_NAME_2=119;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table.h;0
|
||||||
FILE_NAME_3=1762;C;0;16;1;1;1;/home/kolan/projects/include/zalloc_ext.h;0
|
FILE_NAME_3=1762;C;0;16;1;1;1;/home/kolan/projects/include/zalloc_ext.h;0
|
||||||
FILE_NAME_4=634;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table_tags.h;0
|
FILE_NAME_4=634;C;0;16;1;1;1;/home/kolan/dev/c/tex_parser/tex_table_tags.h;0
|
||||||
|
|
|
@ -53,6 +53,8 @@ struct table_s {
|
||||||
struct row_s *rows;
|
struct row_s *rows;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* LaTeX table parser
|
||||||
|
*/
|
||||||
int parse_table(const char *table_source, size_t len, struct table_s *table, struct xerror_s *error);
|
int parse_table(const char *table_source, size_t len, struct table_s *table, struct xerror_s *error);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,10 +31,11 @@ int main(int argc, char *argv[])
|
||||||
struct xerror_s error;
|
struct xerror_s error;
|
||||||
struct table_s table;
|
struct table_s table;
|
||||||
memset(&table, 0, sizeof(struct table_s));
|
memset(&table, 0, sizeof(struct table_s));
|
||||||
|
memset(&error, 0, sizeof(struct xerror_s));
|
||||||
/* Коммент по-русски */
|
/* Коммент по-русски */
|
||||||
int result = parse_table(tex_buf, (size_t)stat_buf.st_size, &table, &error);
|
int result = parse_table(tex_buf, (size_t)stat_buf.st_size, &table, &error);
|
||||||
if (result) {
|
if (result) {
|
||||||
printf("Parsing error: %s\n", error.message);
|
printf("Parsing error at %d, symb=%c: %s\n", error.code + 1, tex_buf[error.code], error.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
tex_buf = xfree_null(tex_buf);
|
tex_buf = xfree_null(tex_buf);
|
||||||
|
|
Loading…
Reference in New Issue