1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-11-02 08:57:19 -04:00

[dgi] Unification.

one fuction prepare_command instead of two very similar.
This commit is contained in:
Witold Filipczyk 2022-07-14 22:29:24 +02:00
parent 307be32113
commit 4811d20a30

View File

@ -105,157 +105,11 @@ enum dgi_state {
}; };
static void static void
prepare_command(struct mime_handler *handler, const char *query, struct string *cmd, char **inp, char **out, char **queryfile) prepare_command(char *program, const char *filename, const char *query, char *inpext, char *outext, struct string *cmd, char **inp, char **out, char **queryfile)
{ {
const char *ch; const char *ch;
enum dgi_state state = NORMAL; enum dgi_state state = NORMAL;
for (ch = handler->program; *ch; ch++) {
switch (state) {
case NORMAL:
default:
if (*ch == '$') {
state = DOLAR;
} else if (*ch == '%') {
state = PERCENT;
} else if (*ch == '[') {
state = LEFT_BRACKET;
} else {
add_char_to_string(cmd, *ch);
}
break;
case LEFT_BRACKET:
switch (*ch) {
case ']':
state = NORMAL;
break;
default:
break;
}
break;
case DOLAR:
case PERCENT:
switch (*ch) {
case 'a':
add_to_string(cmd, get_opt_str("mime.dgi.a", NULL));
state = NORMAL;
break;
case 'b':
add_to_string(cmd, get_opt_str("mime.dgi.b", NULL));
state = NORMAL;
break;
case 'c':
add_to_string(cmd, get_opt_str("mime.dgi.c", NULL));
state = NORMAL;
break;
case 'd':
add_to_string(cmd, get_opt_str("mime.dgi.d", NULL));
state = NORMAL;
break;
case 'e':
add_to_string(cmd, get_opt_str("mime.dgi.e", NULL));
state = NORMAL;
break;
case 'f':
add_to_string(cmd, get_opt_str("mime.dgi.f", NULL));
state = NORMAL;
break;
case 'g':
add_to_string(cmd, get_opt_str("mime.dgi.g", NULL));
state = NORMAL;
break;
case 'h':
add_to_string(cmd, get_opt_str("mime.dgi.h", NULL));
state = NORMAL;
break;
case 'i':
add_to_string(cmd, get_opt_str("mime.dgi.i", NULL));
state = NORMAL;
break;
case 'j':
add_to_string(cmd, get_opt_str("mime.dgi.j", NULL));
state = NORMAL;
break;
case 'l':
add_to_string(cmd, get_opt_str("mime.dgi.l", NULL));
state = NORMAL;
break;
case 'm':
add_to_string(cmd, get_opt_str("mime.dgi.m", NULL));
state = NORMAL;
break;
case 'n':
add_to_string(cmd, get_opt_str("mime.dgi.n", NULL));
state = NORMAL;
break;
case 'p':
add_to_string(cmd, get_opt_str("mime.dgi.p", NULL));
state = NORMAL;
break;
case 'q':
*queryfile = tempname(NULL, "elinks", handler->inpext);
if (*queryfile) {
add_to_string(cmd, *queryfile);
}
state = NORMAL;
break;
case 'r':
add_to_string(cmd, get_opt_str("mime.dgi.r", NULL));
state = NORMAL;
break;
case 's':
if (query) {
add_to_string(cmd, query);
}
state = NORMAL;
break;
case 't':
add_to_string(cmd, get_opt_str("mime.dgi.t", NULL));
state = NORMAL;
break;
case 'u':
add_to_string(cmd, get_opt_str("mime.dgi.u", NULL));
state = NORMAL;
break;
case 'w':
add_to_string(cmd, get_opt_str("mime.dgi.w", NULL));
state = NORMAL;
break;
case 'x':
add_to_string(cmd, get_opt_str("mime.dgi.x", NULL));
state = NORMAL;
break;
case '1':
*inp = tempname(NULL, "elinks", handler->inpext);
if (*inp) {
add_to_string(cmd, *inp);
}
state = NORMAL;
break;
case '2':
*out = tempname(NULL, "elinks", handler->outext);
if (*out) {
add_to_string(cmd, *out);
}
state = NORMAL;
break;
default:
add_char_to_string(cmd, *ch);
state = NORMAL;
break;
}
break;
}
}
}
static void
prepare_command2(char *program, const char *filename, char *inpext, char *outext, struct string *cmd, char **inp, char **out)
{
const char *ch;
char *query = NULL;
enum dgi_state state = NORMAL;
for (ch = program; *ch; ch++) { for (ch = program; *ch; ch++) {
switch (state) { switch (state) {
case NORMAL: case NORMAL:
@ -339,6 +193,10 @@ prepare_command2(char *program, const char *filename, char *inpext, char *outext
state = NORMAL; state = NORMAL;
break; break;
case 'q': case 'q':
*queryfile = tempname(NULL, "elinks", inpext);
if (*queryfile) {
add_to_string(cmd, *queryfile);
}
state = NORMAL; state = NORMAL;
break; break;
case 'r': case 'r':
@ -370,6 +228,11 @@ prepare_command2(char *program, const char *filename, char *inpext, char *outext
case '1': case '1':
if (filename) { if (filename) {
add_to_string(cmd, filename); add_to_string(cmd, filename);
} else {
*inp = tempname(NULL, "elinks", inpext);
if (*inp) {
add_to_string(cmd, *inp);
}
} }
state = NORMAL; state = NORMAL;
break; break;
@ -431,7 +294,7 @@ dgi_protocol_handler(struct connection *conn)
outext = qs_k2v("outext", kvpairs, i); outext = qs_k2v("outext", kvpairs, i);
del = qs_k2v("delete", kvpairs, i); del = qs_k2v("delete", kvpairs, i);
} }
prepare_command2(command, filename, inpext, outext, &command_str, &tempfilename, &outputfilename); prepare_command(command, filename, NULL, inpext, outext, &command_str, &tempfilename, &outputfilename, NULL);
(void)!system(command_str.source); (void)!system(command_str.source);
done_string(&command_str); done_string(&command_str);
@ -548,7 +411,7 @@ execute_dgi(struct connection *conn)
char *query = get_uri_string(conn->uri, URI_QUERY); char *query = get_uri_string(conn->uri, URI_QUERY);
prepare_command(handler, query, &command, &tempfilename, &outputfilename, &queryfile); prepare_command(handler->program, NULL, query, handler->inpext, handler->outext, &command, &tempfilename, &outputfilename, &queryfile);
mem_free_if(query); mem_free_if(query);