#ifndef SRL_PROTOCOL_H_ #define SRL_PROTOCOL_H_ /* =for autoupdater start Tag | Char | Dec | Hex | Binary | Follow ------------------+------+-----+------+----------- |----------------------------------------- POS_0 | | 0 | 0x00 | 0b00000000 | small positive integer - value in low 4 bits (identity) POS_1 | | 1 | 0x01 | 0b00000001 | POS_2 | | 2 | 0x02 | 0b00000010 | POS_3 | | 3 | 0x03 | 0b00000011 | POS_4 | | 4 | 0x04 | 0b00000100 | POS_5 | | 5 | 0x05 | 0b00000101 | POS_6 | | 6 | 0x06 | 0b00000110 | POS_7 | "\a" | 7 | 0x07 | 0b00000111 | POS_8 | "\b" | 8 | 0x08 | 0b00001000 | POS_9 | "\t" | 9 | 0x09 | 0b00001001 | POS_10 | "\n" | 10 | 0x0a | 0b00001010 | POS_11 | | 11 | 0x0b | 0b00001011 | POS_12 | "\f" | 12 | 0x0c | 0b00001100 | POS_13 | "\r" | 13 | 0x0d | 0b00001101 | POS_14 | | 14 | 0x0e | 0b00001110 | POS_15 | | 15 | 0x0f | 0b00001111 | small positive integer - value in low 4 bits (identity) NEG_16 | | 16 | 0x10 | 0b00010000 | small negative integer - value in low 4 bits (k+32) NEG_15 | | 17 | 0x11 | 0b00010001 | NEG_14 | | 18 | 0x12 | 0b00010010 | NEG_13 | | 19 | 0x13 | 0b00010011 | NEG_12 | | 20 | 0x14 | 0b00010100 | NEG_11 | | 21 | 0x15 | 0b00010101 | NEG_10 | | 22 | 0x16 | 0b00010110 | NEG_9 | | 23 | 0x17 | 0b00010111 | NEG_8 | | 24 | 0x18 | 0b00011000 | NEG_7 | | 25 | 0x19 | 0b00011001 | NEG_6 | | 26 | 0x1a | 0b00011010 | NEG_5 | "\e" | 27 | 0x1b | 0b00011011 | NEG_4 | | 28 | 0x1c | 0b00011100 | NEG_3 | | 29 | 0x1d | 0b00011101 | NEG_2 | | 30 | 0x1e | 0b00011110 | NEG_1 | | 31 | 0x1f | 0b00011111 | small negative integer - value in low 4 bits (k+32) VARINT | " " | 32 | 0x20 | 0b00100000 | - Varint variable length integer ZIGZAG | "!" | 33 | 0x21 | 0b00100001 | - Zigzag variable length integer FLOAT | "\"" | 34 | 0x22 | 0b00100010 | DOUBLE | "#" | 35 | 0x23 | 0b00100011 | LONG_DOUBLE | "\$" | 36 | 0x24 | 0b00100100 | UNDEF | "%" | 37 | 0x25 | 0b00100101 | None - Perl undef BINARY | "&" | 38 | 0x26 | 0b00100110 | - binary/(latin1) string STR_UTF8 | "'" | 39 | 0x27 | 0b00100111 | - utf8 string REFN | "(" | 40 | 0x28 | 0b00101000 | - ref to next item REFP | ")" | 41 | 0x29 | 0b00101001 | - ref to previous item stored at offset HASH | "*" | 42 | 0x2a | 0b00101010 | [ ...] - count followed by key/value pairs ARRAY | "+" | 43 | 0x2b | 0b00101011 | [ ...] - count followed by items OBJECT | "," | 44 | 0x2c | 0b00101100 | - class, object-item OBJECTV | "-" | 45 | 0x2d | 0b00101101 | - offset of previously used classname tag - object-item ALIAS | "." | 46 | 0x2e | 0b00101110 | - alias to item defined at offset COPY | "/" | 47 | 0x2f | 0b00101111 | - copy of item defined at offset WEAKEN | "0" | 48 | 0x30 | 0b00110000 | - Weaken the following reference REGEXP | "1" | 49 | 0x31 | 0b00110001 | RESERVED_0 | "2" | 50 | 0x32 | 0b00110010 | reserved RESERVED_1 | "3" | 51 | 0x33 | 0b00110011 | RESERVED_2 | "4" | 52 | 0x34 | 0b00110100 | RESERVED_3 | "5" | 53 | 0x35 | 0b00110101 | RESERVED_4 | "6" | 54 | 0x36 | 0b00110110 | RESERVED_5 | "7" | 55 | 0x37 | 0b00110111 | RESERVED_6 | "8" | 56 | 0x38 | 0b00111000 | RESERVED_7 | "9" | 57 | 0x39 | 0b00111001 | reserved FALSE | ":" | 58 | 0x3a | 0b00111010 | false (PL_sv_no) TRUE | ";" | 59 | 0x3b | 0b00111011 | true (PL_sv_yes) MANY | "<" | 60 | 0x3c | 0b00111100 | - repeated tag (not done yet, will be implemented in version 2) PACKET_START | "=" | 61 | 0x3d | 0b00111101 | (first byte of magic string in header) EXTEND | ">" | 62 | 0x3e | 0b00111110 | - for additional tags PAD | "?" | 63 | 0x3f | 0b00111111 | (ignored tag, skip to next byte) ARRAYREF_0 | "\@" | 64 | 0x40 | 0b01000000 | [ ...] - count of items in low 4 bits (ARRAY must be refcnt=1) ARRAYREF_1 | "A" | 65 | 0x41 | 0b01000001 | ARRAYREF_2 | "B" | 66 | 0x42 | 0b01000010 | ARRAYREF_3 | "C" | 67 | 0x43 | 0b01000011 | ARRAYREF_4 | "D" | 68 | 0x44 | 0b01000100 | ARRAYREF_5 | "E" | 69 | 0x45 | 0b01000101 | ARRAYREF_6 | "F" | 70 | 0x46 | 0b01000110 | ARRAYREF_7 | "G" | 71 | 0x47 | 0b01000111 | ARRAYREF_8 | "H" | 72 | 0x48 | 0b01001000 | ARRAYREF_9 | "I" | 73 | 0x49 | 0b01001001 | ARRAYREF_10 | "J" | 74 | 0x4a | 0b01001010 | ARRAYREF_11 | "K" | 75 | 0x4b | 0b01001011 | ARRAYREF_12 | "L" | 76 | 0x4c | 0b01001100 | ARRAYREF_13 | "M" | 77 | 0x4d | 0b01001101 | ARRAYREF_14 | "N" | 78 | 0x4e | 0b01001110 | ARRAYREF_15 | "O" | 79 | 0x4f | 0b01001111 | [ ...] - count of items in low 4 bits (ARRAY must be refcnt=1) HASHREF_0 | "P" | 80 | 0x50 | 0b01010000 | [ ...] - count in low 4 bits, key/value pairs (HASH must be refcnt=1) HASHREF_1 | "Q" | 81 | 0x51 | 0b01010001 | HASHREF_2 | "R" | 82 | 0x52 | 0b01010010 | HASHREF_3 | "S" | 83 | 0x53 | 0b01010011 | HASHREF_4 | "T" | 84 | 0x54 | 0b01010100 | HASHREF_5 | "U" | 85 | 0x55 | 0b01010101 | HASHREF_6 | "V" | 86 | 0x56 | 0b01010110 | HASHREF_7 | "W" | 87 | 0x57 | 0b01010111 | HASHREF_8 | "X" | 88 | 0x58 | 0b01011000 | HASHREF_9 | "Y" | 89 | 0x59 | 0b01011001 | HASHREF_10 | "Z" | 90 | 0x5a | 0b01011010 | HASHREF_11 | "[" | 91 | 0x5b | 0b01011011 | HASHREF_12 | "\\" | 92 | 0x5c | 0b01011100 | HASHREF_13 | "]" | 93 | 0x5d | 0b01011101 | HASHREF_14 | "^" | 94 | 0x5e | 0b01011110 | HASHREF_15 | "_" | 95 | 0x5f | 0b01011111 | [ ...] - count in low 4 bits, key/value pairs (HASH must be refcnt=1) SHORT_BINARY_0 | "`" | 96 | 0x60 | 0b01100000 | - binary/latin1 string, length encoded in low 5 bits of tag SHORT_BINARY_1 | "a" | 97 | 0x61 | 0b01100001 | SHORT_BINARY_2 | "b" | 98 | 0x62 | 0b01100010 | SHORT_BINARY_3 | "c" | 99 | 0x63 | 0b01100011 | SHORT_BINARY_4 | "d" | 100 | 0x64 | 0b01100100 | SHORT_BINARY_5 | "e" | 101 | 0x65 | 0b01100101 | SHORT_BINARY_6 | "f" | 102 | 0x66 | 0b01100110 | SHORT_BINARY_7 | "g" | 103 | 0x67 | 0b01100111 | SHORT_BINARY_8 | "h" | 104 | 0x68 | 0b01101000 | SHORT_BINARY_9 | "i" | 105 | 0x69 | 0b01101001 | SHORT_BINARY_10 | "j" | 106 | 0x6a | 0b01101010 | SHORT_BINARY_11 | "k" | 107 | 0x6b | 0b01101011 | SHORT_BINARY_12 | "l" | 108 | 0x6c | 0b01101100 | SHORT_BINARY_13 | "m" | 109 | 0x6d | 0b01101101 | SHORT_BINARY_14 | "n" | 110 | 0x6e | 0b01101110 | SHORT_BINARY_15 | "o" | 111 | 0x6f | 0b01101111 | SHORT_BINARY_16 | "p" | 112 | 0x70 | 0b01110000 | SHORT_BINARY_17 | "q" | 113 | 0x71 | 0b01110001 | SHORT_BINARY_18 | "r" | 114 | 0x72 | 0b01110010 | SHORT_BINARY_19 | "s" | 115 | 0x73 | 0b01110011 | SHORT_BINARY_20 | "t" | 116 | 0x74 | 0b01110100 | SHORT_BINARY_21 | "u" | 117 | 0x75 | 0b01110101 | SHORT_BINARY_22 | "v" | 118 | 0x76 | 0b01110110 | SHORT_BINARY_23 | "w" | 119 | 0x77 | 0b01110111 | SHORT_BINARY_24 | "x" | 120 | 0x78 | 0b01111000 | SHORT_BINARY_25 | "y" | 121 | 0x79 | 0b01111001 | SHORT_BINARY_26 | "z" | 122 | 0x7a | 0b01111010 | SHORT_BINARY_27 | "{" | 123 | 0x7b | 0b01111011 | SHORT_BINARY_28 | "|" | 124 | 0x7c | 0b01111100 | SHORT_BINARY_29 | "}" | 125 | 0x7d | 0b01111101 | SHORT_BINARY_30 | "~" | 126 | 0x7e | 0b01111110 | SHORT_BINARY_31 | | 127 | 0x7f | 0b01111111 | - binary/latin1 string, length encoded in low 5 bits of tag =for autoupdater stop */ /* magic string, protocol version and encoding information */ #define SRL_MAGIC_STRING "=srl" /* Magic string for header. Every packet starts with this */ #define SRL_MAGIC_STRING_LILIPUTIAN 0x6c72733d /* SRL_MAGIC_STRING as a little endian integer */ #define SRL_PROTOCOL_VERSION ( 1 ) /* this is the first. for some reason we did not use 0 */ #define SRL_PROTOCOL_VERSION_BITS ( 4 ) /* how many bits we use for the version, the rest go to the encoding */ #define SRL_PROTOCOL_VERSION_MASK ( ( 1 << SRL_PROTOCOL_VERSION_BITS ) - 1 ) #define SRL_PROTOCOL_ENCODING_MASK ( ~SRL_PROTOCOL_VERSION_MASK ) #define SRL_PROTOCOL_ENCODING_RAW ( 0 << SRL_PROTOCOL_VERSION_BITS ) #define SRL_PROTOCOL_ENCODING_SNAPPY ( 1 << SRL_PROTOCOL_VERSION_BITS ) #define SRL_PROTOCOL_ENCODING_SNAPPY_INCREMENTAL ( 2 << SRL_PROTOCOL_VERSION_BITS ) /* Useful constants */ /* See also range constants below for the header byte */ #define SRL_POS_MAX_SIZE 15 #define SRL_NEG_MIN_SIZE 16 /* All constants have the F bit (SRL_HDR_TRACK_FLAG) unset! */ /* _LOW and _HIGH versions refering to INCLUSIVE range boundaries */ #define SRL_HDR_POS ((char)0) /* small positive integer - value in low 4 bits (identity) */ #define SRL_HDR_POS_LOW ((char)0) /* small positive integer - value in low 4 bits (identity) */ #define SRL_HDR_POS_HIGH ((char)15) /* small positive integer - value in low 4 bits (identity) */ #define SRL_HDR_NEG ((char)16) /* small negative integer - value in low 4 bits (k+32) */ #define SRL_HDR_NEG_LOW ((char)16) /* small negative integer - value in low 4 bits (k+32) */ #define SRL_HDR_NEG_HIGH ((char)31) /* small negative integer - value in low 4 bits (k+32) */ #define SRL_HDR_VARINT ((char)32) /* - Varint variable length integer */ #define SRL_HDR_ZIGZAG ((char)33) /* - Zigzag variable length integer */ #define SRL_HDR_FLOAT ((char)34) /* */ #define SRL_HDR_DOUBLE ((char)35) /* */ #define SRL_HDR_LONG_DOUBLE ((char)36) /* */ #define SRL_HDR_UNDEF ((char)37) /* None - Perl undef */ #define SRL_HDR_BINARY ((char)38) /* - binary/(latin1) string */ #define SRL_HDR_STR_UTF8 ((char)39) /* - utf8 string */ #define SRL_HDR_REFN ((char)40) /* - ref to next item */ #define SRL_HDR_REFP ((char)41) /* - ref to previous item stored at offset */ #define SRL_HDR_HASH ((char)42) /* [ ...] - count followed by key/value pairs */ #define SRL_HDR_ARRAY ((char)43) /* [ ...] - count followed by items */ #define SRL_HDR_OBJECT ((char)44) /* - class, object-item */ #define SRL_HDR_OBJECTV ((char)45) /* - offset of previously used classname tag - object-item */ #define SRL_HDR_ALIAS ((char)46) /* - alias to item defined at offset */ #define SRL_HDR_COPY ((char)47) /* - copy of item defined at offset */ #define SRL_HDR_WEAKEN ((char)48) /* - Weaken the following reference */ #define SRL_HDR_REGEXP ((char)49) /* */ /* Note: Can do reserved check with a range now, but as we start using * them, might have to explicit == check later. */ #define SRL_HDR_RESERVED ((char)50) /* reserved */ #define SRL_HDR_RESERVED_LOW ((char)50) #define SRL_HDR_RESERVED_HIGH ((char)57) #define SRL_HDR_FALSE ((char)58) /* false (PL_sv_no) */ #define SRL_HDR_TRUE ((char)59) /* true (PL_sv_yes) */ #define SRL_HDR_MANY ((char)60) /* - repeated tag (not done yet, will be implemented in version 2) */ #define SRL_HDR_PACKET_START ((char)61) /* (first byte of magic string in header) */ #define SRL_HDR_EXTEND ((char)62) /* - for additional tags */ #define SRL_HDR_PAD ((char)63) /* (ignored tag, skip to next byte) */ #define SRL_HDR_ARRAYREF ((char)64) /* [ ...] - count of items in low 4 bits (ARRAY must be refcnt=1)*/ #define SRL_MASK_ARRAYREF_COUNT ((char)15) /* mask to get low bits from tag */ #define SRL_HDR_ARRAYREF_LOW ((char)64) #define SRL_HDR_ARRAYREF_HIGH ((char)79) #define SRL_HDR_HASHREF ((char)80) /* [ ...] - count in low 4 bits, key/value pairs (HASH must be refcnt=1)*/ #define SRL_MASK_HASHREF_COUNT ((char)15) /* mask to get low bits from tag */ #define SRL_HDR_HASHREF_LOW ((char)80) #define SRL_HDR_HASHREF_HIGH ((char)95) #define SRL_HDR_SHORT_BINARY ((char)96) /* - binary/latin1 string, length encoded in low 5 bits of tag */ #define SRL_HDR_SHORT_BINARY_LOW ((char)96) #define SRL_HDR_SHORT_BINARY_HIGH ((char)127) #define SRL_MASK_SHORT_BINARY_LEN ((char)31) /* mask to get length of SRL_HDR_SHORT_BINARY type tags */ #define SRL_HDR_TRACK_FLAG ((char)128) /* if this bit is set track the item */ /* TODO */ #define SRL_SET_FBIT(where) ((where) |= SRL_HDR_TRACK_FLAG) #endif