diff options
Diffstat (limited to 'src/xfaces.c')
| -rw-r--r-- | src/xfaces.c | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/src/xfaces.c b/src/xfaces.c index 9faa7c79e0b..ee41ab69b0b 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -922,7 +922,7 @@ the pixmap. Bits are stored row by row, each row occupies else if (CONSP (object)) { /* Otherwise OBJECT must be (WIDTH HEIGHT DATA), WIDTH and - HEIGHT must be integers > 0, and DATA must be string large + HEIGHT must be ints > 0, and DATA must be string large enough to hold a bitmap of the specified size. */ Lisp_Object width, height, data; @@ -942,11 +942,11 @@ the pixmap. Bits are stored row by row, each row occupies } if (STRINGP (data) - && INTEGERP (width) && 0 < XINT (width) - && INTEGERP (height) && 0 < XINT (height)) + && RANGED_INTEGERP (1, width, INT_MAX) + && RANGED_INTEGERP (1, height, INT_MAX)) { - EMACS_INT bytes_per_row = ((XINT (width) + BITS_PER_CHAR - 1) - / BITS_PER_CHAR); + int bytes_per_row = ((XINT (width) + BITS_PER_CHAR - 1) + / BITS_PER_CHAR); if (XINT (height) <= SBYTES (data) / bytes_per_row) pixmap_p = 1; } @@ -1604,7 +1604,9 @@ compare_fonts_by_sort_order (const void *v1, const void *v2) else { if (INTEGERP (val1)) - result = INTEGERP (val2) ? XINT (val1) - XINT (val2) : -1; + result = (INTEGERP (val2) && XINT (val1) >= XINT (val2) + ? XINT (val1) > XINT (val2) + : -1); else result = INTEGERP (val2) ? 1 : 0; } @@ -1633,8 +1635,10 @@ the face font sort order. */) (Lisp_Object family, Lisp_Object frame) { Lisp_Object font_spec, list, *drivers, vec; - int i, nfonts, ndrivers; + ptrdiff_t i, nfonts; + EMACS_INT ndrivers; Lisp_Object result; + USE_SAFE_ALLOCA; if (NILP (frame)) frame = selected_frame; @@ -1670,7 +1674,7 @@ the face font sort order. */) font_props_for_sorting[i++] = FONT_REGISTRY_INDEX; ndrivers = XINT (Flength (list)); - drivers = alloca (sizeof (Lisp_Object) * ndrivers); + SAFE_ALLOCA_LISP (drivers, ndrivers); for (i = 0; i < ndrivers; i++, list = XCDR (list)) drivers[i] = XCAR (list); vec = Fvconcat (ndrivers, drivers); @@ -1702,6 +1706,7 @@ the face font sort order. */) result = Fcons (v, result); } + SAFE_FREE (); return result; } @@ -2263,7 +2268,7 @@ merge_face_heights (Lisp_Object from, Lisp_Object to, Lisp_Object invalid) { if (INTEGERP (to)) /* relative X absolute => absolute */ - result = make_number ((EMACS_INT)(XFLOAT_DATA (from) * XINT (to))); + result = make_number (XFLOAT_DATA (from) * XINT (to)); else if (FLOATP (to)) /* relative X relative => relative */ result = make_float (XFLOAT_DATA (from) * XFLOAT_DATA (to)); @@ -2683,8 +2688,7 @@ Value is a vector of face attributes. */) property `face' of the Lisp face name. */ if (next_lface_id == lface_id_to_name_size) lface_id_to_name = - xpalloc (lface_id_to_name, &lface_id_to_name_size, 1, - min (INT_MAX, MOST_POSITIVE_FIXNUM), + xpalloc (lface_id_to_name, &lface_id_to_name_size, 1, MAX_FACE_ID, sizeof *lface_id_to_name); lface_id_to_name[next_lface_id] = face; @@ -5277,7 +5281,7 @@ static int realize_basic_faces (struct frame *f) { int success_p = 0; - int count = SPECPDL_INDEX (); + ptrdiff_t count = SPECPDL_INDEX (); /* Block input here so that we won't be surprised by an X expose event, for instance, without having the faces set up. */ @@ -5960,9 +5964,9 @@ compute_char_face (struct frame *f, int ch, Lisp_Object prop) The face returned is suitable for displaying ASCII characters. */ int -face_at_buffer_position (struct window *w, EMACS_INT pos, - EMACS_INT region_beg, EMACS_INT region_end, - EMACS_INT *endptr, EMACS_INT limit, +face_at_buffer_position (struct window *w, ptrdiff_t pos, + ptrdiff_t region_beg, ptrdiff_t region_end, + ptrdiff_t *endptr, ptrdiff_t limit, int mouse, int base_face_id) { struct frame *f = XFRAME (w->frame); @@ -5971,7 +5975,7 @@ face_at_buffer_position (struct window *w, EMACS_INT pos, ptrdiff_t i, noverlays; Lisp_Object *overlay_vec; Lisp_Object frame; - EMACS_INT endpos; + ptrdiff_t endpos; Lisp_Object propname = mouse ? Qmouse_face : Qface; Lisp_Object limit1, end; struct face *default_face; @@ -5997,7 +6001,7 @@ face_at_buffer_position (struct window *w, EMACS_INT pos, /* Look at properties from overlays. */ { - EMACS_INT next_overlay; + ptrdiff_t next_overlay; GET_OVERLAYS_AT (pos, overlay_vec, noverlays, &next_overlay, 0); if (next_overlay < endpos) @@ -6072,9 +6076,9 @@ face_at_buffer_position (struct window *w, EMACS_INT pos, simply disregards the `face' properties of all overlays. */ int -face_for_overlay_string (struct window *w, EMACS_INT pos, - EMACS_INT region_beg, EMACS_INT region_end, - EMACS_INT *endptr, EMACS_INT limit, +face_for_overlay_string (struct window *w, ptrdiff_t pos, + ptrdiff_t region_beg, ptrdiff_t region_end, + ptrdiff_t *endptr, ptrdiff_t limit, int mouse, Lisp_Object overlay) { struct frame *f = XFRAME (w->frame); @@ -6161,9 +6165,9 @@ face_for_overlay_string (struct window *w, EMACS_INT pos, int face_at_string_position (struct window *w, Lisp_Object string, - EMACS_INT pos, EMACS_INT bufpos, - EMACS_INT region_beg, EMACS_INT region_end, - EMACS_INT *endptr, enum face_id base_face_id, + ptrdiff_t pos, ptrdiff_t bufpos, + ptrdiff_t region_beg, ptrdiff_t region_end, + ptrdiff_t *endptr, enum face_id base_face_id, int mouse_p) { Lisp_Object prop, position, end, limit; @@ -6246,7 +6250,7 @@ face_at_string_position (struct window *w, Lisp_Object string, */ int -merge_faces (struct frame *f, Lisp_Object face_name, EMACS_INT face_id, +merge_faces (struct frame *f, Lisp_Object face_name, int face_id, int base_face_id) { Lisp_Object attrs[LFACE_VECTOR_SIZE]; |
