aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2019-06-27 12:21:20 -0700
committerPaul Eggert2019-06-27 12:21:53 -0700
commit3502d4c1b587057c2f5907997f74ae0a2e0d2a7d (patch)
tree1fdccc581a3c80473ca0b67ccf44651bd6256c53 /src
parenta91bdeb131f75210d32243f0bdfa02d2af87ea44 (diff)
downloademacs-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.c46
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