Blame client/X11/generate_argument_docbook.c

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
}