void SettingsArchiverBin::saveNode( AbstractNode *node, std::ostream& out ) { _write<int8_t>(out, node->type()); switch( node->type() ) { case AbstractNode::Map: _write<int32_t>(out, dynamic_cast<MapNode*>(node)->size()); for( MapNode::const_iterator itm = dynamic_cast<MapNode*>(node)->begin(); itm != dynamic_cast<MapNode*>(node)->end(); itm++ ) { _write_string(out, itm->first.c_str(), itm->first.length()); saveNode(itm->second, out); } break; case AbstractNode::Vector: _write<int32_t>(out, dynamic_cast<VectorNode*>(node)->size()); for( VectorNode::const_iterator itv = dynamic_cast<VectorNode*>(node)->begin(); itv != dynamic_cast<VectorNode*>(node)->end(); itv++ ) { saveNode(*itv, out); } break; case AbstractNode::Scalar: { jq::String s(dynamic_cast<ScalarNode*>(node)->value()); _write_string(out, s.c_str(), s.length()); } break; default: break; } }
/// /// write a TypeVar to a wostream /// std::wostream& TypeVar::_write_var(std::wostream& os) const { switch (type()) { case type_null : os << "null"; return os; case type_bool: os << (boost::get<bool_t>(_var) ? "true" : "false"); return os; case type_char : os << boost::get<char_t>(_var); return os; case type_int : os << boost::get<int_t>(_var); return os; case type_double : os << boost::get<double_t>(_var); return os; case type_string : return _write_string(os); case type_wstring : return _write_wstring(os); default : throw myException("TypeVar::_write_var(wostream) unhandled type"); } }
bool _pl_t_erase_page (S___(Plotter *_plotter)) { /* erase: emit ESC C-l, i.e. ^[^l */ _write_string (_plotter->data, "\033\014"); _plotter->tek_mode = TEK_MODE_ALPHA; /* erasing enters alpha mode */ /* Note: kermit Tek emulator, on seeing ESC C-l , seems to enter graphics mode, not alpha mode. Maybe we should specify TEK_MODE_PLOT above, instead of TEK_MODE_ALPHA? The above won't hurt though, because we don't use TEK_MODE_ALPHA anyway (we'll have to switch away from it). */ /* set background color (a no-op unless we're writing to a kermit Tektronix emulator, see t_color.c) */ _pl_t_set_bg_color (S___(_plotter)); return true; }
void DocDump::dump(const String &p_file) { List<StringName> class_list; ClassDB::get_class_list(&class_list); class_list.sort_custom<StringName::AlphCompare>(); FileAccess *f = FileAccess::open(p_file, FileAccess::WRITE); _write_string(f, 0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); _write_string(f, 0, "<doc version=\"" + String(VERSION_MKSTRING) + "\" name=\"Engine Types\">"); while (class_list.size()) { String name = class_list.front()->get(); String header = "<class name=\"" + name + "\""; String inherits = ClassDB::get_parent_class(name); if (inherits != "") header += " inherits=\"" + inherits + "\""; String category = ClassDB::get_category(name); if (category == "") category = "Core"; header += " category=\"" + category + "\""; header += ">"; _write_string(f, 0, header); _write_string(f, 1, "<brief_description>"); _write_string(f, 1, "</brief_description>"); _write_string(f, 1, "<description>"); _write_string(f, 1, "</description>"); _write_string(f, 1, "<methods>"); List<MethodInfo> method_list; ClassDB::get_method_list(name, &method_list, true); method_list.sort(); for (List<MethodInfo>::Element *E = method_list.front(); E; E = E->next()) { if (E->get().name == "" || E->get().name[0] == '_') continue; //hiden MethodBind *m = ClassDB::get_method(name, E->get().name); String qualifiers; if (E->get().flags & METHOD_FLAG_CONST) qualifiers += "qualifiers=\"const\""; _write_string(f, 2, "<method name=\"" + _escape_string(E->get().name) + "\" " + qualifiers + " >"); for (int i = -1; i < E->get().arguments.size(); i++) { PropertyInfo arginfo; if (i == -1) { arginfo = E->get().return_val; String type_name = (arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) ? arginfo.hint_string : Variant::get_type_name(arginfo.type); if (arginfo.type == Variant::NIL) continue; _write_string(f, 3, "<return type=\"" + type_name + "\">"); } else { arginfo = E->get().arguments[i]; String type_name; if (arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) type_name = arginfo.hint_string; else if (arginfo.type == Variant::NIL) type_name = "var"; else type_name = Variant::get_type_name(arginfo.type); if (m && m->has_default_argument(i)) { Variant default_arg = m->get_default_argument(i); String default_arg_text = String(_escape_string(m->get_default_argument(i))); switch (default_arg.get_type()) { case Variant::NIL: default_arg_text = "NULL"; break; // atomic types case Variant::BOOL: if (bool(default_arg)) default_arg_text = "true"; else default_arg_text = "false"; break; case Variant::INT: case Variant::REAL: //keep it break; case Variant::STRING: // 15 case Variant::NODE_PATH: // 15 default_arg_text = "\"" + default_arg_text + "\""; break; case Variant::TRANSFORM: if (default_arg.operator Transform() == Transform()) { default_arg_text = ""; } default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; case Variant::VECTOR2: // 5 case Variant::RECT2: case Variant::VECTOR3: case Variant::PLANE: case Variant::QUAT: case Variant::RECT3: //sorry naming convention fail :( not like it's used often // 10 case Variant::BASIS: case Variant::COLOR: case Variant::POOL_BYTE_ARRAY: case Variant::POOL_INT_ARRAY: case Variant::POOL_REAL_ARRAY: case Variant::POOL_STRING_ARRAY: //25 case Variant::POOL_VECTOR3_ARRAY: case Variant::POOL_COLOR_ARRAY: default_arg_text = Variant::get_type_name(default_arg.get_type()) + "(" + default_arg_text + ")"; break; case Variant::OBJECT: case Variant::INPUT_EVENT: case Variant::DICTIONARY: // 20 case Variant::ARRAY: case Variant::_RID: case Variant::IMAGE: //case Variant::RESOURCE: default_arg_text = Variant::get_type_name(default_arg.get_type()) + "()"; break; default: {} } _write_string(f, 3, "<argument index=\"" + itos(i) + "\" name=\"" + _escape_string(arginfo.name) + "\" type=\"" + type_name + "\" default=\"" + _escape_string(default_arg_text) + "\">"); } else _write_string(f, 3, "<argument index=\"" + itos(i) + "\" name=\"" + arginfo.name + "\" type=\"" + type_name + "\">"); } String hint; switch (arginfo.hint) { case PROPERTY_HINT_DIR: hint = "A directory."; break; case PROPERTY_HINT_RANGE: hint = "Range - min: " + arginfo.hint_string.get_slice(",", 0) + " max: " + arginfo.hint_string.get_slice(",", 1) + " step: " + arginfo.hint_string.get_slice(",", 2); break; case PROPERTY_HINT_ENUM: hint = "Values: "; for (int j = 0; j < arginfo.hint_string.get_slice_count(","); j++) { if (j > 0) hint += ", "; hint += arginfo.hint_string.get_slice(",", j) + "=" + itos(j); } break; case PROPERTY_HINT_LENGTH: hint = "Length: " + arginfo.hint_string; break; case PROPERTY_HINT_FLAGS: hint = "Values: "; for (int j = 0; j < arginfo.hint_string.get_slice_count(","); j++) { if (j > 0) hint += ", "; hint += arginfo.hint_string.get_slice(",", j) + "=" + itos(1 << j); } break; case PROPERTY_HINT_FILE: hint = "A file:"; break; default: {} //case PROPERTY_HINT_RESOURCE_TYPE: hint="Type: "+arginfo.hint_string; break; }; if (hint != "") _write_string(f, 4, hint); _write_string(f, 3, (i == -1) ? "</return>" : "</argument>"); } _write_string(f, 3, "<description>"); _write_string(f, 3, "</description>"); _write_string(f, 2, "</method>"); } _write_string(f, 1, "</methods>"); List<MethodInfo> signal_list; ClassDB::get_signal_list(name, &signal_list, true); if (signal_list.size()) { _write_string(f, 1, "<signals>"); for (List<MethodInfo>::Element *EV = signal_list.front(); EV; EV = EV->next()) { _write_string(f, 2, "<signal name=\"" + EV->get().name + "\">"); for (int i = 0; i < EV->get().arguments.size(); i++) { PropertyInfo arginfo = EV->get().arguments[i]; _write_string(f, 3, "<argument index=\"" + itos(i) + "\" name=\"" + arginfo.name + "\" type=\"" + Variant::get_type_name(arginfo.type) + "\">"); _write_string(f, 3, "</argument>"); } _write_string(f, 3, "<description>"); _write_string(f, 3, "</description>"); _write_string(f, 2, "</signal>"); } _write_string(f, 1, "</signals>"); } _write_string(f, 1, "<constants>"); List<String> constant_list; ClassDB::get_integer_constant_list(name, &constant_list, true); /* constants are sorted in a special way */ List<_ConstantSort> constant_sort; for (List<String>::Element *E = constant_list.front(); E; E = E->next()) { _ConstantSort cs; cs.name = E->get(); cs.value = ClassDB::get_integer_constant(name, E->get()); constant_sort.push_back(cs); } constant_sort.sort(); for (List<_ConstantSort>::Element *E = constant_sort.front(); E; E = E->next()) { _write_string(f, 2, "<constant name=\"" + E->get().name + "\" value=\"" + itos(E->get().value) + "\">"); _write_string(f, 2, "</constant>"); } _write_string(f, 1, "</constants>"); _write_string(f, 0, "</class>"); class_list.erase(name); } _write_string(f, 0, "</doc>"); f->close(); memdelete(f); }
Error DocData::save(const String& p_path) { Error err; FileAccess *f = FileAccess::open(p_path,FileAccess::WRITE,&err); if (err) { ERR_EXPLAIN("Can't write doc file: "+p_path); ERR_FAIL_V(err); } _write_string(f,0,"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); _write_string(f,0,"<doc version=\""+String(VERSION_MKSTRING)+"\" name=\"Engine Types\">"); for( Map<String,ClassDoc>::Element *E=class_list.front();E;E=E->next()) { ClassDoc &c=E->get(); String header="<class name=\""+c.name+"\""; if (c.inherits!="") header+=" inherits=\""+c.inherits+"\""; String category=c.category; if (c.category=="") category="Core"; header+=" category=\""+category+"\""; header+=">"; _write_string(f,0,header); _write_string(f,1,"<brief_description>"); if (c.brief_description!="") _write_string(f,1,c.brief_description.xml_escape()); _write_string(f,1,"</brief_description>"); _write_string(f,1,"<description>"); if (c.description!="") _write_string(f,1,c.description.xml_escape()); _write_string(f,1,"</description>"); _write_string(f,1,"<methods>"); c.methods.sort(); for(int i=0;i<c.methods.size();i++) { MethodDoc &m=c.methods[i]; String qualifiers; if (m.qualifiers!="") qualifiers+=" qualifiers=\""+m.qualifiers.xml_escape()+"\""; _write_string(f,2,"<method name=\""+m.name+"\""+qualifiers+">"); if (m.return_type!="") { _write_string(f,3,"<return type=\""+m.return_type+"\">"); _write_string(f,3,"</return>"); } for(int j=0;j<m.arguments.size();j++) { ArgumentDoc &a = m.arguments[j]; if (a.default_value!="") _write_string(f,3,"<argument index=\""+itos(j)+"\" name=\""+a.name.xml_escape()+"\" type=\""+a.type.xml_escape()+"\" default=\""+a.default_value.xml_escape(true)+"\">"); else _write_string(f,3,"<argument index=\""+itos(j)+"\" name=\""+a.name.xml_escape()+"\" type=\""+a.type.xml_escape()+"\">"); _write_string(f,3,"</argument>"); } _write_string(f,3,"<description>"); if (m.description!="") _write_string(f,3,m.description.xml_escape()); _write_string(f,3,"</description>"); _write_string(f,2,"</method>"); } _write_string(f,1,"</methods>"); if (c.properties.size()) { _write_string(f,1,"<members>"); c.properties.sort(); for(int i=0;i<c.properties.size();i++) { PropertyDoc &p=c.properties[i]; _write_string(f,2,"<member name=\""+p.name+"\" type=\""+p.type+"\">"); if (p.description!="") _write_string(f,3,p.description.xml_escape()); _write_string(f,2,"</member>"); } _write_string(f,1,"</members>"); } if (c.signals.size()) { c.signals.sort(); _write_string(f,1,"<signals>"); for(int i=0;i<c.signals.size();i++) { MethodDoc &m=c.signals[i]; _write_string(f,2,"<signal name=\""+m.name+"\">"); for(int j=0;j<m.arguments.size();j++) { ArgumentDoc &a = m.arguments[j]; _write_string(f,3,"<argument index=\""+itos(j)+"\" name=\""+a.name.xml_escape()+"\" type=\""+a.type.xml_escape()+"\">"); _write_string(f,3,"</argument>"); } _write_string(f,3,"<description>"); if (m.description!="") _write_string(f,3,m.description.xml_escape()); _write_string(f,3,"</description>"); _write_string(f,2,"</signal>"); } _write_string(f,1,"</signals>"); } _write_string(f,1,"<constants>"); c.constants.sort_custom<_ConstantComparator>(); for(int i=0;i<c.constants.size();i++) { ConstantDoc &k=c.constants[i]; _write_string(f,2,"<constant name=\""+k.name+"\" value=\""+k.value+"\">"); if (k.description!="") _write_string(f,3,k.description.xml_escape()); _write_string(f,2,"</constant>"); } _write_string(f,1,"</constants>"); if (c.theme_properties.size()) { c.theme_properties.sort(); _write_string(f,1,"<theme_items>"); for(int i=0;i<c.theme_properties.size();i++) { PropertyDoc &p=c.theme_properties[i]; _write_string(f,2,"<theme_item name=\""+p.name+"\" type=\""+p.type+"\">"); _write_string(f,2,"</theme_item>"); } _write_string(f,1,"</theme_items>"); } _write_string(f,0,"</class>"); } _write_string(f,0,"</doc>"); f->close(); memdelete(f); return OK; }
Error DocData::save_classes(const String &p_default_path, const Map<String, String> &p_class_path) { for (Map<String, ClassDoc>::Element *E = class_list.front(); E; E = E->next()) { ClassDoc &c = E->get(); String save_path; if (p_class_path.has(c.name)) { save_path = p_class_path[c.name]; } else { save_path = p_default_path; } Error err; String save_file = save_path.plus_file(c.name + ".xml"); FileAccessRef f = FileAccess::open(save_file, FileAccess::WRITE, &err); if (err) { ERR_EXPLAIN("Can't write doc file: " + save_file); ERR_FAIL_V(err); } _write_string(f, 0, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); String header = "<class name=\"" + c.name + "\""; if (c.inherits != "") header += " inherits=\"" + c.inherits + "\""; String category = c.category; if (c.category == "") category = "Core"; header += " category=\"" + category + "\""; header += String(" version=\"") + VERSION_NUMBER + "\""; header += ">"; _write_string(f, 0, header); _write_string(f, 1, "<brief_description>"); _write_string(f, 2, c.brief_description.strip_edges().xml_escape()); _write_string(f, 1, "</brief_description>"); _write_string(f, 1, "<description>"); _write_string(f, 2, c.description.strip_edges().xml_escape()); _write_string(f, 1, "</description>"); _write_string(f, 1, "<tutorials>"); _write_string(f, 2, c.tutorials.strip_edges().xml_escape()); _write_string(f, 1, "</tutorials>"); _write_string(f, 1, "<demos>"); _write_string(f, 2, c.demos.strip_edges().xml_escape()); _write_string(f, 1, "</demos>"); _write_string(f, 1, "<methods>"); c.methods.sort(); for (int i = 0; i < c.methods.size(); i++) { MethodDoc &m = c.methods[i]; String qualifiers; if (m.qualifiers != "") qualifiers += " qualifiers=\"" + m.qualifiers.xml_escape() + "\""; _write_string(f, 2, "<method name=\"" + m.name + "\"" + qualifiers + ">"); if (m.return_type != "") { String enum_text; if (m.return_enum != String()) { enum_text = " enum=\"" + m.return_enum + "\""; } _write_string(f, 3, "<return type=\"" + m.return_type + "\"" + enum_text + ">"); _write_string(f, 3, "</return>"); } for (int j = 0; j < m.arguments.size(); j++) { ArgumentDoc &a = m.arguments[j]; String enum_text; if (a.enumeration != String()) { enum_text = " enum=\"" + a.enumeration + "\""; } if (a.default_value != "") _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\"" + enum_text + " default=\"" + a.default_value.xml_escape(true) + "\">"); else _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\"" + enum_text + ">"); _write_string(f, 3, "</argument>"); } _write_string(f, 3, "<description>"); _write_string(f, 4, m.description.strip_edges().xml_escape()); _write_string(f, 3, "</description>"); _write_string(f, 2, "</method>"); } _write_string(f, 1, "</methods>"); if (c.properties.size()) { _write_string(f, 1, "<members>"); c.properties.sort(); for (int i = 0; i < c.properties.size(); i++) { String enum_text; if (c.properties[i].enumeration != String()) { enum_text = " enum=\"" + c.properties[i].enumeration + "\""; } PropertyDoc &p = c.properties[i]; _write_string(f, 2, "<member name=\"" + p.name + "\" type=\"" + p.type + "\" setter=\"" + p.setter + "\" getter=\"" + p.getter + "\"" + enum_text + ">"); _write_string(f, 3, p.description.strip_edges().xml_escape()); _write_string(f, 2, "</member>"); } _write_string(f, 1, "</members>"); } if (c.signals.size()) { c.signals.sort(); _write_string(f, 1, "<signals>"); for (int i = 0; i < c.signals.size(); i++) { MethodDoc &m = c.signals[i]; _write_string(f, 2, "<signal name=\"" + m.name + "\">"); for (int j = 0; j < m.arguments.size(); j++) { ArgumentDoc &a = m.arguments[j]; _write_string(f, 3, "<argument index=\"" + itos(j) + "\" name=\"" + a.name.xml_escape() + "\" type=\"" + a.type.xml_escape() + "\">"); _write_string(f, 3, "</argument>"); } _write_string(f, 3, "<description>"); _write_string(f, 4, m.description.strip_edges().xml_escape()); _write_string(f, 3, "</description>"); _write_string(f, 2, "</signal>"); } _write_string(f, 1, "</signals>"); } _write_string(f, 1, "<constants>"); for (int i = 0; i < c.constants.size(); i++) { ConstantDoc &k = c.constants[i]; if (k.enumeration != String()) { _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\" enum=\"" + k.enumeration + "\">"); } else { _write_string(f, 2, "<constant name=\"" + k.name + "\" value=\"" + k.value + "\">"); } _write_string(f, 3, k.description.strip_edges().xml_escape()); _write_string(f, 2, "</constant>"); } _write_string(f, 1, "</constants>"); if (c.theme_properties.size()) { c.theme_properties.sort(); _write_string(f, 1, "<theme_items>"); for (int i = 0; i < c.theme_properties.size(); i++) { PropertyDoc &p = c.theme_properties[i]; _write_string(f, 2, "<theme_item name=\"" + p.name + "\" type=\"" + p.type + "\">"); _write_string(f, 2, "</theme_item>"); } _write_string(f, 1, "</theme_items>"); } _write_string(f, 0, "</class>"); } return OK; }
void OnException(int signo) { if (signo == SIGCHLD) return; MinimalBuffer buffer; int fd = -1; if (crashlog && (signo == SIGSEGV || signo == SIGABRT)) fd = open(crashlog, O_WRONLY | O_CREAT | O_TRUNC, 0644); /* print signal info */ BufferReset(&buffer); BufferAppendUInt64(&buffer, signo, 10); _write_string(fd, "=========================\n"); _write_string(fd, "FCITX " VERSION " -- Get Signal No.: "); _write_buffer(fd, &buffer); _write_string(fd, "\n"); /* print time info */ time_t t = time(NULL); BufferReset(&buffer); BufferAppendUInt64(&buffer, t, 10); _write_string(fd, "Date: try \"date -d @"); _write_buffer(fd, &buffer); _write_string(fd, "\" if you are using GNU date ***\n"); /* print process info */ BufferReset(&buffer); BufferAppendUInt64(&buffer, getpid(), 10); _write_string(fd, "ProcessID: "); _write_buffer(fd, &buffer); _write_string(fd, "\n"); #if defined(ENABLE_BACKTRACE) #define BACKTRACE_SIZE 32 void *array[BACKTRACE_SIZE] = { NULL, }; int size = backtrace(array, BACKTRACE_SIZE); backtrace_symbols_fd(array, size, STDERR_FILENO); if (fd >= 0) backtrace_symbols_fd(array, size, fd); #endif if (fd >= 0) close(fd); switch (signo) { case SIGABRT: case SIGSEGV: case SIGBUS: case SIGILL: case SIGFPE: exit(1); break; default: { if (!instance || !instance->initialized) { exit(1); break; } uint8_t sig = 0; if (signo < 0xff) sig = (uint8_t)(signo & 0xff); write(selfpipe[1], &sig, 1); signal(signo, OnException); } break; } }