diff options
| author | Paul Eggert | 2019-06-27 12:21:20 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-06-27 12:21:53 -0700 |
| commit | 3502d4c1b587057c2f5907997f74ae0a2e0d2a7d (patch) | |
| tree | 1fdccc581a3c80473ca0b67ccf44651bd6256c53 /src | |
| parent | a91bdeb131f75210d32243f0bdfa02d2af87ea44 (diff) | |
| download | emacs-3502d4c1b587057c2f5907997f74ae0a2e0d2a7d.tar.gz emacs-3502d4c1b587057c2f5907997f74ae0a2e0d2a7d.zip | |
Catch duplicate keywords in image specs
* src/image.c (struct image_keyword.count): Now bool, not int,
since it is either 0 or 1.
(parse_image_spec, xpm_image_p): Use bool for boolean.
(parse_image_spec): Fix a bug introduced in
2011-09-21T17:41:20!eggert@cs.ucla.edu that reported only
triplicate (or more) keywords, not duplicates.
Diffstat (limited to 'src')
| -rw-r--r-- | src/image.c | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/src/image.c b/src/image.c index 7b648c46ae9..e684aedb99f 100644 --- a/src/image.c +++ b/src/image.c | |||
| @@ -873,7 +873,7 @@ struct image_keyword | |||
| 873 | bool mandatory_p; | 873 | bool mandatory_p; |
| 874 | 874 | ||
| 875 | /* Used to recognize duplicate keywords in a property list. */ | 875 | /* Used to recognize duplicate keywords in a property list. */ |
| 876 | int count; | 876 | bool count; |
| 877 | 877 | ||
| 878 | /* The value that was found. */ | 878 | /* The value that was found. */ |
| 879 | Lisp_Object value; | 879 | Lisp_Object value; |
| @@ -894,7 +894,7 @@ parse_image_spec (Lisp_Object spec, struct image_keyword *keywords, | |||
| 894 | Lisp_Object plist; | 894 | Lisp_Object plist; |
| 895 | 895 | ||
| 896 | if (!IMAGEP (spec)) | 896 | if (!IMAGEP (spec)) |
| 897 | return 0; | 897 | return false; |
| 898 | 898 | ||
| 899 | plist = XCDR (spec); | 899 | plist = XCDR (spec); |
| 900 | while (CONSP (plist)) | 900 | while (CONSP (plist)) |
| @@ -905,11 +905,11 @@ parse_image_spec (Lisp_Object spec, struct image_keyword *keywords, | |||
| 905 | key = XCAR (plist); | 905 | key = XCAR (plist); |
| 906 | plist = XCDR (plist); | 906 | plist = XCDR (plist); |
| 907 | if (!SYMBOLP (key)) | 907 | if (!SYMBOLP (key)) |
| 908 | return 0; | 908 | return false; |
| 909 | 909 | ||
| 910 | /* There must follow a value. */ | 910 | /* There must follow a value. */ |
| 911 | if (!CONSP (plist)) | 911 | if (!CONSP (plist)) |
| 912 | return 0; | 912 | return false; |
| 913 | value = XCAR (plist); | 913 | value = XCAR (plist); |
| 914 | plist = XCDR (plist); | 914 | plist = XCDR (plist); |
| 915 | 915 | ||
| @@ -921,34 +921,34 @@ parse_image_spec (Lisp_Object spec, struct image_keyword *keywords, | |||
| 921 | if (i == nkeywords) | 921 | if (i == nkeywords) |
| 922 | continue; | 922 | continue; |
| 923 | 923 | ||
| 924 | /* Record that we recognized the keyword. If a keywords | 924 | /* Record that we recognized the keyword. If a keyword |
| 925 | was found more than once, it's an error. */ | 925 | was found more than once, it's an error. */ |
| 926 | keywords[i].value = value; | 926 | keywords[i].value = value; |
| 927 | if (keywords[i].count > 1) | 927 | if (keywords[i].count) |
| 928 | return 0; | 928 | return false; |
| 929 | ++keywords[i].count; | 929 | keywords[i].count = true; |
| 930 | 930 | ||
| 931 | /* Check type of value against allowed type. */ | 931 | /* Check type of value against allowed type. */ |
| 932 | switch (keywords[i].type) | 932 | switch (keywords[i].type) |
| 933 | { | 933 | { |
| 934 | case IMAGE_STRING_VALUE: | 934 | case IMAGE_STRING_VALUE: |
| 935 | if (!STRINGP (value)) | 935 | if (!STRINGP (value)) |
| 936 | return 0; | 936 | return false; |
| 937 | break; | 937 | break; |
| 938 | 938 | ||
| 939 | case IMAGE_STRING_OR_NIL_VALUE: | 939 | case IMAGE_STRING_OR_NIL_VALUE: |
| 940 | if (!STRINGP (value) && !NILP (value)) | 940 | if (!STRINGP (value) && !NILP (value)) |
| 941 | return 0; | 941 | return false; |
| 942 | break; | 942 | break; |
| 943 | 943 | ||
| 944 | case IMAGE_SYMBOL_VALUE: | 944 | case IMAGE_SYMBOL_VALUE: |
| 945 | if (!SYMBOLP (value)) | 945 | if (!SYMBOLP (value)) |
| 946 | return 0; | 946 | return false; |
| 947 | break; | 947 | break; |
| 948 | 948 | ||
| 949 | case IMAGE_POSITIVE_INTEGER_VALUE: | 949 | case IMAGE_POSITIVE_INTEGER_VALUE: |
| 950 | if (! RANGED_FIXNUMP (1, value, INT_MAX)) | 950 | if (! RANGED_FIXNUMP (1, value, INT_MAX)) |
| 951 | return 0; | 951 | return false; |
| 952 | break; | 952 | break; |
| 953 | 953 | ||
| 954 | case IMAGE_NON_NEGATIVE_INTEGER_VALUE_OR_PAIR: | 954 | case IMAGE_NON_NEGATIVE_INTEGER_VALUE_OR_PAIR: |
| @@ -958,21 +958,21 @@ parse_image_spec (Lisp_Object spec, struct image_keyword *keywords, | |||
| 958 | && RANGED_FIXNUMP (0, XCAR (value), INT_MAX) | 958 | && RANGED_FIXNUMP (0, XCAR (value), INT_MAX) |
| 959 | && RANGED_FIXNUMP (0, XCDR (value), INT_MAX)) | 959 | && RANGED_FIXNUMP (0, XCDR (value), INT_MAX)) |
| 960 | break; | 960 | break; |
| 961 | return 0; | 961 | return false; |
| 962 | 962 | ||
| 963 | case IMAGE_ASCENT_VALUE: | 963 | case IMAGE_ASCENT_VALUE: |
| 964 | if (SYMBOLP (value) && EQ (value, Qcenter)) | 964 | if (SYMBOLP (value) && EQ (value, Qcenter)) |
| 965 | break; | 965 | break; |
| 966 | else if (RANGED_FIXNUMP (0, value, 100)) | 966 | else if (RANGED_FIXNUMP (0, value, 100)) |
| 967 | break; | 967 | break; |
| 968 | return 0; | 968 | return false; |
| 969 | 969 | ||
| 970 | case IMAGE_NON_NEGATIVE_INTEGER_VALUE: | 970 | case IMAGE_NON_NEGATIVE_INTEGER_VALUE: |
| 971 | /* Unlike the other integer-related cases, this one does not | 971 | /* Unlike the other integer-related cases, this one does not |
| 972 | verify that VALUE fits in 'int'. This is because callers | 972 | verify that VALUE fits in 'int'. This is because callers |
| 973 | want EMACS_INT. */ | 973 | want EMACS_INT. */ |
| 974 | if (!FIXNUMP (value) || XFIXNUM (value) < 0) | 974 | if (!FIXNUMP (value) || XFIXNUM (value) < 0) |
| 975 | return 0; | 975 | return false; |
| 976 | break; | 976 | break; |
| 977 | 977 | ||
| 978 | case IMAGE_DONT_CHECK_VALUE_TYPE: | 978 | case IMAGE_DONT_CHECK_VALUE_TYPE: |
| @@ -982,21 +982,21 @@ parse_image_spec (Lisp_Object spec, struct image_keyword *keywords, | |||
| 982 | value = indirect_function (value); | 982 | value = indirect_function (value); |
| 983 | if (FUNCTIONP (value)) | 983 | if (FUNCTIONP (value)) |
| 984 | break; | 984 | break; |
| 985 | return 0; | 985 | return false; |
| 986 | 986 | ||
| 987 | case IMAGE_NUMBER_VALUE: | 987 | case IMAGE_NUMBER_VALUE: |
| 988 | if (! NUMBERP (value)) | 988 | if (! NUMBERP (value)) |
| 989 | return 0; | 989 | return false; |
| 990 | break; | 990 | break; |
| 991 | 991 | ||
| 992 | case IMAGE_INTEGER_VALUE: | 992 | case IMAGE_INTEGER_VALUE: |
| 993 | if (! TYPE_RANGED_FIXNUMP (int, value)) | 993 | if (! TYPE_RANGED_FIXNUMP (int, value)) |
| 994 | return 0; | 994 | return false; |
| 995 | break; | 995 | break; |
| 996 | 996 | ||
| 997 | case IMAGE_BOOL_VALUE: | 997 | case IMAGE_BOOL_VALUE: |
| 998 | if (!NILP (value) && !EQ (value, Qt)) | 998 | if (!NILP (value) && !EQ (value, Qt)) |
| 999 | return 0; | 999 | return false; |
| 1000 | break; | 1000 | break; |
| 1001 | 1001 | ||
| 1002 | default: | 1002 | default: |
| @@ -1005,13 +1005,13 @@ parse_image_spec (Lisp_Object spec, struct image_keyword *keywords, | |||
| 1005 | } | 1005 | } |
| 1006 | 1006 | ||
| 1007 | if (EQ (key, QCtype) && !EQ (type, value)) | 1007 | if (EQ (key, QCtype) && !EQ (type, value)) |
| 1008 | return 0; | 1008 | return false; |
| 1009 | } | 1009 | } |
| 1010 | 1010 | ||
| 1011 | /* Check that all mandatory fields are present. */ | 1011 | /* Check that all mandatory fields are present. */ |
| 1012 | for (i = 0; i < nkeywords; ++i) | 1012 | for (i = 0; i < nkeywords; ++i) |
| 1013 | if (keywords[i].mandatory_p && keywords[i].count == 0) | 1013 | if (keywords[i].count < keywords[i].mandatory_p) |
| 1014 | return 0; | 1014 | return false; |
| 1015 | 1015 | ||
| 1016 | return NILP (plist); | 1016 | return NILP (plist); |
| 1017 | } | 1017 | } |
| @@ -4175,7 +4175,7 @@ xpm_image_p (Lisp_Object object) | |||
| 4175 | && fmt[XPM_FILE].count + fmt[XPM_DATA].count == 1 | 4175 | && fmt[XPM_FILE].count + fmt[XPM_DATA].count == 1 |
| 4176 | /* Either no `:color-symbols' or it's a list of conses | 4176 | /* Either no `:color-symbols' or it's a list of conses |
| 4177 | whose car and cdr are strings. */ | 4177 | whose car and cdr are strings. */ |
| 4178 | && (fmt[XPM_COLOR_SYMBOLS].count == 0 | 4178 | && (! fmt[XPM_COLOR_SYMBOLS].count |
| 4179 | || xpm_valid_color_symbols_p (fmt[XPM_COLOR_SYMBOLS].value))); | 4179 | || xpm_valid_color_symbols_p (fmt[XPM_COLOR_SYMBOLS].value))); |
| 4180 | } | 4180 | } |
| 4181 | 4181 | ||