+ return is_str_user_missing (mv, s) ? MV_USER : 0;
+}
+
+/* Like mv_is_value_missing(), this tests whether V is a missing value in MV.
+ It supports the uncommon case where V and MV might have different widths:
+ the caller must specify VW, the width of V. MV and VW must be both numeric
+ or both string.
+
+ Comparison of strings of different width is done by conceptually extending
+ both strings to infinite width by appending spaces. */
+enum mv_class
+mv_is_value_missing_varwidth (const struct missing_values *mv,
+ const union value *v, int vw)
+{
+ int mvw = mv->width;
+ if (mvw == vw)
+ return mv_is_value_missing (mv, v);
+
+ /* Make sure they're both strings. */
+ assert (mvw && vw);
+ if (mv->type == MVT_NONE)
+ return false;
+
+ for (int i = 0; i < mv->type; i++)
+ if (!buf_compare_rpad (CHAR_CAST_BUG (const char *, mv->values[i].s), mvw,
+ CHAR_CAST_BUG (const char *, v->s), vw))
+ return MV_USER;
+ return 0;