1 syntax = "proto2"; 2 package protobuf_mutator.xml; 3 4 // Simplified definition of XML formant according https://www.w3.org/TR/xml/ 5 // Not all features are implemented and some rules are flattened. 6 7 // There are no required fields to allow backward compatibility with older 8 // corpus. 9 10 // document ::= prolog element Misc* 11 // prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? 12 // XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' 13 // doctypedecl ::= 14 // '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>' 15 message Document { 16 // XMLDecl 17 optional string version = 1; 18 optional string encoding = 2; 19 optional bool standalone = 3; 20 21 repeated Misk misk1 = 4; 22 optional DoctypeDecl doctype = 5; 23 optional Element element = 6; 24 repeated Misk misk2 = 7; 25 } 26 27 message DoctypeDecl { 28 optional string name = 1; 29 optional string external_id = 2; 30 optional string int_subset = 3; 31 repeated Misk misk = 4; 32 } 33 34 message Misk { 35 oneof _ { 36 Pi pi = 1; 37 string comment = 2; 38 } 39 } 40 41 // element ::= EmptyElemTag | STag content ETag 42 message Element { 43 optional Tag tag = 1; 44 // Use EmptyElemTag tag if missing, or STag and ETag otherwise. 45 repeated Content content = 2; 46 } 47 48 // EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' 49 // STag ::= '<' Name (S Attribute)* S? '>' 50 // ETag ::= '</' Name S? '>' 51 message Tag { 52 optional string name = 1; 53 repeated Attribute attribute = 2; 54 } 55 56 message Reference { 57 optional string name = 1; 58 optional bool entry = 2; 59 } 60 61 message Pi { 62 optional string target = 1; 63 optional string data = 2; 64 } 65 66 // content ::= 67 // CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* 68 message Content { 69 oneof _ { 70 string char_data = 1; 71 Element element = 2; 72 Reference reference = 3; 73 string cdsect = 4; 74 Misk misk = 5; 75 } 76 } 77 78 // Attribute ::= Name Eq AttValue 79 message Attribute { 80 optional string name = 1; 81 optional string value = 2; 82 } 83 84 message Input { 85 optional Document document = 1; 86 87 // Option will be sent into libxml2 parser. 88 // TODO(vitalybuka): Use proto extension. Options is libxml2 specific, 89 // other libs may need different data. At the moment mutator does not support 90 // extensions. 91 optional uint32 options = 2; 92 } 93