
The status variable is set to the return value of xv_check_bad_attr() because this is
the same value needed by the internals to XView—that is, the function that called this get
routine. Recall that the get routine for each package is called until one of them returns
XV_OK in the *status parameter. This is the indicator that the attribute passed applies to
that particular package and that the sequence of calling the packages’ get functions should
cease. Since BITMAP_FILE does apply to the Bitmap package, *status is set to XV_OK.
Thus, when the function returns XV_OK, the get method stops and returns to the programmer.
As an opposite case, consider what happens when an attribute that does not apply to the Bit-
map package is evaluated. Let’s say the programmer called:
int width = (int)xv_get(bitmap, XV_WIDTH);
In this case, the switch would fall through to the default case and call
xv_check_bad_attr(). This time, however, the attribute does not belong to the Bitmap
package (it belongs to the generic package) and an error message is not printed.
xv_check_bad_attr() returns XV_ERROR indicating that the get method should con-
tinue on to the next package in the class hierarchy. Thus, *status is set correctly.
This interface for xv_check_bad_attr() may seem confusing, but if you follow a
simple rule of thumb, it can be made easy. Always have the default case in a switch state-
ment set the status