* commit '38c1466ca41c73c7ce347da702362cb69c151716': dict: add av_dict_parse_string() doc: support multitable in texi2pod Conflicts: doc/APIchanges libavutil/version.h
Unified · Split
| @@ -138,6 +138,10 @@ API changes, most recent first: · 137 unmodified lines | ||
| 138 | 138 | 2012-03-26 - a67d9cf - lavfi 2.66.100 |
| 139 | 139 | Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. |
| 140 | 140 | |
| 141 | +2013-xx-xx - xxxxxxx - lavu 52.7.0 - dict.h | |
| 142 | + Add av_dict_parse_string() to set multiple key/value pairs at once from a | |
| 143 | + string. | |
| 144 | + | |
| 141 | 145 | 2013-01-xx - xxxxxxx - lavu 52.6.0 - avstring.h |
| 142 | 146 | Add av_strnstr() |
| 143 | 147 | |
| @@ -169,7 +169,7 @@ INF: while(<$inf>) { · 168 unmodified lines | ||
| 169 | 169 | } elsif ($ended =~ /^(?:example|smallexample|display)$/) { |
| 170 | 170 | $shift = ""; |
| 171 | 171 | $_ = ""; # need a paragraph break |
| 172 | − } elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) { | |
| 172 | + } elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) { | |
| 173 | 173 | $_ = "\n=back\n"; |
| 174 | 174 | $ic = pop @icstack; |
| 175 | 175 | } else { |
| @@ -269,7 +269,7 @@ INF: while(<$inf>) { · 93 unmodified lines | ||
| 269 | 269 | $endw = "enumerate"; |
| 270 | 270 | }; |
| 271 | 271 | |
| 272 | − /^\@([fv]?table)\s+(\@[a-z]+)/ and do { | |
| 272 | + /^\@((?:multi|[fv])?table)\s+(\@[a-z]+)/ and do { | |
| 273 | 273 | push @endwstack, $endw; |
| 274 | 274 | push @icstack, $ic; |
| 275 | 275 | $endw = $1; |
| @@ -278,6 +278,7 @@ INF: while(<$inf>) { · 2 unmodified lines | ||
| 278 | 278 | $ic =~ s/\@(?:code|kbd)/C/; |
| 279 | 279 | $ic =~ s/\@(?:dfn|var|emph|cite|i)/I/; |
| 280 | 280 | $ic =~ s/\@(?:file)/F/; |
| 281 | + $ic =~ s/\@(?:columnfractions)//; | |
| 281 | 282 | $_ = "\n=over 4\n"; |
| 282 | 283 | }; |
| 283 | 284 | |
| @@ -288,6 +289,21 @@ INF: while(<$inf>) { · 4 unmodified lines | ||
| 288 | 289 | $_ = ""; # need a paragraph break |
| 289 | 290 | }; |
| 290 | 291 | |
| 292 | + /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do { | |
| 293 | + my $columns = $1; | |
| 294 | + $columns =~ s/\@tab/ : /; | |
| 295 | + | |
| 296 | + $_ = "\n=item B<". $columns .">\n"; | |
| 297 | + }; | |
| 298 | + | |
| 299 | + /^\@tab\s+(.*\S)\s*$/ and $endw eq "multitable" and do { | |
| 300 | + my $columns = $1; | |
| 301 | + $columns =~ s/\@tab/ : /; | |
| 302 | + | |
| 303 | + $_ = " : ". $columns; | |
| 304 | + $section =~ s/\n+\s+$//; | |
| 305 | + }; | |
| 306 | + | |
| 291 | 307 | /^\@itemx?\s*(.+)?$/ and do { |
| 292 | 308 | if (defined $1) { |
| 293 | 309 | # Entity escapes prevent munging by the <> processing below. |
| @@ -110,6 +110,53 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags · 109 unmodified lines | ||
| 110 | 110 | return 0; |
| 111 | 111 | } |
| 112 | 112 | |
| 113 | +static int parse_key_value_pair(AVDictionary **pm, const char **buf, | |
| 114 | + const char *key_val_sep, const char *pairs_sep, | |
| 115 | + int flags) | |
| 116 | +{ | |
| 117 | + char *key = av_get_token(buf, key_val_sep); | |
| 118 | + char *val = NULL; | |
| 119 | + int ret; | |
| 120 | + | |
| 121 | + if (key && *key && strspn(*buf, key_val_sep)) { | |
| 122 | + (*buf)++; | |
| 123 | + val = av_get_token(buf, pairs_sep); | |
| 124 | + } | |
| 125 | + | |
| 126 | + if (key && *key && val && *val) | |
| 127 | + ret = av_dict_set(pm, key, val, flags); | |
| 128 | + else | |
| 129 | + ret = AVERROR(EINVAL); | |
| 130 | + | |
| 131 | + av_freep(&key); | |
| 132 | + av_freep(&val); | |
| 133 | + | |
| 134 | + return ret; | |
| 135 | +} | |
| 136 | + | |
| 137 | +int av_dict_parse_string(AVDictionary **pm, const char *str, | |
| 138 | + const char *key_val_sep, const char *pairs_sep, | |
| 139 | + int flags) | |
| 140 | +{ | |
| 141 | + int ret; | |
| 142 | + | |
| 143 | + if (!str) | |
| 144 | + return 0; | |
| 145 | + | |
| 146 | + /* ignore STRDUP flags */ | |
| 147 | + flags &= ~(AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); | |
| 148 | + | |
| 149 | + while (*str) { | |
| 150 | + if ((ret = parse_key_value_pair(pm, &str, key_val_sep, pairs_sep, flags)) < 0) | |
| 151 | + return ret; | |
| 152 | + | |
| 153 | + if (*str) | |
| 154 | + str++; | |
| 155 | + } | |
| 156 | + | |
| 157 | + return 0; | |
| 158 | +} | |
| 159 | + | |
| 113 | 160 | void av_dict_free(AVDictionary **pm) |
| 114 | 161 | { |
| 115 | 162 | AVDictionary *m = *pm; |
| @@ -112,6 +112,23 @@ int av_dict_count(const AVDictionary *m); · 111 unmodified lines | ||
| 112 | 112 | */ |
| 113 | 113 | int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); |
| 114 | 114 | |
| 115 | +/** | |
| 116 | + * Parse the key/value pairs list and add to a dictionary. | |
| 117 | + * | |
| 118 | + * @param key_val_sep a 0-terminated list of characters used to separate | |
| 119 | + * key from value | |
| 120 | + * @param pairs_sep a 0-terminated list of characters used to separate | |
| 121 | + * two pairs from each other | |
| 122 | + * @param flags flags to use when adding to dictionary. | |
| 123 | + * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL | |
| 124 | + * are ignored since the key/value tokens will always | |
| 125 | + * be duplicated. | |
| 126 | + * @return 0 on success, negative AVERROR code on failure | |
| 127 | + */ | |
| 128 | +int av_dict_parse_string(AVDictionary **pm, const char *str, | |
| 129 | + const char *key_val_sep, const char *pairs_sep, | |
| 130 | + int flags); | |
| 131 | + | |
| 115 | 132 | /** |
| 116 | 133 | * Copy entries from one AVDictionary struct into another. |
| 117 | 134 | * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, |
| @@ -75,7 +75,7 @@ · 74 unmodified lines | ||
| 75 | 75 | */ |
| 76 | 76 | |
| 77 | 77 | #define LIBAVUTIL_VERSION_MAJOR 52 |
| 78 | −#define LIBAVUTIL_VERSION_MINOR 16 | |
| 78 | +#define LIBAVUTIL_VERSION_MINOR 17 | |
| 79 | 79 | #define LIBAVUTIL_VERSION_MICRO 100 |
| 80 | 80 | |
| 81 | 81 | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ |