dev/c/tex_parser/tex_table.c

103 lines
2.0 KiB
C
Raw Normal View History

#include "tex_table.h"
#include <string.h>
2011-06-10 19:03:50 +04:00
#include <ctype.h>
#include "tex_table_tags.h"
#include "zalloc_ext.h"
#include "zalloc.h"
2011-06-17 19:03:06 +04:00
#define MAX_TEX_STACK_LEVEL 128
2011-06-20 17:24:43 +04:00
char * const PARSING_ERROR = "Error parsing";
int parse_table(const char *table_source, size_t len, struct table_s *table, struct xerror_s *error)
{
2011-06-10 19:03:50 +04:00
char *tag = NULL;
size_t i = 0;
2011-06-20 17:24:43 +04:00
if (!len)
len = strlen(table_source);
2011-06-10 19:03:50 +04:00
enum where_e
{
2011-06-20 17:24:43 +04:00
IN_UNDEF = 0, // undefined place
IN_COMMENT, // any comment
IN_TAG, // any tag
IN_CRLBR, // parameter in curly bracket
IN_SQRBR, // parameter in square bracket
IN_FORMULA, // in $...$
IN_LONGTABLE, // in tag
} where_stack[MAX_TEX_STACK_LEVEL] = {IN_UNDEF};
size_t tex_level = 0;
for (i = 0; i < len; i++) {
char c = table_source[i];
2011-06-20 17:24:43 +04:00
switch (where_stack[tex_level]) {
case IN_UNDEF:
2011-06-10 19:03:50 +04:00
if (c == '\\') {
2011-06-20 17:24:43 +04:00
zfree(tag); tag = NULL;
where_stack[tex_level] = IN_TAG;
} else if (c == '%') {
where_stack[++tex_level] = IN_COMMENT;
} else {
error->code = -1;
error->message = PARSING_ERROR;
return -1;
}
break;
case IN_COMMENT:
if (c == '\r' || c == '\n') {
where_stack[tex_level--] = IN_UNDEF;
2011-06-10 19:03:50 +04:00
}
break;
case IN_TAG:
2011-06-20 17:24:43 +04:00
if (islower(c) || isdigit(c)) {
zalloc_append8_str(tag, c);
2011-06-10 19:03:50 +04:00
} else {
2011-06-20 17:24:43 +04:00
if (!strcmp(tag, TEX_TAG_BEGIN)) {
2011-06-10 19:03:50 +04:00
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_CLINE)) {
2011-06-10 19:03:50 +04:00
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_END)) {
2011-06-10 19:03:50 +04:00
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_ENDFOOT)) {
2011-06-10 19:03:50 +04:00
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_ENDHEAD)) {
2011-06-10 19:03:50 +04:00
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_HLINE)) {
2011-06-10 19:03:50 +04:00
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_HSPACE)) {
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_MULTICOLUMN)) {
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_MULTIROW)) {
} else if (!strcmp(tag, TEX_TAG_TABULARNEWLINE)) {
2011-06-20 17:24:43 +04:00
} else if (!strcmp(tag, TEX_TAG_SLASH)) {
2011-06-20 17:24:43 +04:00
}
}
break;
2011-06-20 17:24:43 +04:00
default:
error->code = -1;
error->message = PARSING_ERROR;
return -1;
break;
2011-06-10 19:03:50 +04:00
}
2011-06-20 17:24:43 +04:00
}
table->id = "Drossel1.Table1";
error->message = NULL;
return 0;
}