diff --git a/c/xlib/property.c b/c/xlib/property.c index b286a3f..3491ba0 100644 --- a/c/xlib/property.c +++ b/c/xlib/property.c @@ -4,10 +4,12 @@ s48_value scx_Intern_Atom(s48_value display, s48_value name, s48_value only_if_exists) { - Atom a = XInternAtom(scx_extract_display(display), - s48_extract_string(name), - S48_EXTRACT_BOOLEAN(only_if_exists)); - return scx_enter_atom(a); + Atom a; + S48_DECLARE_GC_PROTECT_3(display, name, only_if_exists); + a = XInternAtom(scx_extract_display(display), + s48_extract_string(name), + S48_EXTRACT_BOOLEAN(only_if_exists)); + S48_GC_RETURN(scx_enter_atom(a)); } s48_value scx_Intern_Atoms(s48_value display, s48_value names, @@ -15,53 +17,52 @@ s48_value scx_Intern_Atoms(s48_value display, s48_value names, int i, n = s48_list_length(names); char* cnames[n]; Atom atoms[n]; + s48_value l = S48_NULL; + S48_DECLARE_GC_PROTECT_4(display, names, only_if_exists, l); for (i = 0; i < n; i++) cnames[i] = s48_extract_string(names); if (!XInternAtoms(scx_extract_display(display), cnames, n, S48_EXTRACT_BOOLEAN(only_if_exists), atoms)) - return S48_FALSE; + S48_GC_RETURN(S48_FALSE); else { - s48_value l = S48_NULL; - S48_DECLARE_GC_PROTECT(1); - S48_GC_PROTECT_1(l); for (i = n-1; i >= 0; i--) l = s48_cons(scx_enter_atom(atoms[i]), l); - return l; + S48_GC_RETURN(l); } } s48_value scx_Get_Atom_Name(s48_value display, s48_value a) { char* s; s48_value str; + S48_DECLARE_GC_PROTECT_3(display, a, str); s = XGetAtomName(scx_extract_display(display), scx_extract_atom(a)); str = s48_enter_string(s); XFree(s); - return str; + S48_GC_RETURN(str); } s48_value scx_List_Properties(s48_value display, s48_value window) { int n, i; Atom *atoms; s48_value l = S48_NULL; - S48_DECLARE_GC_PROTECT(1); + S48_DECLARE_GC_PROTECT_3(display, window, l); atoms = XListProperties (scx_extract_display(display), scx_extract_window(window), &n); - S48_GC_PROTECT_1(l); for (i = n-1; i >= 0; i--) l = s48_cons(scx_enter_atom(atoms[i]), l); - S48_GC_UNPROTECT(); XFree ((char*)atoms); - return l; + S48_GC_RETURN(l); } s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window, s48_value properties, s48_value delta) { int i, n = s48_list_length(properties); Atom p[n]; + S48_DECLARE_GC_PROTECT_4(display, window, properties, delta); for (i = 0; i < n; i++) { p[i] = scx_extract_atom(S48_CAR(properties)); properties = S48_CDR(properties); @@ -69,14 +70,15 @@ s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window, XRotateWindowProperties(scx_extract_display(display), scx_extract_window(window), p, n, s48_extract_integer(delta)); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_Delete_Property(s48_value display, s48_value window, s48_value prop) { + S48_DECLARE_GC_PROTECT_3(display, window, prop); XDeleteProperty(scx_extract_display(display), scx_extract_window(window), scx_extract_atom(prop)); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_property_binding = S48_FALSE; @@ -87,6 +89,7 @@ void scx_extract_property(s48_value p, Atom* type, int* format, char** data, int* nelements) { int i; s48_value d = S48_RECORD_REF(p, 2); + S48_DECLARE_GC_PROTECT_2(p, d); s48_check_record_type(p, scx_property_binding); *type = scx_extract_atom(S48_RECORD_REF(p, 0)); *format = S48_EXTRACT_ENUM(S48_RECORD_REF(p, 1), @@ -117,6 +120,7 @@ void scx_extract_property(s48_value p, Atom* type, int* format, } break; } + S48_GC_UNPROTECT(); } s48_value scx_enter_property(Atom type, int format, char* data, @@ -161,6 +165,9 @@ s48_value scx_Get_Window_Property(s48_value display, s48_value window, int format, i; unsigned long nitems, bytes_left; unsigned char* data = NULL; + s48_value p = S48_FALSE, res = S48_NULL; + S48_DECLARE_GC_PROTECT_9(display, window, atom, start, len, deletep, + req_type, p, res); if (XGetWindowProperty (scx_extract_display(display), scx_extract_window(window), scx_extract_atom(atom), @@ -170,18 +177,14 @@ s48_value scx_Get_Window_Property(s48_value display, s48_value window, scx_extract_atom(req_type), &actual_type, &format, &nitems, &bytes_left, &data) == Success) { - s48_value p = scx_enter_property(actual_type, format, data, nitems); - s48_value res = S48_NULL; - S48_DECLARE_GC_PROTECT(1); + p = scx_enter_property(actual_type, format, data, nitems); XFree(data); - S48_GC_PROTECT_1(p); res = s48_cons(s48_enter_integer(bytes_left), p); - S48_GC_UNPROTECT(); - return res; + S48_GC_RETURN(res); } else /* Property does not exists */ - return S48_FALSE; + S48_GC_RETURN(S48_FALSE); } s48_value scx_change_property_mode_binding = S48_FALSE; @@ -194,6 +197,7 @@ s48_value scx_Change_Property(s48_value display, s48_value window, Atom type; int format, nelements; char* data; + S48_DECLARE_GC_PROTECT_5(display, window, atom, mode, property); scx_extract_property(property, &type, &format, &data, &nelements); @@ -202,28 +206,34 @@ s48_value scx_Change_Property(s48_value display, s48_value window, scx_extract_change_property_mode(mode), data, nelements); free(data); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection, s48_value owner, s48_value time) { + S48_DECLARE_GC_PROTECT_4(display, selection, owner, time); XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection), scx_extract_window(owner), scx_extract_time(time)); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_Get_Selection_Owner(s48_value display, s48_value selection) { - return scx_enter_window(XGetSelectionOwner(scx_extract_display(display), - scx_extract_atom(selection))); + Window w; + S48_DECLARE_GC_PROTECT_2(display, selection); + w = XGetSelectionOwner(scx_extract_display(display), + scx_extract_atom(selection)); + S48_GC_RETURN(scx_enter_window(w)); } s48_value scx_Convert_Selection(s48_value display, s48_value selection, s48_value target, s48_value property, s48_value requestor, s48_value time) { + S48_DECLARE_GC_PROTECT_6(display, selection, target, property, requestor, + time); XConvertSelection(scx_extract_display(display), scx_extract_atom(selection), scx_extract_atom(target), scx_extract_atom(property), scx_extract_window(requestor), scx_extract_time(time)); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } void scx_init_property(void) { diff --git a/c/xlib/text.c b/c/xlib/text.c index 5dd5ed1..d3c794a 100644 --- a/c/xlib/text.c +++ b/c/xlib/text.c @@ -5,6 +5,7 @@ s48_value scx_Draw_Image_String(s48_value display, s48_value drawable, s48_value gc, s48_value x, s48_value y, s48_value string) { + S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string); XDrawImageString(scx_extract_display(display), scx_extract_drawable(drawable), scx_extract_gc(gc), @@ -12,7 +13,7 @@ s48_value scx_Draw_Image_String(s48_value display, s48_value drawable, s48_extract_integer(y), s48_extract_string(string), S48_STRING_LENGTH(string)); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable, @@ -20,6 +21,7 @@ s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable, s48_value string) { int i, len = s48_list_length(string); XChar2b chars[len]; + S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string); for (i = 0; i < len; i++) { chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string))); chars[i].byte2 = s48_extract_char(S48_CDR(S48_CAR(string))); @@ -31,12 +33,13 @@ s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable, s48_extract_integer(x), s48_extract_integer(y), chars, len); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_text_item = S48_FALSE; void scx_extract_text_item(s48_value v, XTextItem* ti) { + S48_DECLARE_GC_PROTECT_1(v); s48_check_record_type(v, scx_text_item); if (S48_RECORD_REF(v, 0) != S48_FALSE) { ti->nchars = S48_STRING_LENGTH(S48_RECORD_REF(v, 0)); @@ -48,15 +51,19 @@ void scx_extract_text_item(s48_value v, XTextItem* ti) { } ti->delta = s48_extract_integer(S48_RECORD_REF(v, 1)); ti->font = scx_extract_font(S48_RECORD_REF(v, 2)); + S48_GC_UNPROTECT(); /* Free all chars arrays! */ } void scx_extract_text_item_16(s48_value v, XTextItem16* ti) { + s48_value l = S48_NULL; + S48_DECLARE_GC_PROTECT_2(v, l); s48_check_record_type(v, scx_text_item); { if (S48_RECORD_REF(v, 0) != S48_FALSE) { - s48_value l = S48_RECORD_REF(v, 0); - int i, n = s48_list_length(l); + int i, n; + l = S48_RECORD_REF(v, 0); + n = s48_list_length(l); XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b)); for (i = n-1; i >= 0; i--) { ti->chars[i].byte1 = s48_extract_integer(S48_CAR(S48_CAR(l))); @@ -70,6 +77,7 @@ void scx_extract_text_item_16(s48_value v, XTextItem16* ti) { ti->delta = s48_extract_integer(S48_RECORD_REF(v, 1)); ti->font = scx_extract_font(S48_RECORD_REF(v, 2)); } + S48_GC_UNPROTECT(); /* Free all chars arrays! */ } @@ -78,6 +86,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable, s48_value items) { int i, len = s48_list_length(items); XTextItem parts[len]; + S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items); for (i = 0; i < len; i++) { scx_extract_text_item(S48_CAR(items), &parts[i]); items = S48_CDR(items); @@ -90,7 +99,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable, parts, len); for (i = 0; i < len; i++) free(parts[i].chars); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_Draw_Text_16(s48_value display, s48_value drawable, @@ -98,6 +107,7 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable, s48_value items) { int i, len = s48_list_length(items); XTextItem16 parts[len]; + S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items); for (i = 0; i < len; i++) { scx_extract_text_item_16(S48_CAR(items), &parts[i]); items = S48_CDR(items); @@ -110,18 +120,19 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable, parts, len); for (i = 0; i < len; i++) free(parts[i].chars); - return S48_UNSPECIFIC; + S48_GC_RETURN(S48_UNSPECIFIC); } s48_value scx_Text_Extents(s48_value font_struct, s48_value string) { XCharStruct overall; int dir, ascent, descent; + S48_DECLARE_GC_PROTECT_2(font_struct, string); XTextExtents(scx_extract_fontstruct(font_struct), s48_extract_string(string), S48_STRING_LENGTH(string), &dir, &ascent, &descent, &overall); - return scx_enter_charstruct(&overall); + S48_GC_RETURN(scx_enter_charstruct(&overall)); } s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) { @@ -129,6 +140,7 @@ s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) { int dir, ascent, descent; int i, len = s48_list_length(string); XChar2b chars[len]; + S48_DECLARE_GC_PROTECT_2(font_struct, string); for (i = 0; i < len; i++) { chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string))); chars[i].byte2 = s48_extract_char(S48_CDR(S48_CAR(string))); @@ -138,7 +150,7 @@ s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) { chars, len, &dir, &ascent, &descent, &overall); - return scx_enter_charstruct(&overall); + S48_GC_RETURN(scx_enter_charstruct(&overall)); } void scx_init_text(void) { diff --git a/c/xlib/types.c b/c/xlib/types.c index 9a0cab3..70bf3a1 100644 --- a/c/xlib/types.c +++ b/c/xlib/types.c @@ -72,12 +72,12 @@ int s48_list_length(s48_value list) { s48_value scx_enum_set_type_binding = S48_FALSE; extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) { - s48_value enum_set_type = scx_enum_set_type_binding; - s48_check_record_type(v, enum_set_type); + S48_DECLARE_GC_PROTECT_2(v, type); + s48_check_record_type(v, scx_enum_set_type_binding); if (S48_UNSAFE_SHARED_BINDING_REF(type) != S48_UNSAFE_RECORD_REF(v, 0)) s48_raise_argument_type_error(v); - return s48_extract_integer(S48_UNSAFE_RECORD_REF(v, 1)); + S48_GC_RETURN(s48_extract_integer(S48_UNSAFE_RECORD_REF(v, 1))); } s48_value s48_enter_enum_set(unsigned long v, s48_value type) { @@ -91,20 +91,21 @@ s48_value s48_enter_enum_set(unsigned long v, s48_value type) { } s48_value scx_struct_cache_ref(void* cpointer, s48_value list) { + S48_DECLARE_GC_PROTECT_1(list); while (list != S48_NULL) { if (S48_EXTRACT_POINTER(S48_CAR(S48_CAR(list))) == cpointer) - return S48_WEAK_POINTER_REF(S48_CDR(S48_CAR(list))); + S48_GC_RETURN(S48_WEAK_POINTER_REF(S48_CDR(S48_CAR(list)))); list = S48_CDR(list); } - return S48_FALSE; + S48_GC_RETURN(S48_FALSE); } void scx_struct_cache_set(void* cpointer, s48_value* l, s48_value v) { s48_value list = *l; s48_value previous = S48_FALSE; s48_value pair = S48_FALSE; - S48_DECLARE_GC_PROTECT(3); - S48_GC_PROTECT_3(list, pair, previous); + S48_DECLARE_GC_PROTECT(4); + S48_GC_PROTECT_4(v, list, pair, previous); /* create the new entry */ pair = s48_make_weak_pointer(v); diff --git a/c/xlib/util.c b/c/xlib/util.c index 052e1ee..d053b0a 100644 --- a/c/xlib/util.c +++ b/c/xlib/util.c @@ -3,11 +3,12 @@ s48_value scx_Get_Default(s48_value dpy, s48_value program, s48_value option) { char* ret; + S48_DECLARE_GC_PROTECT_3(dpy, program, option); if (ret = XGetDefault(scx_extract_display(dpy), s48_extract_string(program), s48_extract_string(option))) - return s48_enter_string(ret); - else return S48_FALSE; + S48_GC_RETURN(s48_enter_string(ret)); + else S48_GC_RETURN(S48_FALSE); } s48_value scx_Resource_Manager_String(s48_value dpy) { @@ -21,13 +22,12 @@ s48_value scx_Parse_Geometry(s48_value strg) { s48_value ret; int x, y, res; unsigned int w, h; - S48_DECLARE_GC_PROTECT(1); + S48_DECLARE_GC_PROTECT_2(strg, ret); res = XParseGeometry (s48_extract_string(strg), &x, &y, &w, &h); ret = s48_make_vector(6, S48_FALSE); - S48_GC_PROTECT_1(ret); if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE); if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE); if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x));