80 lines
1.2 KiB
C
80 lines
1.2 KiB
C
#include "tex_table.h"
|
|
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include "tex_table_tags.h"
|
|
#include "zmalloc.h"
|
|
|
|
int parse_table(const char *table_source, size_t len, struct table_s *table, struct xerror_s *error)
|
|
{
|
|
if (!len)
|
|
len = strlen(table_source);
|
|
|
|
char *tag = NULL;
|
|
size_t i = 0;
|
|
|
|
enum where_e
|
|
{
|
|
IN_GLOBAL,
|
|
IN_TAG,
|
|
IN_TAG_END,
|
|
IN_TAG_BEGIN_END,
|
|
IN_TAG_PARAM,
|
|
IN_TAG_BEGIN_PARAM
|
|
} where = IN_GLOBAL;
|
|
|
|
/* Ищем первое вхождение
|
|
* \begin{longtable}
|
|
*/
|
|
for (i = 0; i < len; i++) {
|
|
char c = table_source[i];
|
|
|
|
switch (where) {
|
|
case IN_GLOBAL:
|
|
if (c == '\\') {
|
|
zfree(&tag);
|
|
where = IN_TAG;
|
|
}
|
|
break;
|
|
|
|
case IN_TAG:
|
|
if (!isalpha(c)) {
|
|
size_t len = zmalloc_getlen(tag);
|
|
zrealloc(&tag, len + 1);
|
|
tag[len] = c;
|
|
} else {
|
|
if (!strcmp(tag, TEX_TAG_BEGIN))
|
|
where = IN_TAG_BEGIN_END;
|
|
else
|
|
where = IN_TAG_END;
|
|
}
|
|
|
|
break;
|
|
|
|
case IN_TAG_PARAM:
|
|
if ()
|
|
|
|
if (!isspace(c) || c == '{')
|
|
|
|
|
|
else if (isspace(c)) {
|
|
} else {
|
|
}
|
|
break;
|
|
|
|
case IN_TAG_BEGIN_PARAM:
|
|
if (isalpha(c)) {
|
|
} else if (isspace(c)) {
|
|
} else {
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
table->id = "Drossel1.Table1";
|
|
|
|
error->message = NULL;
|
|
|
|
return 0;
|
|
}
|