예제 #1
0
xml_t * XSD_Variable_LoadFromHandle(FILE *f, int filelen) {
#else
xml_t * XSD_Variable_LoadFromHandle(vfsfile_t *v, int filelen) {
	vfserrno_t err;
#endif
    xml_variable_t *document;
    XML_Parser parser = NULL;
    int len;
	int pos = 0;
    char buf[XML_READ_BUFSIZE];
    xml_parser_stack_t parser_stack;

    // create blank document
    document = (xml_variable_t *) Q_malloc(sizeof(xml_variable_t));
    XSD_Variable_Init(document);

    // initialize XML parser
    parser = XML_ParserCreate(NULL);
    if (parser == NULL)
        goto error;
    XML_SetStartElementHandler(parser, OnStartElement);
    XML_SetEndElementHandler(parser, OnEndElement);
    XML_SetCharacterDataHandler(parser, OnCharacterData);

    // prepare user data
    XSD_InitStack(&parser_stack);
    parser_stack.document = (xml_t *) document;
    XML_SetUserData(parser, &parser_stack);

#ifndef WITH_FTE_VFS
    while ((len = fread(buf, 1, min(XML_READ_BUFSIZE, filelen-pos), f)) > 0)
#else
    while ((len = VFS_READ(v, buf, min(XML_READ_BUFSIZE, filelen-pos), &err)) > 0)
#endif
    {
        if (XML_Parse(parser, buf, len, 0) != XML_STATUS_OK)
            goto error;

		pos += len;
    }
    if (XML_Parse(parser, NULL, 0, 1) != XML_STATUS_OK)
        goto error;

    XML_ParserFree(parser);

    return (xml_t *) document;

error:

    if (parser)
        XML_ParserFree(parser);
    XSD_Variable_Free((xml_t *)document);

    return NULL;
}
예제 #2
0
파일: help.c 프로젝트: AAS/ezquake-source
void Help_Describe_f(void)
{
    qbool found = false;
    char *name;
    xml_command_t *cmd;
    xml_variable_t *var;

    if (Cmd_Argc() != 2)
    {
        Com_Printf("usage: /describe <command|variable>\ne.g. /describe ignore\n");
        return;
    }

    name = Cmd_Argv(1);
    
    // check for command
    cmd = XSD_Command_Load(va("help/commands/%s.xml", name));
    if (cmd)
    {
        found = true;
        
        // name
        con_ormask = 128;
        Com_Printf("%s is a command\n", cmd->name);
        con_ormask = 0;

		Help_DescribeCmd(cmd);

        XSD_Command_Free( (xml_t *)cmd );
    }

    // check for variable
    var = XSD_Variable_Load(va("help/variables/%s.xml", name));
    if (var)
    {
        if (found)
            Com_Printf("\n\n\n");

        found = true;
        
        // name
        con_ormask = 128;
        Com_Printf("%s is a variable\n", var->name);
        con_ormask = 0;

		Help_DescribeVar(var);

        XSD_Variable_Free( (xml_t *)var );
    }

    // if no found
    if (!found)
        Com_Printf("Nothing found.\n");
}
예제 #3
0
파일: help.c 프로젝트: AAS/ezquake-source
void Help_VarDescription (const char *varname, char* buf, size_t bufsize)
{
	extern void CharsToBrown(char*, char*);
	extern cvar_t menu_advanced;
	xml_variable_t *var;
	variable_enum_value_t *cv;

	var = XSD_Variable_Load (va ("help/variables/%s.xml", varname));
	
	if(menu_advanced.integer && strlen(varname)){
		strlcat(buf, "Variable name: ", bufsize);
		strlcat(buf, varname, bufsize);
		CharsToBrown(buf, buf + strlen (buf) - strlen(varname));
		strlcat(buf, "\n", bufsize);
	}
	
	if (!var)
		return;

	if (var->description && strlen (var->description) > 1) {
		strlcat (buf, var->description, bufsize);
		strlcat (buf, "\n", bufsize);
	}

	if (var->remarks) {
		strlcat (buf, "remarks: ", bufsize);
		strlcat (buf, var->remarks, bufsize);
		strlcat (buf, "\n", bufsize);
	}

	switch (var->value_type) {
	case t_boolean:
		if (var->value.boolean_value.false_description) {
			strlcat (buf, "0: ", bufsize);
			strlcat (buf, var->value.boolean_value.false_description, bufsize);
			strlcat (buf, "\n", bufsize);
		}

		if (var->value.boolean_value.true_description) {
			strlcat (buf, "1: ", bufsize);
			strlcat (buf, var->value.boolean_value.true_description, bufsize);
			strlcat (buf, "\n", bufsize);
		}

		break;

	case t_float:
		if (var->value.float_description) {
			strlcat (buf, var->value.float_description, bufsize);
			strlcat (buf, "\n", bufsize);
		}

		break;

	case t_integer:
		if (var->value.integer_description) {
			strlcat (buf, var->value.integer_description, bufsize);
			strlcat (buf, "\n", bufsize);
		}

		break;

	case t_string:
		if (var->value.string_description) {
			strlcat (buf, var->value.string_description, bufsize);
			strlcat (buf, "\n", bufsize);
		}

		break;

	case t_enum:
		cv = var->value.enum_value;
		while(cv) {
			if (cv->name && cv->description) {
				strlcat (buf, cv->name, bufsize);
				strlcat (buf, ":", bufsize);
				strlcat (buf, cv->description, bufsize);
				strlcat (buf, "\n", bufsize);
			}

			cv = cv->next;
		}

		break;
	}

	XSD_Variable_Free ((xml_t *) var);
}