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; }
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"); }
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); }