Listing 2:
class IMAGE_OUTPUT_REGISTRY
    {
    public:
// register output component 
        IMAGE_OUTPUT_REGISTRY(IMAGE_TYPE t, 
                  int (*open)(IMAGE_IO *file,IMAGE_FORMAT *format),
                  unsigned int (*write)(IMAGE_IO *file,
                                        IMAGE_FORMAT *format,
                                        const unsigned char *buffer,
                                        unsigned int numlines),
                  int (*close)(IMAGE_IO *file,IMAGE_FORMAT *format),
                  int (*capable)(const IMAGE_FORMAT *format));
        ~IMAGE_OUTPUT_REGISTRY();    // deregister output component
    private:
        IMAGE_TYPE type;
    };
// register output component
IMAGE_OUTPUT_REGISTRY::IMAGE_OUTPUT_REGISTRY(IMAGE_TYPE t,
            int (*open)(IMAGE_IO *file,IMAGE_FORMAT *format),
            unsigned int (*write)(IMAGE_IO *file,
                                  IMAGE_FORMAT *format,
                                  const unsigned char *buffer,
                                  unsigned int numlines),
            int (*close)(IMAGE_IO *file,IMAGE_FORMAT *format),
            int (*capable)(const IMAGE_FORMAT *format))
    {
    type = UNKNOWN;
    if (t <= UNKNOWN || t >= MAX_TYPE)
        return;                         // legal type?
    if (open == 0 || write == 0 || close == 0 || capable == 0)
        return;                         // valid pointers?
    IMAGE_OUTPUT::oopen[t] = open;      // set function pointers
    IMAGE_OUTPUT::owrite[t] = write;
    IMAGE_OUTPUT::oclose[t] = close;
    IMAGE_OUTPUT::ocapable[t] = capable;
    type = t;         // set type for later deregistering
    }

// deregister output component
// Do NOT call this function while you are writing to an open file
// of this type.  Close it first.  Otherwise your output will fail.
IMAGE_OUTPUT_REGISTRY::~IMAGE_OUTPUT_REGISTRY()
    {
    if (type <= UNKNOWN || type >= MAX_TYPE)
        return;                         // legal type?
    IMAGE_OUTPUT::oopen[type] = 0;      // clear function pointers
    IMAGE_OUTPUT::owrite[type] = 0;
    IMAGE_OUTPUT::oclose[type] = 0;
    IMAGE_OUTPUT::ocapable[type] = 0;
    type = UNKNOWN;                     // clear type
    }
