/// Returns XML representation of string the TS Reader XML format. /// When possible matching http://www.tsreader.com/tsreader/text-export.html QString MPEGDescriptor::toStringXML(uint level) const { QString indent_0 = xml_indent(level); QString indent_1 = xml_indent(level+1); QString str; str += indent_0 + "<Descriptor>\n"; str += indent_1 + QString("<Tag>0x%1</Tag>\n") .arg(DescriptorTag(),2,16,QChar('0')); str += indent_1 + QString("<Description>%1</Description>\n") .arg(DescriptorTagString(),0,16); str += indent_1 + "<Data>"; for (uint i = 0; i < DescriptorLength(); i++) { if (((i%8) == 0) && i) str += "\n" + indent_1 + " "; str += QString("0x%1 ").arg(_data[i+2],2,16,QChar('0')); } str += "\n" + indent_1 + "</Data>\n"; str += indent_1 + "<Decoded>" + toString() + "</Decoded>\n"; str += indent_0 + "</Descriptor>"; return str; }
QString ModulationModeSubtable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + QString("<ModulationMode descriptors_count=\"%2\"") .arg(DescriptorsCount()); str += "\n" + indent_1; str += QString("transmission_system=\"%1\" transmission_system_desc=\"%2\"") .arg(TransmissionSystem()).arg(TransmissionSystemString()); str += "\n" + indent_1; str += QString("inner_coding_mode=\"%1\" inner_coding_mode_desc=\"%2\"") .arg(InnerCodingMode()).arg(InnerCodingModeString()); str += "\n" + indent_1; str += QString("split_bitstream_mode=\"%1\" ") .arg(xml_bool_to_string(SplitBitstreamMode())); str += QString("symbol_rate=\"%1\"").arg(SymbolRate()); vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(), DescriptorsLength()); if (desc.empty()) return str + " />"; str += ">\n"; for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</ModulationMode>"; }
QString CarrierDefinitionSubtable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + QString("<CarrierDefinition descriptors_count=\"%2\" ") .arg(DescriptorsCount()); str += QString("number_of_carriers=\"%1\"").arg(NumberOfCarriers()); str += "\n" + indent_1; str += QString("spacing_unit=\"%1\" spacing_unit_hz=\"%2\"") .arg(SpacingUnit()).arg(SpacingUnitHz()); str += "\n" + indent_1; str += QString("frequency_spacing=\"%1\" frequency_spacing_hz=\"%2\"") .arg(FrequencySpacing()).arg(FrequencySpacingHz()); str += "\n" + indent_1; str += QString("frequency_unit=\"%1\" frequency_unit_hz=\"%2\"") .arg(FrequencyUnit()).arg(FrequencyUnitHz()); str += "\n" + indent_1; str += QString("first_carrier_frequency=\"%1\" " "first_carrier_frequency_hz=\"%2\">\n") .arg(FirstCarrierFrequency()) .arg(FirstCarrierFrequencyHz()); vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(), DescriptorsLength()); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</CarrierDefinition>"; }
QString ShortVirtualChannelTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + QString("<ShortVirtualChannelSection vct_id=\"%1\" ").arg(ID()); str += QString("transmission_medium=\"%1\" ").arg(TransmissionMedium()); str += "\n" + indent_1; str += QString("table_subtype=\"%1\" table_subtype_desc=\"%2\"") .arg(TableSubtype()).arg(TableSubtypeString()); str += "\n" + indent_1 + PSIPTable::XMLValues(indent_level + 1) + ">\n"; if (kDefinedChannelsMap == TableSubtype()) str += DefinedChannelsMap().toStringXML(indent_level + 1) + "\n"; else if (kVirtualChannelMap == TableSubtype()) str += VirtualChannelMap().toStringXML(indent_level + 1) + "\n"; else if (kInverseChannelMap == TableSubtype()) str += InverseChannelMap().toStringXML(indent_level + 1) + "\n"; vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(), DescriptorsLength()); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</ShortVirtualChannelSection>"; }
QString SCTESystemTimeTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + QString("<SCTESystemTimeSection system_time=\"%1\" " "gps_utc_offset=\"%2\"\n%3utc_time_desc=\"%4\" psip=\"scte\"") .arg(SystemTimeRaw()).arg(GPSUTCOffset()) .arg(indent_1) .arg(SystemTimeUTC().toString(Qt::ISODate)); if (!DescriptorsLength()) return str + " />"; str += ">\n"; vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(), DescriptorsLength()); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</SCTESystemTimeSection>"; }
QString SCTENetworkInformationTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + "<SCTENetworkInformationSection psip=\"scte\" "; str += QString("transmission_medium=\"%1\" ").arg(TransmissionMedium()); str += QString("first_index=\"%1\" ").arg(FirstIndex()); str += "\n" + indent_1; str += QString("number_of_records=\"%1\" ").arg(NumberOfRecords()); str += QString("table_subtype=\"%1\"").arg(TableSubtype()); str += PSIPTable::XMLValues(indent_level + 1) + ">\n"; if (kCarrierDefinitionSubtable == TableSubtype()) { for (uint i = 0; i < NumberOfRecords(); i++) str += CarrierDefinition(i).toStringXML(indent_level + 1) + "\n"; } else if (kModulationModeSubtable == TableSubtype()) { for (uint i = 0; i < NumberOfRecords(); i++) str += ModulationMode(i).toStringXML(indent_level + 1) + "\n"; } vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(), DescriptorsLength()); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</SCTENetworkInformationSection>"; }
QString MasterGuideTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString indent_2 = xml_indent(indent_level + 2); QString str = QString("%1<MasterGuideSection table_count=\"%2\" " "global_descriptors_length=\"%3\"\n%4%5>\n") .arg(indent_0) .arg(TableCount()) .arg(GlobalDescriptorsLength()) .arg(indent_1) .arg(PSIPTable::XMLValues(indent_level + 1)); vector<const unsigned char*> gdesc = MPEGDescriptor::Parse(GlobalDescriptors(), GlobalDescriptorsLength()); for (uint i = 0; i < gdesc.size(); i++) { str += MPEGDescriptor(gdesc[i], 300) .toStringXML(indent_level + 1) + "\n"; } if (_ptrs.size() < TableCount()) LOG(VB_GENERAL, LOG_ERR, "MasterGuideTable::toStringXML(): Table count mismatch"); for (uint i = 0; i < TableCount() && i < _ptrs.size(); i++) { str += QString( "%1<Table pid=\"0x%2\" version=\"%3\"" "\n%4type=\"0x%5\" type_desc=\"%6\"" "\n%7number_bytes=\"%8\" table_descriptors_length=\"%9\"") .arg(indent_1) .arg(TablePID(i),4,16,QChar('0')) .arg(TableVersion(i)) .arg(indent_1) .arg(TableType(i),4,16,QChar('0')) .arg(TableClassString(i)) .arg(indent_2) .arg(TableDescriptorsBytes(i)) .arg(TableDescriptorsLength(i)); vector<const unsigned char*> desc = MPEGDescriptor::Parse( TableDescriptors(i), TableDescriptorsLength(i)); str += (desc.empty()) ? " />\n" : ">\n"; for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 2) + "\n"; } if (!desc.empty()) str += indent_1 + "</Table>\n"; } return str + "</MasterGuideSection>"; }
void fz_debug_xml(fz_xml *item, int level) { if (item->text) { char *s = item->text; int c; xml_indent(level); putchar('"'); while ((c = *s++)) { switch (c) { default: if (c < 32 || c > 127) { putchar('\\'); putchar('0' + ((c >> 6) & 7)); putchar('0' + ((c >> 3) & 7)); putchar('0' + ((c) & 7)); } else { putchar(c); } break; case '\\': putchar('\\'); putchar('\\'); break; case '\b': putchar('\\'); putchar('b'); break; case '\f': putchar('\\'); putchar('f'); break; case '\n': putchar('\\'); putchar('n'); break; case '\r': putchar('\\'); putchar('r'); break; case '\t': putchar('\\'); putchar('t'); break; }
void xml_puts (FILE *out, int level, char const *s) { xml_indent (out, level); fputs (s, out); fputc ('\n', out); }
int xml_textnode( DumpContext * context, const char * tagname, const char * format, ... ) { va_list ap; int written = 0, len; written = xml_indent( context ); len = append_string( context->output, "<%N>", tagname ); if ( len < 0 ) return len; written += len; va_start( ap, format ); char * tmp; len = vasprintf( &tmp, format, ap ); va_end( ap ); if ( len < 0 ) return len; len = append_string( context->output, "%M", tmp ); free( tmp ); if ( len < 0 ) return len; written += len; len = append_string( context->output, "</%N>\n", tagname ); if ( len < 0 ) return len; written += len; return written; }
QString InverseChannelMapSubtable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + "<InverseChannelMap "; str += QString("first_map_index=\"%1\" ") .arg(FirstMapIndex()); str += QString("record_count=\"%1\">\n") .arg(RecordCount()); for (uint i = 0; i < RecordCount(); i++) { str += indent_1 + QString("<Map source_id=\"%1\" " "virtual_channel_number=\"%2\" />\n") .arg(SourceID(i)).arg(VirtualChannelNumber(i)); } return str + indent_0 + "</InverseChannelMap>"; }
/* Display XML data from the result if any */ static void search_set_xml_metadata(const record_t *rc) { char *indented; indented = (rc && rc->xml) ? xml_indent(rc->xml) : NULL; set_text_buffer(gui_main_window_lookup("text_result_info_xml"), EMPTY_STRING(indented)); HFREE_NULL(indented); }
QString SystemTimeTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); return QString( "%1<SystemTimeSection system_time=\"%2\" system_time_iso=\"%3\"" "\n%4in_dst=\"%5\" dst_start_day=\"%6\" dst_start_hour=\"%7\"" "\n%8%9 />") .arg(indent_0) .arg(GPSRaw()) .arg(SystemTimeGPS().toString(Qt::ISODate)) .arg(indent_1) .arg(xml_bool_to_string(InDaylightSavingsTime())) .arg(DayDaylightSavingsStarts()) /* day-of-month */ .arg(HourDaylightSavingsStarts()) .arg(indent_1) .arg(PSIPTable::XMLValues(indent_level + 1)); }
QString VirtualChannelTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString indent_2 = xml_indent(indent_level + 2); QString section_name = QString("%1VirtualChannelSection") .arg((TableID::TVCT == TableID()) ? "Terrestrial" : "Cable"); QString mapid; if (TableID::CVCT == TableID()) { uint sctemapid = (pesdata()[3]<<8) | pesdata()[4]; mapid = QString(" mapid=\"0x%1\"").arg(sctemapid,4,16,QChar('0')); } QString str = QString("%1<%2 tsid=\"0x%3\" channel_count=\"%4\"" "\n%5global_descriptors_length=\"%6\"%7" "\n%8%9>\n") .arg(indent_0) .arg(section_name) .arg(TransportStreamID(),4,16,QChar('0')) .arg(ChannelCount()) .arg(indent_1) .arg(GlobalDescriptorsLength()) .arg(mapid) .arg(indent_1) .arg(PSIPTable::XMLValues(indent_level + 1)); vector<const unsigned char*> gdesc = MPEGDescriptor::Parse(GlobalDescriptors(), GlobalDescriptorsLength()); for (uint i = 0; i < gdesc.size(); i++) { str += MPEGDescriptor(gdesc[i], 300) .toStringXML(indent_level + 1) + "\n"; } for (uint i = 0; i < ChannelCount(); i++) str += ChannelStringXML(indent_level + 1, i) + "\n"; return str + indent_0 + QString("</%1>").arg(section_name); }
int main() { if (!sql_database("sah2b@sci_master_tcp")) exit(1); std::cout << "<receiver_array>\n"; std::cout << xml_indent() << "<row_count>" << input.count() << "</row_count>\n" ; if (input.open_query()) { while (input.get_next()) { std::cout << input.print_xml(); } } std::cout << "</receiver_array>\n"; }
QString DefinedChannelsMapSubtable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + "<DefinedChannelsMap "; str += QString("first_virtual_channel=\"%1\" ") .arg(FirstVirtualChannel()); str += QString("dcm_data_length=\"%1\">\n") .arg(DCMDataLength()); for (uint i = 0; i < DCMDataLength(); i++) { str += indent_1 + QString("<Range range_defined=\"%1\"%2 " "channels_count=\"%3\" />\n") .arg(xml_bool_to_string(RangeDefined(i))) .arg(RangeDefined(i) ? " " : "") .arg(ChannelsCount(i)); } return str + indent_0 + "</DefinedChannelsMap>"; }
QString VirtualChannelTable::ChannelStringXML( uint indent_level, uint chan) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = QString("%1<Channel %2\n%3descriptors_length=\"%4\">\n") .arg(indent_0) .arg(XMLChannelValues(indent_level + 1, chan)) .arg(indent_1) .arg(DescriptorsLength(chan)); vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(chan), DescriptorsLength(chan)); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</Channel>"; }
void xml_printf (FILE *out, int level, char const *fmt, ...) { va_list arglist; xml_indent (out, level); va_start (arglist, fmt); vfprintf (out, fmt, arglist); va_end (arglist); fputc ('\n', out); }
int xml_tag_open( DumpContext * context, const char * tagname ) { int written = 0, len; written = xml_indent( context ); len = append_string( context->output, "<%N>\n", tagname ); if ( len < 0 ) return len; written += len; context->indent++; return written; }
QString NetworkTextTable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString str = indent_0 + "<NetworkTextSection "; str += QString("iso_639_language_code=\"%1\" ").arg(LanguageString()); str += QString("transmission_medium=\"%1\" ").arg(TransmissionMedium()); str += QString("table_subtype=\"%1\"").arg(TableSubtype()); return str + " />"; /* str += ">\n"; vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(), DescriptorsLength()); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 1) + "\n"; } return str + indent_0 + "</NetworkTextSection>"; */ }
static void print_grammar (FILE *out, int level) { symbol_number i; fputc ('\n', out); xml_puts (out, level, "<grammar>"); grammar_rules_print_xml (out, level); /* Terminals */ xml_puts (out, level + 1, "<terminals>"); for (i = 0; i < max_user_token_number + 1; i++) if (token_translations[i] != undeftoken->number) { char const *tag = symbols[token_translations[i]]->tag; int precedence = symbols[token_translations[i]]->prec; assoc associativity = symbols[token_translations[i]]->assoc; xml_indent (out, level + 2); fprintf (out, "<terminal symbol-number=\"%d\" token-number=\"%d\"" " name=\"%s\" usefulness=\"%s\"", token_translations[i], i, xml_escape (tag), reduce_token_unused_in_grammar (token_translations[i]) ? "unused-in-grammar" : "useful"); if (precedence) fprintf (out, " prec=\"%d\"", precedence); if (associativity != undef_assoc) fprintf (out, " assoc=\"%s\"", assoc_to_string (associativity) + 1); fputs ("/>\n", out); } xml_puts (out, level + 1, "</terminals>"); /* Nonterminals */ xml_puts (out, level + 1, "<nonterminals>"); for (i = ntokens; i < nsyms + nuseless_nonterminals; i++) { char const *tag = symbols[i]->tag; xml_printf (out, level + 2, "<nonterminal symbol-number=\"%d\" name=\"%s\"" " usefulness=\"%s\"/>", i, xml_escape (tag), reduce_nonterminal_useless_in_grammar (i) ? "useless-in-grammar" : "useful"); } xml_puts (out, level + 1, "</nonterminals>"); xml_puts (out, level, "</grammar>"); }
QString VirtualChannelTable::XMLChannelValues( uint indent_level, uint chan) const { QString indent_0 = xml_indent(indent_level); QString str; str += QString("short_channel_name=\"%1\" ").arg(ShortChannelName(chan)); str += "\n" + indent_0; str += QString("modulation=\"0x%1\" modulation_desc=\"%2\" ") .arg(ModulationMode(chan),2,16,QChar('0')) .arg(ModulationModeString(chan)); str += QString("channel_tsid=\"0x%1\"") .arg(ChannelTransportStreamID(chan),4,16,QChar('0')); str += "\n" + indent_0; str += QString("program_number=\"%1\" ").arg(ProgramNumber(chan)); str += QString("etm_location=\"%1\" ").arg(ETMlocation(chan)); str += QString("access_controlled=\"%1\"") .arg(xml_bool_to_string(IsAccessControlled(chan))); str += "\n" + indent_0; str += QString("hidden=\"%1\" ") .arg(xml_bool_to_string(IsHidden(chan))); str += QString("hide_guide=\"%1\"") .arg(xml_bool_to_string(IsHiddenInGuide(chan))); str += "\n" + indent_0; str += QString("service_type=\"0x%1\" service_type_desc=\"%2\"") .arg(ServiceType(chan),2,16,QChar('0')) .arg(ServiceTypeString(chan)); str += "\n" + indent_0; str += QString("source_id=\"0x%1\"") .arg(SourceID(chan),4,16,QChar('0')); return str; }
int xml_tag( DumpContext * context, const char * tagname, ... ) { va_list ap; int written = 0, len; written = xml_indent( context ); len = append_string( context->output, "<%N", tagname ); if ( len < 0 ) return len; written += len; va_start( ap, tagname ); len = xml_attributes( context, ap ); va_end( ap ); if ( len < 0 ) return len; written += len; len = append_string( context->output, "/>\n" ); if ( len < 0 ) return len; written += len; return written; }
QString VirtualChannelMapSubtable::toStringXML(uint indent_level) const { QString indent_0 = xml_indent(indent_level); QString indent_1 = xml_indent(indent_level + 1); QString indent_2 = xml_indent(indent_level + 2); QString str = indent_0 + "<DefinedChannelsMap "; str += QString("number_of_vc_records=\"%1\"") .arg(NumberOfVCRecords()); str += "\n" + indent_1; str += QString("descriptors_included=\"%1\" ") .arg(xml_bool_to_string(DescriptorsIncluded())); str += QString("splice=\"%1\" ") .arg(xml_bool_to_string(Splice())); str += "\n" + indent_1; str += QString("activation_time=\"%1\" actication_time_desc=\"%2\"") .arg(ActivationTimeRaw()) .arg(ActivationTimeUTC().toString(Qt::ISODate)); str += ">\n"; for (uint i = 0; i < NumberOfVCRecords(); i++) { str += indent_1 + "<Channel "; str += QString("virtual_channel_number=\"%1\" ") .arg(VirtualChannelNumber(i)); str += "\n" + indent_2; str += QString("application_virtual_channel=\"%1\" ") .arg(xml_bool_to_string(ApplicationVirtualChannel(i))); str += QString("path_select=\"%1\" ").arg(PathSelect(i)); str += "\n" + indent_2; str += QString("transport_type=\"%1\" transport_type_desc=\"%2\" ") .arg(TransportType(i)).arg(TransportTypeString(i)); str += "\n" + indent_2; str += QString("channel_type=\"%1\" channel_type_desc=\"%2\" ") .arg(ChannelType(i)).arg(ChannelTypeString(i)); if (ApplicationVirtualChannel(i)) str += QString("application_id=\"%1\" ").arg(ApplicationID(i)); else str += QString("source_id=\"%1\" ").arg(SourceID(i)); str += "\n" + indent_2; if (kMPEG2Transport == TransportType(i)) { str += QString("cds_reference=\"%1\" ").arg(CDSReference(i)); str += QString("program_number=\"%1\" ").arg(ProgramNumber(i)); str += QString("mms_reference=\"%1\" ").arg(MMSReference(i)); } else { str += QString("cds_reference=\"%1\" ").arg(CDSReference(i)); str += QString("scrampled=\"%1\" ").arg(Scrambled(i)); str += "\n" + indent_2; str += QString("video_standard=\"%1\" video_standard_desc=\"%2\" ") .arg(VideoStandard(i)).arg(VideoStandardString(i)); } if (!DescriptorsIncluded()) { str += "/>\n"; continue; } str += "\n" + indent_2; str += QString("descriptors_count=\"%1\"").arg(DescriptorsCount(i)); str += ">\n"; vector<const unsigned char*> desc = MPEGDescriptor::Parse(Descriptors(i), DescriptorsLength(i)); for (uint i = 0; i < desc.size(); i++) { str += MPEGDescriptor(desc[i], 300) .toStringXML(indent_level + 2) + "\n"; } str += indent_1 + "</Channel>"; } return str + indent_0 + "</DefinedChannelsMap>"; }
written = xml_indent( context ); len = append_string( context->output, "<%N>\n", tagname ); if ( len < 0 ) return len; written += len; context->indent++; return written; } int xml_tag_open_namespace( DumpContext * context, const char * tagname, const char * namespace ) { int written = 0, len; written = xml_indent( context ); len = append_string( context->output, "<%N xmlns=\"%N\">\n", tagname, namespace ); if ( len < 0 ) return len; written += len; context->indent++; return written; } int xml_attributes( DumpContext * context, va_list ap ) { int written = 0, len; char *attribute, *format, *tmp; while( 1 ) {
void xmlr_listdir(struct _info **dir, char *d, int *dt, int *ft, u_long lev) { char *path; long pathsize = 0; struct _info **sav = dir; bool nlf = FALSE; int mt, t; if (dir == NULL) return; dirs[lev] = 1; if (!*(dir+1)) dirs[lev] = 2; fprintf(outfile,"\n"); path = malloc(pathsize=4096); while(*dir) { if (!noindent) xml_indent(lev); if ((*dir)->lnk) mt = (*dir)->mode & S_IFMT; else mt = (*dir)->mode & S_IFMT; for(t=0;ifmt[t];t++) if (ifmt[t] == mt) break; fprintf(outfile,"<%s", ftype[t]); if (fflag) { if (sizeof(char) * (strlen(d)+strlen((*dir)->name)+2) > pathsize) path=xrealloc(path,pathsize=(sizeof(char) * (strlen(d)+strlen((*dir)->name)+1024))); if (!strcmp(d,"/")) sprintf(path,"%s%s",d,(*dir)->name); else sprintf(path,"%s/%s",d,(*dir)->name); } else { if (sizeof(char) * (strlen((*dir)->name)+1) > pathsize) path=xrealloc(path,pathsize=(sizeof(char) * (strlen((*dir)->name)+1024))); sprintf(path,"%s",(*dir)->name); } fprintf(outfile, " name=\""); html_encode(outfile,path); fputc('"',outfile); if ((*dir)->lnk) { fprintf(outfile, " target=\""); html_encode(outfile,(*dir)->lnk); fputc('"',outfile); } xml_fillinfo(*dir); if (mt != S_IFDIR && mt != S_IFLNK && (*dir)->err == NULL) fprintf(outfile,"/>"); else fputc('>',outfile); if ((*dir)->err) { fprintf(outfile,"<error>%s</error>", (*dir)->err); free((*dir)->err); (*dir)->err = NULL; } if ((*dir)->child) { if (fflag) { if (strlen(d)+strlen((*dir)->name)+2 > pathsize) path=xrealloc(path,pathsize=(strlen(d)+strlen((*dir)->name)+1024)); if (!strcmp(d,"/")) sprintf(path,"%s%s",d,(*dir)->name); else sprintf(path,"%s/%s",d,(*dir)->name); } xmlr_listdir((*dir)->child, fflag? path : NULL, dt, ft, lev+1); nlf = TRUE; *dt += 1; } else { if ((*dir)->isdir) *dt += 1; else *ft += 1; } if (*(dir+1) && !*(dir+2)) dirs[lev] = 2; if (nlf) { nlf = FALSE; if (!noindent) xml_indent(lev); } if (mt == S_IFDIR || mt == S_IFLNK || (*dir)->err != NULL) fprintf(outfile,"</%s>\n",ftype[t]); else putc('\n',outfile); dir++; } dirs[lev] = 0; free(path); free_dir(sav); }
off_t xml_listdir(char *d, int *dt, int *ft, u_long lev, dev_t dev) { char *path; bool nlf = FALSE; long pathsize = 0; struct _info **dir, **sav; struct stat sb; int t, n, mt; if ((Level >= 0) && (lev > Level)) { if (!noindent) fputc('\n',outfile); return 0; } if (xdev && lev == 0) { stat(d,&sb); dev = sb.st_dev; } sav = dir = read_dir(d,&n); if (!dir && n) { fprintf(outfile,"<error>opening dir</error>\n"); return 0; } if (!n) { if (!noindent) fputc('\n', outfile); free_dir(sav); return 0; } if (flimit > 0 && n > flimit) { fprintf(outfile,"<error>%d entries exceeds filelimit, not opening dir</error>%s",n,noindent?"":"\n"); free_dir(sav); return 0; } if (cmpfunc) qsort(dir,n,sizeof(struct _info *), cmpfunc); if (lev >= maxdirs-1) { dirs = xrealloc(dirs,sizeof(int) * (maxdirs += 1024)); memset(dirs+(maxdirs-1024), 0, sizeof(int) * 1024); } dirs[lev] = 1; if (!*(dir+1)) dirs[lev] = 2; if (!noindent) fprintf(outfile,"\n"); path = malloc(pathsize=4096); while(*dir) { if (!noindent) xml_indent(lev); if ((*dir)->lnk) mt = (*dir)->mode & S_IFMT; else mt = (*dir)->mode & S_IFMT; for(t=0;ifmt[t];t++) if (ifmt[t] == mt) break; fprintf(outfile,"<%s", ftype[t]); if (fflag) { if (sizeof(char) * (strlen(d)+strlen((*dir)->name)+2) > pathsize) path=xrealloc(path,pathsize=(sizeof(char) * (strlen(d)+strlen((*dir)->name)+1024))); if (!strcmp(d,"/")) sprintf(path,"%s%s",d,(*dir)->name); else sprintf(path,"%s/%s",d,(*dir)->name); } else { if (sizeof(char) * (strlen((*dir)->name)+1) > pathsize) path=xrealloc(path,pathsize=(sizeof(char) * (strlen((*dir)->name)+1024))); sprintf(path,"%s",(*dir)->name); } fprintf(outfile, " name=\""); html_encode(outfile,path); fputc('"',outfile); if ((*dir)->lnk) { fprintf(outfile, " target=\""); html_encode(outfile,(*dir)->lnk); fputc('"',outfile); } xml_fillinfo(*dir); fputc('>',outfile); if ((*dir)->isdir) { if ((*dir)->lnk) { if (lflag && !(xdev && dev != (*dir)->dev)) { if (findino((*dir)->inode,(*dir)->dev)) { fprintf(outfile,"<error>recursive, not followed</error>"); } else { saveino((*dir)->inode, (*dir)->dev); if (*(*dir)->lnk == '/') listdir((*dir)->lnk,dt,ft,lev+1,dev); else { if (strlen(d)+strlen((*dir)->lnk)+2 > pathsize) path=xrealloc(path,pathsize=(strlen(d)+strlen((*dir)->name)+1024)); if (fflag && !strcmp(d,"/")) sprintf(path,"%s%s",d,(*dir)->lnk); else sprintf(path,"%s/%s",d,(*dir)->lnk); listdir(path,dt,ft,lev+1,dev); } nlf = TRUE; } } } else if (!(xdev && dev != (*dir)->dev)) { if (strlen(d)+strlen((*dir)->name)+2 > pathsize) path=xrealloc(path,pathsize=(strlen(d)+strlen((*dir)->name)+1024)); if (fflag && !strcmp(d,"/")) sprintf(path,"%s%s",d,(*dir)->name); else sprintf(path,"%s/%s",d,(*dir)->name); saveino((*dir)->inode, (*dir)->dev); listdir(path,dt,ft,lev+1,dev); nlf = TRUE; } *dt += 1; } else *ft += 1; if (*(dir+1) && !*(dir+2)) dirs[lev] = 2; if (nlf) { nlf = FALSE; if (!noindent) xml_indent(lev); } fprintf(outfile,"</%s>%s",ftype[t],noindent?"":"\n"); dir++; } dirs[lev] = 0; free(path); free_dir(sav); return 0; }