+ else
+ has_decimals = false;
+
+ /* Check pieces. */
+ if (ss_is_empty (type_ss) || ss_length (type_ss) > FMT_TYPE_LEN_MAX)
+ goto error;
+ if (has_decimals && ss_is_empty (decimals_ss))
+ goto error;
+ if (!ss_is_empty (s))
+ goto error;
+
+ /* Return pieces.
+ These uses of strtol are valid only because we know that
+ their substrings are followed by non-digit characters. */
+ str_copy_buf_trunc (type, FMT_TYPE_LEN_MAX + 1,
+ ss_data (type_ss), ss_length (type_ss));
+ *width = strtol (ss_data (width_ss), NULL, 10);
+ *decimals = has_decimals ? strtol (ss_data (decimals_ss), NULL, 10) : 0;
+
+ lex_get (lexer);
+ return true;
+
+ error:
+ lex_error (lexer, _("expecting valid format specifier"));
+ return false;