rearrange functions

Added alternative notation of headings
This commit is contained in:
gottox@rootkit.lan 2007-12-10 13:44:59 +01:00
parent bd936e513c
commit 597bf0e64e

View file

@ -22,29 +22,35 @@ struct Tag {
void eprint(const char *format, ...); /* Prints error and exits */ void eprint(const char *format, ...); /* Prints error and exits */
void hprint(const char *begin, const char *end); /* escapes HTML and prints it to stdout*/ void hprint(const char *begin, const char *end); /* escapes HTML and prints it to stdout*/
void process(const char *begin, const char *end);
/* Processes range between begin and end with parser (NULL = all parsers) */
unsigned int doreplace(const char *begin, const char *end);
/* Parser for simple replaces */
unsigned int dolineprefix(const char *begin, const char *end); unsigned int dolineprefix(const char *begin, const char *end);
/* Parser for line prefix tags */ /* Parser for line prefix tags */
unsigned int dolink(const char *begin, const char *end);
/* Parser for links and images */
unsigned int doreplace(const char *begin, const char *end);
/* Parser for simple replaces */
unsigned int doshortlink(const char *begin, const char *end);
/* Parser for links and images */
unsigned int dosurround(const char *begin, const char *end); unsigned int dosurround(const char *begin, const char *end);
/* Parser for surrounding tags */ /* Parser for surrounding tags */
unsigned int dounderline(const char *begin, const char *end); unsigned int dounderline(const char *begin, const char *end);
/* Parser for underline tags */ /* Parser for underline tags */
unsigned int dolink(const char *begin, const char *end); void process(const char *begin, const char *end); /* Processes range between begin and end. */
/* Parser for links and images */
unsigned int doshortlink(const char *begin, const char *end);
/* Parser for links and images */
Parser parsers[] = { dounderline, dolineprefix, dosurround, dolink, doshortlink, doreplace };
/* list of parsers */
Parser parsers[] = { dounderline, dolineprefix, dosurround, dolist,
dolink, doshortlink, doreplace }; /* list of parsers */
FILE *source; FILE *source;
unsigned int bsize = 0, nohtml = 0; unsigned int bsize = 0, nohtml = 0;
struct Tag lineprefix[] = { struct Tag lineprefix[] = {
{ " ", 0, "pre" }, { " ", 0, "pre" },
{ "\t", 0, "pre" }, { "\t", 0, "pre" },
{ "> ", 1, "blockquote" }, { "> ", 1, "blockquote" },
{ "####### ", 1, "h7" },
{ "###### ", 1, "h6" },
{ "##### ", 1, "h5" },
{ "#### ", 1, "h4" },
{ "### ", 1, "h3" },
{ "## ", 1, "h2" },
{ "# ", 1, "h1" },
}; };
struct Tag underline[] = { struct Tag underline[] = {
{ "=", 1, "h1" }, { "=", 1, "h1" },
@ -61,6 +67,13 @@ struct Tag surround[] = {
char * replace[][2] = { char * replace[][2] = {
{ "\n---\n", "\n<hr />\n" }, { "\n---\n", "\n<hr />\n" },
{ "\n\n", "<br />\n<br />\n" }, { "\n\n", "<br />\n<br />\n" },
{ " #######\n", "\n" },
{ " ######\n", "\n" },
{ " #####\n", "\n" },
{ " ####\n", "\n" },
{ " ###\n", "\n" },
{ " ##\n", "\n" },
{ " #\n", "\n" },
}; };
void void
@ -86,6 +99,43 @@ hprint(const char *begin, const char *end) {
} }
} }
unsigned int
dolineprefix(const char *begin, const char *end) {
unsigned int i, j, l;
char *buffer;
const char *p;
if(*begin != '\n' && *begin != '\0')
return 0;
for(i = 0; i < LENGTH(lineprefix); i++) {
l = strlen(lineprefix[i].search);
if(end - begin+1 < l)
continue;
if(strncmp(lineprefix[i].search,begin+1,l))
continue;
if(!(buffer = malloc(end - begin+1)))
ERRMALLOC;
printf("<%s>",lineprefix[i].tag);
for(p = begin, j = 0; p != end; p++, j++) {
buffer[j] = *p;
if(*p == '\n') {
if(strncmp(lineprefix[i].search,p+1,l) != 0)
break;
p += l;
}
}
if(lineprefix[i].process)
process(buffer,buffer+strlen(buffer));
else
hprint(buffer,buffer+strlen(buffer));
printf("</%s>",lineprefix[i].tag);
free(buffer);
return p - begin;
}
return 0;
}
unsigned int unsigned int
dolink(const char *begin, const char *end) { dolink(const char *begin, const char *end) {
int img; int img;
@ -122,6 +172,23 @@ dolink(const char *begin, const char *end) {
} }
return p + 1 - begin; return p + 1 - begin;
} }
unsigned int
doreplace(const char *begin, const char *end) {
unsigned int i, l;
for(i = 0; i < LENGTH(replace); i++) {
l = strlen(replace[i][0]);
if(end - begin < l)
continue;
if(strncmp(replace[i][0],begin,l) == 0) {
fputs(replace[i][1], stdout);
return l;
}
}
return 0;
}
unsigned int unsigned int
doshortlink(const char *begin, const char *end) { doshortlink(const char *begin, const char *end) {
const char *p, *c; const char *p, *c;
@ -190,58 +257,6 @@ dosurround(const char *begin, const char *end) {
} }
return 0; return 0;
} }
unsigned int
doreplace(const char *begin, const char *end) {
unsigned int i, l;
for(i = 0; i < LENGTH(replace); i++) {
l = strlen(replace[i][0]);
if(end - begin < l)
continue;
if(strncmp(replace[i][0],begin,l) == 0) {
fputs(replace[i][1], stdout);
return l;
}
}
return 0;
}
unsigned int
dolineprefix(const char *begin, const char *end) {
unsigned int i, j, l;
char *buffer;
const char *p;
if(*begin != '\n' && *begin != '\0')
return 0;
for(i = 0; i < LENGTH(lineprefix); i++) {
l = strlen(lineprefix[i].search);
if(end - begin+1 < l)
continue;
if(strncmp(lineprefix[i].search,begin+1,l))
continue;
if(!(buffer = malloc(end - begin+1)))
ERRMALLOC;
printf("<%s>",lineprefix[i].tag);
for(p = begin, j = 0; p != end; p++, j++) {
buffer[j] = *p;
if(*p == '\n') {
if(strncmp(lineprefix[i].search,p+1,l) != 0)
break;
p += l;
}
}
if(lineprefix[i].process)
process(buffer,buffer+strlen(buffer));
else
hprint(buffer,buffer+strlen(buffer));
printf("</%s>",lineprefix[i].tag);
free(buffer);
return p - begin;
}
return 0;
}
unsigned int unsigned int
dounderline(const char *begin, const char *end) { dounderline(const char *begin, const char *end) {