    // Copyright (C) 2019  Davis E. King (davis@dlib.net), Nils Labugt
    // License: Boost Software License   See LICENSE.txt for the full license.

    #include <setjmp.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <jpeglib.h>
    #include <iostream>

    struct jpeg_loader_error_mgr
    {
        jpeg_error_mgr pub;
        jmp_buf setjmp_buffer;
    };

    void jpeg_loader_error_exit (j_common_ptr cinfo)
    {
        jpeg_loader_error_mgr* myerr = (jpeg_loader_error_mgr*) cinfo->err;

        longjmp(myerr->setjmp_buffer, 1);
    }

    // This code doesn't really make a lot of sense.  It's just calling all the libjpeg functions to make
    // sure they can be compiled and linked.
    int main()
    {
        std::cerr << "This program is just for build system testing.  Don't actually run it." << std::endl;
        abort();

        FILE *fp = fopen("whatever.jpg", "rb" );

        jpeg_decompress_struct cinfo;
        jpeg_loader_error_mgr jerr;

        cinfo.err = jpeg_std_error(&jerr.pub);

        jerr.pub.error_exit = jpeg_loader_error_exit;

        setjmp(jerr.setjmp_buffer);

        jpeg_create_decompress(&cinfo);

        jpeg_stdio_src(&cinfo, fp);
        if (false) {
            unsigned char imgbuffer[1234];
            jpeg_mem_src(&cinfo, imgbuffer, sizeof(imgbuffer));
        }

        jpeg_read_header(&cinfo, TRUE);

        jpeg_start_decompress(&cinfo);

        unsigned long height_ = cinfo.output_height;
        unsigned long width_ = cinfo.output_width;
        unsigned long output_components_ = cinfo.output_components;

        unsigned char* rows[123];

        while (cinfo.output_scanline < cinfo.output_height)
        {
            jpeg_read_scanlines(&cinfo, &rows[cinfo.output_scanline], 100);
        }

        jpeg_finish_decompress(&cinfo);
        jpeg_destroy_decompress(&cinfo);

        fclose( fp );
    }