|
Packit |
1fb8d4 |
#include <stdlib.h>
|
|
Packit |
1fb8d4 |
#include <stdio.h>
|
|
Packit |
1fb8d4 |
#include <ctype.h>
|
|
Packit |
1fb8d4 |
#include <string.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include "../common/cmdline.h"
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define TAG FREERDP_TAG("generate_argument_docbook")
|
|
Packit |
1fb8d4 |
LPSTR tr_esc_str(LPCSTR arg, bool format)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
LPSTR tmp = NULL;
|
|
Packit Service |
5a9772 |
LPSTR tmp2 = NULL;
|
|
Packit |
1fb8d4 |
size_t cs = 0, x, ds, len;
|
|
Packit |
1fb8d4 |
size_t s;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == arg)
|
|
Packit |
1fb8d4 |
return NULL;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
s = strlen(arg);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Find trailing whitespaces */
|
|
Packit |
1fb8d4 |
while ((s > 0) && isspace(arg[s - 1]))
|
|
Packit |
1fb8d4 |
s--;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Prepare a initial buffer with the size of the result string. */
|
|
Packit |
1fb8d4 |
ds = s + 1;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (ds)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
tmp2 = (LPSTR)realloc(tmp, ds * sizeof(CHAR));
|
|
Packit Service |
5a9772 |
if (!tmp2)
|
|
Packit Service |
5a9772 |
free(tmp);
|
|
Packit Service |
5a9772 |
tmp = tmp2;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == tmp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not allocate string buffer.\n");
|
|
Packit |
1fb8d4 |
exit(-2);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Copy character for character and check, if it is necessary to escape. */
|
|
Packit |
1fb8d4 |
memset(tmp, 0, ds * sizeof(CHAR));
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (x = 0; x < s; x++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
switch (arg[x])
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
case '<':
|
|
Packit |
1fb8d4 |
len = format ? 13 : 4;
|
|
Packit |
1fb8d4 |
ds += len - 1;
|
|
Packit Service |
5a9772 |
tmp2 = (LPSTR)realloc(tmp, ds * sizeof(CHAR));
|
|
Packit Service |
5a9772 |
if (!tmp2)
|
|
Packit Service |
5a9772 |
free(tmp);
|
|
Packit Service |
5a9772 |
tmp = tmp2;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == tmp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not reallocate string buffer.\n");
|
|
Packit |
1fb8d4 |
exit(-3);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (format)
|
|
Packit |
1fb8d4 |
/* coverity[buffer_size] */
|
|
Packit |
1fb8d4 |
strncpy(&tmp[cs], "<replaceable>", len);
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
/* coverity[buffer_size] */
|
|
Packit |
1fb8d4 |
strncpy(&tmp[cs], "<", len);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
cs += len;
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
case '>':
|
|
Packit |
1fb8d4 |
len = format ? 14 : 4;
|
|
Packit |
1fb8d4 |
ds += len - 1;
|
|
Packit Service |
5a9772 |
tmp2 = (LPSTR)realloc(tmp, ds * sizeof(CHAR));
|
|
Packit Service |
5a9772 |
if (!tmp2)
|
|
Packit Service |
5a9772 |
free(tmp);
|
|
Packit Service |
5a9772 |
tmp = tmp2;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == tmp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not reallocate string buffer.\n");
|
|
Packit |
1fb8d4 |
exit(-4);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (format)
|
|
Packit |
1fb8d4 |
/* coverity[buffer_size] */
|
|
Packit |
1fb8d4 |
strncpy(&tmp[cs], "</replaceable>", len);
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
/* coverity[buffer_size] */
|
|
Packit |
1fb8d4 |
strncpy(&tmp[cs], "<", len);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
cs += len;
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
case '\'':
|
|
Packit |
1fb8d4 |
ds += 5;
|
|
Packit Service |
5a9772 |
tmp2 = (LPSTR)realloc(tmp, ds * sizeof(CHAR));
|
|
Packit Service |
5a9772 |
if (!tmp2)
|
|
Packit Service |
5a9772 |
free(tmp);
|
|
Packit Service |
5a9772 |
tmp = tmp2;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == tmp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not reallocate string buffer.\n");
|
|
Packit |
1fb8d4 |
exit(-5);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
tmp[cs++] = '&';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'a';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'p';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'o';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 's';
|
|
Packit |
1fb8d4 |
tmp[cs++] = ';';
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
case '"':
|
|
Packit |
1fb8d4 |
ds += 5;
|
|
Packit Service |
5a9772 |
tmp2 = (LPSTR)realloc(tmp, ds * sizeof(CHAR));
|
|
Packit Service |
5a9772 |
if (!tmp2)
|
|
Packit Service |
5a9772 |
free(tmp);
|
|
Packit Service |
5a9772 |
tmp = tmp2;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == tmp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not reallocate string buffer.\n");
|
|
Packit |
1fb8d4 |
exit(-6);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
tmp[cs++] = '&';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'q';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'u';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'o';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 't';
|
|
Packit |
1fb8d4 |
tmp[cs++] = ';';
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
case '&':
|
|
Packit |
1fb8d4 |
ds += 4;
|
|
Packit Service |
5a9772 |
tmp2 = (LPSTR)realloc(tmp, ds * sizeof(CHAR));
|
|
Packit Service |
5a9772 |
if (!tmp2)
|
|
Packit Service |
5a9772 |
free(tmp);
|
|
Packit Service |
5a9772 |
tmp = tmp2;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == tmp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not reallocate string buffer.\n");
|
|
Packit |
1fb8d4 |
exit(-7);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
tmp[cs++] = '&';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'a';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'm';
|
|
Packit |
1fb8d4 |
tmp[cs++] = 'p';
|
|
Packit |
1fb8d4 |
tmp[cs++] = ';';
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
default:
|
|
Packit |
1fb8d4 |
tmp[cs++] = arg[x];
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Assure, the string is '\0' terminated. */
|
|
Packit |
1fb8d4 |
tmp[ds - 1] = '\0';
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
return tmp;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
int main(int argc, char* argv[])
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
size_t elements = sizeof(args) / sizeof(args[0]);
|
|
Packit |
1fb8d4 |
size_t x;
|
|
Packit |
1fb8d4 |
const char* fname = "xfreerdp-argument.1.xml";
|
|
Packit |
1fb8d4 |
FILE* fp = NULL;
|
|
Packit |
1fb8d4 |
/* Open output file for writing, truncate if existing. */
|
|
Packit |
1fb8d4 |
fp = fopen(fname, "w");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (NULL == fp)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "Could not open '%s' for writing.\n", fname);
|
|
Packit |
1fb8d4 |
return -1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* The tag used as header in the manpage */
|
|
Packit |
1fb8d4 |
fprintf(fp, "<refsect1>\n");
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t<title>Options</title>\n");
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t<variablelist>\n");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/* Iterate over argument struct and write data to docbook 4.5
|
|
Packit |
1fb8d4 |
* compatible XML */
|
|
Packit |
1fb8d4 |
if (elements < 2)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
fprintf(stderr, "The argument array 'args' is empty, writing an empty file.\n");
|
|
Packit |
1fb8d4 |
elements = 1;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
for (x = 0; x < elements - 1; x++)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
const COMMAND_LINE_ARGUMENT_A* arg = &args[x];
|
|
Packit Service |
5a9772 |
char* name = tr_esc_str((LPSTR)arg->Name, FALSE);
|
|
Packit Service |
5a9772 |
char* alias = tr_esc_str((LPSTR)arg->Alias, FALSE);
|
|
Packit |
1fb8d4 |
char* format = tr_esc_str(arg->Format, TRUE);
|
|
Packit Service |
5a9772 |
char* text = tr_esc_str((LPSTR)arg->Text, FALSE);
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t\t<varlistentry>\n");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
do
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t\t\t<term><option>");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (arg->Flags == COMMAND_LINE_VALUE_BOOL)
|
|
Packit |
1fb8d4 |
fprintf(fp, "%s", arg->Default ? "-" : "+");
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
fprintf(fp, "/");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fprintf(fp, "%s</option>", name);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (format)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
if (arg->Flags == COMMAND_LINE_VALUE_OPTIONAL)
|
|
Packit |
1fb8d4 |
fprintf(fp, "[");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fprintf(fp, ":%s", format);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (arg->Flags == COMMAND_LINE_VALUE_OPTIONAL)
|
|
Packit |
1fb8d4 |
fprintf(fp, "]");
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fprintf(fp, "</term>\n");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (alias == name)
|
|
Packit |
1fb8d4 |
break;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
free(name);
|
|
Packit |
1fb8d4 |
name = alias;
|
|
Packit Service |
5a9772 |
} while (alias);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (text)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t\t\t<listitem>\n");
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t\t\t\t<para>");
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (text)
|
|
Packit |
1fb8d4 |
fprintf(fp, "%s", text);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (arg->Flags == COMMAND_LINE_VALUE_BOOL)
|
|
Packit |
1fb8d4 |
fprintf(fp, " (default:%s)", arg->Default ? "on" : "off");
|
|
Packit |
1fb8d4 |
else if (arg->Default)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
char* value = tr_esc_str((LPSTR)arg->Default, FALSE);
|
|
Packit |
1fb8d4 |
fprintf(fp, " (default:%s)", value);
|
|
Packit |
1fb8d4 |
free(value);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fprintf(fp, "</para>\n");
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t\t\t</listitem>\n");
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t\t</varlistentry>\n");
|
|
Packit |
1fb8d4 |
free(name);
|
|
Packit |
1fb8d4 |
free(format);
|
|
Packit |
1fb8d4 |
free(text);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t\t</variablelist>\n");
|
|
Packit |
1fb8d4 |
fprintf(fp, "\t</refsect1>\n");
|
|
Packit |
1fb8d4 |
fclose(fp);
|
|
Packit |
1fb8d4 |
return 0;
|
|
Packit |
1fb8d4 |
}
|