From e47790cd5427331ebc832985e3f3baa3cce39f8a Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Sat, 2 Aug 2025 20:01:03 +0100 Subject: [PATCH] Move third party code to code/thirdparty Co-authored-by: smallmodel <15067410+smallmodel@users.noreply.github.com> --- code/client/CMakeLists.txt | 2 +- code/curl-7.54.0/include/README | 55 - code/curl-7.54.0/include/curl/curlbuild.h | 586 ---- code/curl-7.54.0/include/curl/curlrules.h | 239 -- code/curl-7.54.0/include/curl/system.h | 484 ---- code/curl-7.54.0/include/curl/typecheck-gcc.h | 624 ----- code/fgame/CMakeLists.txt | 6 +- code/jpeg-9f/cdjpeg.c | 181 -- code/jpeg-9f/cjpeg.c | 664 ----- code/jpeg-9f/cjpegalt.c | 791 ------ code/jpeg-9f/ckconfig.c | 402 --- code/jpeg-9f/djpeg.c | 631 ----- code/jpeg-9f/djpegalt.c | 766 ------ code/jpeg-9f/example.c | 433 --- code/jpeg-9f/jmemansi.c | 167 -- code/jpeg-9f/jmemdos.c | 638 ----- code/jpeg-9f/jmemmac.c | 289 -- code/jpeg-9f/jmemname.c | 276 -- code/jpeg-9f/jpegtran.c | 654 ----- code/jpeg-9f/rdbmp.c | 469 ---- code/jpeg-9f/rdcolmap.c | 253 -- code/jpeg-9f/rdgif.c | 679 ----- code/jpeg-9f/rdjpgcom.c | 515 ---- code/jpeg-9f/rdppm.c | 501 ---- code/jpeg-9f/rdrle.c | 380 --- code/jpeg-9f/rdswitch.c | 363 --- code/jpeg-9f/rdtarga.c | 500 ---- code/jpeg-9f/transupp.c | 2433 ----------------- code/jpeg-9f/wrbmp.c | 437 --- code/jpeg-9f/wrgif.c | 566 ---- code/jpeg-9f/wrjpgcom.c | 599 ---- code/jpeg-9f/wrppm.c | 264 -- code/jpeg-9f/wrrle.c | 306 --- code/jpeg-9f/wrtarga.c | 254 -- code/libs/win32/libcurl.a | Bin 434836 -> 0 bytes code/libs/win64/libcurl.a | Bin 504330 -> 0 bytes code/qcommon/CMakeLists.txt | 2 +- code/renderercommon/CMakeLists.txt | 2 +- code/sdl/CMakeLists.txt | 10 +- .../SDL2-2.32.8/include/SDL.h | 0 .../SDL2-2.32.8/include/SDL_assert.h | 0 .../SDL2-2.32.8/include/SDL_atomic.h | 0 .../SDL2-2.32.8/include/SDL_audio.h | 0 .../SDL2-2.32.8/include/SDL_bits.h | 0 .../SDL2-2.32.8/include/SDL_blendmode.h | 0 .../SDL2-2.32.8/include/SDL_clipboard.h | 0 .../SDL2-2.32.8/include/SDL_config.h | 0 .../SDL2-2.32.8/include/SDL_config_android.h | 0 .../include/SDL_config_emscripten.h | 0 .../SDL2-2.32.8/include/SDL_config_iphoneos.h | 0 .../SDL2-2.32.8/include/SDL_config_macosx.h | 0 .../SDL2-2.32.8/include/SDL_config_minimal.h | 0 .../SDL2-2.32.8/include/SDL_config_ngage.h | 0 .../SDL2-2.32.8/include/SDL_config_os2.h | 0 .../SDL2-2.32.8/include/SDL_config_pandora.h | 0 .../SDL2-2.32.8/include/SDL_config_windows.h | 0 .../SDL2-2.32.8/include/SDL_config_wingdk.h | 0 .../SDL2-2.32.8/include/SDL_config_winrt.h | 0 .../SDL2-2.32.8/include/SDL_config_xbox.h | 0 .../SDL2-2.32.8/include/SDL_copying.h | 0 .../SDL2-2.32.8/include/SDL_cpuinfo.h | 0 .../SDL2-2.32.8/include/SDL_egl.h | 0 .../SDL2-2.32.8/include/SDL_endian.h | 0 .../SDL2-2.32.8/include/SDL_error.h | 0 .../SDL2-2.32.8/include/SDL_events.h | 0 .../SDL2-2.32.8/include/SDL_filesystem.h | 0 .../SDL2-2.32.8/include/SDL_gamecontroller.h | 0 .../SDL2-2.32.8/include/SDL_gesture.h | 0 .../SDL2-2.32.8/include/SDL_guid.h | 0 .../SDL2-2.32.8/include/SDL_haptic.h | 0 .../SDL2-2.32.8/include/SDL_hidapi.h | 0 .../SDL2-2.32.8/include/SDL_hints.h | 0 .../SDL2-2.32.8/include/SDL_joystick.h | 0 .../SDL2-2.32.8/include/SDL_keyboard.h | 0 .../SDL2-2.32.8/include/SDL_keycode.h | 0 .../SDL2-2.32.8/include/SDL_loadso.h | 0 .../SDL2-2.32.8/include/SDL_locale.h | 0 .../SDL2-2.32.8/include/SDL_log.h | 0 .../SDL2-2.32.8/include/SDL_main.h | 0 .../SDL2-2.32.8/include/SDL_messagebox.h | 0 .../SDL2-2.32.8/include/SDL_metal.h | 0 .../SDL2-2.32.8/include/SDL_misc.h | 0 .../SDL2-2.32.8/include/SDL_mouse.h | 0 .../SDL2-2.32.8/include/SDL_mutex.h | 0 .../SDL2-2.32.8/include/SDL_name.h | 0 .../SDL2-2.32.8/include/SDL_opengl.h | 0 .../SDL2-2.32.8/include/SDL_opengl_glext.h | 0 .../SDL2-2.32.8/include/SDL_opengles.h | 0 .../SDL2-2.32.8/include/SDL_opengles2.h | 0 .../SDL2-2.32.8/include/SDL_opengles2_gl2.h | 0 .../include/SDL_opengles2_gl2ext.h | 0 .../include/SDL_opengles2_gl2platform.h | 0 .../include/SDL_opengles2_khrplatform.h | 0 .../SDL2-2.32.8/include/SDL_pixels.h | 0 .../SDL2-2.32.8/include/SDL_platform.h | 0 .../SDL2-2.32.8/include/SDL_power.h | 0 .../SDL2-2.32.8/include/SDL_quit.h | 0 .../SDL2-2.32.8/include/SDL_rect.h | 0 .../SDL2-2.32.8/include/SDL_render.h | 0 .../SDL2-2.32.8/include/SDL_revision.h | 0 .../SDL2-2.32.8/include/SDL_rwops.h | 0 .../SDL2-2.32.8/include/SDL_scancode.h | 0 .../SDL2-2.32.8/include/SDL_sensor.h | 0 .../SDL2-2.32.8/include/SDL_shape.h | 0 .../SDL2-2.32.8/include/SDL_stdinc.h | 0 .../SDL2-2.32.8/include/SDL_surface.h | 0 .../SDL2-2.32.8/include/SDL_system.h | 0 .../SDL2-2.32.8/include/SDL_syswm.h | 0 .../SDL2-2.32.8/include/SDL_test.h | 0 .../SDL2-2.32.8/include/SDL_test_assert.h | 0 .../SDL2-2.32.8/include/SDL_test_common.h | 0 .../SDL2-2.32.8/include/SDL_test_compare.h | 0 .../SDL2-2.32.8/include/SDL_test_crc32.h | 0 .../SDL2-2.32.8/include/SDL_test_font.h | 0 .../SDL2-2.32.8/include/SDL_test_fuzzer.h | 0 .../SDL2-2.32.8/include/SDL_test_harness.h | 0 .../SDL2-2.32.8/include/SDL_test_images.h | 0 .../SDL2-2.32.8/include/SDL_test_log.h | 0 .../SDL2-2.32.8/include/SDL_test_md5.h | 0 .../SDL2-2.32.8/include/SDL_test_memory.h | 0 .../SDL2-2.32.8/include/SDL_test_random.h | 0 .../SDL2-2.32.8/include/SDL_thread.h | 0 .../SDL2-2.32.8/include/SDL_timer.h | 0 .../SDL2-2.32.8/include/SDL_touch.h | 0 .../SDL2-2.32.8/include/SDL_types.h | 0 .../SDL2-2.32.8/include/SDL_version.h | 0 .../SDL2-2.32.8/include/SDL_video.h | 0 .../SDL2-2.32.8/include/SDL_vulkan.h | 0 .../SDL2-2.32.8/include/begin_code.h | 0 .../SDL2-2.32.8/include/close_code.h | 0 .../curl-8.15.0}/include/curl/curl.h | 0 .../curl-8.15.0}/include/curl/curlver.h | 0 .../curl-8.15.0}/include/curl/easy.h | 0 .../curl-8.15.0/include/curl/header.h | 74 + .../curl-8.15.0}/include/curl/mprintf.h | 0 .../curl-8.15.0}/include/curl/multi.h | 0 .../curl-8.15.0/include/curl/options.h | 70 + .../curl-8.15.0}/include/curl/stdcheaders.h | 0 .../curl-8.15.0/include/curl/system.h | 402 +++ .../curl-8.15.0/include/curl/typecheck-gcc.h | 867 ++++++ .../curl-8.15.0/include/curl/urlapi.h | 155 ++ .../curl-8.15.0/include/curl/websockets.h | 85 + code/{ => thirdparty}/jpeg-9f/cderror.h | 0 code/{ => thirdparty}/jpeg-9f/cdjpeg.h | 0 code/{ => thirdparty}/jpeg-9f/jaricom.c | 0 code/{ => thirdparty}/jpeg-9f/jcapimin.c | 0 code/{ => thirdparty}/jpeg-9f/jcapistd.c | 0 code/{ => thirdparty}/jpeg-9f/jcarith.c | 0 code/{ => thirdparty}/jpeg-9f/jccoefct.c | 0 code/{ => thirdparty}/jpeg-9f/jccolor.c | 0 code/{ => thirdparty}/jpeg-9f/jcdctmgr.c | 0 code/{ => thirdparty}/jpeg-9f/jchuff.c | 0 code/{ => thirdparty}/jpeg-9f/jcinit.c | 0 code/{ => thirdparty}/jpeg-9f/jcmainct.c | 0 code/{ => thirdparty}/jpeg-9f/jcmarker.c | 0 code/{ => thirdparty}/jpeg-9f/jcmaster.c | 0 code/{ => thirdparty}/jpeg-9f/jcomapi.c | 0 code/{ => thirdparty}/jpeg-9f/jconfig.h | 0 code/{ => thirdparty}/jpeg-9f/jcparam.c | 0 code/{ => thirdparty}/jpeg-9f/jcprepct.c | 0 code/{ => thirdparty}/jpeg-9f/jcsample.c | 0 code/{ => thirdparty}/jpeg-9f/jctrans.c | 0 code/{ => thirdparty}/jpeg-9f/jdapimin.c | 0 code/{ => thirdparty}/jpeg-9f/jdapistd.c | 0 code/{ => thirdparty}/jpeg-9f/jdarith.c | 0 code/{ => thirdparty}/jpeg-9f/jdatadst.c | 0 code/{ => thirdparty}/jpeg-9f/jdatasrc.c | 0 code/{ => thirdparty}/jpeg-9f/jdcoefct.c | 0 code/{ => thirdparty}/jpeg-9f/jdcolor.c | 0 code/{ => thirdparty}/jpeg-9f/jdct.h | 0 code/{ => thirdparty}/jpeg-9f/jddctmgr.c | 0 code/{ => thirdparty}/jpeg-9f/jdhuff.c | 0 code/{ => thirdparty}/jpeg-9f/jdinput.c | 0 code/{ => thirdparty}/jpeg-9f/jdmainct.c | 0 code/{ => thirdparty}/jpeg-9f/jdmarker.c | 0 code/{ => thirdparty}/jpeg-9f/jdmaster.c | 0 code/{ => thirdparty}/jpeg-9f/jdmerge.c | 0 code/{ => thirdparty}/jpeg-9f/jdpostct.c | 0 code/{ => thirdparty}/jpeg-9f/jdsample.c | 0 code/{ => thirdparty}/jpeg-9f/jdtrans.c | 0 code/{ => thirdparty}/jpeg-9f/jerror.c | 0 code/{ => thirdparty}/jpeg-9f/jerror.h | 0 code/{ => thirdparty}/jpeg-9f/jfdctflt.c | 0 code/{ => thirdparty}/jpeg-9f/jfdctfst.c | 0 code/{ => thirdparty}/jpeg-9f/jfdctint.c | 0 code/{ => thirdparty}/jpeg-9f/jidctflt.c | 0 code/{ => thirdparty}/jpeg-9f/jidctfst.c | 0 code/{ => thirdparty}/jpeg-9f/jidctint.c | 0 code/{ => thirdparty}/jpeg-9f/jinclude.h | 0 code/{ => thirdparty}/jpeg-9f/jmemmgr.c | 0 code/{ => thirdparty}/jpeg-9f/jmemnobs.c | 0 code/{ => thirdparty}/jpeg-9f/jmemsys.h | 0 code/{ => thirdparty}/jpeg-9f/jmorecfg.h | 0 code/{ => thirdparty}/jpeg-9f/jpegint.h | 0 code/{ => thirdparty}/jpeg-9f/jpeglib.h | 0 code/{ => thirdparty}/jpeg-9f/jquant1.c | 0 code/{ => thirdparty}/jpeg-9f/jquant2.c | 0 code/{ => thirdparty}/jpeg-9f/jutils.c | 0 code/{ => thirdparty}/jpeg-9f/jversion.h | 0 code/{ => thirdparty}/jpeg-9f/transupp.h | 0 .../libmad/.github/workflows/build.yml | 0 code/{ => thirdparty}/libmad/.gitignore | 0 code/{ => thirdparty}/libmad/CHANGES | 0 code/{ => thirdparty}/libmad/CMakeLists.txt | 0 code/{ => thirdparty}/libmad/COPYING | 0 code/{ => thirdparty}/libmad/COPYRIGHT | 0 code/{ => thirdparty}/libmad/CREDITS | 0 code/{ => thirdparty}/libmad/D.dat | 0 code/{ => thirdparty}/libmad/README.md | 0 code/{ => thirdparty}/libmad/TODO | 0 code/{ => thirdparty}/libmad/bit.c | 0 code/{ => thirdparty}/libmad/decoder.c | 0 code/{ => thirdparty}/libmad/fixed.c | 0 code/{ => thirdparty}/libmad/frame.c | 0 code/{ => thirdparty}/libmad/global.h | 0 code/{ => thirdparty}/libmad/huffman.c | 0 code/{ => thirdparty}/libmad/huffman.h | 0 code/{ => thirdparty}/libmad/imdct_l_arm.S | 0 code/{ => thirdparty}/libmad/imdct_s.dat | 0 code/{ => thirdparty}/libmad/layer12.c | 0 code/{ => thirdparty}/libmad/layer12.h | 0 code/{ => thirdparty}/libmad/layer3.c | 0 code/{ => thirdparty}/libmad/layer3.h | 0 code/{ => thirdparty}/libmad/mad.h.in | 0 code/{ => thirdparty}/libmad/minimad.c | 0 .../libmad/packaging/mad.pc.in | 0 .../libmad/packaging/madConfig.cmake.in | 0 code/{ => thirdparty}/libmad/qc_table.dat | 0 code/{ => thirdparty}/libmad/rq_table.dat | 0 code/{ => thirdparty}/libmad/sf_table.dat | 0 code/{ => thirdparty}/libmad/stream.c | 0 code/{ => thirdparty}/libmad/synth.c | 0 code/{ => thirdparty}/libmad/timer.c | 0 code/{ => thirdparty}/libmad/version.c | 0 .../libogg-1.3.6/include/ogg/config_types.h | 0 .../libogg-1.3.6/include/ogg/ogg.h | 0 .../libogg-1.3.6/include/ogg/os_types.h | 0 .../libogg-1.3.6/src/bitwise.c | 0 .../libogg-1.3.6/src/crctable.h | 0 .../libogg-1.3.6/src/framing.c | 0 .../libs/macos/libSDL2-2.0.0.dylib | Bin .../{ => thirdparty}/libs/macos/libSDL2main.a | Bin code/{ => thirdparty}/libs/win32/SDL2.dll | Bin code/{ => thirdparty}/libs/win32/SDL2.lib | Bin code/{ => thirdparty}/libs/win32/SDL2main.lib | Bin .../{ => thirdparty}/libs/win32/libSDL2.dll.a | Bin .../{ => thirdparty}/libs/win32/libSDL2main.a | Bin code/{ => thirdparty}/libs/win64/SDL2.dll | Bin code/{ => thirdparty}/libs/win64/SDL2.lib | Bin code/{ => thirdparty}/libs/win64/SDL2main.lib | Bin .../{ => thirdparty}/libs/win64/libSDL2.dll.a | Bin .../{ => thirdparty}/libs/win64/libSDL2main.a | Bin .../libvorbis-1.3.7/include/vorbis/codec.h | 0 .../include/vorbis/vorbisenc.h | 0 .../include/vorbis/vorbisfile.h | 0 .../libvorbis-1.3.7/lib/analysis.c | 0 .../libvorbis-1.3.7/lib/backends.h | 0 .../libvorbis-1.3.7/lib/bitrate.c | 0 .../libvorbis-1.3.7/lib/bitrate.h | 0 .../libvorbis-1.3.7/lib/block.c | 0 .../lib/books/coupled/res_books_51.h | 0 .../lib/books/coupled/res_books_stereo.h | 0 .../lib/books/floor/floor_books.h | 0 .../lib/books/uncoupled/res_books_uncoupled.h | 0 .../libvorbis-1.3.7/lib/codebook.c | 0 .../libvorbis-1.3.7/lib/codebook.h | 0 .../libvorbis-1.3.7/lib/codec_internal.h | 0 .../libvorbis-1.3.7/lib/envelope.c | 0 .../libvorbis-1.3.7/lib/envelope.h | 0 .../libvorbis-1.3.7/lib/floor0.c | 0 .../libvorbis-1.3.7/lib/floor1.c | 0 .../libvorbis-1.3.7/lib/highlevel.h | 0 .../libvorbis-1.3.7/lib/info.c | 0 .../libvorbis-1.3.7/lib/lookup.c | 0 .../libvorbis-1.3.7/lib/lookup.h | 0 .../libvorbis-1.3.7/lib/lookup_data.h | 0 .../libvorbis-1.3.7/lib/lpc.c | 0 .../libvorbis-1.3.7/lib/lpc.h | 0 .../libvorbis-1.3.7/lib/lsp.c | 0 .../libvorbis-1.3.7/lib/lsp.h | 0 .../libvorbis-1.3.7/lib/mapping0.c | 0 .../libvorbis-1.3.7/lib/masking.h | 0 .../libvorbis-1.3.7/lib/mdct.c | 0 .../libvorbis-1.3.7/lib/mdct.h | 0 .../libvorbis-1.3.7/lib/misc.h | 0 .../libvorbis-1.3.7/lib/modes/floor_all.h | 0 .../libvorbis-1.3.7/lib/modes/psych_11.h | 0 .../libvorbis-1.3.7/lib/modes/psych_16.h | 0 .../libvorbis-1.3.7/lib/modes/psych_44.h | 0 .../libvorbis-1.3.7/lib/modes/psych_8.h | 0 .../libvorbis-1.3.7/lib/modes/residue_16.h | 0 .../libvorbis-1.3.7/lib/modes/residue_44.h | 0 .../libvorbis-1.3.7/lib/modes/residue_44p51.h | 0 .../libvorbis-1.3.7/lib/modes/residue_44u.h | 0 .../libvorbis-1.3.7/lib/modes/residue_8.h | 0 .../libvorbis-1.3.7/lib/modes/setup_11.h | 0 .../libvorbis-1.3.7/lib/modes/setup_16.h | 0 .../libvorbis-1.3.7/lib/modes/setup_22.h | 0 .../libvorbis-1.3.7/lib/modes/setup_32.h | 0 .../libvorbis-1.3.7/lib/modes/setup_44.h | 0 .../libvorbis-1.3.7/lib/modes/setup_44p51.h | 0 .../libvorbis-1.3.7/lib/modes/setup_44u.h | 0 .../libvorbis-1.3.7/lib/modes/setup_8.h | 0 .../libvorbis-1.3.7/lib/modes/setup_X.h | 0 .../{ => thirdparty}/libvorbis-1.3.7/lib/os.h | 0 .../libvorbis-1.3.7/lib/psy.c | 0 .../libvorbis-1.3.7/lib/psy.h | 0 .../libvorbis-1.3.7/lib/registry.c | 0 .../libvorbis-1.3.7/lib/registry.h | 0 .../libvorbis-1.3.7/lib/res0.c | 0 .../libvorbis-1.3.7/lib/scales.h | 0 .../libvorbis-1.3.7/lib/sharedbook.c | 0 .../libvorbis-1.3.7/lib/smallft.c | 0 .../libvorbis-1.3.7/lib/smallft.h | 0 .../libvorbis-1.3.7/lib/synthesis.c | 0 .../libvorbis-1.3.7/lib/vorbisenc.c | 0 .../libvorbis-1.3.7/lib/vorbisfile.c | 0 .../libvorbis-1.3.7/lib/window.c | 0 .../libvorbis-1.3.7/lib/window.h | 0 .../openal-soft-1.24.3/include/AL/al.h | 0 .../openal-soft-1.24.3/include/AL/alc.h | 0 .../openal-soft-1.24.3/include/AL/alext.h | 0 .../include/AL/efx-creative.h | 0 .../include/AL/efx-presets.h | 0 .../openal-soft-1.24.3/include/AL/efx.h | 0 .../opus-1.5.2/celt/_kiss_fft_guts.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/arch.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/bands.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/bands.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/celt.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/celt.h | 0 .../opus-1.5.2/celt/celt_decoder.c | 0 .../opus-1.5.2/celt/celt_encoder.c | 0 .../opus-1.5.2/celt/celt_lpc.c | 0 .../opus-1.5.2/celt/celt_lpc.h | 0 .../opus-1.5.2/celt/cpu_support.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/cwrs.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/cwrs.h | 0 .../opus-1.5.2/celt/ecintrin.h | 0 .../opus-1.5.2/celt/entcode.c | 0 .../opus-1.5.2/celt/entcode.h | 0 .../{ => thirdparty}/opus-1.5.2/celt/entdec.c | 0 .../{ => thirdparty}/opus-1.5.2/celt/entdec.h | 0 .../{ => thirdparty}/opus-1.5.2/celt/entenc.c | 0 .../{ => thirdparty}/opus-1.5.2/celt/entenc.h | 0 .../opus-1.5.2/celt/float_cast.h | 0 .../opus-1.5.2/celt/kiss_fft.c | 0 .../opus-1.5.2/celt/kiss_fft.h | 0 .../opus-1.5.2/celt/laplace.c | 0 .../opus-1.5.2/celt/laplace.h | 0 .../opus-1.5.2/celt/mathops.c | 0 .../opus-1.5.2/celt/mathops.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/mdct.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/mdct.h | 0 .../opus-1.5.2/celt/mfrngcod.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/modes.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/modes.h | 0 .../opus-1.5.2/celt/os_support.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/pitch.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/pitch.h | 0 .../opus-1.5.2/celt/quant_bands.c | 0 .../opus-1.5.2/celt/quant_bands.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/rate.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/rate.h | 0 .../opus-1.5.2/celt/stack_alloc.h | 0 .../opus-1.5.2/celt/static_modes_float.h | 0 code/{ => thirdparty}/opus-1.5.2/celt/vq.c | 0 code/{ => thirdparty}/opus-1.5.2/celt/vq.h | 0 .../opus-1.5.2/include/opus.h | 0 .../opus-1.5.2/include/opus_custom.h | 0 .../opus-1.5.2/include/opus_defines.h | 0 .../opus-1.5.2/include/opus_multistream.h | 0 .../opus-1.5.2/include/opus_projection.h | 0 .../opus-1.5.2/include/opus_types.h | 0 .../{ => thirdparty}/opus-1.5.2/silk/A2NLSF.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/API.h | 0 code/{ => thirdparty}/opus-1.5.2/silk/CNG.c | 0 .../opus-1.5.2/silk/HP_variable_cutoff.c | 0 .../opus-1.5.2/silk/Inlines.h | 0 .../opus-1.5.2/silk/LPC_analysis_filter.c | 0 .../opus-1.5.2/silk/LPC_fit.c | 0 .../opus-1.5.2/silk/LPC_inv_pred_gain.c | 0 .../opus-1.5.2/silk/LP_variable_cutoff.c | 0 .../opus-1.5.2/silk/MacroCount.h | 0 .../opus-1.5.2/silk/MacroDebug.h | 0 .../{ => thirdparty}/opus-1.5.2/silk/NLSF2A.c | 0 .../opus-1.5.2/silk/NLSF_VQ.c | 0 .../opus-1.5.2/silk/NLSF_VQ_weights_laroia.c | 0 .../opus-1.5.2/silk/NLSF_decode.c | 0 .../opus-1.5.2/silk/NLSF_del_dec_quant.c | 0 .../opus-1.5.2/silk/NLSF_encode.c | 0 .../opus-1.5.2/silk/NLSF_stabilize.c | 0 .../opus-1.5.2/silk/NLSF_unpack.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/NSQ.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/NSQ.h | 0 .../opus-1.5.2/silk/NSQ_del_dec.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/PLC.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/PLC.h | 0 .../opus-1.5.2/silk/SigProc_FIX.h | 0 code/{ => thirdparty}/opus-1.5.2/silk/VAD.c | 0 .../opus-1.5.2/silk/VQ_WMat_EC.c | 0 .../opus-1.5.2/silk/ana_filt_bank_1.c | 0 .../opus-1.5.2/silk/biquad_alt.c | 0 .../opus-1.5.2/silk/bwexpander.c | 0 .../opus-1.5.2/silk/bwexpander_32.c | 0 .../opus-1.5.2/silk/check_control_input.c | 0 .../opus-1.5.2/silk/code_signs.c | 0 .../opus-1.5.2/silk/control.h | 0 .../opus-1.5.2/silk/control_SNR.c | 0 .../opus-1.5.2/silk/control_audio_bandwidth.c | 0 .../opus-1.5.2/silk/control_codec.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/debug.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/debug.h | 0 .../opus-1.5.2/silk/dec_API.c | 0 .../opus-1.5.2/silk/decode_core.c | 0 .../opus-1.5.2/silk/decode_frame.c | 0 .../opus-1.5.2/silk/decode_indices.c | 0 .../opus-1.5.2/silk/decode_parameters.c | 0 .../opus-1.5.2/silk/decode_pitch.c | 0 .../opus-1.5.2/silk/decode_pulses.c | 0 .../opus-1.5.2/silk/decoder_set_fs.c | 0 .../{ => thirdparty}/opus-1.5.2/silk/define.h | 0 .../opus-1.5.2/silk/enc_API.c | 0 .../opus-1.5.2/silk/encode_indices.c | 0 .../opus-1.5.2/silk/encode_pulses.c | 0 .../{ => thirdparty}/opus-1.5.2/silk/errors.h | 0 .../silk/float/LPC_analysis_filter_FLP.c | 0 .../silk/float/LPC_inv_pred_gain_FLP.c | 0 .../silk/float/LTP_analysis_filter_FLP.c | 0 .../silk/float/LTP_scale_ctrl_FLP.c | 0 .../opus-1.5.2/silk/float/SigProc_FLP.h | 0 .../silk/float/apply_sine_window_FLP.c | 0 .../silk/float/autocorrelation_FLP.c | 0 .../opus-1.5.2/silk/float/burg_modified_FLP.c | 0 .../opus-1.5.2/silk/float/bwexpander_FLP.c | 0 .../opus-1.5.2/silk/float/corrMatrix_FLP.c | 0 .../opus-1.5.2/silk/float/encode_frame_FLP.c | 0 .../opus-1.5.2/silk/float/energy_FLP.c | 0 .../opus-1.5.2/silk/float/find_LPC_FLP.c | 0 .../opus-1.5.2/silk/float/find_LTP_FLP.c | 0 .../silk/float/find_pitch_lags_FLP.c | 0 .../silk/float/find_pred_coefs_FLP.c | 0 .../opus-1.5.2/silk/float/inner_product_FLP.c | 0 .../opus-1.5.2/silk/float/k2a_FLP.c | 0 .../opus-1.5.2/silk/float/main_FLP.h | 0 .../silk/float/noise_shape_analysis_FLP.c | 0 .../silk/float/pitch_analysis_core_FLP.c | 0 .../opus-1.5.2/silk/float/process_gains_FLP.c | 0 .../silk/float/regularize_correlations_FLP.c | 0 .../silk/float/residual_energy_FLP.c | 0 .../silk/float/scale_copy_vector_FLP.c | 0 .../opus-1.5.2/silk/float/scale_vector_FLP.c | 0 .../opus-1.5.2/silk/float/schur_FLP.c | 0 .../opus-1.5.2/silk/float/sort_FLP.c | 0 .../opus-1.5.2/silk/float/structs_FLP.h | 0 .../silk/float/warped_autocorrelation_FLP.c | 0 .../opus-1.5.2/silk/float/wrappers_FLP.c | 0 .../opus-1.5.2/silk/gain_quant.c | 0 .../opus-1.5.2/silk/init_decoder.c | 0 .../opus-1.5.2/silk/init_encoder.c | 0 .../opus-1.5.2/silk/inner_prod_aligned.c | 0 .../opus-1.5.2/silk/interpolate.c | 0 .../opus-1.5.2/silk/lin2log.c | 0 .../opus-1.5.2/silk/log2lin.c | 0 .../{ => thirdparty}/opus-1.5.2/silk/macros.h | 0 code/{ => thirdparty}/opus-1.5.2/silk/main.h | 0 .../opus-1.5.2/silk/pitch_est_defines.h | 0 .../opus-1.5.2/silk/pitch_est_tables.c | 0 .../opus-1.5.2/silk/process_NLSFs.c | 0 .../opus-1.5.2/silk/quant_LTP_gains.c | 0 .../opus-1.5.2/silk/resampler.c | 0 .../opus-1.5.2/silk/resampler_down2.c | 0 .../opus-1.5.2/silk/resampler_down2_3.c | 0 .../opus-1.5.2/silk/resampler_private.h | 0 .../opus-1.5.2/silk/resampler_private_AR2.c | 0 .../silk/resampler_private_IIR_FIR.c | 0 .../silk/resampler_private_down_FIR.c | 0 .../silk/resampler_private_up2_HQ.c | 0 .../opus-1.5.2/silk/resampler_rom.c | 0 .../opus-1.5.2/silk/resampler_rom.h | 0 .../opus-1.5.2/silk/resampler_structs.h | 0 .../opus-1.5.2/silk/shell_coder.c | 0 .../opus-1.5.2/silk/sigm_Q15.c | 0 code/{ => thirdparty}/opus-1.5.2/silk/sort.c | 0 .../opus-1.5.2/silk/stereo_LR_to_MS.c | 0 .../opus-1.5.2/silk/stereo_MS_to_LR.c | 0 .../opus-1.5.2/silk/stereo_decode_pred.c | 0 .../opus-1.5.2/silk/stereo_encode_pred.c | 0 .../opus-1.5.2/silk/stereo_find_predictor.c | 0 .../opus-1.5.2/silk/stereo_quant_pred.c | 0 .../opus-1.5.2/silk/structs.h | 0 .../opus-1.5.2/silk/sum_sqr_shift.c | 0 .../opus-1.5.2/silk/table_LSF_cos.c | 0 .../{ => thirdparty}/opus-1.5.2/silk/tables.h | 0 .../opus-1.5.2/silk/tables_LTP.c | 0 .../opus-1.5.2/silk/tables_NLSF_CB_NB_MB.c | 0 .../opus-1.5.2/silk/tables_NLSF_CB_WB.c | 0 .../opus-1.5.2/silk/tables_gain.c | 0 .../opus-1.5.2/silk/tables_other.c | 0 .../opus-1.5.2/silk/tables_pitch_lag.c | 0 .../opus-1.5.2/silk/tables_pulses_per_block.c | 0 .../opus-1.5.2/silk/tuning_parameters.h | 0 .../opus-1.5.2/silk/typedef.h | 0 .../opus-1.5.2/src/analysis.c | 0 .../opus-1.5.2/src/analysis.h | 0 .../opus-1.5.2/src/extensions.c | 0 .../opus-1.5.2/src/mapping_matrix.c | 0 .../opus-1.5.2/src/mapping_matrix.h | 0 code/{ => thirdparty}/opus-1.5.2/src/mlp.c | 0 code/{ => thirdparty}/opus-1.5.2/src/mlp.h | 0 .../opus-1.5.2/src/mlp_data.c | 0 code/{ => thirdparty}/opus-1.5.2/src/opus.c | 0 .../opus-1.5.2/src/opus_decoder.c | 0 .../opus-1.5.2/src/opus_encoder.c | 0 .../opus-1.5.2/src/opus_multistream.c | 0 .../opus-1.5.2/src/opus_multistream_decoder.c | 0 .../opus-1.5.2/src/opus_multistream_encoder.c | 0 .../opus-1.5.2/src/opus_private.h | 0 .../opus-1.5.2/src/opus_projection_decoder.c | 0 .../opus-1.5.2/src/opus_projection_encoder.c | 0 .../opus-1.5.2/src/repacketizer.c | 0 .../opusfile-0.12/include/opusfile.h | 0 .../{ => thirdparty}/opusfile-0.12/src/http.c | 0 .../{ => thirdparty}/opusfile-0.12/src/info.c | 0 .../opusfile-0.12/src/internal.c | 0 .../opusfile-0.12/src/internal.h | 0 .../opusfile-0.12/src/opusfile.c | 0 .../opusfile-0.12/src/stream.c | 0 .../opusfile-0.12/src/wincerts.c | 0 .../opusfile-0.12/src/winerrno.h | 0 .../recastnavigation/.editorconfig | 0 .../.github/workflows/Build.yaml | 0 .../.github/workflows/Docs.yaml | 0 .../.github/workflows/Tests.yaml | 0 .../recastnavigation/.gitignore | 0 .../recastnavigation/CHANGELOG.md | 0 .../recastnavigation/CMakeLists.txt | 0 .../recastnavigation/CODE_OF_CONDUCT.md | 0 .../recastnavigation/CONTRIBUTING.md | 0 .../DebugUtils/CMakeLists.txt | 0 .../DebugUtils/Include/DebugDraw.h | 0 .../DebugUtils/Include/DetourDebugDraw.h | 0 .../DebugUtils/Include/RecastDebugDraw.h | 0 .../DebugUtils/Include/RecastDump.h | 0 .../DebugUtils/Source/DebugDraw.cpp | 0 .../DebugUtils/Source/DetourDebugDraw.cpp | 0 .../DebugUtils/Source/RecastDebugDraw.cpp | 0 .../DebugUtils/Source/RecastDump.cpp | 0 .../recastnavigation/Detour/CMakeLists.txt | 0 .../Detour/Include/DetourAlloc.h | 0 .../Detour/Include/DetourAssert.h | 0 .../Detour/Include/DetourCommon.h | 0 .../Detour/Include/DetourMath.h | 0 .../Detour/Include/DetourNavMesh.h | 0 .../Detour/Include/DetourNavMeshBuilder.h | 0 .../Detour/Include/DetourNavMeshQuery.h | 0 .../Detour/Include/DetourNode.h | 0 .../Detour/Include/DetourStatus.h | 0 .../Detour/Source/DetourAlloc.cpp | 0 .../Detour/Source/DetourAssert.cpp | 0 .../Detour/Source/DetourCommon.cpp | 0 .../Detour/Source/DetourNavMesh.cpp | 0 .../Detour/Source/DetourNavMeshBuilder.cpp | 0 .../Detour/Source/DetourNavMeshQuery.cpp | 0 .../Detour/Source/DetourNode.cpp | 0 .../DetourCrowd/CMakeLists.txt | 0 .../DetourCrowd/Include/DetourCrowd.h | 0 .../DetourCrowd/Include/DetourLocalBoundary.h | 0 .../Include/DetourObstacleAvoidance.h | 0 .../DetourCrowd/Include/DetourPathCorridor.h | 0 .../DetourCrowd/Include/DetourPathQueue.h | 0 .../DetourCrowd/Include/DetourProximityGrid.h | 0 .../DetourCrowd/Source/DetourCrowd.cpp | 0 .../Source/DetourLocalBoundary.cpp | 0 .../Source/DetourObstacleAvoidance.cpp | 0 .../DetourCrowd/Source/DetourPathCorridor.cpp | 0 .../DetourCrowd/Source/DetourPathQueue.cpp | 0 .../Source/DetourProximityGrid.cpp | 0 .../DetourTileCache/CMakeLists.txt | 0 .../DetourTileCache/Include/DetourTileCache.h | 0 .../Include/DetourTileCacheBuilder.h | 0 .../Source/DetourTileCache.cpp | 0 .../Source/DetourTileCacheBuilder.cpp | 0 .../recastnavigation/Docs/DoxygenLayout.xml | 0 .../Docs/Extern/Recast_api.txt | 0 .../Docs/Images/screenshot.png | Bin .../recastnavigation/Docs/Readme.txt | 0 .../Docs/doxygen-awesome-css/LICENSE | 0 .../Docs/doxygen-awesome-css/README.md | 0 .../doxygen-awesome-darkmode-toggle.js | 0 .../doxygen-awesome-fragment-copy-button.js | 0 .../doxygen-awesome-interactive-toc.js | 0 .../doxygen-awesome-paragraph-link.js | 0 ...n-awesome-sidebar-only-darkmode-toggle.css | 0 .../doxygen-awesome-sidebar-only.css | 0 .../doxygen-awesome-css/doxygen-awesome.css | 0 .../doxygen-custom/custom-alternative.css | 0 .../doxygen-custom/custom.css | 0 .../doxygen-custom/header.html | 0 .../toggle-alternative-theme.js | 0 .../recastnavigation/Docs/footer.html | 0 .../recastnavigation/Docs/header.html | 0 .../recastnavigation/Doxyfile | 0 .../recastnavigation/License.txt | 0 .../recastnavigation/README.md | 0 .../recastnavigation/Recast/CMakeLists.txt | 0 .../recastnavigation/Recast/Include/Recast.h | 0 .../Recast/Include/RecastAlloc.h | 0 .../Recast/Include/RecastAssert.h | 0 .../recastnavigation/Recast/Source/Recast.cpp | 0 .../Recast/Source/RecastAlloc.cpp | 0 .../Recast/Source/RecastArea.cpp | 0 .../Recast/Source/RecastAssert.cpp | 0 .../Recast/Source/RecastContour.cpp | 0 .../Recast/Source/RecastFilter.cpp | 0 .../Recast/Source/RecastLayers.cpp | 0 .../Recast/Source/RecastMesh.cpp | 0 .../Recast/Source/RecastMeshDetail.cpp | 0 .../Recast/Source/RecastRasterization.cpp | 0 .../Recast/Source/RecastRegion.cpp | 0 .../RecastDemo/Bin/.gitignore | 0 .../RecastDemo/Bin/DroidSans.ttf | Bin .../Bin/TestCases/movement_test.txt | 0 .../Bin/TestCases/nav_mesh_test.txt | 0 .../RecastDemo/Bin/TestCases/raycast_test.txt | 0 .../RecastDemo/CMakeLists.txt | 0 .../RecastDemo/Contrib/fastlz/README.TXT | 0 .../RecastDemo/Contrib/fastlz/fastlz.c | 0 .../RecastDemo/Contrib/fastlz/fastlz.h | 0 .../RecastDemo/Contrib/readme-sdl.txt | 0 .../RecastDemo/Contrib/stb_truetype.h | 0 .../RecastDemo/Include/ChunkyTriMesh.h | 0 .../RecastDemo/Include/ConvexVolumeTool.h | 0 .../RecastDemo/Include/CrowdTool.h | 0 .../RecastDemo/Include/Filelist.h | 0 .../RecastDemo/Include/InputGeom.h | 0 .../RecastDemo/Include/MeshLoaderObj.h | 0 .../RecastDemo/Include/NavMeshPruneTool.h | 0 .../RecastDemo/Include/NavMeshTesterTool.h | 0 .../Include/OffMeshConnectionTool.h | 0 .../RecastDemo/Include/PerfTimer.h | 0 .../RecastDemo/Include/Sample.h | 0 .../RecastDemo/Include/SampleInterfaces.h | 0 .../RecastDemo/Include/Sample_Debug.h | 0 .../RecastDemo/Include/Sample_SoloMesh.h | 0 .../RecastDemo/Include/Sample_TempObstacles.h | 0 .../RecastDemo/Include/Sample_TileMesh.h | 0 .../RecastDemo/Include/TestCase.h | 0 .../RecastDemo/Include/ValueHistory.h | 0 .../RecastDemo/Include/imgui.h | 0 .../RecastDemo/Include/imguiRenderGL.h | 0 .../RecastDemo/Source/ChunkyTriMesh.cpp | 0 .../RecastDemo/Source/ConvexVolumeTool.cpp | 0 .../RecastDemo/Source/CrowdTool.cpp | 0 .../RecastDemo/Source/Filelist.cpp | 0 .../RecastDemo/Source/InputGeom.cpp | 0 .../RecastDemo/Source/MeshLoaderObj.cpp | 0 .../RecastDemo/Source/NavMeshPruneTool.cpp | 0 .../RecastDemo/Source/NavMeshTesterTool.cpp | 0 .../Source/OffMeshConnectionTool.cpp | 0 .../RecastDemo/Source/PerfTimer.cpp | 0 .../RecastDemo/Source/Sample.cpp | 0 .../RecastDemo/Source/SampleInterfaces.cpp | 0 .../RecastDemo/Source/Sample_Debug.cpp | 0 .../RecastDemo/Source/Sample_SoloMesh.cpp | 0 .../Source/Sample_TempObstacles.cpp | 0 .../RecastDemo/Source/Sample_TileMesh.cpp | 0 .../RecastDemo/Source/TestCase.cpp | 0 .../RecastDemo/Source/ValueHistory.cpp | 0 .../RecastDemo/Source/imgui.cpp | 0 .../RecastDemo/Source/imguiRenderGL.cpp | 0 .../RecastDemo/Source/main.cpp | 0 .../RecastDemo/cmake/FindSDL2.cmake | 0 .../recastnavigation/RecastDemo/premake5.lua | 0 .../recastnavigation/Roadmap.md | 0 .../recastnavigation/Tests/CMakeLists.txt | 0 .../Tests/Contrib/catch2/catch_all.hpp | 0 .../Contrib/catch2/catch_amalgamated.cpp | 0 .../Tests/Detour/Tests_Detour.cpp | 0 .../Tests/Recast/Tests_Recast.cpp | 0 .../recastnavigation-config.cmake.in | 0 .../recastnavigation/recastnavigation.pc.in | 0 .../recastnavigation/version.h.in | 0 code/{ => thirdparty}/zlib-1.3.1/adler32.c | 0 code/{ => thirdparty}/zlib-1.3.1/compress.c | 0 code/{ => thirdparty}/zlib-1.3.1/crc32.c | 0 code/{ => thirdparty}/zlib-1.3.1/crc32.h | 0 code/{ => thirdparty}/zlib-1.3.1/deflate.c | 0 code/{ => thirdparty}/zlib-1.3.1/deflate.h | 0 code/{ => thirdparty}/zlib-1.3.1/gzguts.h | 0 code/{ => thirdparty}/zlib-1.3.1/infback.c | 0 code/{ => thirdparty}/zlib-1.3.1/inffast.c | 0 code/{ => thirdparty}/zlib-1.3.1/inffast.h | 0 code/{ => thirdparty}/zlib-1.3.1/inffixed.h | 0 code/{ => thirdparty}/zlib-1.3.1/inflate.c | 0 code/{ => thirdparty}/zlib-1.3.1/inflate.h | 0 code/{ => thirdparty}/zlib-1.3.1/inftrees.c | 0 code/{ => thirdparty}/zlib-1.3.1/inftrees.h | 0 code/{ => thirdparty}/zlib-1.3.1/trees.c | 0 code/{ => thirdparty}/zlib-1.3.1/trees.h | 0 code/{ => thirdparty}/zlib-1.3.1/uncompr.c | 0 code/{ => thirdparty}/zlib-1.3.1/zconf.h | 0 code/{ => thirdparty}/zlib-1.3.1/zlib.h | 0 code/{ => thirdparty}/zlib-1.3.1/zutil.c | 0 code/{ => thirdparty}/zlib-1.3.1/zutil.h | 0 code/zlib-1.3.1/gzclose.c | 23 - code/zlib-1.3.1/gzlib.c | 582 ---- code/zlib-1.3.1/gzread.c | 602 ---- code/zlib-1.3.1/gzwrite.c | 631 ----- misc/update-libs.sh | 2 +- 710 files changed, 1665 insertions(+), 18249 deletions(-) delete mode 100644 code/curl-7.54.0/include/README delete mode 100644 code/curl-7.54.0/include/curl/curlbuild.h delete mode 100644 code/curl-7.54.0/include/curl/curlrules.h delete mode 100644 code/curl-7.54.0/include/curl/system.h delete mode 100644 code/curl-7.54.0/include/curl/typecheck-gcc.h delete mode 100644 code/jpeg-9f/cdjpeg.c delete mode 100644 code/jpeg-9f/cjpeg.c delete mode 100644 code/jpeg-9f/cjpegalt.c delete mode 100644 code/jpeg-9f/ckconfig.c delete mode 100644 code/jpeg-9f/djpeg.c delete mode 100644 code/jpeg-9f/djpegalt.c delete mode 100644 code/jpeg-9f/example.c delete mode 100644 code/jpeg-9f/jmemansi.c delete mode 100644 code/jpeg-9f/jmemdos.c delete mode 100644 code/jpeg-9f/jmemmac.c delete mode 100644 code/jpeg-9f/jmemname.c delete mode 100644 code/jpeg-9f/jpegtran.c delete mode 100644 code/jpeg-9f/rdbmp.c delete mode 100644 code/jpeg-9f/rdcolmap.c delete mode 100644 code/jpeg-9f/rdgif.c delete mode 100644 code/jpeg-9f/rdjpgcom.c delete mode 100644 code/jpeg-9f/rdppm.c delete mode 100644 code/jpeg-9f/rdrle.c delete mode 100644 code/jpeg-9f/rdswitch.c delete mode 100644 code/jpeg-9f/rdtarga.c delete mode 100644 code/jpeg-9f/transupp.c delete mode 100644 code/jpeg-9f/wrbmp.c delete mode 100644 code/jpeg-9f/wrgif.c delete mode 100644 code/jpeg-9f/wrjpgcom.c delete mode 100644 code/jpeg-9f/wrppm.c delete mode 100644 code/jpeg-9f/wrrle.c delete mode 100644 code/jpeg-9f/wrtarga.c delete mode 100644 code/libs/win32/libcurl.a delete mode 100644 code/libs/win64/libcurl.a rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_assert.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_atomic.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_audio.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_bits.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_blendmode.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_clipboard.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_android.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_emscripten.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_iphoneos.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_macosx.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_minimal.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_ngage.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_os2.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_pandora.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_windows.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_wingdk.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_winrt.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_config_xbox.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_copying.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_cpuinfo.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_egl.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_endian.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_error.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_events.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_filesystem.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_gamecontroller.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_gesture.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_guid.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_haptic.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_hidapi.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_hints.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_joystick.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_keyboard.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_keycode.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_loadso.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_locale.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_log.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_main.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_messagebox.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_metal.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_misc.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_mouse.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_mutex.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_name.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengl.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengl_glext.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengles.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengles2.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengles2_gl2.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengles2_gl2ext.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengles2_gl2platform.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_opengles2_khrplatform.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_pixels.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_platform.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_power.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_quit.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_rect.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_render.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_revision.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_rwops.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_scancode.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_sensor.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_shape.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_stdinc.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_surface.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_system.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_syswm.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_assert.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_common.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_compare.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_crc32.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_font.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_fuzzer.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_harness.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_images.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_log.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_md5.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_memory.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_test_random.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_thread.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_timer.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_touch.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_types.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_version.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_video.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/SDL_vulkan.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/begin_code.h (100%) rename code/{ => thirdparty}/SDL2-2.32.8/include/close_code.h (100%) rename code/{curl-7.54.0 => thirdparty/curl-8.15.0}/include/curl/curl.h (100%) rename code/{curl-7.54.0 => thirdparty/curl-8.15.0}/include/curl/curlver.h (100%) rename code/{curl-7.54.0 => thirdparty/curl-8.15.0}/include/curl/easy.h (100%) create mode 100644 code/thirdparty/curl-8.15.0/include/curl/header.h rename code/{curl-7.54.0 => thirdparty/curl-8.15.0}/include/curl/mprintf.h (100%) rename code/{curl-7.54.0 => thirdparty/curl-8.15.0}/include/curl/multi.h (100%) create mode 100644 code/thirdparty/curl-8.15.0/include/curl/options.h rename code/{curl-7.54.0 => thirdparty/curl-8.15.0}/include/curl/stdcheaders.h (100%) create mode 100644 code/thirdparty/curl-8.15.0/include/curl/system.h create mode 100644 code/thirdparty/curl-8.15.0/include/curl/typecheck-gcc.h create mode 100644 code/thirdparty/curl-8.15.0/include/curl/urlapi.h create mode 100644 code/thirdparty/curl-8.15.0/include/curl/websockets.h rename code/{ => thirdparty}/jpeg-9f/cderror.h (100%) rename code/{ => thirdparty}/jpeg-9f/cdjpeg.h (100%) rename code/{ => thirdparty}/jpeg-9f/jaricom.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcapimin.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcapistd.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcarith.c (100%) rename code/{ => thirdparty}/jpeg-9f/jccoefct.c (100%) rename code/{ => thirdparty}/jpeg-9f/jccolor.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcdctmgr.c (100%) rename code/{ => thirdparty}/jpeg-9f/jchuff.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcinit.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcmainct.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcmarker.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcmaster.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcomapi.c (100%) rename code/{ => thirdparty}/jpeg-9f/jconfig.h (100%) rename code/{ => thirdparty}/jpeg-9f/jcparam.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcprepct.c (100%) rename code/{ => thirdparty}/jpeg-9f/jcsample.c (100%) rename code/{ => thirdparty}/jpeg-9f/jctrans.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdapimin.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdapistd.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdarith.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdatadst.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdatasrc.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdcoefct.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdcolor.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdct.h (100%) rename code/{ => thirdparty}/jpeg-9f/jddctmgr.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdhuff.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdinput.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdmainct.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdmarker.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdmaster.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdmerge.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdpostct.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdsample.c (100%) rename code/{ => thirdparty}/jpeg-9f/jdtrans.c (100%) rename code/{ => thirdparty}/jpeg-9f/jerror.c (100%) rename code/{ => thirdparty}/jpeg-9f/jerror.h (100%) rename code/{ => thirdparty}/jpeg-9f/jfdctflt.c (100%) rename code/{ => thirdparty}/jpeg-9f/jfdctfst.c (100%) rename code/{ => thirdparty}/jpeg-9f/jfdctint.c (100%) rename code/{ => thirdparty}/jpeg-9f/jidctflt.c (100%) rename code/{ => thirdparty}/jpeg-9f/jidctfst.c (100%) rename code/{ => thirdparty}/jpeg-9f/jidctint.c (100%) rename code/{ => thirdparty}/jpeg-9f/jinclude.h (100%) rename code/{ => thirdparty}/jpeg-9f/jmemmgr.c (100%) rename code/{ => thirdparty}/jpeg-9f/jmemnobs.c (100%) rename code/{ => thirdparty}/jpeg-9f/jmemsys.h (100%) rename code/{ => thirdparty}/jpeg-9f/jmorecfg.h (100%) rename code/{ => thirdparty}/jpeg-9f/jpegint.h (100%) rename code/{ => thirdparty}/jpeg-9f/jpeglib.h (100%) rename code/{ => thirdparty}/jpeg-9f/jquant1.c (100%) rename code/{ => thirdparty}/jpeg-9f/jquant2.c (100%) rename code/{ => thirdparty}/jpeg-9f/jutils.c (100%) rename code/{ => thirdparty}/jpeg-9f/jversion.h (100%) rename code/{ => thirdparty}/jpeg-9f/transupp.h (100%) rename code/{ => thirdparty}/libmad/.github/workflows/build.yml (100%) rename code/{ => thirdparty}/libmad/.gitignore (100%) rename code/{ => thirdparty}/libmad/CHANGES (100%) rename code/{ => thirdparty}/libmad/CMakeLists.txt (100%) rename code/{ => thirdparty}/libmad/COPYING (100%) rename code/{ => thirdparty}/libmad/COPYRIGHT (100%) rename code/{ => thirdparty}/libmad/CREDITS (100%) rename code/{ => thirdparty}/libmad/D.dat (100%) rename code/{ => thirdparty}/libmad/README.md (100%) rename code/{ => thirdparty}/libmad/TODO (100%) rename code/{ => thirdparty}/libmad/bit.c (100%) rename code/{ => thirdparty}/libmad/decoder.c (100%) rename code/{ => thirdparty}/libmad/fixed.c (100%) rename code/{ => thirdparty}/libmad/frame.c (100%) rename code/{ => thirdparty}/libmad/global.h (100%) rename code/{ => thirdparty}/libmad/huffman.c (100%) rename code/{ => thirdparty}/libmad/huffman.h (100%) rename code/{ => thirdparty}/libmad/imdct_l_arm.S (100%) rename code/{ => thirdparty}/libmad/imdct_s.dat (100%) rename code/{ => thirdparty}/libmad/layer12.c (100%) rename code/{ => thirdparty}/libmad/layer12.h (100%) rename code/{ => thirdparty}/libmad/layer3.c (100%) rename code/{ => thirdparty}/libmad/layer3.h (100%) rename code/{ => thirdparty}/libmad/mad.h.in (100%) rename code/{ => thirdparty}/libmad/minimad.c (100%) rename code/{ => thirdparty}/libmad/packaging/mad.pc.in (100%) rename code/{ => thirdparty}/libmad/packaging/madConfig.cmake.in (100%) rename code/{ => thirdparty}/libmad/qc_table.dat (100%) rename code/{ => thirdparty}/libmad/rq_table.dat (100%) rename code/{ => thirdparty}/libmad/sf_table.dat (100%) rename code/{ => thirdparty}/libmad/stream.c (100%) rename code/{ => thirdparty}/libmad/synth.c (100%) rename code/{ => thirdparty}/libmad/timer.c (100%) rename code/{ => thirdparty}/libmad/version.c (100%) rename code/{ => thirdparty}/libogg-1.3.6/include/ogg/config_types.h (100%) rename code/{ => thirdparty}/libogg-1.3.6/include/ogg/ogg.h (100%) rename code/{ => thirdparty}/libogg-1.3.6/include/ogg/os_types.h (100%) rename code/{ => thirdparty}/libogg-1.3.6/src/bitwise.c (100%) rename code/{ => thirdparty}/libogg-1.3.6/src/crctable.h (100%) rename code/{ => thirdparty}/libogg-1.3.6/src/framing.c (100%) rename code/{ => thirdparty}/libs/macos/libSDL2-2.0.0.dylib (100%) rename code/{ => thirdparty}/libs/macos/libSDL2main.a (100%) rename code/{ => thirdparty}/libs/win32/SDL2.dll (100%) rename code/{ => thirdparty}/libs/win32/SDL2.lib (100%) rename code/{ => thirdparty}/libs/win32/SDL2main.lib (100%) rename code/{ => thirdparty}/libs/win32/libSDL2.dll.a (100%) rename code/{ => thirdparty}/libs/win32/libSDL2main.a (100%) rename code/{ => thirdparty}/libs/win64/SDL2.dll (100%) rename code/{ => thirdparty}/libs/win64/SDL2.lib (100%) rename code/{ => thirdparty}/libs/win64/SDL2main.lib (100%) rename code/{ => thirdparty}/libs/win64/libSDL2.dll.a (100%) rename code/{ => thirdparty}/libs/win64/libSDL2main.a (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/include/vorbis/codec.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/include/vorbis/vorbisenc.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/include/vorbis/vorbisfile.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/analysis.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/backends.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/bitrate.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/bitrate.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/block.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/books/coupled/res_books_51.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/books/floor/floor_books.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/codebook.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/codebook.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/codec_internal.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/envelope.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/envelope.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/floor0.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/floor1.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/highlevel.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/info.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lookup.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lookup.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lookup_data.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lpc.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lpc.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lsp.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/lsp.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/mapping0.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/masking.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/mdct.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/mdct.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/misc.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/floor_all.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/psych_11.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/psych_16.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/psych_44.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/psych_8.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/residue_16.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/residue_44.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/residue_44p51.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/residue_44u.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/residue_8.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_11.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_16.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_22.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_32.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_44.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_44p51.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_44u.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_8.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/modes/setup_X.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/os.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/psy.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/psy.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/registry.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/registry.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/res0.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/scales.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/sharedbook.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/smallft.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/smallft.h (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/synthesis.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/vorbisenc.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/vorbisfile.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/window.c (100%) rename code/{ => thirdparty}/libvorbis-1.3.7/lib/window.h (100%) rename code/{ => thirdparty}/openal-soft-1.24.3/include/AL/al.h (100%) rename code/{ => thirdparty}/openal-soft-1.24.3/include/AL/alc.h (100%) rename code/{ => thirdparty}/openal-soft-1.24.3/include/AL/alext.h (100%) rename code/{ => thirdparty}/openal-soft-1.24.3/include/AL/efx-creative.h (100%) rename code/{ => thirdparty}/openal-soft-1.24.3/include/AL/efx-presets.h (100%) rename code/{ => thirdparty}/openal-soft-1.24.3/include/AL/efx.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/_kiss_fft_guts.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/arch.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/bands.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/bands.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/celt.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/celt.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/celt_decoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/celt_encoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/celt_lpc.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/celt_lpc.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/cpu_support.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/cwrs.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/cwrs.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/ecintrin.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/entcode.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/entcode.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/entdec.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/entdec.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/entenc.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/entenc.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/float_cast.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/kiss_fft.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/kiss_fft.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/laplace.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/laplace.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/mathops.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/mathops.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/mdct.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/mdct.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/mfrngcod.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/modes.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/modes.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/os_support.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/pitch.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/pitch.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/quant_bands.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/quant_bands.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/rate.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/rate.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/stack_alloc.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/static_modes_float.h (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/vq.c (100%) rename code/{ => thirdparty}/opus-1.5.2/celt/vq.h (100%) rename code/{ => thirdparty}/opus-1.5.2/include/opus.h (100%) rename code/{ => thirdparty}/opus-1.5.2/include/opus_custom.h (100%) rename code/{ => thirdparty}/opus-1.5.2/include/opus_defines.h (100%) rename code/{ => thirdparty}/opus-1.5.2/include/opus_multistream.h (100%) rename code/{ => thirdparty}/opus-1.5.2/include/opus_projection.h (100%) rename code/{ => thirdparty}/opus-1.5.2/include/opus_types.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/A2NLSF.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/API.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/CNG.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/HP_variable_cutoff.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/Inlines.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/LPC_analysis_filter.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/LPC_fit.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/LPC_inv_pred_gain.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/LP_variable_cutoff.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/MacroCount.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/MacroDebug.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF2A.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_VQ.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_VQ_weights_laroia.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_decode.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_del_dec_quant.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_encode.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_stabilize.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NLSF_unpack.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NSQ.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NSQ.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/NSQ_del_dec.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/PLC.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/PLC.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/SigProc_FIX.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/VAD.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/VQ_WMat_EC.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/ana_filt_bank_1.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/biquad_alt.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/bwexpander.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/bwexpander_32.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/check_control_input.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/code_signs.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/control.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/control_SNR.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/control_audio_bandwidth.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/control_codec.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/debug.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/debug.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/dec_API.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decode_core.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decode_frame.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decode_indices.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decode_parameters.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decode_pitch.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decode_pulses.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/decoder_set_fs.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/define.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/enc_API.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/encode_indices.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/encode_pulses.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/errors.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/LPC_analysis_filter_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/LPC_inv_pred_gain_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/LTP_analysis_filter_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/LTP_scale_ctrl_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/SigProc_FLP.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/apply_sine_window_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/autocorrelation_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/burg_modified_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/bwexpander_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/corrMatrix_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/encode_frame_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/energy_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/find_LPC_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/find_LTP_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/find_pitch_lags_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/find_pred_coefs_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/inner_product_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/k2a_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/main_FLP.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/noise_shape_analysis_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/pitch_analysis_core_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/process_gains_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/regularize_correlations_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/residual_energy_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/scale_copy_vector_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/scale_vector_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/schur_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/sort_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/structs_FLP.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/warped_autocorrelation_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/float/wrappers_FLP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/gain_quant.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/init_decoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/init_encoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/inner_prod_aligned.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/interpolate.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/lin2log.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/log2lin.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/macros.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/main.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/pitch_est_defines.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/pitch_est_tables.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/process_NLSFs.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/quant_LTP_gains.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_down2.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_down2_3.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_private.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_private_AR2.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_private_IIR_FIR.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_private_down_FIR.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_private_up2_HQ.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_rom.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_rom.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/resampler_structs.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/shell_coder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/sigm_Q15.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/sort.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/stereo_LR_to_MS.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/stereo_MS_to_LR.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/stereo_decode_pred.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/stereo_encode_pred.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/stereo_find_predictor.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/stereo_quant_pred.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/structs.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/sum_sqr_shift.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/table_LSF_cos.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_LTP.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_NLSF_CB_NB_MB.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_NLSF_CB_WB.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_gain.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_other.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_pitch_lag.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tables_pulses_per_block.c (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/tuning_parameters.h (100%) rename code/{ => thirdparty}/opus-1.5.2/silk/typedef.h (100%) rename code/{ => thirdparty}/opus-1.5.2/src/analysis.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/analysis.h (100%) rename code/{ => thirdparty}/opus-1.5.2/src/extensions.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/mapping_matrix.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/mapping_matrix.h (100%) rename code/{ => thirdparty}/opus-1.5.2/src/mlp.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/mlp.h (100%) rename code/{ => thirdparty}/opus-1.5.2/src/mlp_data.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_decoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_encoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_multistream.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_multistream_decoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_multistream_encoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_private.h (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_projection_decoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/opus_projection_encoder.c (100%) rename code/{ => thirdparty}/opus-1.5.2/src/repacketizer.c (100%) rename code/{ => thirdparty}/opusfile-0.12/include/opusfile.h (100%) rename code/{ => thirdparty}/opusfile-0.12/src/http.c (100%) rename code/{ => thirdparty}/opusfile-0.12/src/info.c (100%) rename code/{ => thirdparty}/opusfile-0.12/src/internal.c (100%) rename code/{ => thirdparty}/opusfile-0.12/src/internal.h (100%) rename code/{ => thirdparty}/opusfile-0.12/src/opusfile.c (100%) rename code/{ => thirdparty}/opusfile-0.12/src/stream.c (100%) rename code/{ => thirdparty}/opusfile-0.12/src/wincerts.c (100%) rename code/{ => thirdparty}/opusfile-0.12/src/winerrno.h (100%) rename code/{ => thirdparty}/recastnavigation/.editorconfig (100%) rename code/{ => thirdparty}/recastnavigation/.github/workflows/Build.yaml (100%) rename code/{ => thirdparty}/recastnavigation/.github/workflows/Docs.yaml (100%) rename code/{ => thirdparty}/recastnavigation/.github/workflows/Tests.yaml (100%) rename code/{ => thirdparty}/recastnavigation/.gitignore (100%) rename code/{ => thirdparty}/recastnavigation/CHANGELOG.md (100%) rename code/{ => thirdparty}/recastnavigation/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/CODE_OF_CONDUCT.md (100%) rename code/{ => thirdparty}/recastnavigation/CONTRIBUTING.md (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Include/DebugDraw.h (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Include/DetourDebugDraw.h (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Include/RecastDebugDraw.h (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Include/RecastDump.h (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Source/DebugDraw.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Source/DetourDebugDraw.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Source/RecastDebugDraw.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DebugUtils/Source/RecastDump.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourAlloc.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourAssert.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourCommon.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourMath.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourNavMesh.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourNavMeshBuilder.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourNavMeshQuery.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourNode.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Include/DetourStatus.h (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourAlloc.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourAssert.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourCommon.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourNavMesh.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Detour/Source/DetourNode.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Include/DetourCrowd.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Include/DetourLocalBoundary.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Include/DetourObstacleAvoidance.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Include/DetourPathCorridor.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Include/DetourPathQueue.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Include/DetourProximityGrid.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Source/DetourCrowd.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Source/DetourLocalBoundary.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Source/DetourObstacleAvoidance.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Source/DetourPathCorridor.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Source/DetourPathQueue.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourCrowd/Source/DetourProximityGrid.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourTileCache/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/DetourTileCache/Include/DetourTileCache.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourTileCache/Include/DetourTileCacheBuilder.h (100%) rename code/{ => thirdparty}/recastnavigation/DetourTileCache/Source/DetourTileCache.cpp (100%) rename code/{ => thirdparty}/recastnavigation/DetourTileCache/Source/DetourTileCacheBuilder.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Docs/DoxygenLayout.xml (100%) rename code/{ => thirdparty}/recastnavigation/Docs/Extern/Recast_api.txt (100%) rename code/{ => thirdparty}/recastnavigation/Docs/Images/screenshot.png (100%) rename code/{ => thirdparty}/recastnavigation/Docs/Readme.txt (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/LICENSE (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/README.md (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome.css (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom-alternative.css (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom.css (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/header.html (100%) rename code/{ => thirdparty}/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/toggle-alternative-theme.js (100%) rename code/{ => thirdparty}/recastnavigation/Docs/footer.html (100%) rename code/{ => thirdparty}/recastnavigation/Docs/header.html (100%) rename code/{ => thirdparty}/recastnavigation/Doxyfile (100%) rename code/{ => thirdparty}/recastnavigation/License.txt (100%) rename code/{ => thirdparty}/recastnavigation/README.md (100%) rename code/{ => thirdparty}/recastnavigation/Recast/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Include/Recast.h (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Include/RecastAlloc.h (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Include/RecastAssert.h (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/Recast.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastAlloc.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastArea.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastAssert.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastContour.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastFilter.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastLayers.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastMesh.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastMeshDetail.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastRasterization.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Recast/Source/RecastRegion.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Bin/.gitignore (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Bin/DroidSans.ttf (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Bin/TestCases/movement_test.txt (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Bin/TestCases/nav_mesh_test.txt (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Bin/TestCases/raycast_test.txt (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Contrib/fastlz/README.TXT (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.c (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Contrib/readme-sdl.txt (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Contrib/stb_truetype.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/ChunkyTriMesh.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/ConvexVolumeTool.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/CrowdTool.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/Filelist.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/InputGeom.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/MeshLoaderObj.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/NavMeshPruneTool.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/NavMeshTesterTool.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/OffMeshConnectionTool.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/PerfTimer.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/Sample.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/SampleInterfaces.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/Sample_Debug.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/Sample_SoloMesh.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/Sample_TempObstacles.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/Sample_TileMesh.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/TestCase.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/ValueHistory.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/imgui.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Include/imguiRenderGL.h (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/ChunkyTriMesh.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/ConvexVolumeTool.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/CrowdTool.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/Filelist.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/InputGeom.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/MeshLoaderObj.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/NavMeshPruneTool.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/NavMeshTesterTool.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/OffMeshConnectionTool.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/PerfTimer.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/Sample.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/SampleInterfaces.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/Sample_Debug.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/Sample_SoloMesh.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/Sample_TempObstacles.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/Sample_TileMesh.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/TestCase.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/ValueHistory.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/imgui.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/imguiRenderGL.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/Source/main.cpp (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/cmake/FindSDL2.cmake (100%) rename code/{ => thirdparty}/recastnavigation/RecastDemo/premake5.lua (100%) rename code/{ => thirdparty}/recastnavigation/Roadmap.md (100%) rename code/{ => thirdparty}/recastnavigation/Tests/CMakeLists.txt (100%) rename code/{ => thirdparty}/recastnavigation/Tests/Contrib/catch2/catch_all.hpp (100%) rename code/{ => thirdparty}/recastnavigation/Tests/Contrib/catch2/catch_amalgamated.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Tests/Detour/Tests_Detour.cpp (100%) rename code/{ => thirdparty}/recastnavigation/Tests/Recast/Tests_Recast.cpp (100%) rename code/{ => thirdparty}/recastnavigation/recastnavigation-config.cmake.in (100%) rename code/{ => thirdparty}/recastnavigation/recastnavigation.pc.in (100%) rename code/{ => thirdparty}/recastnavigation/version.h.in (100%) rename code/{ => thirdparty}/zlib-1.3.1/adler32.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/compress.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/crc32.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/crc32.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/deflate.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/deflate.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/gzguts.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/infback.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/inffast.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/inffast.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/inffixed.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/inflate.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/inflate.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/inftrees.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/inftrees.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/trees.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/trees.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/uncompr.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/zconf.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/zlib.h (100%) rename code/{ => thirdparty}/zlib-1.3.1/zutil.c (100%) rename code/{ => thirdparty}/zlib-1.3.1/zutil.h (100%) delete mode 100644 code/zlib-1.3.1/gzclose.c delete mode 100644 code/zlib-1.3.1/gzlib.c delete mode 100644 code/zlib-1.3.1/gzread.c delete mode 100644 code/zlib-1.3.1/gzwrite.c diff --git a/code/client/CMakeLists.txt b/code/client/CMakeLists.txt index 259e055b..da43e611 100644 --- a/code/client/CMakeLists.txt +++ b/code/client/CMakeLists.txt @@ -63,7 +63,7 @@ set(OLD_VALUE ${BUILD_SHARED_LIBS}) set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) if(USE_INTERNAL_MAD) - add_subdirectory("../libmad" "./libmad" EXCLUDE_FROM_ALL) + add_subdirectory("../thirdparty/libmad" "./libmad" EXCLUDE_FROM_ALL) target_link_libraries(omohclient INTERFACE mad) else() include(FindPackageHandleStandardArgs) diff --git a/code/curl-7.54.0/include/README b/code/curl-7.54.0/include/README deleted file mode 100644 index 6eb73b2b..00000000 --- a/code/curl-7.54.0/include/README +++ /dev/null @@ -1,55 +0,0 @@ - _ _ ____ _ - ___| | | | _ \| | - / __| | | | |_) | | - | (__| |_| | _ <| |___ - \___|\___/|_| \_\_____| - -Include files for libcurl, external users. - -They're all placed in the curl subdirectory here for better fit in any kind -of environment. You must include files from here using... - - #include - -... style and point the compiler's include path to the directory holding the -curl subdirectory. It makes it more likely to survive future modifications. - -NOTE FOR LIBCURL HACKERS - -The following notes apply to libcurl version 7.19.0 and later. - -* The distributed curl/curlbuild.h file is only intended to be used on systems - which can not run the also distributed configure script. - -* The distributed curlbuild.h file is generated as a copy of curlbuild.h.dist - when the libcurl source code distribution archive file is originally created. - -* If you check out from git on a non-configure platform, you must run the - appropriate buildconf* script to set up curlbuild.h and other local files - before being able of compiling the library. - -* On systems capable of running the configure script, the configure process - will overwrite the distributed include/curl/curlbuild.h file with one that - is suitable and specific to the library being configured and built, which - is generated from the include/curl/curlbuild.h.in template file. - -* If you intend to distribute an already compiled libcurl library you _MUST_ - also distribute along with it the generated curl/curlbuild.h which has been - used to compile it. Otherwise the library will be of no use for the users of - the library that you have built. It is _your_ responsibility to provide this - file. No one at the curl project can know how you have built the library. - -* File curl/curlbuild.h includes platform and configuration dependent info, - and must not be modified by anyone. Configure script generates it for you. - -* We cannot assume anything else but very basic compiler features being - present. While libcurl requires an ANSI C compiler to build, some of the - earlier ANSI compilers clearly can't deal with some preprocessor operators. - -* Newlines must remain unix-style for older compilers' sake. - -* Comments must be written in the old-style /* unnested C-fashion */ - -To figure out how to do good and portable checks for features, operating -systems or specific hardwarare, a very good resource is Bjorn Reese's -collection at http://predef.sf.net/ diff --git a/code/curl-7.54.0/include/curl/curlbuild.h b/code/curl-7.54.0/include/curl/curlbuild.h deleted file mode 100644 index f596c607..00000000 --- a/code/curl-7.54.0/include/curl/curlbuild.h +++ /dev/null @@ -1,586 +0,0 @@ -#ifndef __CURL_CURLBUILD_H -#define __CURL_CURLBUILD_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* ================================================================ */ -/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * See file include/curl/curlbuild.h.in, run configure, and forget - * that this file exists it is only used for non-configure systems. - * But you can keep reading if you want ;-) - * - */ - -/* ================================================================ */ -/* NOTES FOR NON-CONFIGURE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * Nothing in this file is intended to be modified or adjusted by the - * curl library user nor by the curl library builder. - * - * If you think that something actually needs to be changed, adjusted - * or fixed in this file, then, report it on the libcurl development - * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ - * - * Try to keep one section per platform, compiler and architecture, - * otherwise, if an existing section is reused for a different one and - * later on the original is adjusted, probably the piggybacking one can - * be adversely changed. - * - * In order to differentiate between platforms/compilers/architectures - * use only compiler built in predefined preprocessor symbols. - * - * This header file shall only export symbols which are 'curl' or 'CURL' - * prefixed, otherwise public name space would be polluted. - * - * NOTE 2: - * ------- - * - * For any given platform/compiler curl_off_t must be typedef'ed to a - * 64-bit wide signed integral data type. The width of this data type - * must remain constant and independent of any possible large file - * support settings. - * - * As an exception to the above, curl_off_t shall be typedef'ed to a - * 32-bit wide signed integral data type if there is no 64-bit type. - * - * As a general rule, curl_off_t shall not be mapped to off_t. This - * rule shall only be violated if off_t is the only 64-bit data type - * available and the size of off_t is independent of large file support - * settings. Keep your build on the safe side avoiding an off_t gating. - * If you have a 64-bit off_t then take for sure that another 64-bit - * data type exists, dig deeper and you will find it. - * - * NOTE 3: - * ------- - * - * Right now you might be staring at file include/curl/curlbuild.h.dist or - * at file include/curl/curlbuild.h, this is due to the following reason: - * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h - * when the libcurl source code distribution archive file is created. - * - * File include/curl/curlbuild.h.dist is not included in the distribution - * archive. File include/curl/curlbuild.h is not present in the git tree. - * - * The distributed include/curl/curlbuild.h file is only intended to be used - * on systems which can not run the also distributed configure script. - * - * On systems capable of running the configure script, the configure process - * will overwrite the distributed include/curl/curlbuild.h file with one that - * is suitable and specific to the library being configured and built, which - * is generated from the include/curl/curlbuild.h.in template file. - * - * If you check out from git on a non-configure platform, you must run the - * appropriate buildconf* script to set up curlbuild.h and other local files. - * - */ - -/* ================================================================ */ -/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ -/* ================================================================ */ - -#ifdef CURL_SIZEOF_LONG -# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T -# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_SOCKLEN_T -# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined -#endif - -#ifdef CURL_TYPEOF_CURL_OFF_T -# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_T -# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_FORMAT_CURL_OFF_TU -# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined -#endif - -#ifdef CURL_FORMAT_OFF_T -# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined -#endif - -#ifdef CURL_SIZEOF_CURL_OFF_T -# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_T -# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined -#endif - -#ifdef CURL_SUFFIX_CURL_OFF_TU -# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined -#endif - -/* ================================================================ */ -/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ -/* ================================================================ */ - -#if defined(__DJGPP__) || defined(__GO32__) -# if defined(__DJGPP__) && (__DJGPP__ > 1) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SALFORDC__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__BORLANDC__) -# if (__BORLANDC__ < 0x520) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__TURBOC__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__WATCOMC__) -# if defined(__386__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__POCC__) -# if (__POCC__ < 280) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# elif defined(_MSC_VER) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__LCC__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SYMBIAN32__) -# if defined(__EABI__) /* Treat all ARM compilers equally */ -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__CW32__) -# pragma longlong on -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__VC32__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MWERKS__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(_WIN32_WCE) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MINGW32__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__VMS) -# if defined(__VAX) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__OS400__) -# if defined(__ILEC400__) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__MVS__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURL_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURL_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__370__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURL_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURL_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# else -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(TPF) -# define CURL_SIZEOF_LONG 8 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -/* ===================================== */ -/* KEEP MSVC THE PENULTIMATE ENTRY */ -/* ===================================== */ - -#elif defined(_MSC_VER) -# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T __int64 -# define CURL_FORMAT_CURL_OFF_T "I64d" -# define CURL_FORMAT_CURL_OFF_TU "I64u" -# define CURL_FORMAT_OFF_T "%I64d" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T i64 -# define CURL_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 4 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T int -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 - -/* ===================================== */ -/* KEEP GENERIC GCC THE LAST ENTRY */ -/* ===================================== */ - -#elif defined(__GNUC__) -# if !defined(__LP64__) && (defined(__ILP32__) || \ - defined(__i386__) || defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \ - defined(__sparc__) || defined(__mips__) || defined(__sh__)) -# define CURL_SIZEOF_LONG 4 -# define CURL_TYPEOF_CURL_OFF_T long long -# define CURL_FORMAT_CURL_OFF_T "lld" -# define CURL_FORMAT_CURL_OFF_TU "llu" -# define CURL_FORMAT_OFF_T "%lld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T LL -# define CURL_SUFFIX_CURL_OFF_TU ULL -# elif defined(__LP64__) || \ - defined(__x86_64__) || defined(__ppc64__) || defined(__powerpc64__) || defined(__sparc64__) -# define CURL_SIZEOF_LONG 8 -# define CURL_TYPEOF_CURL_OFF_T long -# define CURL_FORMAT_CURL_OFF_T "ld" -# define CURL_FORMAT_CURL_OFF_TU "lu" -# define CURL_FORMAT_OFF_T "%ld" -# define CURL_SIZEOF_CURL_OFF_T 8 -# define CURL_SUFFIX_CURL_OFF_T L -# define CURL_SUFFIX_CURL_OFF_TU UL -# endif -# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURL_SIZEOF_CURL_SOCKLEN_T 4 -# define CURL_PULL_SYS_TYPES_H 1 -# define CURL_PULL_SYS_SOCKET_H 1 - -#else -# error "Unknown non-configure build target!" - Error Compilation_aborted_Unknown_non_configure_build_target -#endif - -/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ -/* sys/types.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_TYPES_H -# include -#endif - -/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ -/* sys/socket.h is required here to properly make type definitions below. */ -#ifdef CURL_PULL_SYS_SOCKET_H -# include -#endif - -/* Data type definition of curl_socklen_t. */ - -#ifdef CURL_TYPEOF_CURL_SOCKLEN_T - typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; -#endif - -/* Data type definition of curl_off_t. */ - -#ifdef CURL_TYPEOF_CURL_OFF_T - typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; -#endif - -#endif /* __CURL_CURLBUILD_H */ diff --git a/code/curl-7.54.0/include/curl/curlrules.h b/code/curl-7.54.0/include/curl/curlrules.h deleted file mode 100644 index 0abd9f71..00000000 --- a/code/curl-7.54.0/include/curl/curlrules.h +++ /dev/null @@ -1,239 +0,0 @@ -#ifndef __CURL_CURLRULES_H -#define __CURL_CURLRULES_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* ================================================================ */ -/* COMPILE TIME SANITY CHECKS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * All checks done in this file are intentionally placed in a public - * header file which is pulled by curl/curl.h when an application is - * being built using an already built libcurl library. Additionally - * this file is also included and used when building the library. - * - * If compilation fails on this file it is certainly sure that the - * problem is elsewhere. It could be a problem in the curlbuild.h - * header file, or simply that you are using different compilation - * settings than those used to build the library. - * - * Nothing in this file is intended to be modified or adjusted by the - * curl library user nor by the curl library builder. - * - * Do not deactivate any check, these are done to make sure that the - * library is properly built and used. - * - * You can find further help on the libcurl development mailing list: - * https://cool.haxx.se/mailman/listinfo/curl-library/ - * - * NOTE 2 - * ------ - * - * Some of the following compile time checks are based on the fact - * that the dimension of a constant array can not be a negative one. - * In this way if the compile time verification fails, the compilation - * will fail issuing an error. The error description wording is compiler - * dependent but it will be quite similar to one of the following: - * - * "negative subscript or subscript is too large" - * "array must have at least one element" - * "-1 is an illegal array size" - * "size of array is negative" - * - * If you are building an application which tries to use an already - * built libcurl library and you are getting this kind of errors on - * this file, it is a clear indication that there is a mismatch between - * how the library was built and how you are trying to use it for your - * application. Your already compiled or binary library provider is the - * only one who can give you the details you need to properly use it. - */ - -/* - * Verify that some macros are actually defined. - */ - -#ifndef CURL_SIZEOF_LONG -# error "CURL_SIZEOF_LONG definition is missing!" - Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing -#endif - -#ifndef CURL_TYPEOF_CURL_SOCKLEN_T -# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing -#endif - -#ifndef CURL_SIZEOF_CURL_SOCKLEN_T -# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing -#endif - -#ifndef CURL_TYPEOF_CURL_OFF_T -# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_FORMAT_CURL_OFF_T -# error "CURL_FORMAT_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_FORMAT_CURL_OFF_TU -# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" - Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing -#endif - -#ifndef CURL_SIZEOF_CURL_OFF_T -# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_SUFFIX_CURL_OFF_T -# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing -#endif - -#ifndef CURL_SUFFIX_CURL_OFF_TU -# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" - Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing -#endif - -/* - * Macros private to this header file. - */ - -#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 - -#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 - -/* - * Verify that the size previously defined and expected for long - * is the same as the one reported by sizeof() at compile time. - */ - -typedef char - __curl_rule_01__ - [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; - -/* - * Verify that the size previously defined and expected for - * curl_off_t is actually the the same as the one reported - * by sizeof() at compile time. - */ - -typedef char - __curl_rule_02__ - [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; - -/* - * Verify at compile time that the size of curl_off_t as reported - * by sizeof() is greater or equal than the one reported for long - * for the current compilation. - */ - -typedef char - __curl_rule_03__ - [CurlchkszGE(curl_off_t, long)]; - -/* - * Verify that the size previously defined and expected for - * curl_socklen_t is actually the the same as the one reported - * by sizeof() at compile time. - */ - -typedef char - __curl_rule_04__ - [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; - -/* - * Verify at compile time that the size of curl_socklen_t as reported - * by sizeof() is greater or equal than the one reported for int for - * the current compilation. - */ - -typedef char - __curl_rule_05__ - [CurlchkszGE(curl_socklen_t, int)]; - -/* ================================================================ */ -/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ -/* ================================================================ */ - -/* - * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow - * these to be visible and exported by the external libcurl interface API, - * while also making them visible to the library internals, simply including - * curl_setup.h, without actually needing to include curl.h internally. - * If some day this section would grow big enough, all this should be moved - * to its own header file. - */ - -/* - * Figure out if we can use the ## preprocessor operator, which is supported - * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ - * or __cplusplus so we need to carefully check for them too. - */ - -#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ - defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ - defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ - defined(__ILEC400__) - /* This compiler is believed to have an ISO compatible preprocessor */ -#define CURL_ISOCPP -#else - /* This compiler is believed NOT to have an ISO compatible preprocessor */ -#undef CURL_ISOCPP -#endif - -/* - * Macros for minimum-width signed and unsigned curl_off_t integer constants. - */ - -#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) -# define __CURL_OFF_T_C_HLPR2(x) x -# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) -# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ - __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) -# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ - __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) -#else -# ifdef CURL_ISOCPP -# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix -# else -# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix -# endif -# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) -# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) -# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) -#endif - -/* - * Get rid of macros private to this header file. - */ - -#undef CurlchkszEQ -#undef CurlchkszGE - -#endif /* __CURL_CURLRULES_H */ diff --git a/code/curl-7.54.0/include/curl/system.h b/code/curl-7.54.0/include/curl/system.h deleted file mode 100644 index ed3a55c9..00000000 --- a/code/curl-7.54.0/include/curl/system.h +++ /dev/null @@ -1,484 +0,0 @@ -#ifndef __CURL_SYSTEM_H -#define __CURL_SYSTEM_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* - * This header is supposed to eventually replace curlbuild.h. This little one - * is still learning. During the experimental phase, this header files - * defines symbols using the prefixes CURLSYS_ or curlsys_. When we feel - * confident enough, we replace curlbuild.h with this file and rename all - * prefixes to CURL_ and curl_. - */ - -/* - * Try to keep one section per platform, compiler and architecture, otherwise, - * if an existing section is reused for a different one and later on the - * original is adjusted, probably the piggybacking one can be adversely - * changed. - * - * In order to differentiate between platforms/compilers/architectures use - * only compiler built in predefined preprocessor symbols. - * - * curl_off_t - * ---------- - * - * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit - * wide signed integral data type. The width of this data type must remain - * constant and independent of any possible large file support settings. - * - * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit - * wide signed integral data type if there is no 64-bit type. - * - * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall - * only be violated if off_t is the only 64-bit data type available and the - * size of off_t is independent of large file support settings. Keep your - * build on the safe side avoiding an off_t gating. If you have a 64-bit - * off_t then take for sure that another 64-bit data type exists, dig deeper - * and you will find it. - * - */ - -#if defined(__DJGPP__) || defined(__GO32__) -# if defined(__DJGPP__) && (__DJGPP__ > 1) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SALFORDC__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__BORLANDC__) -# if (__BORLANDC__ < 0x520) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__TURBOC__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__WATCOMC__) -# if defined(__386__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__POCC__) -# if (__POCC__ < 280) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# elif defined(_MSC_VER) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__LCC__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__SYMBIAN32__) -# if defined(__EABI__) /* Treat all ARM compilers equally */ -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(__CW32__) -# pragma longlong on -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(__VC32__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MWERKS__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(_WIN32_WCE) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__MINGW32__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_WS2TCPIP_H 1 - -#elif defined(__VMS) -# if defined(__VAX) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T unsigned int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__OS400__) -# if defined(__ILEC400__) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__MVS__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURLSYS_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURLSYS_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(__370__) -# if defined(__IBMC__) || defined(__IBMCPP__) -# if defined(_ILP32) -# define CURLSYS_SIZEOF_LONG 4 -# elif defined(_LP64) -# define CURLSYS_SIZEOF_LONG 8 -# endif -# if defined(_LONG_LONG) -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(_LP64) -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# else -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 -# endif - -#elif defined(TPF) -# define CURLSYS_SIZEOF_LONG 8 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -#elif defined(__TINYC__) /* also known as tcc */ - -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 - -/* ===================================== */ -/* KEEP MSVC THE PENULTIMATE ENTRY */ -/* ===================================== */ - -#elif defined(_MSC_VER) -# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T __int64 -# define CURLSYS_FORMAT_CURL_OFF_T "I64d" -# define CURLSYS_FORMAT_CURL_OFF_TU "I64u" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T i64 -# define CURLSYS_SUFFIX_CURL_OFF_TU ui64 -# else -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 - -/* ===================================== */ -/* KEEP GENERIC GCC THE LAST ENTRY */ -/* ===================================== */ - -#elif defined(__GNUC__) -# if !defined(__LP64__) && (defined(__ILP32__) || \ - defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ - defined(__sparc__) || defined(__mips__) || defined(__sh__)) -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long long -# define CURLSYS_FORMAT_CURL_OFF_T "lld" -# define CURLSYS_FORMAT_CURL_OFF_TU "llu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T LL -# define CURLSYS_SUFFIX_CURL_OFF_TU ULL -# elif defined(__LP64__) || \ - defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) -# define CURLSYS_SIZEOF_LONG 8 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SIZEOF_CURL_OFF_T 8 -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# endif -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T socklen_t -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_PULL_SYS_TYPES_H 1 -# define CURLSYS_PULL_SYS_SOCKET_H 1 - -#else -/* generic "safe guess" on old 32 bit style */ -# define CURLSYS_SIZEOF_LONG 4 -# define CURLSYS_SIZEOF_CURL_SOCKLEN_T 4 -# define CURLSYS_SIZEOF_CURL_OFF_T 4 -# define CURLSYS_TYPEOF_CURL_OFF_T long -# define CURLSYS_FORMAT_CURL_OFF_T "ld" -# define CURLSYS_FORMAT_CURL_OFF_TU "lu" -# define CURLSYS_SUFFIX_CURL_OFF_T L -# define CURLSYS_SUFFIX_CURL_OFF_TU UL -# define CURLSYS_TYPEOF_CURL_SOCKLEN_T int -#endif - -/* CURLSYS_PULL_WS2TCPIP_H is defined above when inclusion of header file */ -/* ws2tcpip.h is required here to properly make type definitions below. */ -#ifdef CURLSYS_PULL_WS2TCPIP_H -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -#endif - -/* CURLSYS_PULL_SYS_TYPES_H is defined above when inclusion of header file */ -/* sys/types.h is required here to properly make type definitions below. */ -#ifdef CURLSYS_PULL_SYS_TYPES_H -# include -#endif - -/* CURLSYS_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ -/* sys/socket.h is required here to properly make type definitions below. */ -#ifdef CURLSYS_PULL_SYS_SOCKET_H -# include -#endif - -/* Data type definition of curl_socklen_t. */ -#ifdef CURLSYS_TYPEOF_CURL_SOCKLEN_T - typedef CURLSYS_TYPEOF_CURL_SOCKLEN_T curlsys_socklen_t; -#endif - -/* Data type definition of curl_off_t. */ - -#ifdef CURLSYS_TYPEOF_CURL_OFF_T - typedef CURLSYS_TYPEOF_CURL_OFF_T curlsys_off_t; -#endif - -#endif /* __CURL_SYSTEM_H */ - diff --git a/code/curl-7.54.0/include/curl/typecheck-gcc.h b/code/curl-7.54.0/include/curl/typecheck-gcc.h deleted file mode 100644 index 3d683152..00000000 --- a/code/curl-7.54.0/include/curl/typecheck-gcc.h +++ /dev/null @@ -1,624 +0,0 @@ -#ifndef __CURL_TYPECHECK_GCC_H -#define __CURL_TYPECHECK_GCC_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at https://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* wraps curl_easy_setopt() with typechecking */ - -/* To add a new kind of warning, add an - * if(_curl_is_sometype_option(_curl_opt)) - * if(!_curl_is_sometype(value)) - * _curl_easy_setopt_err_sometype(); - * block and define _curl_is_sometype_option, _curl_is_sometype and - * _curl_easy_setopt_err_sometype below - * - * NOTE: We use two nested 'if' statements here instead of the && operator, in - * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x - * when compiling with -Wlogical-op. - * - * To add an option that uses the same type as an existing option, you'll just - * need to extend the appropriate _curl_*_option macro - */ -#define curl_easy_setopt(handle, option, value) \ -__extension__ ({ \ - __typeof__(option) _curl_opt = option; \ - if(__builtin_constant_p(_curl_opt)) { \ - if(_curl_is_long_option(_curl_opt)) \ - if(!_curl_is_long(value)) \ - _curl_easy_setopt_err_long(); \ - if(_curl_is_off_t_option(_curl_opt)) \ - if(!_curl_is_off_t(value)) \ - _curl_easy_setopt_err_curl_off_t(); \ - if(_curl_is_string_option(_curl_opt)) \ - if(!_curl_is_string(value)) \ - _curl_easy_setopt_err_string(); \ - if(_curl_is_write_cb_option(_curl_opt)) \ - if(!_curl_is_write_cb(value)) \ - _curl_easy_setopt_err_write_callback(); \ - if((_curl_opt) == CURLOPT_READFUNCTION) \ - if(!_curl_is_read_cb(value)) \ - _curl_easy_setopt_err_read_cb(); \ - if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ - if(!_curl_is_ioctl_cb(value)) \ - _curl_easy_setopt_err_ioctl_cb(); \ - if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ - if(!_curl_is_sockopt_cb(value)) \ - _curl_easy_setopt_err_sockopt_cb(); \ - if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ - if(!_curl_is_opensocket_cb(value)) \ - _curl_easy_setopt_err_opensocket_cb(); \ - if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ - if(!_curl_is_progress_cb(value)) \ - _curl_easy_setopt_err_progress_cb(); \ - if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ - if(!_curl_is_debug_cb(value)) \ - _curl_easy_setopt_err_debug_cb(); \ - if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ - if(!_curl_is_ssl_ctx_cb(value)) \ - _curl_easy_setopt_err_ssl_ctx_cb(); \ - if(_curl_is_conv_cb_option(_curl_opt)) \ - if(!_curl_is_conv_cb(value)) \ - _curl_easy_setopt_err_conv_cb(); \ - if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ - if(!_curl_is_seek_cb(value)) \ - _curl_easy_setopt_err_seek_cb(); \ - if(_curl_is_cb_data_option(_curl_opt)) \ - if(!_curl_is_cb_data(value)) \ - _curl_easy_setopt_err_cb_data(); \ - if((_curl_opt) == CURLOPT_ERRORBUFFER) \ - if(!_curl_is_error_buffer(value)) \ - _curl_easy_setopt_err_error_buffer(); \ - if((_curl_opt) == CURLOPT_STDERR) \ - if(!_curl_is_FILE(value)) \ - _curl_easy_setopt_err_FILE(); \ - if(_curl_is_postfields_option(_curl_opt)) \ - if(!_curl_is_postfields(value)) \ - _curl_easy_setopt_err_postfields(); \ - if((_curl_opt) == CURLOPT_HTTPPOST) \ - if(!_curl_is_arr((value), struct curl_httppost)) \ - _curl_easy_setopt_err_curl_httpost(); \ - if(_curl_is_slist_option(_curl_opt)) \ - if(!_curl_is_arr((value), struct curl_slist)) \ - _curl_easy_setopt_err_curl_slist(); \ - if((_curl_opt) == CURLOPT_SHARE) \ - if(!_curl_is_ptr((value), CURLSH)) \ - _curl_easy_setopt_err_CURLSH(); \ - } \ - curl_easy_setopt(handle, _curl_opt, value); \ -}) - -/* wraps curl_easy_getinfo() with typechecking */ -/* FIXME: don't allow const pointers */ -#define curl_easy_getinfo(handle, info, arg) \ -__extension__ ({ \ - __typeof__(info) _curl_info = info; \ - if(__builtin_constant_p(_curl_info)) { \ - if(_curl_is_string_info(_curl_info)) \ - if(!_curl_is_arr((arg), char *)) \ - _curl_easy_getinfo_err_string(); \ - if(_curl_is_long_info(_curl_info)) \ - if(!_curl_is_arr((arg), long)) \ - _curl_easy_getinfo_err_long(); \ - if(_curl_is_double_info(_curl_info)) \ - if(!_curl_is_arr((arg), double)) \ - _curl_easy_getinfo_err_double(); \ - if(_curl_is_slist_info(_curl_info)) \ - if(!_curl_is_arr((arg), struct curl_slist *)) \ - _curl_easy_getinfo_err_curl_slist(); \ - } \ - curl_easy_getinfo(handle, _curl_info, arg); \ -}) - -/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), - * for now just make sure that the functions are called with three - * arguments - */ -#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) -#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) - - -/* the actual warnings, triggered by calling the _curl_easy_setopt_err* - * functions */ - -/* To define a new warning, use _CURL_WARNING(identifier, "message") */ -#define _CURL_WARNING(id, message) \ - static void __attribute__((__warning__(message))) \ - __attribute__((__unused__)) __attribute__((__noinline__)) \ - id(void) { __asm__(""); } - -_CURL_WARNING(_curl_easy_setopt_err_long, - "curl_easy_setopt expects a long argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, - "curl_easy_setopt expects a curl_off_t argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_string, - "curl_easy_setopt expects a " - "string ('char *' or char[]) argument for this option" - ) -_CURL_WARNING(_curl_easy_setopt_err_write_callback, - "curl_easy_setopt expects a curl_write_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_read_cb, - "curl_easy_setopt expects a curl_read_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, - "curl_easy_setopt expects a curl_ioctl_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, - "curl_easy_setopt expects a curl_sockopt_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, - "curl_easy_setopt expects a " - "curl_opensocket_callback argument for this option" - ) -_CURL_WARNING(_curl_easy_setopt_err_progress_cb, - "curl_easy_setopt expects a curl_progress_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_debug_cb, - "curl_easy_setopt expects a curl_debug_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, - "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_conv_cb, - "curl_easy_setopt expects a curl_conv_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_seek_cb, - "curl_easy_setopt expects a curl_seek_callback argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_cb_data, - "curl_easy_setopt expects a " - "private data pointer as argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_error_buffer, - "curl_easy_setopt expects a " - "char buffer of CURL_ERROR_SIZE as argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_FILE, - "curl_easy_setopt expects a 'FILE *' argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_postfields, - "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, - "curl_easy_setopt expects a 'struct curl_httppost *' " - "argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_curl_slist, - "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") -_CURL_WARNING(_curl_easy_setopt_err_CURLSH, - "curl_easy_setopt expects a CURLSH* argument for this option") - -_CURL_WARNING(_curl_easy_getinfo_err_string, - "curl_easy_getinfo expects a pointer to 'char *' for this info") -_CURL_WARNING(_curl_easy_getinfo_err_long, - "curl_easy_getinfo expects a pointer to long for this info") -_CURL_WARNING(_curl_easy_getinfo_err_double, - "curl_easy_getinfo expects a pointer to double for this info") -_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, - "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") - -/* groups of curl_easy_setops options that take the same type of argument */ - -/* To add a new option to one of the groups, just add - * (option) == CURLOPT_SOMETHING - * to the or-expression. If the option takes a long or curl_off_t, you don't - * have to do anything - */ - -/* evaluates to true if option takes a long argument */ -#define _curl_is_long_option(option) \ - (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) - -#define _curl_is_off_t_option(option) \ - ((option) > CURLOPTTYPE_OFF_T) - -/* evaluates to true if option takes a char* argument */ -#define _curl_is_string_option(option) \ - ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ - (option) == CURLOPT_ACCEPT_ENCODING || \ - (option) == CURLOPT_CAINFO || \ - (option) == CURLOPT_CAPATH || \ - (option) == CURLOPT_COOKIE || \ - (option) == CURLOPT_COOKIEFILE || \ - (option) == CURLOPT_COOKIEJAR || \ - (option) == CURLOPT_COOKIELIST || \ - (option) == CURLOPT_CRLFILE || \ - (option) == CURLOPT_CUSTOMREQUEST || \ - (option) == CURLOPT_DEFAULT_PROTOCOL || \ - (option) == CURLOPT_DNS_INTERFACE || \ - (option) == CURLOPT_DNS_LOCAL_IP4 || \ - (option) == CURLOPT_DNS_LOCAL_IP6 || \ - (option) == CURLOPT_DNS_SERVERS || \ - (option) == CURLOPT_EGDSOCKET || \ - (option) == CURLOPT_FTPPORT || \ - (option) == CURLOPT_FTP_ACCOUNT || \ - (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ - (option) == CURLOPT_INTERFACE || \ - (option) == CURLOPT_ISSUERCERT || \ - (option) == CURLOPT_KEYPASSWD || \ - (option) == CURLOPT_KRBLEVEL || \ - (option) == CURLOPT_LOGIN_OPTIONS || \ - (option) == CURLOPT_MAIL_AUTH || \ - (option) == CURLOPT_MAIL_FROM || \ - (option) == CURLOPT_NETRC_FILE || \ - (option) == CURLOPT_NOPROXY || \ - (option) == CURLOPT_PASSWORD || \ - (option) == CURLOPT_PINNEDPUBLICKEY || \ - (option) == CURLOPT_PROXY || \ - (option) == CURLOPT_PROXYPASSWORD || \ - (option) == CURLOPT_PROXYUSERNAME || \ - (option) == CURLOPT_PROXYUSERPWD || \ - (option) == CURLOPT_PROXY_SERVICE_NAME || \ - (option) == CURLOPT_RANDOM_FILE || \ - (option) == CURLOPT_RANGE || \ - (option) == CURLOPT_REFERER || \ - (option) == CURLOPT_RTSP_SESSION_ID || \ - (option) == CURLOPT_RTSP_STREAM_URI || \ - (option) == CURLOPT_RTSP_TRANSPORT || \ - (option) == CURLOPT_SERVICE_NAME || \ - (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ - (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ - (option) == CURLOPT_SSH_KNOWNHOSTS || \ - (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ - (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ - (option) == CURLOPT_SSLCERT || \ - (option) == CURLOPT_SSLCERTTYPE || \ - (option) == CURLOPT_SSLENGINE || \ - (option) == CURLOPT_SSLKEY || \ - (option) == CURLOPT_SSLKEYTYPE || \ - (option) == CURLOPT_SSL_CIPHER_LIST || \ - (option) == CURLOPT_TLSAUTH_PASSWORD || \ - (option) == CURLOPT_TLSAUTH_TYPE || \ - (option) == CURLOPT_TLSAUTH_USERNAME || \ - (option) == CURLOPT_UNIX_SOCKET_PATH || \ - (option) == CURLOPT_URL || \ - (option) == CURLOPT_USERAGENT || \ - (option) == CURLOPT_USERNAME || \ - (option) == CURLOPT_USERPWD || \ - (option) == CURLOPT_XOAUTH2_BEARER || \ - 0) - -/* evaluates to true if option takes a curl_write_callback argument */ -#define _curl_is_write_cb_option(option) \ - ((option) == CURLOPT_HEADERFUNCTION || \ - (option) == CURLOPT_WRITEFUNCTION) - -/* evaluates to true if option takes a curl_conv_callback argument */ -#define _curl_is_conv_cb_option(option) \ - ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ - (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ - (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) - -/* evaluates to true if option takes a data argument to pass to a callback */ -#define _curl_is_cb_data_option(option) \ - ((option) == CURLOPT_CHUNK_DATA || \ - (option) == CURLOPT_CLOSESOCKETDATA || \ - (option) == CURLOPT_DEBUGDATA || \ - (option) == CURLOPT_FNMATCH_DATA || \ - (option) == CURLOPT_HEADERDATA || \ - (option) == CURLOPT_INTERLEAVEDATA || \ - (option) == CURLOPT_IOCTLDATA || \ - (option) == CURLOPT_OPENSOCKETDATA || \ - (option) == CURLOPT_PRIVATE || \ - (option) == CURLOPT_PROGRESSDATA || \ - (option) == CURLOPT_READDATA || \ - (option) == CURLOPT_SEEKDATA || \ - (option) == CURLOPT_SOCKOPTDATA || \ - (option) == CURLOPT_SSH_KEYDATA || \ - (option) == CURLOPT_SSL_CTX_DATA || \ - (option) == CURLOPT_WRITEDATA || \ - 0) - -/* evaluates to true if option takes a POST data argument (void* or char*) */ -#define _curl_is_postfields_option(option) \ - ((option) == CURLOPT_POSTFIELDS || \ - (option) == CURLOPT_COPYPOSTFIELDS || \ - 0) - -/* evaluates to true if option takes a struct curl_slist * argument */ -#define _curl_is_slist_option(option) \ - ((option) == CURLOPT_HTTP200ALIASES || \ - (option) == CURLOPT_HTTPHEADER || \ - (option) == CURLOPT_MAIL_RCPT || \ - (option) == CURLOPT_POSTQUOTE || \ - (option) == CURLOPT_PREQUOTE || \ - (option) == CURLOPT_PROXYHEADER || \ - (option) == CURLOPT_QUOTE || \ - (option) == CURLOPT_RESOLVE || \ - (option) == CURLOPT_TELNETOPTIONS || \ - 0) - -/* groups of curl_easy_getinfo infos that take the same type of argument */ - -/* evaluates to true if info expects a pointer to char * argument */ -#define _curl_is_string_info(info) \ - (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) - -/* evaluates to true if info expects a pointer to long argument */ -#define _curl_is_long_info(info) \ - (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) - -/* evaluates to true if info expects a pointer to double argument */ -#define _curl_is_double_info(info) \ - (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) - -/* true if info expects a pointer to struct curl_slist * argument */ -#define _curl_is_slist_info(info) \ - (CURLINFO_SLIST < (info)) - - -/* typecheck helpers -- check whether given expression has requested type*/ - -/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, - * otherwise define a new macro. Search for __builtin_types_compatible_p - * in the GCC manual. - * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is - * the actual expression passed to the curl_easy_setopt macro. This - * means that you can only apply the sizeof and __typeof__ operators, no - * == or whatsoever. - */ - -/* XXX: should evaluate to true iff expr is a pointer */ -#define _curl_is_any_ptr(expr) \ - (sizeof(expr) == sizeof(void *)) - -/* evaluates to true if expr is NULL */ -/* XXX: must not evaluate expr, so this check is not accurate */ -#define _curl_is_NULL(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) - -/* evaluates to true if expr is type*, const type* or NULL */ -#define _curl_is_ptr(expr, type) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), type *) || \ - __builtin_types_compatible_p(__typeof__(expr), const type *)) - -/* evaluates to true if expr is one of type[], type*, NULL or const type* */ -#define _curl_is_arr(expr, type) \ - (_curl_is_ptr((expr), type) || \ - __builtin_types_compatible_p(__typeof__(expr), type [])) - -/* evaluates to true if expr is a string */ -#define _curl_is_string(expr) \ - (_curl_is_arr((expr), char) || \ - _curl_is_arr((expr), signed char) || \ - _curl_is_arr((expr), unsigned char)) - -/* evaluates to true if expr is a long (no matter the signedness) - * XXX: for now, int is also accepted (and therefore short and char, which - * are promoted to int when passed to a variadic function) */ -#define _curl_is_long(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), long) || \ - __builtin_types_compatible_p(__typeof__(expr), signed long) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ - __builtin_types_compatible_p(__typeof__(expr), int) || \ - __builtin_types_compatible_p(__typeof__(expr), signed int) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ - __builtin_types_compatible_p(__typeof__(expr), short) || \ - __builtin_types_compatible_p(__typeof__(expr), signed short) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ - __builtin_types_compatible_p(__typeof__(expr), char) || \ - __builtin_types_compatible_p(__typeof__(expr), signed char) || \ - __builtin_types_compatible_p(__typeof__(expr), unsigned char)) - -/* evaluates to true if expr is of type curl_off_t */ -#define _curl_is_off_t(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) - -/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ -/* XXX: also check size of an char[] array? */ -#define _curl_is_error_buffer(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), char *) || \ - __builtin_types_compatible_p(__typeof__(expr), char[])) - -/* evaluates to true if expr is of type (const) void* or (const) FILE* */ -#if 0 -#define _curl_is_cb_data(expr) \ - (_curl_is_ptr((expr), void) || \ - _curl_is_ptr((expr), FILE)) -#else /* be less strict */ -#define _curl_is_cb_data(expr) \ - _curl_is_any_ptr(expr) -#endif - -/* evaluates to true if expr is of type FILE* */ -#define _curl_is_FILE(expr) \ - (__builtin_types_compatible_p(__typeof__(expr), FILE *)) - -/* evaluates to true if expr can be passed as POST data (void* or char*) */ -#define _curl_is_postfields(expr) \ - (_curl_is_ptr((expr), void) || \ - _curl_is_arr((expr), char)) - -/* FIXME: the whole callback checking is messy... - * The idea is to tolerate char vs. void and const vs. not const - * pointers in arguments at least - */ -/* helper: __builtin_types_compatible_p distinguishes between functions and - * function pointers, hide it */ -#define _curl_callback_compatible(func, type) \ - (__builtin_types_compatible_p(__typeof__(func), type) || \ - __builtin_types_compatible_p(__typeof__(func), type*)) - -/* evaluates to true if expr is of type curl_read_callback or "similar" */ -#define _curl_is_read_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ - _curl_callback_compatible((expr), _curl_read_callback1) || \ - _curl_callback_compatible((expr), _curl_read_callback2) || \ - _curl_callback_compatible((expr), _curl_read_callback3) || \ - _curl_callback_compatible((expr), _curl_read_callback4) || \ - _curl_callback_compatible((expr), _curl_read_callback5) || \ - _curl_callback_compatible((expr), _curl_read_callback6)) -typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void *); -typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void *); -typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE *); -typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void *); -typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void *); -typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE *); - -/* evaluates to true if expr is of type curl_write_callback or "similar" */ -#define _curl_is_write_cb(expr) \ - (_curl_is_read_cb(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ - _curl_callback_compatible((expr), _curl_write_callback1) || \ - _curl_callback_compatible((expr), _curl_write_callback2) || \ - _curl_callback_compatible((expr), _curl_write_callback3) || \ - _curl_callback_compatible((expr), _curl_write_callback4) || \ - _curl_callback_compatible((expr), _curl_write_callback5) || \ - _curl_callback_compatible((expr), _curl_write_callback6)) -typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void *); -typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, - const void *); -typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE *); -typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void *); -typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, - const void *); -typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE *); - -/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ -#define _curl_is_ioctl_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ - _curl_callback_compatible((expr), _curl_ioctl_callback4)) -typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void *); -typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void *); -typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void *); -typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void *); - -/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ -#define _curl_is_sockopt_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ - _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ - _curl_callback_compatible((expr), _curl_sockopt_callback2)) -typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); -typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, - curlsocktype); - -/* evaluates to true if expr is of type curl_opensocket_callback or - "similar" */ -#define _curl_is_opensocket_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ - _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ - _curl_callback_compatible((expr), _curl_opensocket_callback4)) -typedef curl_socket_t (_curl_opensocket_callback1) - (void *, curlsocktype, struct curl_sockaddr *); -typedef curl_socket_t (_curl_opensocket_callback2) - (void *, curlsocktype, const struct curl_sockaddr *); -typedef curl_socket_t (_curl_opensocket_callback3) - (const void *, curlsocktype, struct curl_sockaddr *); -typedef curl_socket_t (_curl_opensocket_callback4) - (const void *, curlsocktype, const struct curl_sockaddr *); - -/* evaluates to true if expr is of type curl_progress_callback or "similar" */ -#define _curl_is_progress_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ - _curl_callback_compatible((expr), _curl_progress_callback1) || \ - _curl_callback_compatible((expr), _curl_progress_callback2)) -typedef int (_curl_progress_callback1)(void *, - double, double, double, double); -typedef int (_curl_progress_callback2)(const void *, - double, double, double, double); - -/* evaluates to true if expr is of type curl_debug_callback or "similar" */ -#define _curl_is_debug_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ - _curl_callback_compatible((expr), _curl_debug_callback1) || \ - _curl_callback_compatible((expr), _curl_debug_callback2) || \ - _curl_callback_compatible((expr), _curl_debug_callback3) || \ - _curl_callback_compatible((expr), _curl_debug_callback4) || \ - _curl_callback_compatible((expr), _curl_debug_callback5) || \ - _curl_callback_compatible((expr), _curl_debug_callback6) || \ - _curl_callback_compatible((expr), _curl_debug_callback7) || \ - _curl_callback_compatible((expr), _curl_debug_callback8)) -typedef int (_curl_debug_callback1) (CURL *, - curl_infotype, char *, size_t, void *); -typedef int (_curl_debug_callback2) (CURL *, - curl_infotype, char *, size_t, const void *); -typedef int (_curl_debug_callback3) (CURL *, - curl_infotype, const char *, size_t, void *); -typedef int (_curl_debug_callback4) (CURL *, - curl_infotype, const char *, size_t, const void *); -typedef int (_curl_debug_callback5) (CURL *, - curl_infotype, unsigned char *, size_t, void *); -typedef int (_curl_debug_callback6) (CURL *, - curl_infotype, unsigned char *, size_t, const void *); -typedef int (_curl_debug_callback7) (CURL *, - curl_infotype, const unsigned char *, size_t, void *); -typedef int (_curl_debug_callback8) (CURL *, - curl_infotype, const unsigned char *, size_t, const void *); - -/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ -/* this is getting even messier... */ -#define _curl_is_ssl_ctx_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ - _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) -typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); -typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); -typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); -typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); -#ifdef HEADER_SSL_H -/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX - * this will of course break if we're included before OpenSSL headers... - */ -typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); -typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); -typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); -typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, - const void *); -#else -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; -typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; -#endif - -/* evaluates to true if expr is of type curl_conv_callback or "similar" */ -#define _curl_is_conv_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ - _curl_callback_compatible((expr), _curl_conv_callback1) || \ - _curl_callback_compatible((expr), _curl_conv_callback2) || \ - _curl_callback_compatible((expr), _curl_conv_callback3) || \ - _curl_callback_compatible((expr), _curl_conv_callback4)) -typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); -typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); -typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); -typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); - -/* evaluates to true if expr is of type curl_seek_callback or "similar" */ -#define _curl_is_seek_cb(expr) \ - (_curl_is_NULL(expr) || \ - __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ - _curl_callback_compatible((expr), _curl_seek_callback1) || \ - _curl_callback_compatible((expr), _curl_seek_callback2)) -typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); -typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); - - -#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/code/fgame/CMakeLists.txt b/code/fgame/CMakeLists.txt index c0161b52..66d42a98 100644 --- a/code/fgame/CMakeLists.txt +++ b/code/fgame/CMakeLists.txt @@ -59,9 +59,9 @@ if (FLEX_FOUND AND BISON_FOUND) endif() # Recast navigation -add_subdirectory(../recastnavigation/Detour fgame_detour) -add_subdirectory(../recastnavigation/DetourCrowd fgame_detour_crowd) -add_subdirectory(../recastnavigation/Recast fgame_recast) +add_subdirectory(../thirdparty/recastnavigation/Detour fgame_detour) +add_subdirectory(../thirdparty/recastnavigation/DetourCrowd fgame_detour_crowd) +add_subdirectory(../thirdparty/recastnavigation/Recast fgame_recast) # Enable position independant code on recast navigation libraries. # Otherwise linking will fail relocating some functions on Linux set_property(TARGET Detour DetourCrowd Recast PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/code/jpeg-9f/cdjpeg.c b/code/jpeg-9f/cdjpeg.c deleted file mode 100644 index b6250ff9..00000000 --- a/code/jpeg-9f/cdjpeg.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * cdjpeg.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains common support routines used by the IJG application - * programs (cjpeg, djpeg, jpegtran). - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include /* to declare isupper(), tolower() */ -#ifdef NEED_SIGNAL_CATCHER -#include /* to declare signal() */ -#endif -#ifdef USE_SETMODE -#include /* to declare setmode()'s parameter macros */ -/* If you have setmode() but not , just delete this line: */ -#include /* to declare setmode() */ -#endif - - -/* - * Signal catcher to ensure that temporary files are removed before aborting. - * NB: for Amiga Manx C this is actually a global routine named _abort(); - * we put "#define signal_catcher _abort" in jconfig.h. Talk about bogus... - */ - -#ifdef NEED_SIGNAL_CATCHER - -static j_common_ptr sig_cinfo; - -void /* must be global for Manx C */ -signal_catcher (int signum) -{ - if (sig_cinfo != NULL) { - if (sig_cinfo->err != NULL) /* turn off trace output */ - sig_cinfo->err->trace_level = 0; - jpeg_destroy(sig_cinfo); /* clean up memory allocation & temp files */ - } - exit(EXIT_FAILURE); -} - - -GLOBAL(void) -enable_signal_catcher (j_common_ptr cinfo) -{ - sig_cinfo = cinfo; -#ifdef SIGINT /* not all systems have SIGINT */ - signal(SIGINT, signal_catcher); -#endif -#ifdef SIGTERM /* not all systems have SIGTERM */ - signal(SIGTERM, signal_catcher); -#endif -} - -#endif - - -/* - * Optional progress monitor: display a percent-done figure on stderr. - */ - -#ifdef PROGRESS_REPORT - -METHODDEF(void) -progress_monitor (j_common_ptr cinfo) -{ - cd_progress_ptr prog = (cd_progress_ptr) cinfo->progress; - int total_passes = prog->pub.total_passes + prog->total_extra_passes; - int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit); - - if (percent_done != prog->percent_done) { - prog->percent_done = percent_done; - if (total_passes > 1) { - fprintf(stderr, "\rPass %d/%d: %3d%% ", - prog->pub.completed_passes + prog->completed_extra_passes + 1, - total_passes, percent_done); - } else { - fprintf(stderr, "\r %3d%% ", percent_done); - } - fflush(stderr); - } -} - - -GLOBAL(void) -start_progress_monitor (j_common_ptr cinfo, cd_progress_ptr progress) -{ - /* Enable progress display, unless trace output is on */ - if (cinfo->err->trace_level == 0) { - progress->pub.progress_monitor = progress_monitor; - progress->completed_extra_passes = 0; - progress->total_extra_passes = 0; - progress->percent_done = -1; - cinfo->progress = &progress->pub; - } -} - - -GLOBAL(void) -end_progress_monitor (j_common_ptr cinfo) -{ - /* Clear away progress display */ - if (cinfo->err->trace_level == 0) { - fprintf(stderr, "\r \r"); - fflush(stderr); - } -} - -#endif - - -/* - * Case-insensitive matching of possibly-abbreviated keyword switches. - * keyword is the constant keyword (must be lower case already), - * minchars is length of minimum legal abbreviation. - */ - -GLOBAL(boolean) -keymatch (char * arg, const char * keyword, int minchars) -{ - register int ca, ck; - register int nmatched = 0; - - while ((ca = *arg++) != '\0') { - if ((ck = *keyword++) == '\0') - return FALSE; /* arg longer than keyword, no good */ - if (isupper(ca)) /* force arg to lcase (assume ck is already) */ - ca = tolower(ca); - if (ca != ck) - return FALSE; /* no good */ - nmatched++; /* count matched characters */ - } - /* reached end of argument; fail if it's too short for unique abbrev */ - if (nmatched < minchars) - return FALSE; - return TRUE; /* A-OK */ -} - - -/* - * Routines to establish binary I/O mode for stdin and stdout. - * Non-Unix systems often require some hacking to get out of text mode. - */ - -GLOBAL(FILE *) -read_stdin (void) -{ - FILE * input_file = stdin; - -#ifdef USE_SETMODE /* need to hack file mode? */ - setmode(fileno(stdin), O_BINARY); -#endif -#ifdef USE_FDOPEN /* need to re-open in binary mode? */ - if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) { - fprintf(stderr, "Cannot reopen stdin\n"); - exit(EXIT_FAILURE); - } -#endif - return input_file; -} - - -GLOBAL(FILE *) -write_stdout (void) -{ - FILE * output_file = stdout; - -#ifdef USE_SETMODE /* need to hack file mode? */ - setmode(fileno(stdout), O_BINARY); -#endif -#ifdef USE_FDOPEN /* need to re-open in binary mode? */ - if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { - fprintf(stderr, "Cannot reopen stdout\n"); - exit(EXIT_FAILURE); - } -#endif - return output_file; -} diff --git a/code/jpeg-9f/cjpeg.c b/code/jpeg-9f/cjpeg.c deleted file mode 100644 index 3cb07fa4..00000000 --- a/code/jpeg-9f/cjpeg.c +++ /dev/null @@ -1,664 +0,0 @@ -/* - * cjpeg.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2003-2013 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a command-line user interface for the JPEG compressor. - * It should work on any system with Unix- or MS-DOS-style command lines. - * - * Two different command line styles are permitted, depending on the - * compile-time switch TWO_FILE_COMMANDLINE: - * cjpeg [options] inputfile outputfile - * cjpeg [options] [inputfile] - * In the second style, output is always to standard output, which you'd - * normally redirect to a file or pipe to some other program. Input is - * either from a named file or from standard input (typically redirected). - * The second style is convenient on Unix but is unhelpful on systems that - * don't support pipes. Also, you MUST use the first style if your system - * doesn't do binary I/O to stdin/stdout. - * To simplify script writing, the "-outfile" switch is provided. The syntax - * cjpeg [options] -outfile outputfile inputfile - * works regardless of which command line style is used. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include "jversion.h" /* for version message */ - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - - -/* Create the add-on message string table. */ - -#define JMESSAGE(code,string) string , - -static const char * const cdjpeg_message_table[] = { -#include "cderror.h" - NULL -}; - - -/* - * This routine determines what format the input file is, - * and selects the appropriate input-reading module. - * - * To determine which family of input formats the file belongs to, - * we may look only at the first byte of the file, since C does not - * guarantee that more than one character can be pushed back with ungetc. - * Looking at additional bytes would require one of these approaches: - * 1) assume we can fseek() the input file (fails for piped input); - * 2) assume we can push back more than one character (works in - * some C implementations, but unportable); - * 3) provide our own buffering (breaks input readers that want to use - * stdio directly, such as the RLE library); - * or 4) don't put back the data, and modify the input_init methods to assume - * they start reading after the start of file (also breaks RLE library). - * #1 is attractive for MS-DOS but is untenable on Unix. - * - * The most portable solution for file types that can't be identified by their - * first byte is to make the user tell us what they are. This is also the - * only approach for "raw" file types that contain only arbitrary values. - * We presently apply this method for Targa files. Most of the time Targa - * files start with 0x00, so we recognize that case. Potentially, however, - * a Targa file could start with any byte value (byte 0 is the length of the - * seldom-used ID field), so we provide a switch to force Targa input mode. - */ - -static boolean is_targa; /* records user -targa switch */ - - -LOCAL(cjpeg_source_ptr) -select_file_type (j_compress_ptr cinfo, FILE * infile) -{ - int c; - - if (is_targa) { -#ifdef TARGA_SUPPORTED - return jinit_read_targa(cinfo); -#else - ERREXIT(cinfo, JERR_TGA_NOTCOMP); -#endif - } - - if ((c = getc(infile)) == EOF) - ERREXIT(cinfo, JERR_INPUT_EMPTY); - if (ungetc(c, infile) == EOF) - ERREXIT(cinfo, JERR_UNGETC_FAILED); - - switch (c) { -#ifdef BMP_SUPPORTED - case 'B': - return jinit_read_bmp(cinfo); -#endif -#ifdef GIF_SUPPORTED - case 'G': - return jinit_read_gif(cinfo); -#endif -#ifdef PPM_SUPPORTED - case 'P': - return jinit_read_ppm(cinfo); -#endif -#ifdef RLE_SUPPORTED - case 'R': - return jinit_read_rle(cinfo); -#endif -#ifdef TARGA_SUPPORTED - case 0x00: - return jinit_read_targa(cinfo); -#endif - default: - ERREXIT(cinfo, JERR_UNKNOWN_FORMAT); - break; - } - - return NULL; /* suppress compiler warnings */ -} - - -/* - * Argument-parsing code. - * The switch parser is designed to be useful with DOS-style command line - * syntax, ie, intermixed switches and file names, where only the switches - * to the left of a given file name affect processing of that file. - * The main program in this file doesn't actually use this capability... - */ - - -static const char * progname; /* program name for error messages */ -static char * outfilename; /* for -outfile switch */ - - -LOCAL(void) -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "usage: %s [switches] ", progname); -#ifdef TWO_FILE_COMMANDLINE - fprintf(stderr, "inputfile outputfile\n"); -#else - fprintf(stderr, "[inputfile]\n"); -#endif - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n"); - fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); - fprintf(stderr, " -rgb Create RGB JPEG file\n"); -#ifdef ENTROPY_OPT_SUPPORTED - fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); -#endif -#ifdef C_PROGRESSIVE_SUPPORTED - fprintf(stderr, " -progressive Create progressive JPEG file\n"); -#endif -#ifdef DCT_SCALING_SUPPORTED - fprintf(stderr, " -scale M/N Scale image by fraction M/N, eg, 1/2\n"); -#endif -#ifdef TARGA_SUPPORTED - fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); -#endif - fprintf(stderr, "Switches for advanced users:\n"); -#ifdef C_ARITH_CODING_SUPPORTED - fprintf(stderr, " -arithmetic Use arithmetic coding\n"); -#endif -#ifdef DCT_SCALING_SUPPORTED - fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n"); -#endif -#if JPEG_LIB_VERSION_MAJOR >= 9 - fprintf(stderr, " -rgb1 Create RGB JPEG file with reversible color transform\n"); - fprintf(stderr, " -bgycc Create big gamut YCC JPEG file\n"); -#endif -#ifdef DCT_ISLOW_SUPPORTED - fprintf(stderr, " -dct int Use integer DCT method%s\n", - (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); -#endif -#ifdef DCT_IFAST_SUPPORTED - fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", - (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); -#endif -#ifdef DCT_FLOAT_SUPPORTED - fprintf(stderr, " -dct float Use floating-point DCT method%s\n", - (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); -#endif - fprintf(stderr, " -nosmooth Don't use high-quality downsampling\n"); - fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); -#ifdef INPUT_SMOOTHING_SUPPORTED - fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n"); -#endif - fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); - fprintf(stderr, " -outfile name Specify name for output file\n"); - fprintf(stderr, " -verbose or -debug Emit debug output\n"); - fprintf(stderr, "Switches for wizards:\n"); - fprintf(stderr, " -baseline Force baseline quantization tables\n"); - fprintf(stderr, " -qtables file Use quantization tables given in file\n"); - fprintf(stderr, " -qslots N[,...] Set component quantization tables\n"); - fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n"); -#ifdef C_MULTISCAN_FILES_SUPPORTED - fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); -#endif - exit(EXIT_FAILURE); -} - - -LOCAL(int) -parse_switches (j_compress_ptr cinfo, int argc, char **argv, - int last_file_arg_seen, boolean for_real) -/* Parse optional switches. - * Returns argv[] index of first file-name argument (== argc if none). - * Any file names with indexes <= last_file_arg_seen are ignored; - * they have presumably been processed in a previous iteration. - * (Pass 0 for last_file_arg_seen on the first or only iteration.) - * for_real is FALSE on the first (dummy) pass; we may skip any expensive - * processing. - */ -{ - int argn; - char * arg; - boolean force_baseline; - boolean simple_progressive; - char * qualityarg = NULL; /* saves -quality parm if any */ - char * qtablefile = NULL; /* saves -qtables filename if any */ - char * qslotsarg = NULL; /* saves -qslots parm if any */ - char * samplearg = NULL; /* saves -sample parm if any */ - char * scansarg = NULL; /* saves -scans parm if any */ - - /* Set up default JPEG parameters. */ - - force_baseline = FALSE; /* by default, allow 16-bit quantizers */ - simple_progressive = FALSE; - is_targa = FALSE; - outfilename = NULL; - cinfo->err->trace_level = 0; - - /* Scan command line options, adjust parameters */ - - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (*arg != '-') { - /* Not a switch, must be a file name argument */ - if (argn <= last_file_arg_seen) { - outfilename = NULL; /* -outfile applies to just one input file */ - continue; /* ignore this name if previously processed */ - } - break; /* else done parsing switches */ - } - arg++; /* advance past switch marker character */ - - if (keymatch(arg, "arithmetic", 1)) { - /* Use arithmetic coding. */ -#ifdef C_ARITH_CODING_SUPPORTED - cinfo->arith_code = TRUE; -#else - fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "baseline", 2)) { - /* Force baseline-compatible output (8-bit quantizer values). */ - force_baseline = TRUE; - - } else if (keymatch(arg, "block", 2)) { - /* Set DCT block size. */ -#if defined DCT_SCALING_SUPPORTED && JPEG_LIB_VERSION_MAJOR >= 8 && \ - (JPEG_LIB_VERSION_MAJOR > 8 || JPEG_LIB_VERSION_MINOR >= 3) - int val; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d", &val) != 1) - usage(); - if (val < 1 || val > 16) - usage(); - cinfo->block_size = val; -#else - fprintf(stderr, "%s: sorry, block size setting not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "dct", 2)) { - /* Select DCT algorithm. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "int", 1)) { - cinfo->dct_method = JDCT_ISLOW; - } else if (keymatch(argv[argn], "fast", 2)) { - cinfo->dct_method = JDCT_IFAST; - } else if (keymatch(argv[argn], "float", 2)) { - cinfo->dct_method = JDCT_FLOAT; - } else - usage(); - - } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { - /* Enable debug printouts. */ - /* On first -d, print version identification */ - static boolean printed_version = FALSE; - - if (! printed_version) { - fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n", - JVERSION, JCOPYRIGHT); - printed_version = TRUE; - } - cinfo->err->trace_level++; - - } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { - /* Force a monochrome JPEG file to be generated. */ - jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); - - } else if (keymatch(arg, "rgb", 3) || keymatch(arg, "rgb1", 4)) { - /* Force an RGB JPEG file to be generated. */ -#if JPEG_LIB_VERSION_MAJOR >= 9 - /* Note: Entropy table assignment in jpeg_set_colorspace depends - * on color_transform. - */ - cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE; -#endif - jpeg_set_colorspace(cinfo, JCS_RGB); - - } else if (keymatch(arg, "bgycc", 5)) { - /* Force a big gamut YCC JPEG file to be generated. */ -#if JPEG_LIB_VERSION_MAJOR >= 9 && \ - (JPEG_LIB_VERSION_MAJOR > 9 || JPEG_LIB_VERSION_MINOR >= 1) - jpeg_set_colorspace(cinfo, JCS_BG_YCC); -#else - fprintf(stderr, "%s: sorry, BG_YCC colorspace not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "maxmemory", 3)) { - /* Maximum memory in Kb (or Mb with 'm'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (ch == 'm' || ch == 'M') - lval *= 1000L; - cinfo->mem->max_memory_to_use = lval * 1000L; - - } else if (keymatch(arg, "nosmooth", 3)) { - /* Suppress fancy downsampling. */ - cinfo->do_fancy_downsampling = FALSE; - - } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { - /* Enable entropy parm optimization. */ -#ifdef ENTROPY_OPT_SUPPORTED - cinfo->optimize_coding = TRUE; -#else - fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "outfile", 4)) { - /* Set output file name. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - outfilename = argv[argn]; /* save it away for later use */ - - } else if (keymatch(arg, "progressive", 1)) { - /* Select simple progressive mode. */ -#ifdef C_PROGRESSIVE_SUPPORTED - simple_progressive = TRUE; - /* We must postpone execution until num_components is known. */ -#else - fprintf(stderr, "%s: sorry, progressive output was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "quality", 1)) { - /* Quality ratings (quantization table scaling factors). */ - if (++argn >= argc) /* advance to next argument */ - usage(); - qualityarg = argv[argn]; - - } else if (keymatch(arg, "qslots", 2)) { - /* Quantization table slot numbers. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - qslotsarg = argv[argn]; - /* Must delay setting qslots until after we have processed any - * colorspace-determining switches, since jpeg_set_colorspace sets - * default quant table numbers. - */ - - } else if (keymatch(arg, "qtables", 2)) { - /* Quantization tables fetched from file. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - qtablefile = argv[argn]; - /* We postpone actually reading the file in case -quality comes later. */ - - } else if (keymatch(arg, "restart", 1)) { - /* Restart interval in MCU rows (or in MCUs with 'b'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (lval < 0 || lval > 65535L) - usage(); - if (ch == 'b' || ch == 'B') { - cinfo->restart_interval = (unsigned int) lval; - cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ - } else { - cinfo->restart_in_rows = (int) lval; - /* restart_interval will be computed during startup */ - } - - } else if (keymatch(arg, "sample", 2)) { - /* Set sampling factors. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - samplearg = argv[argn]; - /* Must delay setting sample factors until after we have processed any - * colorspace-determining switches, since jpeg_set_colorspace sets - * default sampling factors. - */ - - } else if (keymatch(arg, "scale", 4)) { - /* Scale the image by a fraction M/N. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%u/%u", - &cinfo->scale_num, &cinfo->scale_denom) != 2) - usage(); - - } else if (keymatch(arg, "scans", 4)) { - /* Set scan script. */ -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (++argn >= argc) /* advance to next argument */ - usage(); - scansarg = argv[argn]; - /* We must postpone reading the file in case -progressive appears. */ -#else - fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "smooth", 2)) { - /* Set input smoothing factor. */ - int val; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d", &val) != 1) - usage(); - if (val < 0 || val > 100) - usage(); - cinfo->smoothing_factor = val; - - } else if (keymatch(arg, "targa", 1)) { - /* Input file is Targa format. */ - is_targa = TRUE; - - } else { - usage(); /* bogus switch */ - } - } - - /* Post-switch-scanning cleanup */ - - if (for_real) { - - /* Set quantization tables for selected quality. */ - /* Some or all may be overridden if -qtables is present. */ - if (qualityarg != NULL) /* process -quality if it was present */ - if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) - usage(); - - if (qtablefile != NULL) /* process -qtables if it was present */ - if (! read_quant_tables(cinfo, qtablefile, force_baseline)) - usage(); - - if (qslotsarg != NULL) /* process -qslots if it was present */ - if (! set_quant_slots(cinfo, qslotsarg)) - usage(); - - if (samplearg != NULL) /* process -sample if it was present */ - if (! set_sample_factors(cinfo, samplearg)) - usage(); - -#ifdef C_PROGRESSIVE_SUPPORTED - if (simple_progressive) /* process -progressive; -scans can override */ - jpeg_simple_progression(cinfo); -#endif - -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (scansarg != NULL) /* process -scans if it was present */ - if (! read_scan_script(cinfo, scansarg)) - usage(); -#endif - } - - return argn; /* return index of next arg (file name) */ -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; -#ifdef PROGRESS_REPORT - struct cdjpeg_progress_mgr progress; -#endif - int file_index; - cjpeg_source_ptr src_mgr; - FILE * input_file; - FILE * output_file; - JDIMENSION num_scanlines; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "cjpeg"; /* in case C library doesn't provide it */ - - /* Initialize the JPEG compression object with default error handling. */ - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_compress(&cinfo); - /* Add some application-specific error messages (from cderror.h) */ - jerr.addon_message_table = cdjpeg_message_table; - jerr.first_addon_message = JMSG_FIRSTADDONCODE; - jerr.last_addon_message = JMSG_LASTADDONCODE; - - /* Now safe to enable signal catcher. */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) &cinfo); -#endif - - /* Initialize JPEG parameters. - * Much of this may be overridden later. - * In particular, we don't yet know the input file's color space, - * but we need to provide some value for jpeg_set_defaults() to work. - */ - - cinfo.in_color_space = JCS_RGB; /* arbitrary guess */ - jpeg_set_defaults(&cinfo); - - /* Scan command line to find file names. - * It is convenient to use just one switch-parsing routine, but the switch - * values read here are ignored; we will rescan the switches after opening - * the input file. - */ - - file_index = parse_switches(&cinfo, argc, argv, 0, FALSE); - -#ifdef TWO_FILE_COMMANDLINE - /* Must have either -outfile switch or explicit output file name */ - if (outfilename == NULL) { - if (file_index != argc-2) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - outfilename = argv[file_index+1]; - } else { - if (file_index != argc-1) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - } -#else - /* Unix style: expect zero or one file name */ - if (file_index < argc-1) { - fprintf(stderr, "%s: only one input file\n", progname); - usage(); - } -#endif /* TWO_FILE_COMMANDLINE */ - - /* Open the input file. */ - if (file_index < argc) { - if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); - exit(EXIT_FAILURE); - } - } else { - /* default input file is stdin */ - input_file = read_stdin(); - } - - /* Open the output file. */ - if (outfilename != NULL) { - if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, outfilename); - exit(EXIT_FAILURE); - } - } else { - /* default output file is stdout */ - output_file = write_stdout(); - } - -#ifdef PROGRESS_REPORT - start_progress_monitor((j_common_ptr) &cinfo, &progress); -#endif - - /* Figure out the input file format, and set up to read it. */ - src_mgr = select_file_type(&cinfo, input_file); - src_mgr->input_file = input_file; - - /* Read the input file header to obtain file size & colorspace. */ - (*src_mgr->start_input) (&cinfo, src_mgr); - - /* Now that we know input colorspace, fix colorspace-dependent defaults */ - jpeg_default_colorspace(&cinfo); - - /* Adjust default compression parameters by re-parsing the options */ - file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); - - /* Specify data destination for compression */ - jpeg_stdio_dest(&cinfo, output_file); - - /* Start compressor */ - jpeg_start_compress(&cinfo, TRUE); - - /* Process data */ - while (cinfo.next_scanline < cinfo.image_height) { - num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr); - (void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines); - } - - /* Finish compression and release memory */ - (*src_mgr->finish_input) (&cinfo, src_mgr); - jpeg_finish_compress(&cinfo); - jpeg_destroy_compress(&cinfo); - - /* Close files, if we opened them */ - if (input_file != stdin) - fclose(input_file); - if (output_file != stdout) - fclose(output_file); - -#ifdef PROGRESS_REPORT - end_progress_monitor((j_common_ptr) &cinfo); -#endif - - /* All done. */ - exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/cjpegalt.c b/code/jpeg-9f/cjpegalt.c deleted file mode 100644 index c89827e2..00000000 --- a/code/jpeg-9f/cjpegalt.c +++ /dev/null @@ -1,791 +0,0 @@ -/* - * alternate cjpeg.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2009-2023 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains an alternate user interface for the JPEG compressor. - * One or more input files are named on the command line, and output file - * names are created by substituting ".jpg" for the input file's extension. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include "jversion.h" /* for version message */ - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - -#ifndef PATH_MAX /* ANSI maximum-pathname-length constant */ -#define PATH_MAX 256 -#endif - - -/* Create the add-on message string table. */ - -#define JMESSAGE(code,string) string , - -static const char * const cdjpeg_message_table[] = { -#include "cderror.h" - NULL -}; - - -/* - * Automatic determination of available memory. - */ - -static long default_maxmem; /* saves value determined at startup, or 0 */ - -#ifndef FREE_MEM_ESTIMATE /* may be defined from command line */ - -#ifdef MSDOS /* For MS-DOS (unless flat-memory model) */ - -#include /* for access to intdos() call */ - -LOCAL(long) -unused_dos_memory (void) -/* Obtain total amount of unallocated DOS memory */ -{ - union REGS regs; - long nparas; - - regs.h.ah = 0x48; /* DOS function Allocate Memory Block */ - regs.x.bx = 0xFFFF; /* Ask for more memory than DOS can have */ - (void) intdos(®s, ®s); - /* DOS will fail and return # of paragraphs actually available in BX. */ - nparas = (unsigned int) regs.x.bx; - /* Times 16 to convert to bytes. */ - return nparas << 4; -} - -/* The default memory setting is 95% of the available space. */ -#define FREE_MEM_ESTIMATE ((unused_dos_memory() * 95L) / 100L) - -#endif /* MSDOS */ - -#ifdef ATARI /* For Atari ST/Mega/STE/TT/Falcon, Pure C or Turbo C */ - -#include - -/* The default memory setting is 90% of the available space. */ -#define FREE_MEM_ESTIMATE (((long) coreleft() * 90L) / 100L) - -#endif /* ATARI */ - -/* Add memory-estimation procedures for other operating systems here, - * with appropriate #ifdef's around them. - */ - -#endif /* !FREE_MEM_ESTIMATE */ - - -/* - * This routine determines what format the input file is, - * and selects the appropriate input-reading module. - * - * To determine which family of input formats the file belongs to, - * we may look only at the first byte of the file, since C does not - * guarantee that more than one character can be pushed back with ungetc. - * Looking at additional bytes would require one of these approaches: - * 1) assume we can fseek() the input file (fails for piped input); - * 2) assume we can push back more than one character (works in - * some C implementations, but unportable); - * 3) provide our own buffering (breaks input readers that want to use - * stdio directly, such as the RLE library); - * or 4) don't put back the data, and modify the input_init methods to assume - * they start reading after the start of file (also breaks RLE library). - * #1 is attractive for MS-DOS but is untenable on Unix. - * - * The most portable solution for file types that can't be identified by their - * first byte is to make the user tell us what they are. This is also the - * only approach for "raw" file types that contain only arbitrary values. - * We presently apply this method for Targa files. Most of the time Targa - * files start with 0x00, so we recognize that case. Potentially, however, - * a Targa file could start with any byte value (byte 0 is the length of the - * seldom-used ID field), so we provide a switch to force Targa input mode. - */ - -static boolean is_targa; /* records user -targa switch */ - - -LOCAL(cjpeg_source_ptr) -select_file_type (j_compress_ptr cinfo, FILE * infile) -{ - int c; - - if (is_targa) { -#ifdef TARGA_SUPPORTED - return jinit_read_targa(cinfo); -#else - ERREXIT(cinfo, JERR_TGA_NOTCOMP); -#endif - } - - if ((c = getc(infile)) == EOF) - ERREXIT(cinfo, JERR_INPUT_EMPTY); - if (ungetc(c, infile) == EOF) - ERREXIT(cinfo, JERR_UNGETC_FAILED); - - switch (c) { -#ifdef BMP_SUPPORTED - case 'B': - return jinit_read_bmp(cinfo); -#endif -#ifdef GIF_SUPPORTED - case 'G': - return jinit_read_gif(cinfo); -#endif -#ifdef PPM_SUPPORTED - case 'P': - return jinit_read_ppm(cinfo); -#endif -#ifdef RLE_SUPPORTED - case 'R': - return jinit_read_rle(cinfo); -#endif -#ifdef TARGA_SUPPORTED - case 0x00: - return jinit_read_targa(cinfo); -#endif - default: - ERREXIT(cinfo, JERR_UNKNOWN_FORMAT); - break; - } - - return NULL; /* suppress compiler warnings */ -} - - -/* - * Argument-parsing code. - * The switch parser is designed to be useful with DOS-style command line - * syntax, ie, intermixed switches and file names, where only the switches - * to the left of a given file name affect processing of that file. - */ - - -static const char * progname; /* program name for error messages */ -static char * outfilename; /* for -outfile switch */ - - -LOCAL(void) -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "usage: %s [switches] inputfile(s)\n", progname); - fprintf(stderr, "List of input files may use wildcards (* and ?)\n"); - fprintf(stderr, "Output filename is same as input filename, but extension .jpg\n"); - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n"); - fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); - fprintf(stderr, " -rgb Create RGB JPEG file\n"); -#ifdef ENTROPY_OPT_SUPPORTED - fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); -#endif -#ifdef C_PROGRESSIVE_SUPPORTED - fprintf(stderr, " -progressive Create progressive JPEG file\n"); -#endif -#ifdef DCT_SCALING_SUPPORTED - fprintf(stderr, " -scale M/N Scale image by fraction M/N, eg, 1/2\n"); -#endif -#ifdef TARGA_SUPPORTED - fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); -#endif - fprintf(stderr, "Switches for advanced users:\n"); -#ifdef C_ARITH_CODING_SUPPORTED - fprintf(stderr, " -arithmetic Use arithmetic coding\n"); -#endif -#ifdef DCT_SCALING_SUPPORTED - fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n"); -#endif -#if JPEG_LIB_VERSION_MAJOR >= 9 - fprintf(stderr, " -rgb1 Create RGB JPEG file with reversible color transform\n"); - fprintf(stderr, " -bgycc Create big gamut YCC JPEG file\n"); -#endif -#ifdef DCT_ISLOW_SUPPORTED - fprintf(stderr, " -dct int Use integer DCT method%s\n", - (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); -#endif -#ifdef DCT_IFAST_SUPPORTED - fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", - (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); -#endif -#ifdef DCT_FLOAT_SUPPORTED - fprintf(stderr, " -dct float Use floating-point DCT method%s\n", - (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); -#endif - fprintf(stderr, " -nosmooth Don't use high-quality downsampling\n"); - fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); -#ifdef INPUT_SMOOTHING_SUPPORTED - fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n"); -#endif -#ifndef FREE_MEM_ESTIMATE - fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); -#endif - fprintf(stderr, " -outfile name Specify name for output file\n"); - fprintf(stderr, " -verbose or -debug Emit debug output\n"); - fprintf(stderr, "Switches for wizards:\n"); - fprintf(stderr, " -baseline Force baseline quantization tables\n"); - fprintf(stderr, " -qtables file Use quantization tables given in file\n"); - fprintf(stderr, " -qslots N[,...] Set component quantization tables\n"); - fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n"); -#ifdef C_MULTISCAN_FILES_SUPPORTED - fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); -#endif - exit(EXIT_FAILURE); -} - - -LOCAL(int) -parse_switches (j_compress_ptr cinfo, int argc, char **argv, - int last_file_arg_seen, boolean for_real) -/* Parse optional switches. - * Returns argv[] index of first file-name argument (== argc if none). - * Any file names with indexes <= last_file_arg_seen are ignored; - * they have presumably been processed in a previous iteration. - * (Pass 0 for last_file_arg_seen on the first or only iteration.) - * for_real is FALSE on the first (dummy) pass; we may skip any expensive - * processing. - */ -{ - int argn; - char * arg; - boolean force_baseline; - boolean simple_progressive; - char * qualityarg = NULL; /* saves -quality parm if any */ - char * qtablefile = NULL; /* saves -qtables filename if any */ - char * qslotsarg = NULL; /* saves -qslots parm if any */ - char * samplearg = NULL; /* saves -sample parm if any */ - char * scansarg = NULL; /* saves -scans parm if any */ - - /* Set up default JPEG parameters. */ - - force_baseline = FALSE; /* by default, allow 16-bit quantizers */ - simple_progressive = FALSE; - is_targa = FALSE; - outfilename = NULL; - cinfo->err->trace_level = 0; - if (default_maxmem > 0) /* override library's default value */ - cinfo->mem->max_memory_to_use = default_maxmem; - - /* Scan command line options, adjust parameters */ - - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (*arg != '-') { - /* Not a switch, must be a file name argument */ - if (argn <= last_file_arg_seen) { - outfilename = NULL; /* -outfile applies to just one input file */ - continue; /* ignore this name if previously processed */ - } - break; /* else done parsing switches */ - } - arg++; /* advance past switch marker character */ - - if (keymatch(arg, "arithmetic", 1)) { - /* Use arithmetic coding. */ -#ifdef C_ARITH_CODING_SUPPORTED - cinfo->arith_code = TRUE; -#else - fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "baseline", 2)) { - /* Force baseline-compatible output (8-bit quantizer values). */ - force_baseline = TRUE; - - } else if (keymatch(arg, "block", 2)) { - /* Set DCT block size. */ -#if defined DCT_SCALING_SUPPORTED && JPEG_LIB_VERSION_MAJOR >= 8 && \ - (JPEG_LIB_VERSION_MAJOR > 8 || JPEG_LIB_VERSION_MINOR >= 3) - int val; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d", &val) != 1) - usage(); - if (val < 1 || val > 16) - usage(); - cinfo->block_size = val; -#else - fprintf(stderr, "%s: sorry, block size setting not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "dct", 2)) { - /* Select DCT algorithm. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "int", 1)) { - cinfo->dct_method = JDCT_ISLOW; - } else if (keymatch(argv[argn], "fast", 2)) { - cinfo->dct_method = JDCT_IFAST; - } else if (keymatch(argv[argn], "float", 2)) { - cinfo->dct_method = JDCT_FLOAT; - } else - usage(); - - } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { - /* Enable debug printouts. */ - /* On first -d, print version identification */ - static boolean printed_version = FALSE; - - if (! printed_version) { - fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n", - JVERSION, JCOPYRIGHT); - printed_version = TRUE; - } - cinfo->err->trace_level++; - - } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { - /* Force a monochrome JPEG file to be generated. */ - jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); - - } else if (keymatch(arg, "rgb", 3) || keymatch(arg, "rgb1", 4)) { - /* Force an RGB JPEG file to be generated. */ -#if JPEG_LIB_VERSION_MAJOR >= 9 - /* Note: Entropy table assignment in jpeg_set_colorspace depends - * on color_transform. - */ - cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE; -#endif - jpeg_set_colorspace(cinfo, JCS_RGB); - - } else if (keymatch(arg, "bgycc", 5)) { - /* Force a big gamut YCC JPEG file to be generated. */ -#if JPEG_LIB_VERSION_MAJOR >= 9 && \ - (JPEG_LIB_VERSION_MAJOR > 9 || JPEG_LIB_VERSION_MINOR >= 1) - jpeg_set_colorspace(cinfo, JCS_BG_YCC); -#else - fprintf(stderr, "%s: sorry, BG_YCC colorspace not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "maxmemory", 3)) { - /* Maximum memory in Kb (or Mb with 'm'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (ch == 'm' || ch == 'M') - lval *= 1000L; - cinfo->mem->max_memory_to_use = lval * 1000L; - - } else if (keymatch(arg, "nosmooth", 3)) { - /* Suppress fancy downsampling. */ - cinfo->do_fancy_downsampling = FALSE; - - } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { - /* Enable entropy parm optimization. */ -#ifdef ENTROPY_OPT_SUPPORTED - cinfo->optimize_coding = TRUE; -#else - fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "outfile", 4)) { - /* Set output file name. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - outfilename = argv[argn]; /* save it away for later use */ - - } else if (keymatch(arg, "progressive", 1)) { - /* Select simple progressive mode. */ -#ifdef C_PROGRESSIVE_SUPPORTED - simple_progressive = TRUE; - /* We must postpone execution until num_components is known. */ -#else - fprintf(stderr, "%s: sorry, progressive output was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "quality", 1)) { - /* Quality ratings (quantization table scaling factors). */ - if (++argn >= argc) /* advance to next argument */ - usage(); - qualityarg = argv[argn]; - - } else if (keymatch(arg, "qslots", 2)) { - /* Quantization table slot numbers. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - qslotsarg = argv[argn]; - /* Must delay setting qslots until after we have processed any - * colorspace-determining switches, since jpeg_set_colorspace sets - * default quant table numbers. - */ - - } else if (keymatch(arg, "qtables", 2)) { - /* Quantization tables fetched from file. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - qtablefile = argv[argn]; - /* We postpone actually reading the file in case -quality comes later. */ - - } else if (keymatch(arg, "restart", 1)) { - /* Restart interval in MCU rows (or in MCUs with 'b'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (lval < 0 || lval > 65535L) - usage(); - if (ch == 'b' || ch == 'B') { - cinfo->restart_interval = (unsigned int) lval; - cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ - } else { - cinfo->restart_in_rows = (int) lval; - /* restart_interval will be computed during startup */ - } - - } else if (keymatch(arg, "sample", 2)) { - /* Set sampling factors. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - samplearg = argv[argn]; - /* Must delay setting sample factors until after we have processed any - * colorspace-determining switches, since jpeg_set_colorspace sets - * default sampling factors. - */ - - } else if (keymatch(arg, "scale", 4)) { - /* Scale the image by a fraction M/N. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d/%d", - &cinfo->scale_num, &cinfo->scale_denom) != 2) - usage(); - - } else if (keymatch(arg, "scans", 4)) { - /* Set scan script. */ -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (++argn >= argc) /* advance to next argument */ - usage(); - scansarg = argv[argn]; - /* We must postpone reading the file in case -progressive appears. */ -#else - fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "smooth", 2)) { - /* Set input smoothing factor. */ - int val; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d", &val) != 1) - usage(); - if (val < 0 || val > 100) - usage(); - cinfo->smoothing_factor = val; - - } else if (keymatch(arg, "targa", 1)) { - /* Input file is Targa format. */ - is_targa = TRUE; - - } else { - usage(); /* bogus switch */ - } - } - - /* Post-switch-scanning cleanup */ - - if (for_real) { - - /* Set quantization tables for selected quality. */ - /* Some or all may be overridden if -qtables is present. */ - if (qualityarg != NULL) /* process -quality if it was present */ - if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) - usage(); - - if (qtablefile != NULL) /* process -qtables if it was present */ - if (! read_quant_tables(cinfo, qtablefile, force_baseline)) - usage(); - - if (qslotsarg != NULL) /* process -qslots if it was present */ - if (! set_quant_slots(cinfo, qslotsarg)) - usage(); - - if (samplearg != NULL) /* process -sample if it was present */ - if (! set_sample_factors(cinfo, samplearg)) - usage(); - -#ifdef C_PROGRESSIVE_SUPPORTED - if (simple_progressive) /* process -progressive; -scans can override */ - jpeg_simple_progression(cinfo); -#endif - -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (scansarg != NULL) /* process -scans if it was present */ - if (! read_scan_script(cinfo, scansarg)) - usage(); -#endif - } - - return argn; /* return index of next arg (file name) */ -} - - -/* - * Check for overwrite of an existing file; clear it with user - */ - -#ifndef NO_OVERWRITE_CHECK - -LOCAL(boolean) -is_write_ok (char * outfname) -{ - FILE * ofile; - int ch; - - ofile = fopen(outfname, READ_BINARY); - if (ofile == NULL) - return TRUE; /* not present */ - fclose(ofile); /* oops, it is present */ - - for (;;) { - fprintf(stderr, "%s already exists, overwrite it? [y/n] ", - outfname); - fflush(stderr); - ch = getc(stdin); - if (ch != '\n') /* flush rest of line */ - while (getc(stdin) != '\n') - /* nothing */; - - switch (ch) { - case 'Y': - case 'y': - return TRUE; - case 'N': - case 'n': - return FALSE; - /* otherwise, ask again */ - } - } -} - -#endif - - -/* - * Process a single input file name, and return its index in argv[]. - * File names at or to left of old_file_index have been processed already. - */ - -LOCAL(int) -process_one_file (int argc, char **argv, int old_file_index) -{ - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; - char *infilename; - char workfilename[PATH_MAX]; -#ifdef PROGRESS_REPORT - struct cdjpeg_progress_mgr progress; -#endif - int file_index; - cjpeg_source_ptr src_mgr; - FILE * input_file = NULL; - FILE * output_file = NULL; - JDIMENSION num_scanlines; - - /* Initialize the JPEG compression object with default error handling. */ - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_compress(&cinfo); - /* Add some application-specific error messages (from cderror.h) */ - jerr.addon_message_table = cdjpeg_message_table; - jerr.first_addon_message = JMSG_FIRSTADDONCODE; - jerr.last_addon_message = JMSG_LASTADDONCODE; - - /* Now safe to enable signal catcher. */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) &cinfo); -#endif - - /* Initialize JPEG parameters. - * Much of this may be overridden later. - * In particular, we don't yet know the input file's color space, - * but we need to provide some value for jpeg_set_defaults() to work. - */ - - cinfo.in_color_space = JCS_RGB; /* arbitrary guess */ - jpeg_set_defaults(&cinfo); - - /* Scan command line to find next file name. - * It is convenient to use just one switch-parsing routine, but the switch - * values read here are ignored; we will rescan the switches after opening - * the input file. - */ - - file_index = parse_switches(&cinfo, argc, argv, old_file_index, FALSE); - if (file_index >= argc) { - fprintf(stderr, "%s: missing input file name\n", progname); - usage(); - } - - /* Open the input file. */ - infilename = argv[file_index]; - if ((input_file = fopen(infilename, READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, infilename); - goto fail; - } - -#ifdef PROGRESS_REPORT - start_progress_monitor((j_common_ptr) &cinfo, &progress); -#endif - - /* Figure out the input file format, and set up to read it. */ - src_mgr = select_file_type(&cinfo, input_file); - src_mgr->input_file = input_file; - - /* Read the input file header to obtain file size & colorspace. */ - (*src_mgr->start_input) (&cinfo, src_mgr); - - /* Now that we know input colorspace, fix colorspace-dependent defaults */ - jpeg_default_colorspace(&cinfo); - - /* Adjust default compression parameters by re-parsing the options */ - file_index = parse_switches(&cinfo, argc, argv, old_file_index, TRUE); - - /* If user didn't supply -outfile switch, select output file name. */ - if (outfilename == NULL) { - int i; - - outfilename = workfilename; - /* Make outfilename be infilename with .jpg substituted for extension */ - strcpy(outfilename, infilename); - for (i = (int)strlen(outfilename)-1; i >= 0; i--) { - switch (outfilename[i]) { - case ':': - case '/': - case '\\': - i = 0; /* stop scanning */ - break; - case '.': - outfilename[i] = '\0'; /* lop off existing extension */ - i = 0; /* stop scanning */ - break; - default: - break; /* keep scanning */ - } - } - strcat(outfilename, ".jpg"); - } - - fprintf(stderr, "Compressing %s => %s\n", infilename, outfilename); -#ifndef NO_OVERWRITE_CHECK - if (! is_write_ok(outfilename)) - goto fail; -#endif - - /* Open the output file. */ - if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't create %s\n", progname, outfilename); - goto fail; - } - - /* Specify data destination for compression */ - jpeg_stdio_dest(&cinfo, output_file); - - /* Start compressor */ - jpeg_start_compress(&cinfo, TRUE); - - /* Process data */ - while (cinfo.next_scanline < cinfo.image_height) { - num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr); - (void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines); - } - - /* Finish compression and release memory */ - (*src_mgr->finish_input) (&cinfo, src_mgr); - jpeg_finish_compress(&cinfo); - - /* Clean up and exit */ -fail: - jpeg_destroy_compress(&cinfo); - - if (input_file != NULL) fclose(input_file); - if (output_file != NULL) fclose(output_file); - -#ifdef PROGRESS_REPORT - end_progress_monitor((j_common_ptr) &cinfo); -#endif - - /* Disable signal catcher. */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) NULL); -#endif - - return file_index; -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - int file_index; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - -#ifdef MSDOS - progname = "cjpeg"; /* DOS tends to be too verbose about argv[0] */ -#else - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "cjpeg"; /* in case C library doesn't provide it */ -#endif - - /* The default maxmem must be computed only once at program startup, - * since releasing memory with free() won't give it back to the OS. - */ -#ifdef FREE_MEM_ESTIMATE - default_maxmem = FREE_MEM_ESTIMATE; -#else - default_maxmem = 0; -#endif - - /* Scan command line, parse switches and locate input file names */ - - if (argc < 2) - usage(); /* nothing on the command line?? */ - - file_index = 0; - - while (file_index < argc-1) - file_index = process_one_file(argc, argv, file_index); - - /* All done. */ - exit(EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/ckconfig.c b/code/jpeg-9f/ckconfig.c deleted file mode 100644 index e658623f..00000000 --- a/code/jpeg-9f/ckconfig.c +++ /dev/null @@ -1,402 +0,0 @@ -/* - * ckconfig.c - * - * Copyright (C) 1991-1994, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - */ - -/* - * This program is intended to help you determine how to configure the JPEG - * software for installation on a particular system. The idea is to try to - * compile and execute this program. If your compiler fails to compile the - * program, make changes as indicated in the comments below. Once you can - * compile the program, run it, and it will produce a "jconfig.h" file for - * your system. - * - * As a general rule, each time you try to compile this program, - * pay attention only to the *first* error message you get from the compiler. - * Many C compilers will issue lots of spurious error messages once they - * have gotten confused. Go to the line indicated in the first error message, - * and read the comments preceding that line to see what to change. - * - * Almost all of the edits you may need to make to this program consist of - * changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL", - * or vice versa. This is called defining or undefining that symbol. - */ - - -/* First we must see if your system has the include files we need. - * We start out with the assumption that your system has all the ANSI-standard - * include files. If you get any error trying to include one of these files, - * undefine the corresponding HAVE_xxx symbol. - */ - -#define HAVE_STDDEF_H /* replace 'define' by 'undef' if error here */ -#ifdef HAVE_STDDEF_H /* next line will be skipped if you undef... */ -#include -#endif - -#define HAVE_STDLIB_H /* same thing for stdlib.h */ -#ifdef HAVE_STDLIB_H -#include -#endif - -#include /* If you ain't got this, you ain't got C. */ - -/* We have to see if your string functions are defined by - * strings.h (old BSD convention) or string.h (everybody else). - * We try the non-BSD convention first; define NEED_BSD_STRINGS - * if the compiler says it can't find string.h. - */ - -#undef NEED_BSD_STRINGS - -#ifdef NEED_BSD_STRINGS -#include -#else -#include -#endif - -/* On some systems (especially older Unix machines), type size_t is - * defined only in the include file . If you get a failure - * on the size_t test below, try defining NEED_SYS_TYPES_H. - */ - -#undef NEED_SYS_TYPES_H /* start by assuming we don't need it */ -#ifdef NEED_SYS_TYPES_H -#include -#endif - - -/* Usually type size_t is defined in one of the include files we've included - * above. If not, you'll get an error on the "typedef size_t my_size_t;" line. - * In that case, first try defining NEED_SYS_TYPES_H just above. - * If that doesn't work, you'll have to search through your system library - * to figure out which include file defines "size_t". Look for a line that - * says "typedef something-or-other size_t;". Then, change the line below - * that says "#include " to instead include the file - * you found size_t in, and define NEED_SPECIAL_INCLUDE. If you can't find - * type size_t anywhere, try replacing "#include " with - * "typedef unsigned int size_t;". - */ - -#undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */ - -#ifdef NEED_SPECIAL_INCLUDE -#include -#endif - -typedef size_t my_size_t; /* The payoff: do we have size_t now? */ - - -/* The next question is whether your compiler supports ANSI-style function - * prototypes. You need to know this in order to choose between using - * makefile.ansi and using makefile.unix. - * The #define line below is set to assume you have ANSI function prototypes. - * If you get an error in this group of lines, undefine HAVE_PROTOTYPES. - */ - -#define HAVE_PROTOTYPES - -#ifdef HAVE_PROTOTYPES -int testfunction (int arg1, int * arg2); /* check prototypes */ - -struct methods_struct { /* check method-pointer declarations */ - int (*error_exit) (char *msgtext); - int (*trace_message) (char *msgtext); - int (*another_method) (void); -}; - -int testfunction (int arg1, int * arg2) /* check definitions */ -{ - return arg2[arg1]; -} - -int test2function (void) /* check void arg list */ -{ - return 0; -} -#endif - - -/* Now we want to find out if your compiler knows what "unsigned char" means. - * If you get an error on the "unsigned char un_char;" line, - * then undefine HAVE_UNSIGNED_CHAR. - */ - -#define HAVE_UNSIGNED_CHAR - -#ifdef HAVE_UNSIGNED_CHAR -unsigned char un_char; -#endif - - -/* Now we want to find out if your compiler knows what "unsigned short" means. - * If you get an error on the "unsigned short un_short;" line, - * then undefine HAVE_UNSIGNED_SHORT. - */ - -#define HAVE_UNSIGNED_SHORT - -#ifdef HAVE_UNSIGNED_SHORT -unsigned short un_short; -#endif - - -/* Now we want to find out if your compiler understands type "void". - * If you get an error anywhere in here, undefine HAVE_VOID. - */ - -#define HAVE_VOID - -#ifdef HAVE_VOID -/* Caution: a C++ compiler will insist on complete prototypes */ -typedef void * void_ptr; /* check void * */ -#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */ -typedef void (*void_func) (int a, int b); -#else -typedef void (*void_func) (); -#endif - -#ifdef HAVE_PROTOTYPES /* check void function result */ -void test3function (void_ptr arg1, void_func arg2) -#else -void test3function (arg1, arg2) - void_ptr arg1; - void_func arg2; -#endif -{ - char * locptr = (char *) arg1; /* check casting to and from void * */ - arg1 = (void *) locptr; - (*arg2) (1, 2); /* check call of fcn returning void */ -} -#endif - - -/* Now we want to find out if your compiler knows what "const" means. - * If you get an error here, undefine HAVE_CONST. - */ - -#define HAVE_CONST - -#ifdef HAVE_CONST -static const int carray[3] = {1, 2, 3}; - -#ifdef HAVE_PROTOTYPES -int test4function (const int arg1) -#else -int test4function (arg1) - const int arg1; -#endif -{ - return carray[arg1]; -} -#endif - - -/* If you get an error or warning about this structure definition, - * define INCOMPLETE_TYPES_BROKEN. - */ - -#undef INCOMPLETE_TYPES_BROKEN - -#ifndef INCOMPLETE_TYPES_BROKEN -typedef struct undefined_structure * undef_struct_ptr; -#endif - - -/* If you get an error about duplicate names, - * define NEED_SHORT_EXTERNAL_NAMES. - */ - -#undef NEED_SHORT_EXTERNAL_NAMES - -#ifndef NEED_SHORT_EXTERNAL_NAMES - -int possibly_duplicate_function () -{ - return 0; -} - -int possibly_dupli_function () -{ - return 1; -} - -#endif - - - -/************************************************************************ - * OK, that's it. You should not have to change anything beyond this - * point in order to compile and execute this program. (You might get - * some warnings, but you can ignore them.) - * When you run the program, it will make a couple more tests that it - * can do automatically, and then it will create jconfig.h and print out - * any additional suggestions it has. - ************************************************************************ - */ - - -#ifdef HAVE_PROTOTYPES -int is_char_signed (int arg) -#else -int is_char_signed (arg) - int arg; -#endif -{ - if (arg == 189) { /* expected result for unsigned char */ - return 0; /* type char is unsigned */ - } - else if (arg != -67) { /* expected result for signed char */ - printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); - printf("I fear the JPEG software will not work at all.\n\n"); - } - return 1; /* assume char is signed otherwise */ -} - - -#ifdef HAVE_PROTOTYPES -int is_shifting_signed (long arg) -#else -int is_shifting_signed (arg) - long arg; -#endif -/* See whether right-shift on a long is signed or not. */ -{ - long res = arg >> 4; - - if (res == -0x7F7E80CL) { /* expected result for signed shift */ - return 1; /* right shift is signed */ - } - /* see if unsigned-shift hack will fix it. */ - /* we can't just test exact value since it depends on width of long... */ - res |= (~0L) << (32-4); - if (res == -0x7F7E80CL) { /* expected result now? */ - return 0; /* right shift is unsigned */ - } - printf("Right shift isn't acting as I expect it to.\n"); - printf("I fear the JPEG software will not work at all.\n\n"); - return 0; /* try it with unsigned anyway */ -} - - -#ifdef HAVE_PROTOTYPES -int main (int argc, char ** argv) -#else -int main (argc, argv) - int argc; - char ** argv; -#endif -{ - char signed_char_check = (char) (-67); - FILE *outfile; - - /* Attempt to write jconfig.h */ - if ((outfile = fopen("jconfig.h", "w")) == NULL) { - printf("Failed to write jconfig.h\n"); - return 1; - } - - /* Write out all the info */ - fprintf(outfile, "/* jconfig.h --- generated by ckconfig.c */\n"); - fprintf(outfile, "/* see jconfig.txt for explanations */\n\n"); -#ifdef HAVE_PROTOTYPES - fprintf(outfile, "#define HAVE_PROTOTYPES\n"); -#else - fprintf(outfile, "#undef HAVE_PROTOTYPES\n"); -#endif -#ifdef HAVE_UNSIGNED_CHAR - fprintf(outfile, "#define HAVE_UNSIGNED_CHAR\n"); -#else - fprintf(outfile, "#undef HAVE_UNSIGNED_CHAR\n"); -#endif -#ifdef HAVE_UNSIGNED_SHORT - fprintf(outfile, "#define HAVE_UNSIGNED_SHORT\n"); -#else - fprintf(outfile, "#undef HAVE_UNSIGNED_SHORT\n"); -#endif -#ifdef HAVE_VOID - fprintf(outfile, "/* #define void char */\n"); -#else - fprintf(outfile, "#define void char\n"); -#endif -#ifdef HAVE_CONST - fprintf(outfile, "/* #define const */\n"); -#else - fprintf(outfile, "#define const\n"); -#endif - if (is_char_signed((int) signed_char_check)) - fprintf(outfile, "#undef CHAR_IS_UNSIGNED\n"); - else - fprintf(outfile, "#define CHAR_IS_UNSIGNED\n"); -#ifdef HAVE_STDDEF_H - fprintf(outfile, "#define HAVE_STDDEF_H\n"); -#else - fprintf(outfile, "#undef HAVE_STDDEF_H\n"); -#endif -#ifdef HAVE_STDLIB_H - fprintf(outfile, "#define HAVE_STDLIB_H\n"); -#else - fprintf(outfile, "#undef HAVE_STDLIB_H\n"); -#endif -#ifdef NEED_BSD_STRINGS - fprintf(outfile, "#define NEED_BSD_STRINGS\n"); -#else - fprintf(outfile, "#undef NEED_BSD_STRINGS\n"); -#endif -#ifdef NEED_SYS_TYPES_H - fprintf(outfile, "#define NEED_SYS_TYPES_H\n"); -#else - fprintf(outfile, "#undef NEED_SYS_TYPES_H\n"); -#endif - fprintf(outfile, "#undef NEED_FAR_POINTERS\n"); -#ifdef NEED_SHORT_EXTERNAL_NAMES - fprintf(outfile, "#define NEED_SHORT_EXTERNAL_NAMES\n"); -#else - fprintf(outfile, "#undef NEED_SHORT_EXTERNAL_NAMES\n"); -#endif -#ifdef INCOMPLETE_TYPES_BROKEN - fprintf(outfile, "#define INCOMPLETE_TYPES_BROKEN\n"); -#else - fprintf(outfile, "#undef INCOMPLETE_TYPES_BROKEN\n"); -#endif - fprintf(outfile, "\n#ifdef JPEG_INTERNALS\n\n"); - if (is_shifting_signed(-0x7F7E80B1L)) - fprintf(outfile, "#undef RIGHT_SHIFT_IS_UNSIGNED\n"); - else - fprintf(outfile, "#define RIGHT_SHIFT_IS_UNSIGNED\n"); - fprintf(outfile, "\n#endif /* JPEG_INTERNALS */\n"); - fprintf(outfile, "\n#ifdef JPEG_CJPEG_DJPEG\n\n"); - fprintf(outfile, "#define BMP_SUPPORTED /* BMP image file format */\n"); - fprintf(outfile, "#define GIF_SUPPORTED /* GIF image file format */\n"); - fprintf(outfile, "#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */\n"); - fprintf(outfile, "#undef RLE_SUPPORTED /* Utah RLE image file format */\n"); - fprintf(outfile, "#define TARGA_SUPPORTED /* Targa image file format */\n\n"); - fprintf(outfile, "#undef TWO_FILE_COMMANDLINE /* You may need this on non-Unix systems */\n"); - fprintf(outfile, "#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */\n"); - fprintf(outfile, "#undef DONT_USE_B_MODE\n"); - fprintf(outfile, "/* #define PROGRESS_REPORT */ /* optional */\n"); - fprintf(outfile, "\n#endif /* JPEG_CJPEG_DJPEG */\n"); - - /* Close the jconfig.h file */ - fclose(outfile); - - /* User report */ - printf("Configuration check for Independent JPEG Group's software done.\n"); - printf("\nI have written the jconfig.h file for you.\n\n"); -#ifdef HAVE_PROTOTYPES - printf("You should use makefile.ansi as the starting point for your Makefile.\n"); -#else - printf("You should use makefile.unix as the starting point for your Makefile.\n"); -#endif - -#ifdef NEED_SPECIAL_INCLUDE - printf("\nYou'll need to change jconfig.h to include the system include file\n"); - printf("that you found type size_t in, or add a direct definition of type\n"); - printf("size_t if that's what you used. Just add it to the end.\n"); -#endif - - return 0; -} diff --git a/code/jpeg-9f/djpeg.c b/code/jpeg-9f/djpeg.c deleted file mode 100644 index a01b3968..00000000 --- a/code/jpeg-9f/djpeg.c +++ /dev/null @@ -1,631 +0,0 @@ -/* - * djpeg.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2009-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a command-line user interface for the JPEG decompressor. - * It should work on any system with Unix- or MS-DOS-style command lines. - * - * Two different command line styles are permitted, depending on the - * compile-time switch TWO_FILE_COMMANDLINE: - * djpeg [options] inputfile outputfile - * djpeg [options] [inputfile] - * In the second style, output is always to standard output, which you'd - * normally redirect to a file or pipe to some other program. Input is - * either from a named file or from standard input (typically redirected). - * The second style is convenient on Unix but is unhelpful on systems that - * don't support pipes. Also, you MUST use the first style if your system - * doesn't do binary I/O to stdin/stdout. - * To simplify script writing, the "-outfile" switch is provided. The syntax - * djpeg [options] -outfile outputfile inputfile - * works regardless of which command line style is used. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include "jversion.h" /* for version message */ - -#include /* to declare isprint() */ - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - - -/* Create the add-on message string table. */ - -#define JMESSAGE(code,string) string , - -static const char * const cdjpeg_message_table[] = { -#include "cderror.h" - NULL -}; - - -/* - * This list defines the known output image formats - * (not all of which need be supported by a given version). - * You can change the default output format by defining DEFAULT_FMT; - * indeed, you had better do so if you undefine PPM_SUPPORTED. - */ - -typedef enum { - FMT_BMP, /* BMP format (Windows flavor) */ - FMT_GIF, /* GIF format (LZW compressed) */ - FMT_GIF0, /* GIF format (uncompressed) */ - FMT_OS2, /* BMP format (OS/2 flavor) */ - FMT_PPM, /* PPM/PGM (PBMPLUS formats) */ - FMT_RLE, /* RLE format */ - FMT_TARGA, /* Targa format */ - FMT_TIFF /* TIFF format */ -} IMAGE_FORMATS; - -#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */ -#define DEFAULT_FMT FMT_PPM -#endif - -static IMAGE_FORMATS requested_fmt; - - -/* - * Argument-parsing code. - * The switch parser is designed to be useful with DOS-style command line - * syntax, ie, intermixed switches and file names, where only the switches - * to the left of a given file name affect processing of that file. - * The main program in this file doesn't actually use this capability... - */ - - -static const char * progname; /* program name for error messages */ -static char * outfilename; /* for -outfile switch */ - - -LOCAL(void) -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "usage: %s [switches] ", progname); -#ifdef TWO_FILE_COMMANDLINE - fprintf(stderr, "inputfile outputfile\n"); -#else - fprintf(stderr, "[inputfile]\n"); -#endif - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -colors N Reduce image to no more than N colors\n"); - fprintf(stderr, " -fast Fast, low-quality processing\n"); - fprintf(stderr, " -grayscale Force grayscale output\n"); - fprintf(stderr, " -rgb Force RGB output\n"); -#ifdef IDCT_SCALING_SUPPORTED - fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); -#endif -#ifdef BMP_SUPPORTED - fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n", - (DEFAULT_FMT == FMT_BMP ? " (default)" : "")); -#endif -#ifdef GIF_SUPPORTED - fprintf(stderr, " -gif Select GIF output format (LZW compressed)%s\n", - (DEFAULT_FMT == FMT_GIF ? " (default)" : "")); - fprintf(stderr, " -gif0 Select GIF output format (uncompressed)%s\n", - (DEFAULT_FMT == FMT_GIF0 ? " (default)" : "")); -#endif -#ifdef BMP_SUPPORTED - fprintf(stderr, " -os2 Select BMP output format (OS/2 style)%s\n", - (DEFAULT_FMT == FMT_OS2 ? " (default)" : "")); -#endif -#ifdef PPM_SUPPORTED - fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format%s\n", - (DEFAULT_FMT == FMT_PPM ? " (default)" : "")); -#endif -#ifdef RLE_SUPPORTED - fprintf(stderr, " -rle Select Utah RLE output format%s\n", - (DEFAULT_FMT == FMT_RLE ? " (default)" : "")); -#endif -#ifdef TARGA_SUPPORTED - fprintf(stderr, " -targa Select Targa output format%s\n", - (DEFAULT_FMT == FMT_TARGA ? " (default)" : "")); -#endif - fprintf(stderr, "Switches for advanced users:\n"); -#ifdef DCT_ISLOW_SUPPORTED - fprintf(stderr, " -dct int Use integer DCT method%s\n", - (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); -#endif -#ifdef DCT_IFAST_SUPPORTED - fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", - (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); -#endif -#ifdef DCT_FLOAT_SUPPORTED - fprintf(stderr, " -dct float Use floating-point DCT method%s\n", - (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); -#endif - fprintf(stderr, " -dither fs Use F-S dithering (default)\n"); - fprintf(stderr, " -dither none Don't use dithering in quantization\n"); - fprintf(stderr, " -dither ordered Use ordered dither (medium speed, quality)\n"); -#ifdef QUANT_2PASS_SUPPORTED - fprintf(stderr, " -map FILE Map to colors used in named image file\n"); -#endif - fprintf(stderr, " -nosmooth Don't use high-quality upsampling\n"); -#ifdef QUANT_1PASS_SUPPORTED - fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\n"); -#endif - fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); - fprintf(stderr, " -outfile name Specify name for output file\n"); - fprintf(stderr, " -verbose or -debug Emit debug output\n"); - exit(EXIT_FAILURE); -} - - -LOCAL(int) -parse_switches (j_decompress_ptr cinfo, int argc, char **argv, - int last_file_arg_seen, boolean for_real) -/* Parse optional switches. - * Returns argv[] index of first file-name argument (== argc if none). - * Any file names with indexes <= last_file_arg_seen are ignored; - * they have presumably been processed in a previous iteration. - * (Pass 0 for last_file_arg_seen on the first or only iteration.) - * for_real is FALSE on the first (dummy) pass; we may skip any expensive - * processing. - */ -{ - int argn; - char * arg; - - /* Set up default JPEG parameters. */ - requested_fmt = DEFAULT_FMT; /* set default output file format */ - outfilename = NULL; - cinfo->err->trace_level = 0; - - /* Scan command line options, adjust parameters */ - - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (*arg != '-') { - /* Not a switch, must be a file name argument */ - if (argn <= last_file_arg_seen) { - outfilename = NULL; /* -outfile applies to just one input file */ - continue; /* ignore this name if previously processed */ - } - break; /* else done parsing switches */ - } - arg++; /* advance past switch marker character */ - - if (keymatch(arg, "bmp", 1)) { - /* BMP output format (Windows flavor). */ - requested_fmt = FMT_BMP; - - } else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) || - keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) { - /* Do color quantization. */ - int val; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d", &val) != 1) - usage(); - cinfo->desired_number_of_colors = val; - cinfo->quantize_colors = TRUE; - - } else if (keymatch(arg, "dct", 2)) { - /* Select IDCT algorithm. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "int", 1)) { - cinfo->dct_method = JDCT_ISLOW; - } else if (keymatch(argv[argn], "fast", 2)) { - cinfo->dct_method = JDCT_IFAST; - } else if (keymatch(argv[argn], "float", 2)) { - cinfo->dct_method = JDCT_FLOAT; - } else - usage(); - - } else if (keymatch(arg, "dither", 2)) { - /* Select dithering algorithm. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "fs", 2)) { - cinfo->dither_mode = JDITHER_FS; - } else if (keymatch(argv[argn], "none", 2)) { - cinfo->dither_mode = JDITHER_NONE; - } else if (keymatch(argv[argn], "ordered", 2)) { - cinfo->dither_mode = JDITHER_ORDERED; - } else - usage(); - - } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { - /* Enable debug printouts. */ - /* On first -d, print version identification */ - static boolean printed_version = FALSE; - - if (! printed_version) { - fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n", - JVERSION, JCOPYRIGHT); - printed_version = TRUE; - } - cinfo->err->trace_level++; - - } else if (keymatch(arg, "fast", 1)) { - /* Select recommended processing options for quick-and-dirty output. */ - cinfo->two_pass_quantize = FALSE; - cinfo->dither_mode = JDITHER_ORDERED; - if (! cinfo->quantize_colors) /* don't override an earlier -colors */ - cinfo->desired_number_of_colors = 216; - cinfo->dct_method = JDCT_FASTEST; - cinfo->do_fancy_upsampling = FALSE; - - } else if (keymatch(arg, "gif", 1)) { - /* GIF output format (LZW compressed). */ - requested_fmt = FMT_GIF; - - } else if (keymatch(arg, "gif0", 4)) { - /* GIF output format (uncompressed). */ - requested_fmt = FMT_GIF0; - - } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { - /* Force monochrome output. */ - cinfo->out_color_space = JCS_GRAYSCALE; - - } else if (keymatch(arg, "rgb", 3)) { - /* Force RGB output. */ - cinfo->out_color_space = JCS_RGB; - - } else if (keymatch(arg, "map", 3)) { - /* Quantize to a color map taken from an input file. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (for_real) { /* too expensive to do twice! */ -#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ - FILE * mapfile; - - if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); - exit(EXIT_FAILURE); - } - read_color_map(cinfo, mapfile); - fclose(mapfile); - cinfo->quantize_colors = TRUE; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } - - } else if (keymatch(arg, "maxmemory", 3)) { - /* Maximum memory in Kb (or Mb with 'm'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (ch == 'm' || ch == 'M') - lval *= 1000L; - cinfo->mem->max_memory_to_use = lval * 1000L; - - } else if (keymatch(arg, "nosmooth", 3)) { - /* Suppress fancy upsampling. */ - cinfo->do_fancy_upsampling = FALSE; - - } else if (keymatch(arg, "onepass", 3)) { - /* Use fast one-pass quantization. */ - cinfo->two_pass_quantize = FALSE; - - } else if (keymatch(arg, "os2", 3)) { - /* BMP output format (OS/2 flavor). */ - requested_fmt = FMT_OS2; - - } else if (keymatch(arg, "outfile", 4)) { - /* Set output file name. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - outfilename = argv[argn]; /* save it away for later use */ - - } else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) { - /* PPM/PGM output format. */ - requested_fmt = FMT_PPM; - - } else if (keymatch(arg, "rle", 1)) { - /* RLE output format. */ - requested_fmt = FMT_RLE; - - } else if (keymatch(arg, "scale", 1)) { - /* Scale the output image by a fraction M/N. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%u/%u", - &cinfo->scale_num, &cinfo->scale_denom) < 1) - usage(); - - } else if (keymatch(arg, "targa", 1)) { - /* Targa output format. */ - requested_fmt = FMT_TARGA; - - } else { - usage(); /* bogus switch */ - } - } - - return argn; /* return index of next arg (file name) */ -} - - -/* - * Marker processor for COM and interesting APPn markers. - * This replaces the library's built-in processor, which just skips the marker. - * We want to print out the marker as text, to the extent possible. - * Note this code relies on a non-suspending data source. - */ - -LOCAL(unsigned int) -jpeg_getc (j_decompress_ptr cinfo) -/* Read next byte */ -{ - struct jpeg_source_mgr * datasrc = cinfo->src; - - if (datasrc->bytes_in_buffer == 0) { - if (! (*datasrc->fill_input_buffer) (cinfo)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - } - datasrc->bytes_in_buffer--; - return GETJOCTET(*datasrc->next_input_byte++); -} - - -METHODDEF(boolean) -print_text_marker (j_decompress_ptr cinfo) -{ - boolean traceit = (cinfo->err->trace_level >= 1); - INT32 length; - unsigned int ch; - unsigned int lastch = 0; - - length = jpeg_getc(cinfo) << 8; - length += jpeg_getc(cinfo); - length -= 2; /* discount the length word itself */ - - if (traceit) { - if (cinfo->unread_marker == JPEG_COM) - fprintf(stderr, "Comment, length %ld:\n", (long) length); - else /* assume it is an APPn otherwise */ - fprintf(stderr, "APP%d, length %ld:\n", - cinfo->unread_marker - JPEG_APP0, (long) length); - } - - while (--length >= 0) { - ch = jpeg_getc(cinfo); - if (traceit) { - /* Emit the character in a readable form. - * Nonprintables are converted to \nnn form, - * while \ is converted to \\. - * Newlines in CR, CR/LF, or LF form will be printed as one newline. - */ - if (ch == '\r') { - fprintf(stderr, "\n"); - } else if (ch == '\n') { - if (lastch != '\r') - fprintf(stderr, "\n"); - } else if (ch == '\\') { - fprintf(stderr, "\\\\"); - } else if (isprint(ch)) { - putc(ch, stderr); - } else { - fprintf(stderr, "\\%03o", ch); - } - lastch = ch; - } - } - - if (traceit) - fprintf(stderr, "\n"); - - return TRUE; -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; -#ifdef PROGRESS_REPORT - struct cdjpeg_progress_mgr progress; -#endif - int file_index; - djpeg_dest_ptr dest_mgr = NULL; - FILE * input_file; - FILE * output_file; - JDIMENSION num_scanlines; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "djpeg"; /* in case C library doesn't provide it */ - - /* Initialize the JPEG decompression object with default error handling. */ - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - /* Add some application-specific error messages (from cderror.h) */ - jerr.addon_message_table = cdjpeg_message_table; - jerr.first_addon_message = JMSG_FIRSTADDONCODE; - jerr.last_addon_message = JMSG_LASTADDONCODE; - - /* Insert custom marker processor for COM and APP12. - * APP12 is used by some digital camera makers for textual info, - * so we provide the ability to display it as text. - * If you like, additional APPn marker types can be selected for display, - * but don't try to override APP0 or APP14 this way (see libjpeg.txt). - */ - jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); - jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); - - /* Now safe to enable signal catcher. */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) &cinfo); -#endif - - /* Scan command line to find file names. */ - /* It is convenient to use just one switch-parsing routine, but the switch - * values read here are ignored; we will rescan the switches after opening - * the input file. - * (Exception: tracing level set here controls verbosity for COM markers - * found during jpeg_read_header...) - */ - - file_index = parse_switches(&cinfo, argc, argv, 0, FALSE); - -#ifdef TWO_FILE_COMMANDLINE - /* Must have either -outfile switch or explicit output file name */ - if (outfilename == NULL) { - if (file_index != argc-2) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - outfilename = argv[file_index+1]; - } else { - if (file_index != argc-1) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - } -#else - /* Unix style: expect zero or one file name */ - if (file_index < argc-1) { - fprintf(stderr, "%s: only one input file\n", progname); - usage(); - } -#endif /* TWO_FILE_COMMANDLINE */ - - /* Open the input file. */ - if (file_index < argc) { - if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); - exit(EXIT_FAILURE); - } - } else { - /* default input file is stdin */ - input_file = read_stdin(); - } - - /* Open the output file. */ - if (outfilename != NULL) { - if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, outfilename); - exit(EXIT_FAILURE); - } - } else { - /* default output file is stdout */ - output_file = write_stdout(); - } - -#ifdef PROGRESS_REPORT - start_progress_monitor((j_common_ptr) &cinfo, &progress); -#endif - - /* Specify data source for decompression */ - jpeg_stdio_src(&cinfo, input_file); - - /* Read file header, set default decompression parameters */ - (void) jpeg_read_header(&cinfo, TRUE); - - /* Adjust default decompression parameters by re-parsing the options */ - file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); - - /* Initialize the output module now to let it override any crucial - * option settings (for instance, GIF wants to force color quantization). - */ - switch (requested_fmt) { -#ifdef BMP_SUPPORTED - case FMT_BMP: - dest_mgr = jinit_write_bmp(&cinfo, FALSE); - break; - case FMT_OS2: - dest_mgr = jinit_write_bmp(&cinfo, TRUE); - break; -#endif -#ifdef GIF_SUPPORTED - case FMT_GIF: - dest_mgr = jinit_write_gif(&cinfo, TRUE); - break; - case FMT_GIF0: - dest_mgr = jinit_write_gif(&cinfo, FALSE); - break; -#endif -#ifdef PPM_SUPPORTED - case FMT_PPM: - dest_mgr = jinit_write_ppm(&cinfo); - break; -#endif -#ifdef RLE_SUPPORTED - case FMT_RLE: - dest_mgr = jinit_write_rle(&cinfo); - break; -#endif -#ifdef TARGA_SUPPORTED - case FMT_TARGA: - dest_mgr = jinit_write_targa(&cinfo); - break; -#endif - default: - ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT); - } - dest_mgr->output_file = output_file; - - /* Start decompressor */ - (void) jpeg_start_decompress(&cinfo); - - /* Write output file header */ - (*dest_mgr->start_output) (&cinfo, dest_mgr); - - /* Process data */ - while (cinfo.output_scanline < cinfo.output_height) { - num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer, - dest_mgr->buffer_height); - (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); - } - -#ifdef PROGRESS_REPORT - /* Hack: count final pass as done in case finish_output does an extra pass. - * The library won't have updated completed_passes. - */ - progress.pub.completed_passes = progress.pub.total_passes; -#endif - - /* Finish decompression and release memory. - * I must do it in this order because output module has allocated memory - * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. - */ - (*dest_mgr->finish_output) (&cinfo, dest_mgr); - (void) jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - - /* Close files, if we opened them */ - if (input_file != stdin) - fclose(input_file); - if (output_file != stdout) - fclose(output_file); - -#ifdef PROGRESS_REPORT - end_progress_monitor((j_common_ptr) &cinfo); -#endif - - /* All done. */ - exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/djpegalt.c b/code/jpeg-9f/djpegalt.c deleted file mode 100644 index 969c58b4..00000000 --- a/code/jpeg-9f/djpegalt.c +++ /dev/null @@ -1,766 +0,0 @@ -/* - * alternate djpeg.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2009-2023 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains an alternate user interface for the JPEG decompressor. - * One or more input files are named on the command line, and output file - * names are created by substituting an appropriate extension. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include "jversion.h" /* for version message */ - -#include /* to declare isprint() */ - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - -#ifndef PATH_MAX /* ANSI maximum-pathname-length constant */ -#define PATH_MAX 256 -#endif - - -/* Create the add-on message string table. */ - -#define JMESSAGE(code,string) string , - -static const char * const cdjpeg_message_table[] = { -#include "cderror.h" - NULL -}; - - -/* - * Automatic determination of available memory. - */ - -static long default_maxmem; /* saves value determined at startup, or 0 */ - -#ifndef FREE_MEM_ESTIMATE /* may be defined from command line */ - -#ifdef MSDOS /* For MS-DOS (unless flat-memory model) */ - -#include /* for access to intdos() call */ - -LOCAL(long) -unused_dos_memory (void) -/* Obtain total amount of unallocated DOS memory */ -{ - union REGS regs; - long nparas; - - regs.h.ah = 0x48; /* DOS function Allocate Memory Block */ - regs.x.bx = 0xFFFF; /* Ask for more memory than DOS can have */ - (void) intdos(®s, ®s); - /* DOS will fail and return # of paragraphs actually available in BX. */ - nparas = (unsigned int) regs.x.bx; - /* Times 16 to convert to bytes. */ - return nparas << 4; -} - -/* The default memory setting is 95% of the available space. */ -#define FREE_MEM_ESTIMATE ((unused_dos_memory() * 95L) / 100L) - -#endif /* MSDOS */ - -#ifdef ATARI /* For Atari ST/Mega/STE/TT/Falcon, Pure C or Turbo C */ - -#include - -/* The default memory setting is 90% of the available space. */ -#define FREE_MEM_ESTIMATE (((long) coreleft() * 90L) / 100L) - -#endif /* ATARI */ - -/* Add memory-estimation procedures for other operating systems here, - * with appropriate #ifdef's around them. - */ - -#endif /* !FREE_MEM_ESTIMATE */ - - -/* - * This list defines the known output image formats - * (not all of which need be supported by a given version). - * You can change the default output format by defining DEFAULT_FMT; - * indeed, you had better do so if you undefine PPM_SUPPORTED. - */ - -typedef enum { - FMT_BMP, /* BMP format (Windows flavor) */ - FMT_GIF, /* GIF format (LZW compressed) */ - FMT_GIF0, /* GIF format (uncompressed) */ - FMT_OS2, /* BMP format (OS/2 flavor) */ - FMT_PPM, /* PPM/PGM (PBMPLUS formats) */ - FMT_RLE, /* RLE format */ - FMT_TARGA, /* Targa format */ - FMT_TIFF /* TIFF format */ -} IMAGE_FORMATS; - -#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */ -#define DEFAULT_FMT FMT_BMP -#endif - -static IMAGE_FORMATS requested_fmt; - - -/* - * Argument-parsing code. - * The switch parser is designed to be useful with DOS-style command line - * syntax, ie, intermixed switches and file names, where only the switches - * to the left of a given file name affect processing of that file. - */ - - -static const char * progname; /* program name for error messages */ -static char * outfilename; /* for -outfile switch */ - - -LOCAL(void) -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "usage: %s [switches] inputfile(s)\n", progname); - fprintf(stderr, "List of input files may use wildcards (* and ?)\n"); - fprintf(stderr, "Output filename is same as input filename except for extension\n"); - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -colors N Reduce image to no more than N colors\n"); - fprintf(stderr, " -fast Fast, low-quality processing\n"); - fprintf(stderr, " -grayscale Force grayscale output\n"); - fprintf(stderr, " -rgb Force RGB output\n"); -#ifdef IDCT_SCALING_SUPPORTED - fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); -#endif -#ifdef BMP_SUPPORTED - fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n", - (DEFAULT_FMT == FMT_BMP ? " (default)" : "")); -#endif -#ifdef GIF_SUPPORTED - fprintf(stderr, " -gif Select GIF output format (LZW compressed)%s\n", - (DEFAULT_FMT == FMT_GIF ? " (default)" : "")); - fprintf(stderr, " -gif0 Select GIF output format (uncompressed)%s\n", - (DEFAULT_FMT == FMT_GIF0 ? " (default)" : "")); -#endif -#ifdef BMP_SUPPORTED - fprintf(stderr, " -os2 Select BMP output format (OS/2 style)%s\n", - (DEFAULT_FMT == FMT_OS2 ? " (default)" : "")); -#endif -#ifdef PPM_SUPPORTED - fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format%s\n", - (DEFAULT_FMT == FMT_PPM ? " (default)" : "")); -#endif -#ifdef RLE_SUPPORTED - fprintf(stderr, " -rle Select Utah RLE output format%s\n", - (DEFAULT_FMT == FMT_RLE ? " (default)" : "")); -#endif -#ifdef TARGA_SUPPORTED - fprintf(stderr, " -targa Select Targa output format%s\n", - (DEFAULT_FMT == FMT_TARGA ? " (default)" : "")); -#endif - fprintf(stderr, "Switches for advanced users:\n"); -#ifdef DCT_ISLOW_SUPPORTED - fprintf(stderr, " -dct int Use integer DCT method%s\n", - (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); -#endif -#ifdef DCT_IFAST_SUPPORTED - fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", - (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); -#endif -#ifdef DCT_FLOAT_SUPPORTED - fprintf(stderr, " -dct float Use floating-point DCT method%s\n", - (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); -#endif - fprintf(stderr, " -dither fs Use F-S dithering (default)\n"); - fprintf(stderr, " -dither none Don't use dithering in quantization\n"); - fprintf(stderr, " -dither ordered Use ordered dither (medium speed, quality)\n"); -#ifdef QUANT_2PASS_SUPPORTED - fprintf(stderr, " -map FILE Map to colors used in named image file\n"); -#endif - fprintf(stderr, " -nosmooth Don't use high-quality upsampling\n"); -#ifdef QUANT_1PASS_SUPPORTED - fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\n"); -#endif -#ifndef FREE_MEM_ESTIMATE - fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); -#endif - fprintf(stderr, " -outfile name Specify name for output file\n"); - fprintf(stderr, " -verbose or -debug Emit debug output\n"); - exit(EXIT_FAILURE); -} - - -LOCAL(int) -parse_switches (j_decompress_ptr cinfo, int argc, char **argv, - int last_file_arg_seen, boolean for_real) -/* Parse optional switches. - * Returns argv[] index of first file-name argument (== argc if none). - * Any file names with indexes <= last_file_arg_seen are ignored; - * they have presumably been processed in a previous iteration. - * (Pass 0 for last_file_arg_seen on the first or only iteration.) - * for_real is FALSE on the first (dummy) pass; we may skip any expensive - * processing. - */ -{ - int argn; - char * arg; - - /* Set up default JPEG parameters. */ - requested_fmt = DEFAULT_FMT; /* set default output file format */ - outfilename = NULL; - cinfo->err->trace_level = 0; - if (default_maxmem > 0) /* override library's default value */ - cinfo->mem->max_memory_to_use = default_maxmem; - - /* Scan command line options, adjust parameters */ - - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (*arg != '-') { - /* Not a switch, must be a file name argument */ - if (argn <= last_file_arg_seen) { - outfilename = NULL; /* -outfile applies to just one input file */ - continue; /* ignore this name if previously processed */ - } - break; /* else done parsing switches */ - } - arg++; /* advance past switch marker character */ - - if (keymatch(arg, "bmp", 1)) { - /* BMP output format (Windows flavor). */ - requested_fmt = FMT_BMP; - - } else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) || - keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) { - /* Do color quantization. */ - int val; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%d", &val) != 1) - usage(); - cinfo->desired_number_of_colors = val; - cinfo->quantize_colors = TRUE; - - } else if (keymatch(arg, "dct", 2)) { - /* Select IDCT algorithm. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "int", 1)) { - cinfo->dct_method = JDCT_ISLOW; - } else if (keymatch(argv[argn], "fast", 2)) { - cinfo->dct_method = JDCT_IFAST; - } else if (keymatch(argv[argn], "float", 2)) { - cinfo->dct_method = JDCT_FLOAT; - } else - usage(); - - } else if (keymatch(arg, "dither", 2)) { - /* Select dithering algorithm. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "fs", 2)) { - cinfo->dither_mode = JDITHER_FS; - } else if (keymatch(argv[argn], "none", 2)) { - cinfo->dither_mode = JDITHER_NONE; - } else if (keymatch(argv[argn], "ordered", 2)) { - cinfo->dither_mode = JDITHER_ORDERED; - } else - usage(); - - } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { - /* Enable debug printouts. */ - /* On first -d, print version identification */ - static boolean printed_version = FALSE; - - if (! printed_version) { - fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n", - JVERSION, JCOPYRIGHT); - printed_version = TRUE; - } - cinfo->err->trace_level++; - - } else if (keymatch(arg, "fast", 1)) { - /* Select recommended processing options for quick-and-dirty output. */ - cinfo->two_pass_quantize = FALSE; - cinfo->dither_mode = JDITHER_ORDERED; - if (! cinfo->quantize_colors) /* don't override an earlier -colors */ - cinfo->desired_number_of_colors = 216; - cinfo->dct_method = JDCT_FASTEST; - cinfo->do_fancy_upsampling = FALSE; - - } else if (keymatch(arg, "gif", 1)) { - /* GIF output format (LZW compressed). */ - requested_fmt = FMT_GIF; - - } else if (keymatch(arg, "gif0", 4)) { - /* GIF output format (uncompressed). */ - requested_fmt = FMT_GIF0; - - } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { - /* Force monochrome output. */ - cinfo->out_color_space = JCS_GRAYSCALE; - - } else if (keymatch(arg, "rgb", 3)) { - /* Force RGB output. */ - cinfo->out_color_space = JCS_RGB; - - } else if (keymatch(arg, "map", 3)) { - /* Quantize to a color map taken from an input file. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (for_real) { /* too expensive to do twice! */ -#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ - FILE * mapfile; - - if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); - exit(EXIT_FAILURE); - } - read_color_map(cinfo, mapfile); - fclose(mapfile); - cinfo->quantize_colors = TRUE; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } - - } else if (keymatch(arg, "maxmemory", 3)) { - /* Maximum memory in Kb (or Mb with 'm'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (ch == 'm' || ch == 'M') - lval *= 1000L; - cinfo->mem->max_memory_to_use = lval * 1000L; - - } else if (keymatch(arg, "nosmooth", 3)) { - /* Suppress fancy upsampling. */ - cinfo->do_fancy_upsampling = FALSE; - - } else if (keymatch(arg, "onepass", 3)) { - /* Use fast one-pass quantization. */ - cinfo->two_pass_quantize = FALSE; - - } else if (keymatch(arg, "os2", 3)) { - /* BMP output format (OS/2 flavor). */ - requested_fmt = FMT_OS2; - - } else if (keymatch(arg, "outfile", 4)) { - /* Set output file name. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - outfilename = argv[argn]; /* save it away for later use */ - - } else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) { - /* PPM/PGM output format. */ - requested_fmt = FMT_PPM; - - } else if (keymatch(arg, "rle", 1)) { - /* RLE output format. */ - requested_fmt = FMT_RLE; - - } else if (keymatch(arg, "scale", 1)) { - /* Scale the output image by a fraction M/N. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%u/%u", - &cinfo->scale_num, &cinfo->scale_denom) < 1) - usage(); - - } else if (keymatch(arg, "targa", 1)) { - /* Targa output format. */ - requested_fmt = FMT_TARGA; - - } else { - usage(); /* bogus switch */ - } - } - - return argn; /* return index of next arg (file name) */ -} - - -/* - * Marker processor for COM and interesting APPn markers. - * This replaces the library's built-in processor, which just skips the marker. - * We want to print out the marker as text, to the extent possible. - * Note this code relies on a non-suspending data source. - */ - -LOCAL(unsigned int) -jpeg_getc (j_decompress_ptr cinfo) -/* Read next byte */ -{ - struct jpeg_source_mgr * datasrc = cinfo->src; - - if (datasrc->bytes_in_buffer == 0) { - if (! (*datasrc->fill_input_buffer) (cinfo)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - } - datasrc->bytes_in_buffer--; - return GETJOCTET(*datasrc->next_input_byte++); -} - - -METHODDEF(boolean) -print_text_marker (j_decompress_ptr cinfo) -{ - boolean traceit = (cinfo->err->trace_level >= 1); - INT32 length; - unsigned int ch; - unsigned int lastch = 0; - - length = jpeg_getc(cinfo) << 8; - length += jpeg_getc(cinfo); - length -= 2; /* discount the length word itself */ - - if (traceit) { - if (cinfo->unread_marker == JPEG_COM) - fprintf(stderr, "Comment, length %ld:\n", (long) length); - else /* assume it is an APPn otherwise */ - fprintf(stderr, "APP%d, length %ld:\n", - cinfo->unread_marker - JPEG_APP0, (long) length); - } - - while (--length >= 0) { - ch = jpeg_getc(cinfo); - if (traceit) { - /* Emit the character in a readable form. - * Nonprintables are converted to \nnn form, - * while \ is converted to \\. - * Newlines in CR, CR/LF, or LF form will be printed as one newline. - */ - if (ch == '\r') { - fprintf(stderr, "\n"); - } else if (ch == '\n') { - if (lastch != '\r') - fprintf(stderr, "\n"); - } else if (ch == '\\') { - fprintf(stderr, "\\\\"); - } else if (isprint(ch)) { - putc(ch, stderr); - } else { - fprintf(stderr, "\\%03o", ch); - } - lastch = ch; - } - } - - if (traceit) - fprintf(stderr, "\n"); - - return TRUE; -} - - -/* - * Check for overwrite of an existing file; clear it with user - */ - -#ifndef NO_OVERWRITE_CHECK - -LOCAL(boolean) -is_write_ok (char * outfname) -{ - FILE * ofile; - int ch; - - ofile = fopen(outfname, READ_BINARY); - if (ofile == NULL) - return TRUE; /* not present */ - fclose(ofile); /* oops, it is present */ - - for (;;) { - fprintf(stderr, "%s already exists, overwrite it? [y/n] ", - outfname); - fflush(stderr); - ch = getc(stdin); - if (ch != '\n') /* flush rest of line */ - while (getc(stdin) != '\n') - /* nothing */; - - switch (ch) { - case 'Y': - case 'y': - return TRUE; - case 'N': - case 'n': - return FALSE; - /* otherwise, ask again */ - } - } -} - -#endif - - -/* - * Process a single input file name, and return its index in argv[]. - * File names at or to left of old_file_index have been processed already. - */ - -LOCAL(int) -process_one_file (int argc, char **argv, int old_file_index) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - char *infilename; - char workfilename[PATH_MAX]; - const char *default_extension = NULL; -#ifdef PROGRESS_REPORT - struct cdjpeg_progress_mgr progress; -#endif - int file_index; - djpeg_dest_ptr dest_mgr = NULL; - FILE * input_file = NULL; - FILE * output_file = NULL; - JDIMENSION num_scanlines; - - /* Initialize the JPEG decompression object with default error handling. */ - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - /* Add some application-specific error messages (from cderror.h) */ - jerr.addon_message_table = cdjpeg_message_table; - jerr.first_addon_message = JMSG_FIRSTADDONCODE; - jerr.last_addon_message = JMSG_LASTADDONCODE; - - /* Insert custom marker processor for COM and APP12. - * APP12 is used by some digital camera makers for textual info, - * so we provide the ability to display it as text. - * If you like, additional APPn marker types can be selected for display, - * but don't try to override APP0 or APP14 this way (see libjpeg.txt). - */ - jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); - jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); - - /* Now safe to enable signal catcher. */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) &cinfo); -#endif - - /* Scan command line to find next file name. - * It is convenient to use just one switch-parsing routine, but the switch - * values read here are ignored; we will rescan the switches after opening - * the input file. - * (Exception: tracing level set here controls verbosity for COM markers - * found during jpeg_read_header...) - */ - - file_index = parse_switches(&cinfo, argc, argv, old_file_index, FALSE); - if (file_index >= argc) { - fprintf(stderr, "%s: missing input file name\n", progname); - usage(); - } - - /* Open the input file. */ - infilename = argv[file_index]; - if ((input_file = fopen(infilename, READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, infilename); - goto fail; - } - -#ifdef PROGRESS_REPORT - start_progress_monitor((j_common_ptr) &cinfo, &progress); -#endif - - /* Specify data source for decompression */ - jpeg_stdio_src(&cinfo, input_file); - - /* Read file header, set default decompression parameters */ - (void) jpeg_read_header(&cinfo, TRUE); - - /* Adjust default decompression parameters by re-parsing the options */ - file_index = parse_switches(&cinfo, argc, argv, old_file_index, TRUE); - - /* Initialize the output module now to let it override any crucial - * option settings (for instance, GIF wants to force color quantization). - */ - switch (requested_fmt) { -#ifdef BMP_SUPPORTED - case FMT_BMP: - dest_mgr = jinit_write_bmp(&cinfo, FALSE); - default_extension = ".bmp"; - break; - case FMT_OS2: - dest_mgr = jinit_write_bmp(&cinfo, TRUE); - default_extension = ".bmp"; - break; -#endif -#ifdef GIF_SUPPORTED - case FMT_GIF: - dest_mgr = jinit_write_gif(&cinfo, TRUE); - default_extension = ".gif"; - break; - case FMT_GIF0: - dest_mgr = jinit_write_gif(&cinfo, FALSE); - default_extension = ".gif"; - break; -#endif -#ifdef PPM_SUPPORTED - case FMT_PPM: - dest_mgr = jinit_write_ppm(&cinfo); - default_extension = ".ppm"; - break; -#endif -#ifdef RLE_SUPPORTED - case FMT_RLE: - dest_mgr = jinit_write_rle(&cinfo); - default_extension = ".rle"; - break; -#endif -#ifdef TARGA_SUPPORTED - case FMT_TARGA: - dest_mgr = jinit_write_targa(&cinfo); - default_extension = ".tga"; - break; -#endif - default: - ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT); - } - - /* If user didn't supply -outfile switch, select output file name. */ - if (outfilename == NULL) { - int i; - - outfilename = workfilename; - /* Make outfilename be infilename with appropriate extension */ - strcpy(outfilename, infilename); - for (i = (int)strlen(outfilename)-1; i >= 0; i--) { - switch (outfilename[i]) { - case ':': - case '/': - case '\\': - i = 0; /* stop scanning */ - break; - case '.': - outfilename[i] = '\0'; /* lop off existing extension */ - i = 0; /* stop scanning */ - break; - default: - break; /* keep scanning */ - } - } - strcat(outfilename, default_extension); - } - - fprintf(stderr, "Decompressing %s => %s\n", infilename, outfilename); -#ifndef NO_OVERWRITE_CHECK - if (! is_write_ok(outfilename)) - goto fail; -#endif - - /* Open the output file. */ - if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't create %s\n", progname, outfilename); - goto fail; - } - dest_mgr->output_file = output_file; - - /* Start decompressor */ - (void) jpeg_start_decompress(&cinfo); - - /* Write output file header */ - (*dest_mgr->start_output) (&cinfo, dest_mgr); - - /* Process data */ - while (cinfo.output_scanline < cinfo.output_height) { - num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer, - dest_mgr->buffer_height); - (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); - } - -#ifdef PROGRESS_REPORT - /* Hack: count final pass as done in case finish_output does an extra pass. - * The library won't have updated completed_passes. - */ - progress.pub.completed_passes = progress.pub.total_passes; -#endif - - /* Finish decompression and release memory. - * I must do it in this order because output module has allocated memory - * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. - */ - (*dest_mgr->finish_output) (&cinfo, dest_mgr); - (void) jpeg_finish_decompress(&cinfo); - - /* Clean up and exit */ -fail: - jpeg_destroy_decompress(&cinfo); - - if (input_file != NULL) fclose(input_file); - if (output_file != NULL) fclose(output_file); - -#ifdef PROGRESS_REPORT - end_progress_monitor((j_common_ptr) &cinfo); -#endif - - /* Disable signal catcher. */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) NULL); -#endif - - return file_index; -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - int file_index; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - -#ifdef MSDOS - progname = "djpeg"; /* DOS tends to be too verbose about argv[0] */ -#else - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "djpeg"; /* in case C library doesn't provide it */ -#endif - - /* The default maxmem must be computed only once at program startup, - * since releasing memory with free() won't give it back to the OS. - */ -#ifdef FREE_MEM_ESTIMATE - default_maxmem = FREE_MEM_ESTIMATE; -#else - default_maxmem = 0; -#endif - - /* Scan command line, parse switches and locate input file names */ - - if (argc < 2) - usage(); /* nothing on the command line?? */ - - file_index = 0; - - while (file_index < argc-1) - file_index = process_one_file(argc, argv, file_index); - - /* All done. */ - exit(EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/example.c b/code/jpeg-9f/example.c deleted file mode 100644 index 1d6f6cc3..00000000 --- a/code/jpeg-9f/example.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * example.c - * - * This file illustrates how to use the IJG code as a subroutine library - * to read or write JPEG image files. You should look at this code in - * conjunction with the documentation file libjpeg.txt. - * - * This code will not do anything useful as-is, but it may be helpful as a - * skeleton for constructing routines that call the JPEG library. - * - * We present these routines in the same coding style used in the JPEG code - * (ANSI function definitions, etc); but you are of course free to code your - * routines in a different style if you prefer. - */ - -#include - -/* - * Include file for users of JPEG library. - * You will need to have included system headers that define at least - * the typedefs FILE and size_t before you can include jpeglib.h. - * (stdio.h is sufficient on ANSI-conforming systems.) - * You may also wish to include "jerror.h". - */ - -#include "jpeglib.h" - -/* - * is used for the optional error recovery mechanism shown in - * the second part of the example. - */ - -#include - - - -/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ - -/* This half of the example shows how to feed data into the JPEG compressor. - * We present a minimal version that does not worry about refinements such - * as error recovery (the JPEG code will just exit() if it gets an error). - */ - - -/* - * IMAGE DATA FORMATS: - * - * The standard input image format is a rectangular array of pixels, with - * each pixel having the same number of "component" values (color channels). - * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). - * If you are working with color data, then the color values for each pixel - * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit - * RGB color. - * - * For this example, we'll assume that this data structure matches the way - * our application has stored the image in memory, so we can just pass a - * pointer to our image buffer. In particular, let's say that the image is - * RGB color and is described by: - */ - -extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ -extern int image_height; /* Number of rows in image */ -extern int image_width; /* Number of columns in image */ - - -/* - * Sample routine for JPEG compression. We assume that the target file name - * and a compression quality factor are passed in. - */ - -GLOBAL(void) -write_JPEG_file (char * filename, int quality) -{ - /* This struct contains the JPEG compression parameters and pointers to - * working space (which is allocated as needed by the JPEG library). - * It is possible to have several such structures, representing multiple - * compression/decompression processes, in existence at once. We refer - * to any one struct (and its associated working data) as a "JPEG object". - */ - struct jpeg_compress_struct cinfo; - /* This struct represents a JPEG error handler. It is declared separately - * because applications often want to supply a specialized error handler - * (see the second half of this file for an example). But here we just - * take the easy way out and use the standard error handler, which will - * print a message on stderr and call exit() if compression fails. - * Note that this struct must live as long as the main JPEG parameter - * struct, to avoid dangling-pointer problems. - */ - struct jpeg_error_mgr jerr; - /* More stuff */ - FILE * outfile; /* target file */ - JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ - int row_stride; /* physical row width in image buffer */ - - /* Step 1: allocate and initialize JPEG compression object */ - - /* We have to set up the error handler first, in case the initialization - * step fails. (Unlikely, but it could happen if you are out of memory.) - * This routine fills in the contents of struct jerr, and returns jerr's - * address which we place into the link field in cinfo. - */ - cinfo.err = jpeg_std_error(&jerr); - /* Now we can initialize the JPEG compression object. */ - jpeg_create_compress(&cinfo); - - /* Step 2: specify data destination (eg, a file) */ - /* Note: steps 2 and 3 can be done in either order. */ - - /* Here we use the library-supplied code to send compressed data to a - * stdio stream. You can also write your own code to do something else. - * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that - * requires it in order to write binary files. - */ - if ((outfile = fopen(filename, "wb")) == NULL) { - fprintf(stderr, "can't open %s\n", filename); - exit(1); - } - jpeg_stdio_dest(&cinfo, outfile); - - /* Step 3: set parameters for compression */ - - /* First we supply a description of the input image. - * Four fields of the cinfo struct must be filled in: - */ - cinfo.image_width = image_width; /* image width and height, in pixels */ - cinfo.image_height = image_height; - cinfo.input_components = 3; /* # of color components per pixel */ - cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ - /* Now use the library's routine to set default compression parameters. - * (You must set at least cinfo.in_color_space before calling this, - * since the defaults depend on the source color space.) - */ - jpeg_set_defaults(&cinfo); - /* Now you can set any non-default parameters you wish to. - * Here we just illustrate the use of quality (quantization table) scaling: - */ - jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); - - /* Step 4: Start compressor */ - - /* TRUE ensures that we will write a complete interchange-JPEG file. - * Pass TRUE unless you are very sure of what you're doing. - */ - jpeg_start_compress(&cinfo, TRUE); - - /* Step 5: while (scan lines remain to be written) */ - /* jpeg_write_scanlines(...); */ - - /* Here we use the library's state variable cinfo.next_scanline as the - * loop counter, so that we don't have to keep track ourselves. - * To keep things simple, we pass one scanline per call; you can pass - * more if you wish, though. - */ - row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ - - while (cinfo.next_scanline < cinfo.image_height) { - /* jpeg_write_scanlines expects an array of pointers to scanlines. - * Here the array is only one element long, but you could pass - * more than one scanline at a time if that's more convenient. - */ - row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; - (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); - } - - /* Step 6: Finish compression */ - - jpeg_finish_compress(&cinfo); - /* After finish_compress, we can close the output file. */ - fclose(outfile); - - /* Step 7: release JPEG compression object */ - - /* This is an important step since it will release a good deal of memory. */ - jpeg_destroy_compress(&cinfo); - - /* And we're done! */ -} - - -/* - * SOME FINE POINTS: - * - * In the above loop, we ignored the return value of jpeg_write_scanlines, - * which is the number of scanlines actually written. We could get away - * with this because we were only relying on the value of cinfo.next_scanline, - * which will be incremented correctly. If you maintain additional loop - * variables then you should be careful to increment them properly. - * Actually, for output to a stdio stream you needn't worry, because - * then jpeg_write_scanlines will write all the lines passed (or else exit - * with a fatal error). Partial writes can only occur if you use a data - * destination module that can demand suspension of the compressor. - * (If you don't know what that's for, you don't need it.) - * - * If the compressor requires full-image buffers (for entropy-coding - * optimization or a multi-scan JPEG file), it will create temporary - * files for anything that doesn't fit within the maximum-memory setting. - * (Note that temp files are NOT needed if you use the default parameters.) - * On some systems you may need to set up a signal handler to ensure that - * temporary files are deleted if the program is interrupted. See libjpeg.txt. - * - * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG - * files to be compatible with everyone else's. If you cannot readily read - * your data in that order, you'll need an intermediate array to hold the - * image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top - * source data using the JPEG code's internal virtual-array mechanisms. - */ - - - -/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ - -/* This half of the example shows how to read data from the JPEG decompressor. - * It's a bit more refined than the above, in that we show: - * (a) how to modify the JPEG library's standard error-reporting behavior; - * (b) how to allocate workspace using the library's memory manager. - * - * Just to make this example a little different from the first one, we'll - * assume that we do not intend to put the whole image into an in-memory - * buffer, but to send it line-by-line someplace else. We need a one- - * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG - * memory manager allocate it for us. This approach is actually quite useful - * because we don't need to remember to deallocate the buffer separately: it - * will go away automatically when the JPEG object is cleaned up. - */ - - -/* - * ERROR HANDLING: - * - * The JPEG library's standard error handler (jerror.c) is divided into - * several "methods" which you can override individually. This lets you - * adjust the behavior without duplicating a lot of code, which you might - * have to update with each future release. - * - * Our example here shows how to override the "error_exit" method so that - * control is returned to the library's caller when a fatal error occurs, - * rather than calling exit() as the standard error_exit method does. - * - * We use C's setjmp/longjmp facility to return control. This means that the - * routine which calls the JPEG library must first execute a setjmp() call to - * establish the return point. We want the replacement error_exit to do a - * longjmp(). But we need to make the setjmp buffer accessible to the - * error_exit routine. To do this, we make a private extension of the - * standard JPEG error handler object. (If we were using C++, we'd say we - * were making a subclass of the regular error handler.) - * - * Here's the extended error handler struct: - */ - -struct my_error_mgr { - struct jpeg_error_mgr pub; /* "public" fields */ - - jmp_buf setjmp_buffer; /* for return to caller */ -}; - -typedef struct my_error_mgr * my_error_ptr; - -/* - * Here's the routine that will replace the standard error_exit method: - */ - -METHODDEF(void) -my_error_exit (j_common_ptr cinfo) -{ - /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ - my_error_ptr myerr = (my_error_ptr) cinfo->err; - - /* Always display the message. */ - /* We could postpone this until after returning, if we chose. */ - (*cinfo->err->output_message) (cinfo); - - /* Return control to the setjmp point */ - longjmp(myerr->setjmp_buffer, 1); -} - - -/* - * Sample routine for JPEG decompression. We assume that the source file name - * is passed in. We want to return 1 on success, 0 on error. - */ - - -GLOBAL(int) -read_JPEG_file (char * filename) -{ - /* This struct contains the JPEG decompression parameters and pointers to - * working space (which is allocated as needed by the JPEG library). - */ - struct jpeg_decompress_struct cinfo; - /* We use our private extension JPEG error handler. - * Note that this struct must live as long as the main JPEG parameter - * struct, to avoid dangling-pointer problems. - */ - struct my_error_mgr jerr; - /* More stuff */ - FILE * infile; /* source file */ - JSAMPARRAY buffer; /* Output row buffer */ - int row_stride; /* physical row width in output buffer */ - - /* In this example we want to open the input file before doing anything else, - * so that the setjmp() error recovery below can assume the file is open. - * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that - * requires it in order to read binary files. - */ - - if ((infile = fopen(filename, "rb")) == NULL) { - fprintf(stderr, "can't open %s\n", filename); - return 0; - } - - /* Step 1: allocate and initialize JPEG decompression object */ - - /* We set up the normal JPEG error routines, then override error_exit. */ - cinfo.err = jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = my_error_exit; - /* Establish the setjmp return context for my_error_exit to use. */ - if (setjmp(jerr.setjmp_buffer)) { - /* If we get here, the JPEG code has signaled an error. - * We need to clean up the JPEG object, close the input file, and return. - */ - jpeg_destroy_decompress(&cinfo); - fclose(infile); - return 0; - } - /* Now we can initialize the JPEG decompression object. */ - jpeg_create_decompress(&cinfo); - - /* Step 2: specify data source (eg, a file) */ - - jpeg_stdio_src(&cinfo, infile); - - /* Step 3: read file parameters with jpeg_read_header() */ - - (void) jpeg_read_header(&cinfo, TRUE); - /* We can ignore the return value from jpeg_read_header since - * (a) suspension is not possible with the stdio data source, and - * (b) we passed TRUE to reject a tables-only JPEG file as an error. - * See libjpeg.txt for more info. - */ - - /* Step 4: set parameters for decompression */ - - /* In this example, we don't need to change any of the defaults set by - * jpeg_read_header(), so we do nothing here. - */ - - /* Step 5: Start decompressor */ - - (void) jpeg_start_decompress(&cinfo); - /* We can ignore the return value since suspension is not possible - * with the stdio data source. - */ - - /* We may need to do some setup of our own at this point before reading - * the data. After jpeg_start_decompress() we have the correct scaled - * output image dimensions available, as well as the output colormap - * if we asked for color quantization. - * In this example, we need to make an output work buffer of the right size. - */ - /* JSAMPLEs per row in output buffer */ - row_stride = cinfo.output_width * cinfo.output_components; - /* Make a one-row-high sample array that will go away when done with image */ - buffer = (*cinfo.mem->alloc_sarray) - ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); - - /* Step 6: while (scan lines remain to be read) */ - /* jpeg_read_scanlines(...); */ - - /* Here we use the library's state variable cinfo.output_scanline as the - * loop counter, so that we don't have to keep track ourselves. - */ - while (cinfo.output_scanline < cinfo.output_height) { - /* jpeg_read_scanlines expects an array of pointers to scanlines. - * Here the array is only one element long, but you could ask for - * more than one scanline at a time if that's more convenient. - */ - (void) jpeg_read_scanlines(&cinfo, buffer, 1); - /* Assume put_scanline_someplace wants a pointer and sample count. */ - put_scanline_someplace(buffer[0], row_stride); - } - - /* Step 7: Finish decompression */ - - (void) jpeg_finish_decompress(&cinfo); - /* We can ignore the return value since suspension is not possible - * with the stdio data source. - */ - - /* Step 8: Release JPEG decompression object */ - - /* This is an important step since it will release a good deal of memory. */ - jpeg_destroy_decompress(&cinfo); - - /* After finish_decompress, we can close the input file. - * Here we postpone it until after no more JPEG errors are possible, - * so as to simplify the setjmp error logic above. (Actually, I don't - * think that jpeg_destroy can do an error exit, but why assume anything...) - */ - fclose(infile); - - /* At this point you may want to check to see whether any corrupt-data - * warnings occurred (test whether jerr.pub.num_warnings is nonzero). - */ - - /* And we're done! */ - return 1; -} - - -/* - * SOME FINE POINTS: - * - * In the above code, we ignored the return value of jpeg_read_scanlines, - * which is the number of scanlines actually read. We could get away with - * this because we asked for only one line at a time and we weren't using - * a suspending data source. See libjpeg.txt for more info. - * - * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress(); - * we should have done it beforehand to ensure that the space would be - * counted against the JPEG max_memory setting. In some systems the above - * code would risk an out-of-memory error. However, in general we don't - * know the output image dimensions before jpeg_start_decompress(), unless we - * call jpeg_calc_output_dimensions(). See libjpeg.txt for more about this. - * - * Scanlines are returned in the same order as they appear in the JPEG file, - * which is standardly top-to-bottom. If you must emit data bottom-to-top, - * you can use one of the virtual arrays provided by the JPEG memory manager - * to invert the data. See wrbmp.c for an example. - * - * As with compression, some operating modes may require temporary files. - * On some systems you may need to set up a signal handler to ensure that - * temporary files are deleted if the program is interrupted. See libjpeg.txt. - */ diff --git a/code/jpeg-9f/jmemansi.c b/code/jpeg-9f/jmemansi.c deleted file mode 100644 index 2d93e496..00000000 --- a/code/jpeg-9f/jmemansi.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * jmemansi.c - * - * Copyright (C) 1992-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides a simple generic implementation of the system- - * dependent portion of the JPEG memory manager. This implementation - * assumes that you have the ANSI-standard library routine tmpfile(). - * Also, the problem of determining the amount of memory available - * is shoved onto the user. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ -extern void * malloc JPP((size_t size)); -extern void free JPP((void *ptr)); -#endif - -#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ -#define SEEK_SET 0 /* if not, assume 0 is correct */ -#endif - - -/* - * Memory allocation and freeing are controlled by the regular library - * routines malloc() and free(). - */ - -GLOBAL(void *) -jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * "Large" objects are treated the same as "small" ones. - * NB: although we include FAR keywords in the routine declarations, - * this file won't actually work in 80x86 small/medium model; at least, - * you probably won't be able to process useful-size images in only 64KB. - */ - -GLOBAL(void FAR *) -jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void FAR *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * This routine computes the total memory space available for allocation. - * It's impossible to do this in a portable way; our current solution is - * to make the user tell us (with a default value set at compile time). - * If you can actually get the available space, it's a good idea to subtract - * a slop factor of 5% or so. - */ - -#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ -#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ -#endif - -GLOBAL(long) -jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, - long max_bytes_needed, long already_allocated) -{ - return cinfo->mem->max_memory_to_use - already_allocated; -} - - -/* - * Backing store (temporary file) management. - * Backing store objects are only used when the value returned by - * jpeg_mem_available is less than the total space needed. You can dispense - * with these routines if you have plenty of virtual memory; see jmemnobs.c. - */ - - -METHODDEF(void) -read_backing_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - if (fseek(info->temp_file, file_offset, SEEK_SET)) - ERREXIT(cinfo, JERR_TFILE_SEEK); - if (JFREAD(info->temp_file, buffer_address, byte_count) - != (size_t) byte_count) - ERREXIT(cinfo, JERR_TFILE_READ); -} - - -METHODDEF(void) -write_backing_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - if (fseek(info->temp_file, file_offset, SEEK_SET)) - ERREXIT(cinfo, JERR_TFILE_SEEK); - if (JFWRITE(info->temp_file, buffer_address, byte_count) - != (size_t) byte_count) - ERREXIT(cinfo, JERR_TFILE_WRITE); -} - - -METHODDEF(void) -close_backing_store (j_common_ptr cinfo, backing_store_ptr info) -{ - fclose(info->temp_file); - /* Since this implementation uses tmpfile() to create the file, - * no explicit file deletion is needed. - */ -} - - -/* - * Initial opening of a backing-store object. - * - * This version uses tmpfile(), which constructs a suitable file name - * behind the scenes. We don't have to use info->temp_name[] at all; - * indeed, we can't even find out the actual name of the temp file. - */ - -GLOBAL(void) -jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - if ((info->temp_file = tmpfile()) == NULL) - ERREXITS(cinfo, JERR_TFILE_CREATE, ""); - info->read_backing_store = read_backing_store; - info->write_backing_store = write_backing_store; - info->close_backing_store = close_backing_store; -} - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. - */ - -GLOBAL(long) -jpeg_mem_init (j_common_ptr cinfo) -{ - return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ -} - -GLOBAL(void) -jpeg_mem_term (j_common_ptr cinfo) -{ - /* no work */ -} diff --git a/code/jpeg-9f/jmemdos.c b/code/jpeg-9f/jmemdos.c deleted file mode 100644 index 60b45c69..00000000 --- a/code/jpeg-9f/jmemdos.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - * jmemdos.c - * - * Copyright (C) 1992-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides an MS-DOS-compatible implementation of the system- - * dependent portion of the JPEG memory manager. Temporary data can be - * stored in extended or expanded memory as well as in regular DOS files. - * - * If you use this file, you must be sure that NEED_FAR_POINTERS is defined - * if you compile in a small-data memory model; it should NOT be defined if - * you use a large-data memory model. This file is not recommended if you - * are using a flat-memory-space 386 environment such as DJGCC or Watcom C. - * Also, this code will NOT work if struct fields are aligned on greater than - * 2-byte boundaries. - * - * Based on code contributed by Ge' Weijers. - */ - -/* - * If you have both extended and expanded memory, you may want to change the - * order in which they are tried in jopen_backing_store. On a 286 machine - * expanded memory is usually faster, since extended memory access involves - * an expensive protected-mode-and-back switch. On 386 and better, extended - * memory is usually faster. As distributed, the code tries extended memory - * first (what? not everyone has a 386? :-). - * - * You can disable use of extended/expanded memory entirely by altering these - * definitions or overriding them from the Makefile (eg, -DEMS_SUPPORTED=0). - */ - -#ifndef XMS_SUPPORTED -#define XMS_SUPPORTED 1 -#endif -#ifndef EMS_SUPPORTED -#define EMS_SUPPORTED 1 -#endif - - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef HAVE_STDLIB_H /* should declare these */ -extern void * malloc JPP((size_t size)); -extern void free JPP((void *ptr)); -extern char * getenv JPP((const char * name)); -#endif - -#ifdef NEED_FAR_POINTERS - -#ifdef __TURBOC__ -/* These definitions work for Borland C (Turbo C) */ -#include /* need farmalloc(), farfree() */ -#define far_malloc(x) farmalloc(x) -#define far_free(x) farfree(x) -#else -/* These definitions work for Microsoft C and compatible compilers */ -#include /* need _fmalloc(), _ffree() */ -#define far_malloc(x) _fmalloc(x) -#define far_free(x) _ffree(x) -#endif - -#else /* not NEED_FAR_POINTERS */ - -#define far_malloc(x) malloc(x) -#define far_free(x) free(x) - -#endif /* NEED_FAR_POINTERS */ - -#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ -#define READ_BINARY "r" -#else -#define READ_BINARY "rb" -#endif - -#ifndef USE_MSDOS_MEMMGR /* make sure user got configuration right */ - You forgot to define USE_MSDOS_MEMMGR in jconfig.h. /* deliberate syntax error */ -#endif - -#if MAX_ALLOC_CHUNK >= 65535L /* make sure jconfig.h got this right */ - MAX_ALLOC_CHUNK should be less than 64K. /* deliberate syntax error */ -#endif - - -/* - * Declarations for assembly-language support routines (see jmemdosa.asm). - * - * The functions are declared "far" as are all their pointer arguments; - * this ensures the assembly source code will work regardless of the - * compiler memory model. We assume "short" is 16 bits, "long" is 32. - */ - -typedef void far * XMSDRIVER; /* actually a pointer to code */ -typedef struct { /* registers for calling XMS driver */ - unsigned short ax, dx, bx; - void far * ds_si; - } XMScontext; -typedef struct { /* registers for calling EMS driver */ - unsigned short ax, dx, bx; - void far * ds_si; - } EMScontext; - -extern short far jdos_open JPP((short far * handle, char far * filename)); -extern short far jdos_close JPP((short handle)); -extern short far jdos_seek JPP((short handle, long offset)); -extern short far jdos_read JPP((short handle, void far * buffer, - unsigned short count)); -extern short far jdos_write JPP((short handle, void far * buffer, - unsigned short count)); -extern void far jxms_getdriver JPP((XMSDRIVER far *)); -extern void far jxms_calldriver JPP((XMSDRIVER, XMScontext far *)); -extern short far jems_available JPP((void)); -extern void far jems_calldriver JPP((EMScontext far *)); - - -/* - * Selection of a file name for a temporary file. - * This is highly system-dependent, and you may want to customize it. - */ - -static int next_file_num; /* to distinguish among several temp files */ - -LOCAL(void) -select_file_name (char * fname) -{ - const char * env; - char * ptr; - FILE * tfile; - - /* Keep generating file names till we find one that's not in use */ - for (;;) { - /* Get temp directory name from environment TMP or TEMP variable; - * if none, use "." - */ - if ((env = (const char *) getenv("TMP")) == NULL) - if ((env = (const char *) getenv("TEMP")) == NULL) - env = "."; - if (*env == '\0') /* null string means "." */ - env = "."; - ptr = fname; /* copy name to fname */ - while (*env != '\0') - *ptr++ = *env++; - if (ptr[-1] != '\\' && ptr[-1] != '/') - *ptr++ = '\\'; /* append backslash if not in env variable */ - /* Append a suitable file name */ - next_file_num++; /* advance counter */ - sprintf(ptr, "JPG%03d.TMP", next_file_num); - /* Probe to see if file name is already in use */ - if ((tfile = fopen(fname, READ_BINARY)) == NULL) - break; - fclose(tfile); /* oops, it's there; close tfile & try again */ - } -} - - -/* - * Near-memory allocation and freeing are controlled by the regular library - * routines malloc() and free(). - */ - -GLOBAL(void *) -jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * "Large" objects are allocated in far memory, if possible - */ - -GLOBAL(void FAR *) -jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void FAR *) far_malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) -{ - far_free(object); -} - - -/* - * This routine computes the total memory space available for allocation. - * It's impossible to do this in a portable way; our current solution is - * to make the user tell us (with a default value set at compile time). - * If you can actually get the available space, it's a good idea to subtract - * a slop factor of 5% or so. - */ - -#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ -#define DEFAULT_MAX_MEM 300000L /* for total usage about 450K */ -#endif - -GLOBAL(long) -jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, - long max_bytes_needed, long already_allocated) -{ - return cinfo->mem->max_memory_to_use - already_allocated; -} - - -/* - * Backing store (temporary file) management. - * Backing store objects are only used when the value returned by - * jpeg_mem_available is less than the total space needed. You can dispense - * with these routines if you have plenty of virtual memory; see jmemnobs.c. - */ - -/* - * For MS-DOS we support three types of backing storage: - * 1. Conventional DOS files. We access these by direct DOS calls rather - * than via the stdio package. This provides a bit better performance, - * but the real reason is that the buffers to be read or written are FAR. - * The stdio library for small-data memory models can't cope with that. - * 2. Extended memory, accessed per the XMS V2.0 specification. - * 3. Expanded memory, accessed per the LIM/EMS 4.0 specification. - * You'll need copies of those specs to make sense of the related code. - * The specs are available by Internet FTP from the SIMTEL archives - * (oak.oakland.edu and its various mirror sites). See files - * pub/msdos/microsoft/xms20.arc and pub/msdos/info/limems41.zip. - */ - - -/* - * Access methods for a DOS file. - */ - - -METHODDEF(void) -read_file_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - if (jdos_seek(info->handle.file_handle, file_offset)) - ERREXIT(cinfo, JERR_TFILE_SEEK); - /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ - if (byte_count > 65535L) /* safety check */ - ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); - if (jdos_read(info->handle.file_handle, buffer_address, - (unsigned short) byte_count)) - ERREXIT(cinfo, JERR_TFILE_READ); -} - - -METHODDEF(void) -write_file_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - if (jdos_seek(info->handle.file_handle, file_offset)) - ERREXIT(cinfo, JERR_TFILE_SEEK); - /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ - if (byte_count > 65535L) /* safety check */ - ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); - if (jdos_write(info->handle.file_handle, buffer_address, - (unsigned short) byte_count)) - ERREXIT(cinfo, JERR_TFILE_WRITE); -} - - -METHODDEF(void) -close_file_store (j_common_ptr cinfo, backing_store_ptr info) -{ - jdos_close(info->handle.file_handle); /* close the file */ - remove(info->temp_name); /* delete the file */ -/* If your system doesn't have remove(), try unlink() instead. - * remove() is the ANSI-standard name for this function, but - * unlink() was more common in pre-ANSI systems. - */ - TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); -} - - -LOCAL(boolean) -open_file_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - short handle; - - select_file_name(info->temp_name); - if (jdos_open((short far *) & handle, (char far *) info->temp_name)) { - /* might as well exit since jpeg_open_backing_store will fail anyway */ - ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); - return FALSE; - } - info->handle.file_handle = handle; - info->read_backing_store = read_file_store; - info->write_backing_store = write_file_store; - info->close_backing_store = close_file_store; - TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); - return TRUE; /* succeeded */ -} - - -/* - * Access methods for extended memory. - */ - -#if XMS_SUPPORTED - -static XMSDRIVER xms_driver; /* saved address of XMS driver */ - -typedef union { /* either long offset or real-mode pointer */ - long offset; - void far * ptr; - } XMSPTR; - -typedef struct { /* XMS move specification structure */ - long length; - XMSH src_handle; - XMSPTR src; - XMSH dst_handle; - XMSPTR dst; - } XMSspec; - -#define ODD(X) (((X) & 1L) != 0) - - -METHODDEF(void) -read_xms_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - XMScontext ctx; - XMSspec spec; - char endbuffer[2]; - - /* The XMS driver can't cope with an odd length, so handle the last byte - * specially if byte_count is odd. We don't expect this to be common. - */ - - spec.length = byte_count & (~ 1L); - spec.src_handle = info->handle.xms_handle; - spec.src.offset = file_offset; - spec.dst_handle = 0; - spec.dst.ptr = buffer_address; - - ctx.ds_si = (void far *) & spec; - ctx.ax = 0x0b00; /* EMB move */ - jxms_calldriver(xms_driver, (XMScontext far *) & ctx); - if (ctx.ax != 1) - ERREXIT(cinfo, JERR_XMS_READ); - - if (ODD(byte_count)) { - read_xms_store(cinfo, info, (void FAR *) endbuffer, - file_offset + byte_count - 1L, 2L); - ((char FAR *) buffer_address)[byte_count - 1L] = endbuffer[0]; - } -} - - -METHODDEF(void) -write_xms_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - XMScontext ctx; - XMSspec spec; - char endbuffer[2]; - - /* The XMS driver can't cope with an odd length, so handle the last byte - * specially if byte_count is odd. We don't expect this to be common. - */ - - spec.length = byte_count & (~ 1L); - spec.src_handle = 0; - spec.src.ptr = buffer_address; - spec.dst_handle = info->handle.xms_handle; - spec.dst.offset = file_offset; - - ctx.ds_si = (void far *) & spec; - ctx.ax = 0x0b00; /* EMB move */ - jxms_calldriver(xms_driver, (XMScontext far *) & ctx); - if (ctx.ax != 1) - ERREXIT(cinfo, JERR_XMS_WRITE); - - if (ODD(byte_count)) { - read_xms_store(cinfo, info, (void FAR *) endbuffer, - file_offset + byte_count - 1L, 2L); - endbuffer[0] = ((char FAR *) buffer_address)[byte_count - 1L]; - write_xms_store(cinfo, info, (void FAR *) endbuffer, - file_offset + byte_count - 1L, 2L); - } -} - - -METHODDEF(void) -close_xms_store (j_common_ptr cinfo, backing_store_ptr info) -{ - XMScontext ctx; - - ctx.dx = info->handle.xms_handle; - ctx.ax = 0x0a00; - jxms_calldriver(xms_driver, (XMScontext far *) & ctx); - TRACEMS1(cinfo, 1, JTRC_XMS_CLOSE, info->handle.xms_handle); - /* we ignore any error return from the driver */ -} - - -LOCAL(boolean) -open_xms_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - XMScontext ctx; - - /* Get address of XMS driver */ - jxms_getdriver((XMSDRIVER far *) & xms_driver); - if (xms_driver == NULL) - return FALSE; /* no driver to be had */ - - /* Get version number, must be >= 2.00 */ - ctx.ax = 0x0000; - jxms_calldriver(xms_driver, (XMScontext far *) & ctx); - if (ctx.ax < (unsigned short) 0x0200) - return FALSE; - - /* Try to get space (expressed in kilobytes) */ - ctx.dx = (unsigned short) ((total_bytes_needed + 1023L) >> 10); - ctx.ax = 0x0900; - jxms_calldriver(xms_driver, (XMScontext far *) & ctx); - if (ctx.ax != 1) - return FALSE; - - /* Succeeded, save the handle and away we go */ - info->handle.xms_handle = ctx.dx; - info->read_backing_store = read_xms_store; - info->write_backing_store = write_xms_store; - info->close_backing_store = close_xms_store; - TRACEMS1(cinfo, 1, JTRC_XMS_OPEN, ctx.dx); - return TRUE; /* succeeded */ -} - -#endif /* XMS_SUPPORTED */ - - -/* - * Access methods for expanded memory. - */ - -#if EMS_SUPPORTED - -/* The EMS move specification structure requires word and long fields aligned - * at odd byte boundaries. Some compilers will align struct fields at even - * byte boundaries. While it's usually possible to force byte alignment, - * that causes an overall performance penalty and may pose problems in merging - * JPEG into a larger application. Instead we accept some rather dirty code - * here. Note this code would fail if the hardware did not allow odd-byte - * word & long accesses, but all 80x86 CPUs do. - */ - -typedef void far * EMSPTR; - -typedef union { /* EMS move specification structure */ - long length; /* It's easy to access first 4 bytes */ - char bytes[18]; /* Misaligned fields in here! */ - } EMSspec; - -/* Macros for accessing misaligned fields */ -#define FIELD_AT(spec,offset,type) (*((type *) &(spec.bytes[offset]))) -#define SRC_TYPE(spec) FIELD_AT(spec,4,char) -#define SRC_HANDLE(spec) FIELD_AT(spec,5,EMSH) -#define SRC_OFFSET(spec) FIELD_AT(spec,7,unsigned short) -#define SRC_PAGE(spec) FIELD_AT(spec,9,unsigned short) -#define SRC_PTR(spec) FIELD_AT(spec,7,EMSPTR) -#define DST_TYPE(spec) FIELD_AT(spec,11,char) -#define DST_HANDLE(spec) FIELD_AT(spec,12,EMSH) -#define DST_OFFSET(spec) FIELD_AT(spec,14,unsigned short) -#define DST_PAGE(spec) FIELD_AT(spec,16,unsigned short) -#define DST_PTR(spec) FIELD_AT(spec,14,EMSPTR) - -#define EMSPAGESIZE 16384L /* gospel, see the EMS specs */ - -#define HIBYTE(W) (((W) >> 8) & 0xFF) -#define LOBYTE(W) ((W) & 0xFF) - - -METHODDEF(void) -read_ems_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - EMScontext ctx; - EMSspec spec; - - spec.length = byte_count; - SRC_TYPE(spec) = 1; - SRC_HANDLE(spec) = info->handle.ems_handle; - SRC_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); - SRC_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); - DST_TYPE(spec) = 0; - DST_HANDLE(spec) = 0; - DST_PTR(spec) = buffer_address; - - ctx.ds_si = (void far *) & spec; - ctx.ax = 0x5700; /* move memory region */ - jems_calldriver((EMScontext far *) & ctx); - if (HIBYTE(ctx.ax) != 0) - ERREXIT(cinfo, JERR_EMS_READ); -} - - -METHODDEF(void) -write_ems_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - EMScontext ctx; - EMSspec spec; - - spec.length = byte_count; - SRC_TYPE(spec) = 0; - SRC_HANDLE(spec) = 0; - SRC_PTR(spec) = buffer_address; - DST_TYPE(spec) = 1; - DST_HANDLE(spec) = info->handle.ems_handle; - DST_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); - DST_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); - - ctx.ds_si = (void far *) & spec; - ctx.ax = 0x5700; /* move memory region */ - jems_calldriver((EMScontext far *) & ctx); - if (HIBYTE(ctx.ax) != 0) - ERREXIT(cinfo, JERR_EMS_WRITE); -} - - -METHODDEF(void) -close_ems_store (j_common_ptr cinfo, backing_store_ptr info) -{ - EMScontext ctx; - - ctx.ax = 0x4500; - ctx.dx = info->handle.ems_handle; - jems_calldriver((EMScontext far *) & ctx); - TRACEMS1(cinfo, 1, JTRC_EMS_CLOSE, info->handle.ems_handle); - /* we ignore any error return from the driver */ -} - - -LOCAL(boolean) -open_ems_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - EMScontext ctx; - - /* Is EMS driver there? */ - if (! jems_available()) - return FALSE; - - /* Get status, make sure EMS is OK */ - ctx.ax = 0x4000; - jems_calldriver((EMScontext far *) & ctx); - if (HIBYTE(ctx.ax) != 0) - return FALSE; - - /* Get version, must be >= 4.0 */ - ctx.ax = 0x4600; - jems_calldriver((EMScontext far *) & ctx); - if (HIBYTE(ctx.ax) != 0 || LOBYTE(ctx.ax) < 0x40) - return FALSE; - - /* Try to allocate requested space */ - ctx.ax = 0x4300; - ctx.bx = (unsigned short) ((total_bytes_needed + EMSPAGESIZE-1L) / EMSPAGESIZE); - jems_calldriver((EMScontext far *) & ctx); - if (HIBYTE(ctx.ax) != 0) - return FALSE; - - /* Succeeded, save the handle and away we go */ - info->handle.ems_handle = ctx.dx; - info->read_backing_store = read_ems_store; - info->write_backing_store = write_ems_store; - info->close_backing_store = close_ems_store; - TRACEMS1(cinfo, 1, JTRC_EMS_OPEN, ctx.dx); - return TRUE; /* succeeded */ -} - -#endif /* EMS_SUPPORTED */ - - -/* - * Initial opening of a backing-store object. - */ - -GLOBAL(void) -jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - /* Try extended memory, then expanded memory, then regular file. */ -#if XMS_SUPPORTED - if (open_xms_store(cinfo, info, total_bytes_needed)) - return; -#endif -#if EMS_SUPPORTED - if (open_ems_store(cinfo, info, total_bytes_needed)) - return; -#endif - if (open_file_store(cinfo, info, total_bytes_needed)) - return; - ERREXITS(cinfo, JERR_TFILE_CREATE, ""); -} - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. - */ - -GLOBAL(long) -jpeg_mem_init (j_common_ptr cinfo) -{ - next_file_num = 0; /* initialize temp file name generator */ - return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ -} - -GLOBAL(void) -jpeg_mem_term (j_common_ptr cinfo) -{ - /* Microsoft C, at least in v6.00A, will not successfully reclaim freed - * blocks of size > 32Kbytes unless we give it a kick in the rear, like so: - */ -#ifdef NEED_FHEAPMIN - _fheapmin(); -#endif -} diff --git a/code/jpeg-9f/jmemmac.c b/code/jpeg-9f/jmemmac.c deleted file mode 100644 index 106f9bea..00000000 --- a/code/jpeg-9f/jmemmac.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * jmemmac.c - * - * Copyright (C) 1992-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * jmemmac.c provides an Apple Macintosh implementation of the system- - * dependent portion of the JPEG memory manager. - * - * If you use jmemmac.c, then you must define USE_MAC_MEMMGR in the - * JPEG_INTERNALS part of jconfig.h. - * - * jmemmac.c uses the Macintosh toolbox routines NewPtr and DisposePtr - * instead of malloc and free. It accurately determines the amount of - * memory available by using CompactMem. Notice that if left to its - * own devices, this code can chew up all available space in the - * application's zone, with the exception of the rather small "slop" - * factor computed in jpeg_mem_available(). The application can ensure - * that more space is left over by reducing max_memory_to_use. - * - * Large images are swapped to disk using temporary files and System 7.0+'s - * temporary folder functionality. - * - * Note that jmemmac.c depends on two features of MacOS that were first - * introduced in System 7: FindFolder and the FSSpec-based calls. - * If your application uses jmemmac.c and is run under System 6 or earlier, - * and the jpeg library decides it needs a temporary file, it will abort, - * printing error messages about requiring System 7. (If no temporary files - * are created, it will run fine.) - * - * If you want to use jmemmac.c in an application that might be used with - * System 6 or earlier, then you should remove dependencies on FindFolder - * and the FSSpec calls. You will need to replace FindFolder with some - * other mechanism for finding a place to put temporary files, and you - * should replace the FSSpec calls with their HFS equivalents: - * - * FSpDelete -> HDelete - * FSpGetFInfo -> HGetFInfo - * FSpCreate -> HCreate - * FSpOpenDF -> HOpen *** Note: not HOpenDF *** - * FSMakeFSSpec -> (fill in spec by hand.) - * - * (Use HOpen instead of HOpenDF. HOpen is just a glue-interface to PBHOpen, - * which is on all HFS macs. HOpenDF is a System 7 addition which avoids the - * ages-old problem of names starting with a period.) - * - * Contributed by Sam Bushell (jsam@iagu.on.net) and - * Dan Gildor (gyld@in-touch.com). - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef USE_MAC_MEMMGR /* make sure user got configuration right */ - You forgot to define USE_MAC_MEMMGR in jconfig.h. /* deliberate syntax error */ -#endif - -#include /* we use the MacOS memory manager */ -#include /* we use the MacOS File stuff */ -#include /* we use the MacOS HFS stuff */ -#include /* for smSystemScript */ -#include /* we use Gestalt to test for specific functionality */ - -#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ -#define TEMP_FILE_NAME "JPG%03d.TMP" -#endif - -static int next_file_num; /* to distinguish among several temp files */ - - -/* - * Memory allocation and freeing are controlled by the MacOS library - * routines NewPtr() and DisposePtr(), which allocate fixed-address - * storage. Unfortunately, the IJG library isn't smart enough to cope - * with relocatable storage. - */ - -GLOBAL(void *) -jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void *) NewPtr(sizeofobject); -} - -GLOBAL(void) -jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) -{ - DisposePtr((Ptr) object); -} - - -/* - * "Large" objects are treated the same as "small" ones. - * NB: we include FAR keywords in the routine declarations simply for - * consistency with the rest of the IJG code; FAR should expand to empty - * on rational architectures like the Mac. - */ - -GLOBAL(void FAR *) -jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void FAR *) NewPtr(sizeofobject); -} - -GLOBAL(void) -jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) -{ - DisposePtr((Ptr) object); -} - - -/* - * This routine computes the total memory space available for allocation. - */ - -GLOBAL(long) -jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, - long max_bytes_needed, long already_allocated) -{ - long limit = cinfo->mem->max_memory_to_use - already_allocated; - long slop, mem; - - /* Don't ask for more than what application has told us we may use */ - if (max_bytes_needed > limit && limit > 0) - max_bytes_needed = limit; - /* Find whether there's a big enough free block in the heap. - * CompactMem tries to create a contiguous block of the requested size, - * and then returns the size of the largest free block (which could be - * much more or much less than we asked for). - * We add some slop to ensure we don't use up all available memory. - */ - slop = max_bytes_needed / 16 + 32768L; - mem = CompactMem(max_bytes_needed + slop) - slop; - if (mem < 0) - mem = 0; /* sigh, couldn't even get the slop */ - /* Don't take more than the application says we can have */ - if (mem > limit && limit > 0) - mem = limit; - return mem; -} - - -/* - * Backing store (temporary file) management. - * Backing store objects are only used when the value returned by - * jpeg_mem_available is less than the total space needed. You can dispense - * with these routines if you have plenty of virtual memory; see jmemnobs.c. - */ - - -METHODDEF(void) -read_backing_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - long bytes = byte_count; - long retVal; - - if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr ) - ERREXIT(cinfo, JERR_TFILE_SEEK); - - retVal = FSRead ( info->temp_file, &bytes, - (unsigned char *) buffer_address ); - if ( retVal != noErr || bytes != byte_count ) - ERREXIT(cinfo, JERR_TFILE_READ); -} - - -METHODDEF(void) -write_backing_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - long bytes = byte_count; - long retVal; - - if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr ) - ERREXIT(cinfo, JERR_TFILE_SEEK); - - retVal = FSWrite ( info->temp_file, &bytes, - (unsigned char *) buffer_address ); - if ( retVal != noErr || bytes != byte_count ) - ERREXIT(cinfo, JERR_TFILE_WRITE); -} - - -METHODDEF(void) -close_backing_store (j_common_ptr cinfo, backing_store_ptr info) -{ - FSClose ( info->temp_file ); - FSpDelete ( &(info->tempSpec) ); -} - - -/* - * Initial opening of a backing-store object. - * - * This version uses FindFolder to find the Temporary Items folder, - * and puts the temporary file in there. - */ - -GLOBAL(void) -jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - short tmpRef, vRefNum; - long dirID; - FInfo finderInfo; - FSSpec theSpec; - Str255 fName; - OSErr osErr; - long gestaltResponse = 0; - - /* Check that FSSpec calls are available. */ - osErr = Gestalt( gestaltFSAttr, &gestaltResponse ); - if ( ( osErr != noErr ) - || !( gestaltResponse & (1<temp_name, TEMP_FILE_NAME, next_file_num); - strcpy ( (Ptr)fName+1, info->temp_name ); - *fName = strlen (info->temp_name); - osErr = FSMakeFSSpec ( vRefNum, dirID, fName, &theSpec ); - - if ( (osErr = FSpGetFInfo ( &theSpec, &finderInfo ) ) != noErr ) - break; - } - - osErr = FSpCreate ( &theSpec, '????', '????', smSystemScript ); - if ( osErr != noErr ) - ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); - - osErr = FSpOpenDF ( &theSpec, fsRdWrPerm, &(info->temp_file) ); - if ( osErr != noErr ) - ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); - - info->tempSpec = theSpec; - - info->read_backing_store = read_backing_store; - info->write_backing_store = write_backing_store; - info->close_backing_store = close_backing_store; - TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); -} - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. - */ - -GLOBAL(long) -jpeg_mem_init (j_common_ptr cinfo) -{ - next_file_num = 0; - - /* max_memory_to_use will be initialized to FreeMem()'s result; - * the calling application might later reduce it, for example - * to leave room to invoke multiple JPEG objects. - * Note that FreeMem returns the total number of free bytes; - * it may not be possible to allocate a single block of this size. - */ - return FreeMem(); -} - -GLOBAL(void) -jpeg_mem_term (j_common_ptr cinfo) -{ - /* no work */ -} diff --git a/code/jpeg-9f/jmemname.c b/code/jpeg-9f/jmemname.c deleted file mode 100644 index ed96dee1..00000000 --- a/code/jpeg-9f/jmemname.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * jmemname.c - * - * Copyright (C) 1992-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides a generic implementation of the system-dependent - * portion of the JPEG memory manager. This implementation assumes that - * you must explicitly construct a name for each temp file. - * Also, the problem of determining the amount of memory available - * is shoved onto the user. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ -extern void * malloc JPP((size_t size)); -extern void free JPP((void *ptr)); -#endif - -#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ -#define SEEK_SET 0 /* if not, assume 0 is correct */ -#endif - -#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ -#define READ_BINARY "r" -#define RW_BINARY "w+" -#else -#ifdef VMS /* VMS is very nonstandard */ -#define READ_BINARY "rb", "ctx=stm" -#define RW_BINARY "w+b", "ctx=stm" -#else /* standard ANSI-compliant case */ -#define READ_BINARY "rb" -#define RW_BINARY "w+b" -#endif -#endif - - -/* - * Selection of a file name for a temporary file. - * This is system-dependent! - * - * The code as given is suitable for most Unix systems, and it is easily - * modified for most non-Unix systems. Some notes: - * 1. The temp file is created in the directory named by TEMP_DIRECTORY. - * The default value is /usr/tmp, which is the conventional place for - * creating large temp files on Unix. On other systems you'll probably - * want to change the file location. You can do this by editing the - * #define, or (preferred) by defining TEMP_DIRECTORY in jconfig.h. - * - * 2. If you need to change the file name as well as its location, - * you can override the TEMP_FILE_NAME macro. (Note that this is - * actually a printf format string; it must contain %s and %d.) - * Few people should need to do this. - * - * 3. mktemp() is used to ensure that multiple processes running - * simultaneously won't select the same file names. If your system - * doesn't have mktemp(), define NO_MKTEMP to do it the hard way. - * (If you don't have , also define NO_ERRNO_H.) - * - * 4. You probably want to define NEED_SIGNAL_CATCHER so that cjpeg.c/djpeg.c - * will cause the temp files to be removed if you stop the program early. - */ - -#ifndef TEMP_DIRECTORY /* can override from jconfig.h or Makefile */ -#define TEMP_DIRECTORY "/usr/tmp/" /* recommended setting for Unix */ -#endif - -static int next_file_num; /* to distinguish among several temp files */ - -#ifdef NO_MKTEMP - -#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ -#define TEMP_FILE_NAME "%sJPG%03d.TMP" -#endif - -#ifndef NO_ERRNO_H -#include /* to define ENOENT */ -#endif - -/* ANSI C specifies that errno is a macro, but on older systems it's more - * likely to be a plain int variable. And not all versions of errno.h - * bother to declare it, so we have to in order to be most portable. Thus: - */ -#ifndef errno -extern int errno; -#endif - - -LOCAL(void) -select_file_name (char * fname) -{ - FILE * tfile; - - /* Keep generating file names till we find one that's not in use */ - for (;;) { - next_file_num++; /* advance counter */ - sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num); - if ((tfile = fopen(fname, READ_BINARY)) == NULL) { - /* fopen could have failed for a reason other than the file not - * being there; for example, file there but unreadable. - * If isn't available, then we cannot test the cause. - */ -#ifdef ENOENT - if (errno != ENOENT) - continue; -#endif - break; - } - fclose(tfile); /* oops, it's there; close tfile & try again */ - } -} - -#else /* ! NO_MKTEMP */ - -/* Note that mktemp() requires the initial filename to end in six X's */ -#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ -#define TEMP_FILE_NAME "%sJPG%dXXXXXX" -#endif - -LOCAL(void) -select_file_name (char * fname) -{ - next_file_num++; /* advance counter */ - sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num); - mktemp(fname); /* make sure file name is unique */ - /* mktemp replaces the trailing XXXXXX with a unique string of characters */ -} - -#endif /* NO_MKTEMP */ - - -/* - * Memory allocation and freeing are controlled by the regular library - * routines malloc() and free(). - */ - -GLOBAL(void *) -jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * "Large" objects are treated the same as "small" ones. - * NB: although we include FAR keywords in the routine declarations, - * this file won't actually work in 80x86 small/medium model; at least, - * you probably won't be able to process useful-size images in only 64KB. - */ - -GLOBAL(void FAR *) -jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void FAR *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * This routine computes the total memory space available for allocation. - * It's impossible to do this in a portable way; our current solution is - * to make the user tell us (with a default value set at compile time). - * If you can actually get the available space, it's a good idea to subtract - * a slop factor of 5% or so. - */ - -#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ -#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ -#endif - -GLOBAL(long) -jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, - long max_bytes_needed, long already_allocated) -{ - return cinfo->mem->max_memory_to_use - already_allocated; -} - - -/* - * Backing store (temporary file) management. - * Backing store objects are only used when the value returned by - * jpeg_mem_available is less than the total space needed. You can dispense - * with these routines if you have plenty of virtual memory; see jmemnobs.c. - */ - - -METHODDEF(void) -read_backing_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - if (fseek(info->temp_file, file_offset, SEEK_SET)) - ERREXIT(cinfo, JERR_TFILE_SEEK); - if (JFREAD(info->temp_file, buffer_address, byte_count) - != (size_t) byte_count) - ERREXIT(cinfo, JERR_TFILE_READ); -} - - -METHODDEF(void) -write_backing_store (j_common_ptr cinfo, backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count) -{ - if (fseek(info->temp_file, file_offset, SEEK_SET)) - ERREXIT(cinfo, JERR_TFILE_SEEK); - if (JFWRITE(info->temp_file, buffer_address, byte_count) - != (size_t) byte_count) - ERREXIT(cinfo, JERR_TFILE_WRITE); -} - - -METHODDEF(void) -close_backing_store (j_common_ptr cinfo, backing_store_ptr info) -{ - fclose(info->temp_file); /* close the file */ - unlink(info->temp_name); /* delete the file */ -/* If your system doesn't have unlink(), use remove() instead. - * remove() is the ANSI-standard name for this function, but if - * your system was ANSI you'd be using jmemansi.c, right? - */ - TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); -} - - -/* - * Initial opening of a backing-store object. - */ - -GLOBAL(void) -jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - select_file_name(info->temp_name); - if ((info->temp_file = fopen(info->temp_name, RW_BINARY)) == NULL) - ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); - info->read_backing_store = read_backing_store; - info->write_backing_store = write_backing_store; - info->close_backing_store = close_backing_store; - TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); -} - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. - */ - -GLOBAL(long) -jpeg_mem_init (j_common_ptr cinfo) -{ - next_file_num = 0; /* initialize temp file name generator */ - return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ -} - -GLOBAL(void) -jpeg_mem_term (j_common_ptr cinfo) -{ - /* no work */ -} diff --git a/code/jpeg-9f/jpegtran.c b/code/jpeg-9f/jpegtran.c deleted file mode 100644 index bfaa8aca..00000000 --- a/code/jpeg-9f/jpegtran.c +++ /dev/null @@ -1,654 +0,0 @@ -/* - * jpegtran.c - * - * Copyright (C) 1995-2019, Thomas G. Lane, Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a command-line user interface for JPEG transcoding. - * It is very similar to cjpeg.c, and partly to djpeg.c, but provides - * lossless transcoding between different JPEG file formats. It also - * provides some lossless and sort-of-lossless transformations of JPEG data. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include "transupp.h" /* Support routines for jpegtran */ -#include "jversion.h" /* for version message */ - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - - -/* - * Argument-parsing code. - * The switch parser is designed to be useful with DOS-style command line - * syntax, ie, intermixed switches and file names, where only the switches - * to the left of a given file name affect processing of that file. - * The main program in this file doesn't actually use this capability... - */ - - -static const char * progname; /* program name for error messages */ -static char * outfilename; /* for -outfile switch */ -static char * dropfilename; /* for -drop switch */ -static char * scaleoption; /* -scale switch */ -static JCOPY_OPTION copyoption; /* -copy switch */ -static jpeg_transform_info transformoption; /* image transformation options */ - - -LOCAL(void) -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "usage: %s [switches] ", progname); -#ifdef TWO_FILE_COMMANDLINE - fprintf(stderr, "inputfile outputfile\n"); -#else - fprintf(stderr, "[inputfile]\n"); -#endif - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -copy none Copy no extra markers from source file\n"); - fprintf(stderr, " -copy comments Copy only comment markers (default)\n"); - fprintf(stderr, " -copy all Copy all extra markers\n"); -#ifdef ENTROPY_OPT_SUPPORTED - fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); -#endif -#ifdef C_PROGRESSIVE_SUPPORTED - fprintf(stderr, " -progressive Create progressive JPEG file\n"); -#endif - fprintf(stderr, "Switches for modifying the image:\n"); -#if TRANSFORMS_SUPPORTED - fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n"); - fprintf(stderr, " -drop +X+Y filename Drop another image\n"); - fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n"); - fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n"); - fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n"); - fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n"); -#endif - fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); -#if TRANSFORMS_SUPPORTED - fprintf(stderr, " -transpose Transpose image\n"); - fprintf(stderr, " -transverse Transverse transpose image\n"); - fprintf(stderr, " -trim Drop non-transformable edge blocks\n"); - fprintf(stderr, " with -drop: Requantize drop file to source file\n"); - fprintf(stderr, " -wipe WxH+X+Y Wipe (gray out) a rectangular subarea\n"); -#endif - fprintf(stderr, "Switches for advanced users:\n"); -#ifdef C_ARITH_CODING_SUPPORTED - fprintf(stderr, " -arithmetic Use arithmetic coding\n"); -#endif - fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); - fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); - fprintf(stderr, " -outfile name Specify name for output file\n"); - fprintf(stderr, " -verbose or -debug Emit debug output\n"); - fprintf(stderr, "Switches for wizards:\n"); -#ifdef C_MULTISCAN_FILES_SUPPORTED - fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); -#endif - exit(EXIT_FAILURE); -} - - -LOCAL(void) -select_transform (JXFORM_CODE transform) -/* Silly little routine to detect multiple transform options, - * which we can't handle. - */ -{ -#if TRANSFORMS_SUPPORTED - if (transformoption.transform == JXFORM_NONE || - transformoption.transform == transform) { - transformoption.transform = transform; - } else { - fprintf(stderr, "%s: can only do one image transformation at a time\n", - progname); - usage(); - } -#else - fprintf(stderr, "%s: sorry, image transformation was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif -} - - -LOCAL(int) -parse_switches (j_compress_ptr cinfo, int argc, char **argv, - int last_file_arg_seen, boolean for_real) -/* Parse optional switches. - * Returns argv[] index of first file-name argument (== argc if none). - * Any file names with indexes <= last_file_arg_seen are ignored; - * they have presumably been processed in a previous iteration. - * (Pass 0 for last_file_arg_seen on the first or only iteration.) - * for_real is FALSE on the first (dummy) pass; we may skip any expensive - * processing. - */ -{ - int argn; - char * arg; - boolean simple_progressive; - char * scansarg = NULL; /* saves -scans parm if any */ - - /* Set up default JPEG parameters. */ - simple_progressive = FALSE; - outfilename = NULL; - scaleoption = NULL; - copyoption = JCOPYOPT_DEFAULT; - transformoption.transform = JXFORM_NONE; - transformoption.perfect = FALSE; - transformoption.trim = FALSE; - transformoption.force_grayscale = FALSE; - transformoption.crop = FALSE; - cinfo->err->trace_level = 0; - - /* Scan command line options, adjust parameters */ - - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (*arg != '-') { - /* Not a switch, must be a file name argument */ - if (argn <= last_file_arg_seen) { - outfilename = NULL; /* -outfile applies to just one input file */ - continue; /* ignore this name if previously processed */ - } - break; /* else done parsing switches */ - } - arg++; /* advance past switch marker character */ - - if (keymatch(arg, "arithmetic", 1)) { - /* Use arithmetic coding. */ -#ifdef C_ARITH_CODING_SUPPORTED - cinfo->arith_code = TRUE; -#else - fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "copy", 2)) { - /* Select which extra markers to copy. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "none", 1)) { - copyoption = JCOPYOPT_NONE; - } else if (keymatch(argv[argn], "comments", 1)) { - copyoption = JCOPYOPT_COMMENTS; - } else if (keymatch(argv[argn], "all", 1)) { - copyoption = JCOPYOPT_ALL; - } else - usage(); - - } else if (keymatch(arg, "crop", 2)) { - /* Perform lossless cropping. */ -#if TRANSFORMS_SUPPORTED - if (++argn >= argc) /* advance to next argument */ - usage(); - if (transformoption.crop /* reject multiple crop/drop/wipe requests */ || - ! jtransform_parse_crop_spec(&transformoption, argv[argn])) { - fprintf(stderr, "%s: bogus -crop argument '%s'\n", - progname, argv[argn]); - exit(EXIT_FAILURE); - } -#else - select_transform(JXFORM_NONE); /* force an error */ -#endif - - } else if (keymatch(arg, "drop", 2)) { -#if TRANSFORMS_SUPPORTED - if (++argn >= argc) /* advance to next argument */ - usage(); - if (transformoption.crop /* reject multiple crop/drop/wipe requests */ || - ! jtransform_parse_crop_spec(&transformoption, argv[argn]) || - transformoption.crop_width_set != JCROP_UNSET || - transformoption.crop_height_set != JCROP_UNSET) { - fprintf(stderr, "%s: bogus -drop argument '%s'\n", - progname, argv[argn]); - exit(EXIT_FAILURE); - } - if (++argn >= argc) /* advance to next argument */ - usage(); - dropfilename = argv[argn]; - select_transform(JXFORM_DROP); -#else - select_transform(JXFORM_NONE); /* force an error */ -#endif - - } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { - /* Enable debug printouts. */ - /* On first -d, print version identification */ - static boolean printed_version = FALSE; - - if (! printed_version) { - fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n", - JVERSION, JCOPYRIGHT); - printed_version = TRUE; - } - cinfo->err->trace_level++; - - } else if (keymatch(arg, "flip", 1)) { - /* Mirror left-right or top-bottom. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "horizontal", 1)) - select_transform(JXFORM_FLIP_H); - else if (keymatch(argv[argn], "vertical", 1)) - select_transform(JXFORM_FLIP_V); - else - usage(); - - } else if (keymatch(arg, "grayscale", 1) || keymatch(arg, "greyscale",1)) { - /* Force to grayscale. */ -#if TRANSFORMS_SUPPORTED - transformoption.force_grayscale = TRUE; -#else - select_transform(JXFORM_NONE); /* force an error */ -#endif - - } else if (keymatch(arg, "maxmemory", 3)) { - /* Maximum memory in Kb (or Mb with 'm'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (ch == 'm' || ch == 'M') - lval *= 1000L; - cinfo->mem->max_memory_to_use = lval * 1000L; - - } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { - /* Enable entropy parm optimization. */ -#ifdef ENTROPY_OPT_SUPPORTED - cinfo->optimize_coding = TRUE; -#else - fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "outfile", 4)) { - /* Set output file name. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - outfilename = argv[argn]; /* save it away for later use */ - - } else if (keymatch(arg, "perfect", 2)) { - /* Fail if there is any partial edge MCUs that the transform can't - * handle. */ - transformoption.perfect = TRUE; - - } else if (keymatch(arg, "progressive", 2)) { - /* Select simple progressive mode. */ -#ifdef C_PROGRESSIVE_SUPPORTED - simple_progressive = TRUE; - /* We must postpone execution until num_components is known. */ -#else - fprintf(stderr, "%s: sorry, progressive output was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "restart", 1)) { - /* Restart interval in MCU rows (or in MCUs with 'b'). */ - long lval; - char ch = 'x'; - - if (++argn >= argc) /* advance to next argument */ - usage(); - if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) - usage(); - if (lval < 0 || lval > 65535L) - usage(); - if (ch == 'b' || ch == 'B') { - cinfo->restart_interval = (unsigned int) lval; - cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ - } else { - cinfo->restart_in_rows = (int) lval; - /* restart_interval will be computed during startup */ - } - - } else if (keymatch(arg, "rotate", 2)) { - /* Rotate 90, 180, or 270 degrees (measured clockwise). */ - if (++argn >= argc) /* advance to next argument */ - usage(); - if (keymatch(argv[argn], "90", 2)) - select_transform(JXFORM_ROT_90); - else if (keymatch(argv[argn], "180", 3)) - select_transform(JXFORM_ROT_180); - else if (keymatch(argv[argn], "270", 3)) - select_transform(JXFORM_ROT_270); - else - usage(); - - } else if (keymatch(arg, "scale", 4)) { - /* Scale the output image by a fraction M/N. */ - if (++argn >= argc) /* advance to next argument */ - usage(); - scaleoption = argv[argn]; - /* We must postpone processing until decompression startup. */ - - } else if (keymatch(arg, "scans", 1)) { - /* Set scan script. */ -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (++argn >= argc) /* advance to next argument */ - usage(); - scansarg = argv[argn]; - /* We must postpone reading the file in case -progressive appears. */ -#else - fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", - progname); - exit(EXIT_FAILURE); -#endif - - } else if (keymatch(arg, "transpose", 1)) { - /* Transpose (across UL-to-LR axis). */ - select_transform(JXFORM_TRANSPOSE); - - } else if (keymatch(arg, "transverse", 6)) { - /* Transverse transpose (across UR-to-LL axis). */ - select_transform(JXFORM_TRANSVERSE); - - } else if (keymatch(arg, "trim", 3)) { - /* Trim off any partial edge MCUs that the transform can't handle. */ - transformoption.trim = TRUE; - - } else if (keymatch(arg, "wipe", 1)) { -#if TRANSFORMS_SUPPORTED - if (++argn >= argc) /* advance to next argument */ - usage(); - if (transformoption.crop /* reject multiple crop/drop/wipe requests */ || - ! jtransform_parse_crop_spec(&transformoption, argv[argn])) { - fprintf(stderr, "%s: bogus -wipe argument '%s'\n", - progname, argv[argn]); - exit(EXIT_FAILURE); - } - select_transform(JXFORM_WIPE); -#else - select_transform(JXFORM_NONE); /* force an error */ -#endif - - } else { - usage(); /* bogus switch */ - } - } - - /* Post-switch-scanning cleanup */ - - if (for_real) { - -#ifdef C_PROGRESSIVE_SUPPORTED - if (simple_progressive) /* process -progressive; -scans can override */ - jpeg_simple_progression(cinfo); -#endif - -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (scansarg != NULL) /* process -scans if it was present */ - if (! read_scan_script(cinfo, scansarg)) - usage(); -#endif - } - - return argn; /* return index of next arg (file name) */ -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - struct jpeg_decompress_struct srcinfo; - struct jpeg_error_mgr jsrcerr; -#if TRANSFORMS_SUPPORTED - struct jpeg_decompress_struct dropinfo; - struct jpeg_error_mgr jdroperr; - FILE * drop_file; -#endif - struct jpeg_compress_struct dstinfo; - struct jpeg_error_mgr jdsterr; -#ifdef PROGRESS_REPORT - struct cdjpeg_progress_mgr progress; -#endif - jvirt_barray_ptr * src_coef_arrays; - jvirt_barray_ptr * dst_coef_arrays; - int file_index; - /* We assume all-in-memory processing and can therefore use only a - * single file pointer for sequential input and output operation. - */ - FILE * fp; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "jpegtran"; /* in case C library doesn't provide it */ - - /* Initialize the JPEG decompression object with default error handling. */ - srcinfo.err = jpeg_std_error(&jsrcerr); - jpeg_create_decompress(&srcinfo); - /* Initialize the JPEG compression object with default error handling. */ - dstinfo.err = jpeg_std_error(&jdsterr); - jpeg_create_compress(&dstinfo); - - /* Now safe to enable signal catcher. - * Note: we assume only the decompression object will have virtual arrays. - */ -#ifdef NEED_SIGNAL_CATCHER - enable_signal_catcher((j_common_ptr) &srcinfo); -#endif - - /* Scan command line to find file names. - * It is convenient to use just one switch-parsing routine, but the switch - * values read here are mostly ignored; we will rescan the switches after - * opening the input file. Also note that most of the switches affect the - * destination JPEG object, so we parse into that and then copy over what - * needs to affect the source too. - */ - - file_index = parse_switches(&dstinfo, argc, argv, 0, FALSE); - jsrcerr.trace_level = jdsterr.trace_level; - srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use; - -#ifdef TWO_FILE_COMMANDLINE - /* Must have either -outfile switch or explicit output file name */ - if (outfilename == NULL) { - if (file_index != argc-2) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - outfilename = argv[file_index+1]; - } else { - if (file_index != argc-1) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - } -#else - /* Unix style: expect zero or one file name */ - if (file_index < argc-1) { - fprintf(stderr, "%s: only one input file\n", progname); - usage(); - } -#endif /* TWO_FILE_COMMANDLINE */ - - /* Open the input file. */ - if (file_index < argc) { - if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s for reading\n", progname, argv[file_index]); - exit(EXIT_FAILURE); - } - } else { - /* default input file is stdin */ - fp = read_stdin(); - } - -#if TRANSFORMS_SUPPORTED - /* Open the drop file. */ - if (dropfilename != NULL) { - if ((drop_file = fopen(dropfilename, READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s for reading\n", progname, dropfilename); - exit(EXIT_FAILURE); - } - dropinfo.err = jpeg_std_error(&jdroperr); - jpeg_create_decompress(&dropinfo); - jpeg_stdio_src(&dropinfo, drop_file); - } else { - drop_file = NULL; - } -#endif - -#ifdef PROGRESS_REPORT - start_progress_monitor((j_common_ptr) &dstinfo, &progress); -#endif - - /* Specify data source for decompression */ - jpeg_stdio_src(&srcinfo, fp); - - /* Enable saving of extra markers that we want to copy */ - jcopy_markers_setup(&srcinfo, copyoption); - - /* Read file header */ - (void) jpeg_read_header(&srcinfo, TRUE); - - /* Adjust default decompression parameters */ - if (scaleoption != NULL) - if (sscanf(scaleoption, "%u/%u", - &srcinfo.scale_num, &srcinfo.scale_denom) < 1) - usage(); - -#if TRANSFORMS_SUPPORTED - if (dropfilename != NULL) { - (void) jpeg_read_header(&dropinfo, TRUE); - transformoption.crop_width = dropinfo.image_width; - transformoption.crop_width_set = JCROP_POS; - transformoption.crop_height = dropinfo.image_height; - transformoption.crop_height_set = JCROP_POS; - transformoption.drop_ptr = &dropinfo; - } -#endif - - /* Any space needed by a transform option must be requested before - * jpeg_read_coefficients so that memory allocation will be done right. - */ -#if TRANSFORMS_SUPPORTED - /* Fail right away if -perfect is given and transformation is not perfect. - */ - if (!jtransform_request_workspace(&srcinfo, &transformoption)) { - fprintf(stderr, "%s: transformation is not perfect\n", progname); - exit(EXIT_FAILURE); - } -#endif - - /* Read source file as DCT coefficients */ - src_coef_arrays = jpeg_read_coefficients(&srcinfo); - -#if TRANSFORMS_SUPPORTED - if (dropfilename != NULL) { - transformoption.drop_coef_arrays = jpeg_read_coefficients(&dropinfo); - } -#endif - - /* Initialize destination compression parameters from source values */ - jpeg_copy_critical_parameters(&srcinfo, &dstinfo); - - /* Adjust destination parameters if required by transform options; - * also find out which set of coefficient arrays will hold the output. - */ -#if TRANSFORMS_SUPPORTED - dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo, - src_coef_arrays, - &transformoption); -#else - dst_coef_arrays = src_coef_arrays; -#endif - - /* Close input file, if we opened it. - * Note: we assume that jpeg_read_coefficients consumed all input - * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will - * only consume more while (! cinfo->inputctl->eoi_reached). - * We cannot call jpeg_finish_decompress here since we still need the - * virtual arrays allocated from the source object for processing. - */ - if (fp != stdin) - fclose(fp); - - /* Open the output file. */ - if (outfilename != NULL) { - if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s for writing\n", progname, outfilename); - exit(EXIT_FAILURE); - } - } else { - /* default output file is stdout */ - fp = write_stdout(); - } - - /* Adjust default compression parameters by re-parsing the options */ - file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE); - - /* Specify data destination for compression */ - jpeg_stdio_dest(&dstinfo, fp); - - /* Start compressor (note no image data is actually written here) */ - jpeg_write_coefficients(&dstinfo, dst_coef_arrays); - - /* Copy to the output file any extra markers that we want to preserve */ - jcopy_markers_execute(&srcinfo, &dstinfo, copyoption); - - /* Execute image transformation, if any */ -#if TRANSFORMS_SUPPORTED - jtransform_execute_transformation(&srcinfo, &dstinfo, - src_coef_arrays, - &transformoption); -#endif - - /* Finish compression and release memory */ - jpeg_finish_compress(&dstinfo); - jpeg_destroy_compress(&dstinfo); -#if TRANSFORMS_SUPPORTED - if (dropfilename != NULL) { - (void) jpeg_finish_decompress(&dropinfo); - jpeg_destroy_decompress(&dropinfo); - } -#endif - (void) jpeg_finish_decompress(&srcinfo); - jpeg_destroy_decompress(&srcinfo); - - /* Close output file, if we opened it */ - if (fp != stdout) - fclose(fp); -#if TRANSFORMS_SUPPORTED - if (drop_file != NULL) - fclose(drop_file); -#endif - -#ifdef PROGRESS_REPORT - end_progress_monitor((j_common_ptr) &dstinfo); -#endif - - /* All done. */ -#if TRANSFORMS_SUPPORTED - if (dropfilename != NULL) - exit(jsrcerr.num_warnings + jdroperr.num_warnings + - jdsterr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); -#endif - exit(jsrcerr.num_warnings + jdsterr.num_warnings ? - EXIT_WARNING : EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/rdbmp.c b/code/jpeg-9f/rdbmp.c deleted file mode 100644 index 6749ea01..00000000 --- a/code/jpeg-9f/rdbmp.c +++ /dev/null @@ -1,469 +0,0 @@ -/* - * rdbmp.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2009-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to read input images in Microsoft "BMP" - * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors). - * Currently, only 8-, 24-, and 32-bit images are supported, not 1-bit or - * 4-bit (feeding such low-depth images into JPEG would be silly anyway). - * Also, we don't support RLE-compressed files. - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume input from - * an ordinary stdio stream. They further assume that reading begins - * at the start of the file; start_input may need work if the - * user interface has already read some data (e.g., to determine that - * the file is indeed BMP format). - * - * This code contributed by James Arthur Boucher. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef BMP_SUPPORTED - - -/* Macros to deal with unsigned chars as efficiently as compiler allows */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char U_CHAR; -#define UCH(x) ((int) (x)) -#else /* !HAVE_UNSIGNED_CHAR */ -typedef char U_CHAR; -#ifdef CHAR_IS_UNSIGNED -#define UCH(x) ((int) (x)) -#else -#define UCH(x) ((int) (x) & 0xFF) -#endif -#endif /* HAVE_UNSIGNED_CHAR */ - - -#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) - - -/* Private version of data source object */ - -typedef struct _bmp_source_struct * bmp_source_ptr; - -typedef struct _bmp_source_struct { - struct cjpeg_source_struct pub; /* public fields */ - - j_compress_ptr cinfo; /* back link saves passing separate parm */ - - JSAMPARRAY colormap; /* BMP colormap (converted to my format) */ - - jvirt_sarray_ptr whole_image; /* Needed to reverse row order */ - JDIMENSION source_row; /* Current source row number */ - JDIMENSION row_width; /* Physical width of scanlines in file */ - - int bits_per_pixel; /* remembers 8-, 24-, or 32-bit format */ - int cmap_length; /* colormap length */ -} bmp_source_struct; - - -LOCAL(int) -read_byte (bmp_source_ptr sinfo) -/* Read next byte from BMP file */ -{ - register FILE *infile = sinfo->pub.input_file; - register int c; - - if ((c = getc(infile)) == EOF) - ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); - return c; -} - - -LOCAL(void) -read_colormap (bmp_source_ptr sinfo, int cmaplen, int mapentrysize) -/* Read the colormap from a BMP file */ -{ - int i; - - switch (mapentrysize) { - case 3: - /* BGR format (occurs in OS/2 files) */ - for (i = 0; i < cmaplen; i++) { - sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); - sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); - sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); - } - break; - case 4: - /* BGR0 format (occurs in MS Windows files) */ - for (i = 0; i < cmaplen; i++) { - sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); - sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); - sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); - (void) read_byte(sinfo); - } - break; - default: - ERREXIT(sinfo->cinfo, JERR_BMP_BADCMAP); - } -} - - -/* - * Read one row of pixels. - * The image has been read into the whole_image array, but is otherwise - * unprocessed. We must read it out in top-to-bottom row order, and if - * it is an 8-bit image, we must expand colormapped pixels to 24bit format. - */ - -METHODDEF(JDIMENSION) -get_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 8-bit colormap indexes */ -{ - bmp_source_ptr source = (bmp_source_ptr) sinfo; - register JSAMPROW inptr, outptr; - register JSAMPARRAY colormap; - register JDIMENSION col; - register int t; - int cmaplen; - - /* Fetch next row from virtual array */ - source->source_row--; - inptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->whole_image, source->source_row, (JDIMENSION) 1, FALSE); - - /* Expand the colormap indexes to real data */ - outptr = source->pub.buffer[0]; - colormap = source->colormap; - cmaplen = source->cmap_length; - for (col = cinfo->image_width; col > 0; col--) { - t = GETJSAMPLE(*inptr++); - if (t >= cmaplen) - ERREXIT(cinfo, JERR_BMP_OUTOFRANGE); - *outptr++ = colormap[0][t]; /* can omit GETJSAMPLE() safely */ - *outptr++ = colormap[1][t]; - *outptr++ = colormap[2][t]; - } - - return 1; -} - -METHODDEF(JDIMENSION) -get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 24-bit pixels */ -{ - bmp_source_ptr source = (bmp_source_ptr) sinfo; - register JSAMPROW inptr, outptr; - register JDIMENSION col; - - /* Fetch next row from virtual array */ - source->source_row--; - inptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->whole_image, source->source_row, (JDIMENSION) 1, FALSE); - - /* Transfer data. Note source values are in BGR order - * (even though Microsoft's own documents say the opposite). - */ - outptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ - outptr[1] = *inptr++; - outptr[0] = *inptr++; - outptr += 3; - } - - return 1; -} - -METHODDEF(JDIMENSION) -get_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 32-bit pixels */ -{ - bmp_source_ptr source = (bmp_source_ptr) sinfo; - register JSAMPROW inptr, outptr; - register JDIMENSION col; - - /* Fetch next row from virtual array */ - source->source_row--; - inptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->whole_image, source->source_row, (JDIMENSION) 1, FALSE); - - /* Transfer data. Note source values are in BGR order - * (even though Microsoft's own documents say the opposite). - */ - outptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ - outptr[1] = *inptr++; - outptr[0] = *inptr++; - inptr++; /* skip the 4th byte (Alpha channel) */ - outptr += 3; - } - - return 1; -} - - -/* - * This method loads the image into whole_image during the first call on - * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call - * get_8bit_row, get_24bit_row, or get_32bit_row on subsequent calls. - */ - -METHODDEF(JDIMENSION) -preload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - bmp_source_ptr source = (bmp_source_ptr) sinfo; - register FILE *infile = source->pub.input_file; - register int c; - register JSAMPROW out_ptr; - JDIMENSION row, col; - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - - /* Read the data into a virtual array in input-file row order. */ - for (row = 0; row < cinfo->image_height; row++) { - if (progress != NULL) { - progress->pub.pass_counter = (long) row; - progress->pub.pass_limit = (long) cinfo->image_height; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } - out_ptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->whole_image, row, (JDIMENSION) 1, TRUE); - for (col = source->row_width; col > 0; col--) { - /* inline copy of read_byte() for speed */ - if ((c = getc(infile)) == EOF) - ERREXIT(cinfo, JERR_INPUT_EOF); - *out_ptr++ = (JSAMPLE) c; - } - } - if (progress != NULL) - progress->completed_extra_passes++; - - /* Set up to read from the virtual array in top-to-bottom order */ - switch (source->bits_per_pixel) { - case 8: - source->pub.get_pixel_rows = get_8bit_row; - break; - case 24: - source->pub.get_pixel_rows = get_24bit_row; - break; - case 32: - source->pub.get_pixel_rows = get_32bit_row; - break; - default: - ERREXIT(cinfo, JERR_BMP_BADDEPTH); - } - source->source_row = cinfo->image_height; - - /* And read the first row */ - return (*source->pub.get_pixel_rows) (cinfo, sinfo); -} - - -/* - * Read the file header; return image size and component count. - */ - -METHODDEF(void) -start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - bmp_source_ptr source = (bmp_source_ptr) sinfo; - U_CHAR bmpfileheader[14]; - U_CHAR bmpinfoheader[64]; -#define GET_2B(array, offset) ((unsigned int) UCH(array[offset]) + \ - (((unsigned int) UCH(array[offset+1])) << 8)) -#define GET_4B(array, offset) ((INT32) UCH(array[offset]) + \ - (((INT32) UCH(array[offset+1])) << 8) + \ - (((INT32) UCH(array[offset+2])) << 16) + \ - (((INT32) UCH(array[offset+3])) << 24)) - INT32 bfOffBits; - INT32 headerSize; - INT32 biWidth; - INT32 biHeight; - unsigned int biPlanes; - INT32 biCompression; - INT32 biXPelsPerMeter,biYPelsPerMeter; - INT32 biClrUsed = 0; - int mapentrysize = 0; /* 0 indicates no colormap */ - INT32 bPad; - JDIMENSION row_width; - - /* Read and verify the bitmap file header */ - if (! ReadOK(source->pub.input_file, bmpfileheader, 14)) - ERREXIT(cinfo, JERR_INPUT_EOF); - if (GET_2B(bmpfileheader, 0) != 0x4D42) /* 'BM' */ - ERREXIT(cinfo, JERR_BMP_NOT); - bfOffBits = GET_4B(bmpfileheader, 10); - /* We ignore the remaining fileheader fields */ - - /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows), - * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which. - */ - if (! ReadOK(source->pub.input_file, bmpinfoheader, 4)) - ERREXIT(cinfo, JERR_INPUT_EOF); - headerSize = GET_4B(bmpinfoheader, 0); - if (headerSize < 12 || headerSize > 64) - ERREXIT(cinfo, JERR_BMP_BADHEADER); - if (! ReadOK(source->pub.input_file, bmpinfoheader + 4, headerSize - 4)) - ERREXIT(cinfo, JERR_INPUT_EOF); - - switch ((int) headerSize) { - case 12: - /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ - biWidth = (INT32) GET_2B(bmpinfoheader, 4); - biHeight = (INT32) GET_2B(bmpinfoheader, 6); - biPlanes = GET_2B(bmpinfoheader, 8); - source->bits_per_pixel = (int) GET_2B(bmpinfoheader, 10); - - switch (source->bits_per_pixel) { - case 8: /* colormapped image */ - mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */ - TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight); - break; - case 24: /* RGB image */ - case 32: /* RGB image + Alpha channel */ - TRACEMS3(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight, - source->bits_per_pixel); - break; - default: - ERREXIT(cinfo, JERR_BMP_BADDEPTH); - } - break; - case 40: - case 64: - /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ - /* or OS/2 2.x header, which has additional fields that we ignore */ - biWidth = GET_4B(bmpinfoheader, 4); - biHeight = GET_4B(bmpinfoheader, 8); - biPlanes = GET_2B(bmpinfoheader, 12); - source->bits_per_pixel = (int) GET_2B(bmpinfoheader, 14); - biCompression = GET_4B(bmpinfoheader, 16); - biXPelsPerMeter = GET_4B(bmpinfoheader, 24); - biYPelsPerMeter = GET_4B(bmpinfoheader, 28); - biClrUsed = GET_4B(bmpinfoheader, 32); - /* biSizeImage, biClrImportant fields are ignored */ - - switch (source->bits_per_pixel) { - case 8: /* colormapped image */ - mapentrysize = 4; /* Windows uses RGBQUAD colormap */ - TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight); - break; - case 24: /* RGB image */ - case 32: /* RGB image + Alpha channel */ - TRACEMS3(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight, - source->bits_per_pixel); - break; - default: - ERREXIT(cinfo, JERR_BMP_BADDEPTH); - } - if (biCompression != 0) - ERREXIT(cinfo, JERR_BMP_COMPRESSED); - - if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { - /* Set JFIF density parameters from the BMP data */ - cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ - cinfo->Y_density = (UINT16) (biYPelsPerMeter/100); - cinfo->density_unit = 2; /* dots/cm */ - } - break; - default: - ERREXIT(cinfo, JERR_BMP_BADHEADER); - return; /* avoid compiler warnings for uninitialized variables */ - } - - if (biPlanes != 1) - ERREXIT(cinfo, JERR_BMP_BADPLANES); - /* Sanity check for buffer allocation below */ - if (biWidth <= 0 || biHeight <= 0 || (biWidth >> 24) || (biHeight >> 24)) - ERREXIT(cinfo, JERR_BMP_OUTOFRANGE); - - /* Compute distance to bitmap data --- will adjust for colormap below */ - bPad = bfOffBits - (headerSize + 14); - - /* Read the colormap, if any */ - if (mapentrysize > 0) { - if (biClrUsed <= 0) - biClrUsed = 256; /* assume it's 256 */ - else if (biClrUsed > 256) - ERREXIT(cinfo, JERR_BMP_BADCMAP); - /* Allocate space to store the colormap */ - source->colormap = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) biClrUsed, (JDIMENSION) 3); - source->cmap_length = (int) biClrUsed; - /* and read it from the file */ - read_colormap(source, (int) biClrUsed, mapentrysize); - /* account for size of colormap */ - bPad -= biClrUsed * mapentrysize; - } - - /* Skip any remaining pad bytes */ - if (bPad < 0) /* incorrect bfOffBits value? */ - ERREXIT(cinfo, JERR_BMP_BADHEADER); - while (--bPad >= 0) { - (void) read_byte(source); - } - - /* Compute row width in file, including padding to 4-byte boundary */ - if (source->bits_per_pixel == 24) - row_width = (JDIMENSION) (biWidth * 3); - else if (source->bits_per_pixel == 32) - row_width = (JDIMENSION) (biWidth * 4); - else - row_width = (JDIMENSION) biWidth; - while ((row_width & 3) != 0) row_width++; - source->row_width = row_width; - - /* Allocate space for inversion array, prepare for preload pass */ - source->whole_image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - row_width, (JDIMENSION) biHeight, (JDIMENSION) 1); - source->pub.get_pixel_rows = preload_image; - if (cinfo->progress != NULL) { - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - progress->total_extra_passes++; /* count file input as separate pass */ - } - - /* Allocate one-row buffer for returned data */ - source->pub.buffer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) (biWidth * 3), (JDIMENSION) 1); - source->pub.buffer_height = 1; - - cinfo->in_color_space = JCS_RGB; - cinfo->input_components = 3; - cinfo->data_precision = 8; - cinfo->image_width = (JDIMENSION) biWidth; - cinfo->image_height = (JDIMENSION) biHeight; -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - /* no work */ -} - - -/* - * The module selection routine for BMP format input. - */ - -GLOBAL(cjpeg_source_ptr) -jinit_read_bmp (j_compress_ptr cinfo) -{ - bmp_source_ptr source; - - /* Create module interface object */ - source = (bmp_source_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(bmp_source_struct)); - source->cinfo = cinfo; /* make back link for subroutines */ - /* Fill in method ptrs, except get_pixel_rows which start_input sets */ - source->pub.start_input = start_input_bmp; - source->pub.finish_input = finish_input_bmp; - - return &source->pub; -} - -#endif /* BMP_SUPPORTED */ diff --git a/code/jpeg-9f/rdcolmap.c b/code/jpeg-9f/rdcolmap.c deleted file mode 100644 index 42b34376..00000000 --- a/code/jpeg-9f/rdcolmap.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * rdcolmap.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file implements djpeg's "-map file" switch. It reads a source image - * and constructs a colormap to be supplied to the JPEG decompressor. - * - * Currently, these file formats are supported for the map file: - * GIF: the contents of the GIF's global colormap are used. - * PPM (either text or raw flavor): the entire file is read and - * each unique pixel value is entered in the map. - * Note that reading a large PPM file will be horrendously slow. - * Typically, a PPM-format map file should contain just one pixel - * of each desired color. Such a file can be extracted from an - * ordinary image PPM file with ppmtomap(1). - * - * Rescaling a PPM that has a maxval unequal to MAXJSAMPLE is not - * currently implemented. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */ - -/* Portions of this code are based on the PBMPLUS library, which is: -** -** Copyright (C) 1988 by Jef Poskanzer. -** -** Permission to use, copy, modify, and distribute this software and its -** documentation for any purpose and without fee is hereby granted, provided -** that the above copyright notice appear in all copies and that both that -** copyright notice and this permission notice appear in supporting -** documentation. This software is provided "as is" without express or -** implied warranty. -*/ - - -/* - * Add a (potentially) new color to the color map. - */ - -LOCAL(void) -add_map_entry (j_decompress_ptr cinfo, int R, int G, int B) -{ - JSAMPROW colormap0 = cinfo->colormap[0]; - JSAMPROW colormap1 = cinfo->colormap[1]; - JSAMPROW colormap2 = cinfo->colormap[2]; - int ncolors = cinfo->actual_number_of_colors; - int index; - - /* Check for duplicate color. */ - for (index = 0; index < ncolors; index++) { - if (GETJSAMPLE(colormap0[index]) == R && - GETJSAMPLE(colormap1[index]) == G && - GETJSAMPLE(colormap2[index]) == B) - return; /* color is already in map */ - } - - /* Check for map overflow. */ - if (ncolors >= (MAXJSAMPLE+1)) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, (MAXJSAMPLE+1)); - - /* OK, add color to map. */ - colormap0[ncolors] = (JSAMPLE) R; - colormap1[ncolors] = (JSAMPLE) G; - colormap2[ncolors] = (JSAMPLE) B; - cinfo->actual_number_of_colors++; -} - - -/* - * Extract color map from a GIF file. - */ - -LOCAL(void) -read_gif_map (j_decompress_ptr cinfo, FILE * infile) -{ - int header[13]; - int i, colormaplen; - int R, G, B; - - /* Initial 'G' has already been read by read_color_map */ - /* Read the rest of the GIF header and logical screen descriptor */ - for (i = 1; i < 13; i++) { - if ((header[i] = getc(infile)) == EOF) - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - } - - /* Verify GIF Header */ - if (header[1] != 'I' || header[2] != 'F') - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - - /* There must be a global color map. */ - if ((header[10] & 0x80) == 0) - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - - /* OK, fetch it. */ - colormaplen = 2 << (header[10] & 0x07); - - for (i = 0; i < colormaplen; i++) { - R = getc(infile); - G = getc(infile); - B = getc(infile); - if (R == EOF || G == EOF || B == EOF) - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - add_map_entry(cinfo, - R << (BITS_IN_JSAMPLE-8), - G << (BITS_IN_JSAMPLE-8), - B << (BITS_IN_JSAMPLE-8)); - } -} - - -/* Support routines for reading PPM */ - - -LOCAL(int) -pbm_getc (FILE * infile) -/* Read next char, skipping over any comments */ -/* A comment/newline sequence is returned as a newline */ -{ - register int ch; - - ch = getc(infile); - if (ch == '#') { - do { - ch = getc(infile); - } while (ch != '\n' && ch != EOF); - } - return ch; -} - - -LOCAL(unsigned int) -read_pbm_integer (j_decompress_ptr cinfo, FILE * infile) -/* Read an unsigned decimal integer from the PPM file */ -/* Swallows one trailing character after the integer */ -/* Note that on a 16-bit-int machine, only values up to 64k can be read. */ -/* This should not be a problem in practice. */ -{ - register int ch; - register unsigned int val; - - /* Skip any leading whitespace */ - do { - ch = pbm_getc(infile); - if (ch == EOF) - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); - - if (ch < '0' || ch > '9') - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - - val = ch - '0'; - while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') { - val *= 10; - val += ch - '0'; - } - return val; -} - - -/* - * Extract color map from a PPM file. - */ - -LOCAL(void) -read_ppm_map (j_decompress_ptr cinfo, FILE * infile) -{ - int c; - unsigned int w, h, maxval, row, col; - int R, G, B; - - /* Initial 'P' has already been read by read_color_map */ - c = getc(infile); /* save format discriminator for a sec */ - - /* while we fetch the remaining header info */ - w = read_pbm_integer(cinfo, infile); - h = read_pbm_integer(cinfo, infile); - maxval = read_pbm_integer(cinfo, infile); - - if (w <= 0 || h <= 0 || maxval <= 0) /* error check */ - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - - /* For now, we don't support rescaling from an unusual maxval. */ - if (maxval != (unsigned int) MAXJSAMPLE) - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - - switch (c) { - case '3': /* it's a text-format PPM file */ - for (row = 0; row < h; row++) { - for (col = 0; col < w; col++) { - R = read_pbm_integer(cinfo, infile); - G = read_pbm_integer(cinfo, infile); - B = read_pbm_integer(cinfo, infile); - add_map_entry(cinfo, R, G, B); - } - } - break; - - case '6': /* it's a raw-format PPM file */ - for (row = 0; row < h; row++) { - for (col = 0; col < w; col++) { - R = getc(infile); - G = getc(infile); - B = getc(infile); - if (R == EOF || G == EOF || B == EOF) - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - add_map_entry(cinfo, R, G, B); - } - } - break; - - default: - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - break; - } -} - - -/* - * Main entry point from djpeg.c. - * Input: opened input file (from file name argument on command line). - * Output: colormap and actual_number_of_colors fields are set in cinfo. - */ - -GLOBAL(void) -read_color_map (j_decompress_ptr cinfo, FILE * infile) -{ - /* Allocate space for a color map of maximum supported size. */ - cinfo->colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (MAXJSAMPLE+1), (JDIMENSION) 3); - cinfo->actual_number_of_colors = 0; /* initialize map to empty */ - - /* Read first byte to determine file format */ - switch (getc(infile)) { - case 'G': - read_gif_map(cinfo, infile); - break; - case 'P': - read_ppm_map(cinfo, infile); - break; - default: - ERREXIT(cinfo, JERR_BAD_CMAP_FILE); - break; - } -} - -#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/code/jpeg-9f/rdgif.c b/code/jpeg-9f/rdgif.c deleted file mode 100644 index 5d2339ca..00000000 --- a/code/jpeg-9f/rdgif.c +++ /dev/null @@ -1,679 +0,0 @@ -/* - * rdgif.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2019-2020 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to read input images in GIF format. - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume input from - * an ordinary stdio stream. They further assume that reading begins - * at the start of the file; start_input may need work if the - * user interface has already read some data (e.g., to determine that - * the file is indeed GIF format). - */ - -/* - * This code is loosely based on giftoppm from the PBMPLUS distribution - * of Feb. 1991. That file contains the following copyright notice: - * +-------------------------------------------------------------------+ - * | Copyright 1990, David Koblas. | - * | Permission to use, copy, modify, and distribute this software | - * | and its documentation for any purpose and without fee is hereby | - * | granted, provided that the above copyright notice appear in all | - * | copies and that both that copyright notice and this permission | - * | notice appear in supporting documentation. This software is | - * | provided "as is" without express or implied warranty. | - * +-------------------------------------------------------------------+ - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef GIF_SUPPORTED - - -/* Macros to deal with unsigned chars as efficiently as compiler allows */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char U_CHAR; -#define UCH(x) ((int) (x)) -#else /* !HAVE_UNSIGNED_CHAR */ -typedef char U_CHAR; -#ifdef CHAR_IS_UNSIGNED -#define UCH(x) ((int) (x)) -#else -#define UCH(x) ((int) (x) & 0xFF) -#endif -#endif /* HAVE_UNSIGNED_CHAR */ - - -#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) - - -#define MAXCOLORMAPSIZE 256 /* max # of colors in a GIF colormap */ -#define NUMCOLORS 3 /* # of colors */ -#define CM_RED 0 /* color component numbers */ -#define CM_GREEN 1 -#define CM_BLUE 2 - -#define MAX_LZW_BITS 12 /* maximum LZW code size */ -#define LZW_TABLE_SIZE (1< table of prefix symbols */ - UINT8 FAR *symbol_tail; /* => table of suffix bytes */ - UINT8 FAR *symbol_stack; /* => stack for symbol expansions */ - UINT8 FAR *sp; /* stack pointer */ - - /* State for interlaced image processing */ - boolean is_interlaced; /* TRUE if have interlaced image */ - jvirt_sarray_ptr interlaced_image; /* full image in interlaced order */ - JDIMENSION cur_row_number; /* need to know actual row number */ - JDIMENSION pass2_offset; /* # of pixel rows in pass 1 */ - JDIMENSION pass3_offset; /* # of pixel rows in passes 1&2 */ - JDIMENSION pass4_offset; /* # of pixel rows in passes 1,2,3 */ -} gif_source_struct; - -typedef gif_source_struct * gif_source_ptr; - - -/* Forward declarations */ -METHODDEF(JDIMENSION) get_pixel_rows - JPP((j_compress_ptr cinfo, cjpeg_source_ptr sinfo)); -METHODDEF(JDIMENSION) load_interlaced_image - JPP((j_compress_ptr cinfo, cjpeg_source_ptr sinfo)); -METHODDEF(JDIMENSION) get_interlaced_row - JPP((j_compress_ptr cinfo, cjpeg_source_ptr sinfo)); - - -LOCAL(int) -ReadByte (gif_source_ptr sinfo) -/* Read next byte from GIF file */ -{ - register FILE *infile = sinfo->pub.input_file; - register int c; - - if ((c = getc(infile)) == EOF) - ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); - return c; -} - - -LOCAL(int) -GetDataBlock (gif_source_ptr sinfo, U_CHAR *buf) -/* Read a GIF data block, which has a leading count byte */ -/* A zero-length block marks the end of a data block sequence */ -{ - int count; - - count = ReadByte(sinfo); - if (count > 0) { - if (! ReadOK(sinfo->pub.input_file, buf, count)) - ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); - } - return count; -} - - -LOCAL(void) -SkipDataBlocks (gif_source_ptr sinfo) -/* Skip a series of data blocks, until a block terminator is found */ -{ - U_CHAR buf[256]; - - while (GetDataBlock(sinfo, buf) > 0) - /* skip */; -} - - -LOCAL(void) -ReInitLZW (gif_source_ptr sinfo) -/* (Re)initialize LZW state; shared code for startup and Clear processing */ -{ - sinfo->code_size = sinfo->input_code_size + 1; - sinfo->limit_code = sinfo->clear_code << 1; /* 2^code_size */ - sinfo->max_code = sinfo->clear_code + 2; /* first unused code value */ - sinfo->sp = sinfo->symbol_stack; /* init stack to empty */ -} - - -LOCAL(void) -InitLZWCode (gif_source_ptr sinfo) -/* Initialize for a series of LZWReadByte (and hence GetCode) calls */ -{ - /* GetCode initialization */ - sinfo->last_byte = 2; /* make safe to "recopy last two bytes" */ - sinfo->code_buf[0] = 0; - sinfo->code_buf[1] = 0; - sinfo->last_bit = 0; /* nothing in the buffer */ - sinfo->cur_bit = 0; /* force buffer load on first call */ - sinfo->first_time = TRUE; - sinfo->out_of_blocks = FALSE; - - /* LZWReadByte initialization: */ - /* compute special code values (note that these do not change later) */ - sinfo->clear_code = 1 << sinfo->input_code_size; - sinfo->end_code = sinfo->clear_code + 1; - ReInitLZW(sinfo); -} - - -LOCAL(int) -GetCode (gif_source_ptr sinfo) -/* Fetch the next code_size bits from the GIF data */ -/* We assume code_size is less than 16 */ -{ - register INT32 accum; - int offs, count; - - while (sinfo->cur_bit + sinfo->code_size > sinfo->last_bit) { - /* Time to reload the buffer */ - /* First time, share code with Clear case */ - if (sinfo->first_time) { - sinfo->first_time = FALSE; - return sinfo->clear_code; - } - if (sinfo->out_of_blocks) { - WARNMS(sinfo->cinfo, JWRN_GIF_NOMOREDATA); - return sinfo->end_code; /* fake something useful */ - } - /* preserve last two bytes of what we have -- assume code_size <= 16 */ - sinfo->code_buf[0] = sinfo->code_buf[sinfo->last_byte-2]; - sinfo->code_buf[1] = sinfo->code_buf[sinfo->last_byte-1]; - /* Load more bytes; set flag if we reach the terminator block */ - if ((count = GetDataBlock(sinfo, &sinfo->code_buf[2])) == 0) { - sinfo->out_of_blocks = TRUE; - WARNMS(sinfo->cinfo, JWRN_GIF_NOMOREDATA); - return sinfo->end_code; /* fake something useful */ - } - /* Reset counters */ - sinfo->cur_bit = (sinfo->cur_bit - sinfo->last_bit) + 16; - sinfo->last_byte = 2 + count; - sinfo->last_bit = sinfo->last_byte * 8; - } - - /* Form up next 24 bits in accum */ - offs = sinfo->cur_bit >> 3; /* byte containing cur_bit */ - accum = (INT32) UCH(sinfo->code_buf[offs+2]); - accum <<= 8; - accum |= (INT32) UCH(sinfo->code_buf[offs+1]); - accum <<= 8; - accum |= (INT32) UCH(sinfo->code_buf[offs]); - - /* Right-align cur_bit in accum, then mask off desired number of bits */ - accum >>= (sinfo->cur_bit & 7); - sinfo->cur_bit += sinfo->code_size; - return ((int) accum) & ((1 << sinfo->code_size) - 1); -} - - -LOCAL(int) -LZWReadByte (gif_source_ptr sinfo) -/* Read an LZW-compressed byte */ -{ - register int code; /* current working code */ - int incode; /* saves actual input code */ - - /* If any codes are stacked from a previously read symbol, return them */ - if (sinfo->sp > sinfo->symbol_stack) - return (int) *(-- sinfo->sp); - - /* Time to read a new symbol */ - code = GetCode(sinfo); - - if (code == sinfo->clear_code) { - /* Reinit state, swallow any extra Clear codes, and */ - /* return next code, which is expected to be a raw byte. */ - ReInitLZW(sinfo); - do { - code = GetCode(sinfo); - } while (code == sinfo->clear_code); - if (code > sinfo->clear_code) { /* make sure it is a raw byte */ - WARNMS(sinfo->cinfo, JWRN_GIF_BADDATA); - code = 0; /* use something valid */ - } - /* make firstcode, oldcode valid! */ - sinfo->firstcode = sinfo->oldcode = code; - return code; - } - - if (code == sinfo->end_code) { - /* Skip the rest of the image, unless GetCode already read terminator */ - if (! sinfo->out_of_blocks) { - SkipDataBlocks(sinfo); - sinfo->out_of_blocks = TRUE; - } - /* Complain that there's not enough data */ - WARNMS(sinfo->cinfo, JWRN_GIF_ENDCODE); - /* Pad data with 0's */ - return 0; /* fake something usable */ - } - - /* Got normal raw byte or LZW symbol */ - incode = code; /* save for a moment */ - - if (code >= sinfo->max_code) { /* special case for not-yet-defined symbol */ - /* code == max_code is OK; anything bigger is bad data */ - if (code > sinfo->max_code) { - WARNMS(sinfo->cinfo, JWRN_GIF_BADDATA); - incode = 0; /* prevent creation of loops in symbol table */ - } - /* this symbol will be defined as oldcode/firstcode */ - *(sinfo->sp++) = (UINT8) sinfo->firstcode; - code = sinfo->oldcode; - } - - /* If it's a symbol, expand it into the stack */ - while (code >= sinfo->clear_code) { - *(sinfo->sp++) = sinfo->symbol_tail[code]; /* tail is a byte value */ - code = sinfo->symbol_head[code]; /* head is another LZW symbol */ - } - /* At this point code just represents a raw byte */ - sinfo->firstcode = code; /* save for possible future use */ - - /* If there's room in table... */ - if ((code = sinfo->max_code) < LZW_TABLE_SIZE) { - /* Define a new symbol = prev sym + head of this sym's expansion */ - sinfo->symbol_head[code] = (UINT16) sinfo->oldcode; - sinfo->symbol_tail[code] = (UINT8) sinfo->firstcode; - sinfo->max_code++; - /* Is it time to increase code_size? */ - if (sinfo->max_code >= sinfo->limit_code && - sinfo->code_size < MAX_LZW_BITS) { - sinfo->code_size++; - sinfo->limit_code <<= 1; /* keep equal to 2^code_size */ - } - } - - sinfo->oldcode = incode; /* save last input symbol for future use */ - return sinfo->firstcode; /* return first byte of symbol's expansion */ -} - - -LOCAL(void) -ReadColorMap (gif_source_ptr sinfo, int cmaplen, JSAMPARRAY cmap) -/* Read a GIF colormap */ -{ - int i; - - for (i = 0; i < cmaplen; i++) { -#if BITS_IN_JSAMPLE == 8 -#define UPSCALE(x) (x) -#else -#define UPSCALE(x) ((x) << (BITS_IN_JSAMPLE-8)) -#endif - cmap[CM_RED ][i] = (JSAMPLE) UPSCALE(ReadByte(sinfo)); - cmap[CM_GREEN][i] = (JSAMPLE) UPSCALE(ReadByte(sinfo)); - cmap[CM_BLUE ][i] = (JSAMPLE) UPSCALE(ReadByte(sinfo)); - } -} - - -LOCAL(void) -DoExtension (gif_source_ptr sinfo) -/* Process an extension block */ -/* Currently we ignore 'em all */ -{ - int extlabel; - - /* Read extension label byte */ - extlabel = ReadByte(sinfo); - TRACEMS1(sinfo->cinfo, 1, JTRC_GIF_EXTENSION, extlabel); - /* Skip the data block(s) associated with the extension */ - SkipDataBlocks(sinfo); -} - - -/* - * Read the file header; return image size and component count. - */ - -METHODDEF(void) -start_input_gif (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - gif_source_ptr source = (gif_source_ptr) sinfo; - U_CHAR hdrbuf[10]; /* workspace for reading control blocks */ - unsigned int width, height; /* image dimensions */ - int colormaplen, aspectRatio; - int c; - - /* Read and verify GIF Header */ - if (! ReadOK(source->pub.input_file, hdrbuf, 6)) - ERREXIT(cinfo, JERR_GIF_NOT); - if (hdrbuf[0] != 'G' || hdrbuf[1] != 'I' || hdrbuf[2] != 'F') - ERREXIT(cinfo, JERR_GIF_NOT); - /* Check for expected version numbers. - * If unknown version, give warning and try to process anyway; - * this is per recommendation in GIF89a standard. - */ - if ((hdrbuf[3] != '8' || hdrbuf[4] != '7' || hdrbuf[5] != 'a') && - (hdrbuf[3] != '8' || hdrbuf[4] != '9' || hdrbuf[5] != 'a')) - TRACEMS3(cinfo, 1, JTRC_GIF_BADVERSION, hdrbuf[3], hdrbuf[4], hdrbuf[5]); - - /* Read and decipher Logical Screen Descriptor */ - if (! ReadOK(source->pub.input_file, hdrbuf, 7)) - ERREXIT(cinfo, JERR_INPUT_EOF); - width = LM_to_uint(hdrbuf, 0); - height = LM_to_uint(hdrbuf, 2); - /* we ignore the color resolution, sort flag, and background color index */ - aspectRatio = UCH(hdrbuf[6]); - if (aspectRatio != 0 && aspectRatio != 49) - TRACEMS(cinfo, 1, JTRC_GIF_NONSQUARE); - - /* Allocate space to store the colormap */ - source->colormap = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) MAXCOLORMAPSIZE, (JDIMENSION) NUMCOLORS); - colormaplen = 0; /* indicate initialization */ - - /* Read global colormap if header indicates it is present */ - if (BitSet(hdrbuf[4], COLORMAPFLAG)) { - colormaplen = 2 << (hdrbuf[4] & 0x07); - ReadColorMap(source, colormaplen, source->colormap); - } - - /* Scan until we reach start of desired image. - * We don't currently support skipping images, but could add it easily. - */ - for (;;) { - c = ReadByte(source); - - if (c == ';') /* GIF terminator?? */ - ERREXIT(cinfo, JERR_GIF_IMAGENOTFOUND); - - if (c == '!') { /* Extension */ - DoExtension(source); - continue; - } - - if (c != ',') { /* Not an image separator? */ - WARNMS1(cinfo, JWRN_GIF_CHAR, c); - continue; - } - - /* Read and decipher Local Image Descriptor */ - if (! ReadOK(source->pub.input_file, hdrbuf, 9)) - ERREXIT(cinfo, JERR_INPUT_EOF); - /* we ignore top/left position info, also sort flag */ - width = LM_to_uint(hdrbuf, 4); - height = LM_to_uint(hdrbuf, 6); - if (width <= 0 || height <= 0) - ERREXIT(cinfo, JERR_GIF_OUTOFRANGE); - source->is_interlaced = (BitSet(hdrbuf[8], INTERLACE) != 0); - - /* Read local colormap if header indicates it is present */ - /* Note: if we wanted to support skipping images, */ - /* we'd need to skip rather than read colormap for ignored images */ - if (BitSet(hdrbuf[8], COLORMAPFLAG)) { - colormaplen = 2 << (hdrbuf[8] & 0x07); - ReadColorMap(source, colormaplen, source->colormap); - } - - source->input_code_size = ReadByte(source); /* get min-code-size byte */ - if (source->input_code_size < 2 || source->input_code_size > 8) - ERREXIT1(cinfo, JERR_GIF_CODESIZE, source->input_code_size); - - /* Reached desired image, so break out of loop */ - /* If we wanted to skip this image, */ - /* we'd call SkipDataBlocks and then continue the loop */ - break; - } - - /* Prepare to read selected image: first initialize LZW decompressor */ - source->symbol_head = (UINT16 FAR *) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, LZW_TABLE_SIZE * SIZEOF(UINT16)); - source->symbol_tail = (UINT8 FAR *) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, LZW_TABLE_SIZE * SIZEOF(UINT8)); - source->symbol_stack = (UINT8 FAR *) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, LZW_TABLE_SIZE * SIZEOF(UINT8)); - InitLZWCode(source); - - /* - * If image is interlaced, we read it into a full-size sample array, - * decompressing as we go; then get_interlaced_row selects rows from the - * sample array in the proper order. - */ - if (source->is_interlaced) { - /* We request the virtual array now, but can't access it until virtual - * arrays have been allocated. Hence, the actual work of reading the - * image is postponed until the first call to get_pixel_rows. - */ - source->interlaced_image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - (JDIMENSION) width, (JDIMENSION) height, (JDIMENSION) 1); - if (cinfo->progress != NULL) { - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - progress->total_extra_passes++; /* count file input as separate pass */ - } - source->pub.get_pixel_rows = load_interlaced_image; - } else { - source->pub.get_pixel_rows = get_pixel_rows; - } - - /* Create compressor input buffer. */ - source->pub.buffer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) width * NUMCOLORS, (JDIMENSION) 1); - source->pub.buffer_height = 1; - - /* Pad colormap for safety. */ - for (c = colormaplen; c < source->clear_code; c++) { - source->colormap[CM_RED ][c] = - source->colormap[CM_GREEN][c] = - source->colormap[CM_BLUE ][c] = CENTERJSAMPLE; - } - - /* Return info about the image. */ - cinfo->in_color_space = JCS_RGB; - cinfo->input_components = NUMCOLORS; - cinfo->data_precision = BITS_IN_JSAMPLE; /* we always rescale data to this */ - cinfo->image_width = width; - cinfo->image_height = height; - - TRACEMS3(cinfo, 1, JTRC_GIF, width, height, colormaplen); -} - - -/* - * Read one row of pixels. - * This version is used for noninterlaced GIF images: - * we read directly from the GIF file. - */ - -METHODDEF(JDIMENSION) -get_pixel_rows (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - gif_source_ptr source = (gif_source_ptr) sinfo; - register int c; - register JSAMPROW ptr; - register JDIMENSION col; - register JSAMPARRAY colormap = source->colormap; - - ptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - c = LZWReadByte(source); - *ptr++ = colormap[CM_RED ][c]; - *ptr++ = colormap[CM_GREEN][c]; - *ptr++ = colormap[CM_BLUE ][c]; - } - return 1; -} - - -/* - * Read one row of pixels. - * This version is used for the first call on get_pixel_rows when - * reading an interlaced GIF file: we read the whole image into memory. - */ - -METHODDEF(JDIMENSION) -load_interlaced_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - gif_source_ptr source = (gif_source_ptr) sinfo; - register JSAMPROW sptr; - register JDIMENSION col; - JDIMENSION row; - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - - /* Read the interlaced image into the virtual array we've created. */ - for (row = 0; row < cinfo->image_height; row++) { - if (progress != NULL) { - progress->pub.pass_counter = (long) row; - progress->pub.pass_limit = (long) cinfo->image_height; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } - sptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->interlaced_image, row, (JDIMENSION) 1, TRUE); - for (col = cinfo->image_width; col > 0; col--) { - *sptr++ = (JSAMPLE) LZWReadByte(source); - } - } - if (progress != NULL) - progress->completed_extra_passes++; - - /* Replace method pointer so subsequent calls don't come here. */ - source->pub.get_pixel_rows = get_interlaced_row; - /* Initialize for get_interlaced_row, and perform first call on it. */ - source->cur_row_number = 0; - source->pass2_offset = (cinfo->image_height + 7) / 8; - source->pass3_offset = source->pass2_offset + (cinfo->image_height + 3) / 8; - source->pass4_offset = source->pass3_offset + (cinfo->image_height + 1) / 4; - - return get_interlaced_row(cinfo, sinfo); -} - - -/* - * Read one row of pixels. - * This version is used for interlaced GIF images: - * we read from the virtual array. - */ - -METHODDEF(JDIMENSION) -get_interlaced_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - gif_source_ptr source = (gif_source_ptr) sinfo; - register int c; - register JSAMPROW sptr, ptr; - register JDIMENSION col; - register JSAMPARRAY colormap = source->colormap; - JDIMENSION irow; - - /* Figure out which row of interlaced image is needed, and access it. */ - switch ((int) (source->cur_row_number & 7)) { - case 0: /* first-pass row */ - irow = source->cur_row_number >> 3; - break; - case 4: /* second-pass row */ - irow = (source->cur_row_number >> 3) + source->pass2_offset; - break; - case 2: /* third-pass row */ - case 6: - irow = (source->cur_row_number >> 2) + source->pass3_offset; - break; - default: /* fourth-pass row */ - irow = (source->cur_row_number >> 1) + source->pass4_offset; - } - sptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->interlaced_image, irow, (JDIMENSION) 1, FALSE); - /* Scan the row, expand colormap, and output */ - ptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - c = GETJSAMPLE(*sptr++); - *ptr++ = colormap[CM_RED ][c]; - *ptr++ = colormap[CM_GREEN][c]; - *ptr++ = colormap[CM_BLUE ][c]; - } - source->cur_row_number++; /* for next time */ - return 1; -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_input_gif (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - /* no work */ -} - - -/* - * The module selection routine for GIF format input. - */ - -GLOBAL(cjpeg_source_ptr) -jinit_read_gif (j_compress_ptr cinfo) -{ - gif_source_ptr source; - - /* Create module interface object */ - source = (gif_source_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(gif_source_struct)); - source->cinfo = cinfo; /* make back link for subroutines */ - /* Fill in method ptrs, except get_pixel_rows which start_input sets */ - source->pub.start_input = start_input_gif; - source->pub.finish_input = finish_input_gif; - - return &source->pub; -} - -#endif /* GIF_SUPPORTED */ diff --git a/code/jpeg-9f/rdjpgcom.c b/code/jpeg-9f/rdjpgcom.c deleted file mode 100644 index 37191547..00000000 --- a/code/jpeg-9f/rdjpgcom.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - * rdjpgcom.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 2009 by Bill Allombert, Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a very simple stand-alone application that displays - * the text in COM (comment) markers in a JFIF file. - * This may be useful as an example of the minimum logic needed to parse - * JPEG markers. - */ - -#define JPEG_CJPEG_DJPEG /* to get the command-line config symbols */ -#include "jinclude.h" /* get auto-config symbols, */ - -#ifdef HAVE_LOCALE_H -#include /* Bill Allombert: use locale for isprint */ -#endif -#include /* to declare isupper(), tolower() */ -#ifdef USE_SETMODE -#include /* to declare setmode()'s parameter macros */ -/* If you have setmode() but not , just delete this line: */ -#include /* to declare setmode() */ -#endif - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - -#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ -#define READ_BINARY "r" -#else -#ifdef VMS /* VMS is very nonstandard */ -#define READ_BINARY "rb", "ctx=stm" -#else /* standard ANSI-compliant case */ -#define READ_BINARY "rb" -#endif -#endif - -#ifndef EXIT_FAILURE /* define exit() codes if not provided */ -#define EXIT_FAILURE 1 -#endif -#ifndef EXIT_SUCCESS -#ifdef VMS -#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ -#else -#define EXIT_SUCCESS 0 -#endif -#endif - - -/* - * These macros are used to read the input file. - * To reuse this code in another application, you might need to change these. - */ - -static FILE * infile; /* input JPEG file */ - -/* Return next input byte, or EOF if no more */ -#define NEXTBYTE() getc(infile) - - -/* Error exit handler */ -#define ERREXIT(msg) (fprintf(stderr, "%s\n", msg), exit(EXIT_FAILURE)) - - -/* Read one byte, testing for EOF */ -static int -read_1_byte (void) -{ - int c; - - c = NEXTBYTE(); - if (c == EOF) - ERREXIT("Premature EOF in JPEG file"); - return c; -} - -/* Read 2 bytes, convert to unsigned int */ -/* All 2-byte quantities in JPEG markers are MSB first */ -static unsigned int -read_2_bytes (void) -{ - int c1, c2; - - c1 = NEXTBYTE(); - if (c1 == EOF) - ERREXIT("Premature EOF in JPEG file"); - c2 = NEXTBYTE(); - if (c2 == EOF) - ERREXIT("Premature EOF in JPEG file"); - return (((unsigned int) c1) << 8) + ((unsigned int) c2); -} - - -/* - * JPEG markers consist of one or more 0xFF bytes, followed by a marker - * code byte (which is not an FF). Here are the marker codes of interest - * in this program. (See jdmarker.c for a more complete list.) - */ - -#define M_SOF0 0xC0 /* Start Of Frame N */ -#define M_SOF1 0xC1 /* N indicates which compression process */ -#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */ -#define M_SOF3 0xC3 -#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */ -#define M_SOF6 0xC6 -#define M_SOF7 0xC7 -#define M_SOF9 0xC9 -#define M_SOF10 0xCA -#define M_SOF11 0xCB -#define M_SOF13 0xCD -#define M_SOF14 0xCE -#define M_SOF15 0xCF -#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */ -#define M_EOI 0xD9 /* End Of Image (end of datastream) */ -#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ -#define M_APP0 0xE0 /* Application-specific marker, type N */ -#define M_APP12 0xEC /* (we don't bother to list all 16 APPn's) */ -#define M_COM 0xFE /* COMment */ - - -/* - * Find the next JPEG marker and return its marker code. - * We expect at least one FF byte, possibly more if the compressor used FFs - * to pad the file. - * There could also be non-FF garbage between markers. The treatment of such - * garbage is unspecified; we choose to skip over it but emit a warning msg. - * NB: this routine must not be used after seeing SOS marker, since it will - * not deal correctly with FF/00 sequences in the compressed image data... - */ - -static int -next_marker (void) -{ - int c; - int discarded_bytes = 0; - - /* Find 0xFF byte; count and skip any non-FFs. */ - c = read_1_byte(); - while (c != 0xFF) { - discarded_bytes++; - c = read_1_byte(); - } - /* Get marker code byte, swallowing any duplicate FF bytes. Extra FFs - * are legal as pad bytes, so don't count them in discarded_bytes. - */ - do { - c = read_1_byte(); - } while (c == 0xFF); - - if (discarded_bytes != 0) { - fprintf(stderr, "Warning: garbage data found in JPEG file\n"); - } - - return c; -} - - -/* - * Read the initial marker, which should be SOI. - * For a JFIF file, the first two bytes of the file should be literally - * 0xFF M_SOI. To be more general, we could use next_marker, but if the - * input file weren't actually JPEG at all, next_marker might read the whole - * file and then return a misleading error message... - */ - -static int -first_marker (void) -{ - int c1, c2; - - c1 = NEXTBYTE(); - c2 = NEXTBYTE(); - if (c1 != 0xFF || c2 != M_SOI) - ERREXIT("Not a JPEG file"); - return c2; -} - - -/* - * Most types of marker are followed by a variable-length parameter segment. - * This routine skips over the parameters for any marker we don't otherwise - * want to process. - * Note that we MUST skip the parameter segment explicitly in order not to - * be fooled by 0xFF bytes that might appear within the parameter segment; - * such bytes do NOT introduce new markers. - */ - -static void -skip_variable (void) -/* Skip over an unknown or uninteresting variable-length marker */ -{ - unsigned int length; - - /* Get the marker parameter length count */ - length = read_2_bytes(); - /* Length includes itself, so must be at least 2 */ - if (length < 2) - ERREXIT("Erroneous JPEG marker length"); - length -= 2; - /* Skip over the remaining bytes */ - while (length > 0) { - (void) read_1_byte(); - length--; - } -} - - -/* - * Process a COM marker. - * We want to print out the marker contents as legible text; - * we must guard against non-text junk and varying newline representations. - */ - -static void -process_COM (int raw) -{ - unsigned int length; - int ch; - int lastch = 0; - - /* Bill Allombert: set locale properly for isprint */ -#ifdef HAVE_LOCALE_H - setlocale(LC_CTYPE, ""); -#endif - - /* Get the marker parameter length count */ - length = read_2_bytes(); - /* Length includes itself, so must be at least 2 */ - if (length < 2) - ERREXIT("Erroneous JPEG marker length"); - length -= 2; - - while (length > 0) { - ch = read_1_byte(); - if (raw) { - putc(ch, stdout); - /* Emit the character in a readable form. - * Nonprintables are converted to \nnn form, - * while \ is converted to \\. - * Newlines in CR, CR/LF, or LF form will be printed as one newline. - */ - } else if (ch == '\r') { - printf("\n"); - } else if (ch == '\n') { - if (lastch != '\r') - printf("\n"); - } else if (ch == '\\') { - printf("\\\\"); - } else if (isprint(ch)) { - putc(ch, stdout); - } else { - printf("\\%03o", ch); - } - lastch = ch; - length--; - } - printf("\n"); - - /* Bill Allombert: revert to C locale */ -#ifdef HAVE_LOCALE_H - setlocale(LC_CTYPE, "C"); -#endif -} - - -/* - * Process a SOFn marker. - * This code is only needed if you want to know the image dimensions... - */ - -static void -process_SOFn (int marker) -{ - unsigned int length; - unsigned int image_height, image_width; - int data_precision, num_components; - const char * process; - int ci; - - length = read_2_bytes(); /* usual parameter length count */ - - data_precision = read_1_byte(); - image_height = read_2_bytes(); - image_width = read_2_bytes(); - num_components = read_1_byte(); - - switch (marker) { - case M_SOF0: process = "Baseline"; break; - case M_SOF1: process = "Extended sequential"; break; - case M_SOF2: process = "Progressive"; break; - case M_SOF3: process = "Lossless"; break; - case M_SOF5: process = "Differential sequential"; break; - case M_SOF6: process = "Differential progressive"; break; - case M_SOF7: process = "Differential lossless"; break; - case M_SOF9: process = "Extended sequential, arithmetic coding"; break; - case M_SOF10: process = "Progressive, arithmetic coding"; break; - case M_SOF11: process = "Lossless, arithmetic coding"; break; - case M_SOF13: process = "Differential sequential, arithmetic coding"; break; - case M_SOF14: process = "Differential progressive, arithmetic coding"; break; - case M_SOF15: process = "Differential lossless, arithmetic coding"; break; - default: process = "Unknown"; break; - } - - printf("JPEG image is %uw * %uh, %d color components, %d bits per sample\n", - image_width, image_height, num_components, data_precision); - printf("JPEG process: %s\n", process); - - if (length != (unsigned int) (8 + num_components * 3)) - ERREXIT("Bogus SOF marker length"); - - for (ci = 0; ci < num_components; ci++) { - (void) read_1_byte(); /* Component ID code */ - (void) read_1_byte(); /* H, V sampling factors */ - (void) read_1_byte(); /* Quantization table number */ - } -} - - -/* - * Parse the marker stream until SOS or EOI is seen; - * display any COM markers. - * While the companion program wrjpgcom will always insert COM markers before - * SOFn, other implementations might not, so we scan to SOS before stopping. - * If we were only interested in the image dimensions, we would stop at SOFn. - * (Conversely, if we only cared about COM markers, there would be no need - * for special code to handle SOFn; we could treat it like other markers.) - */ - -static int -scan_JPEG_header (int verbose, int raw) -{ - int marker; - - /* Expect SOI at start of file */ - if (first_marker() != M_SOI) - ERREXIT("Expected SOI marker first"); - - /* Scan miscellaneous markers until we reach SOS. */ - for (;;) { - marker = next_marker(); - switch (marker) { - /* Note that marker codes 0xC4, 0xC8, 0xCC are not, and must not be, - * treated as SOFn. C4 in particular is actually DHT. - */ - case M_SOF0: /* Baseline */ - case M_SOF1: /* Extended sequential, Huffman */ - case M_SOF2: /* Progressive, Huffman */ - case M_SOF3: /* Lossless, Huffman */ - case M_SOF5: /* Differential sequential, Huffman */ - case M_SOF6: /* Differential progressive, Huffman */ - case M_SOF7: /* Differential lossless, Huffman */ - case M_SOF9: /* Extended sequential, arithmetic */ - case M_SOF10: /* Progressive, arithmetic */ - case M_SOF11: /* Lossless, arithmetic */ - case M_SOF13: /* Differential sequential, arithmetic */ - case M_SOF14: /* Differential progressive, arithmetic */ - case M_SOF15: /* Differential lossless, arithmetic */ - if (verbose) - process_SOFn(marker); - else - skip_variable(); - break; - - case M_SOS: /* stop before hitting compressed data */ - return marker; - - case M_EOI: /* in case it's a tables-only JPEG stream */ - return marker; - - case M_COM: - process_COM(raw); - break; - - case M_APP12: - /* Some digital camera makers put useful textual information into - * APP12 markers, so we print those out too when in -verbose mode. - */ - if (verbose) { - printf("APP12 contains:\n"); - process_COM(raw); - } else - skip_variable(); - break; - - default: /* Anything else just gets skipped */ - skip_variable(); /* we assume it has a parameter count... */ - break; - } - } /* end loop */ -} - - -/* Command line parsing code */ - -static const char * progname; /* program name for error messages */ - - -static void -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "rdjpgcom displays any textual comments in a JPEG file.\n"); - - fprintf(stderr, "Usage: %s [switches] [inputfile]\n", progname); - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -raw Display non-printable characters in comments (unsafe)\n"); - fprintf(stderr, " -verbose Also display dimensions of JPEG image\n"); - - exit(EXIT_FAILURE); -} - - -static int -keymatch (char * arg, const char * keyword, int minchars) -/* Case-insensitive matching of (possibly abbreviated) keyword switches. */ -/* keyword is the constant keyword (must be lower case already), */ -/* minchars is length of minimum legal abbreviation. */ -{ - register int ca, ck; - register int nmatched = 0; - - while ((ca = *arg++) != '\0') { - if ((ck = *keyword++) == '\0') - return 0; /* arg longer than keyword, no good */ - if (isupper(ca)) /* force arg to lcase (assume ck is already) */ - ca = tolower(ca); - if (ca != ck) - return 0; /* no good */ - nmatched++; /* count matched characters */ - } - /* reached end of argument; fail if it's too short for unique abbrev */ - if (nmatched < minchars) - return 0; - return 1; /* A-OK */ -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - int argn; - char * arg; - int verbose = 0, raw = 0; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "rdjpgcom"; /* in case C library doesn't provide it */ - - /* Parse switches, if any */ - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (arg[0] != '-') - break; /* not switch, must be file name */ - arg++; /* advance over '-' */ - if (keymatch(arg, "verbose", 1)) { - verbose++; - } else if (keymatch(arg, "raw", 1)) { - raw = 1; - } else - usage(); - } - - /* Open the input file. */ - /* Unix style: expect zero or one file name */ - if (argn < argc-1) { - fprintf(stderr, "%s: only one input file\n", progname); - usage(); - } - if (argn < argc) { - if ((infile = fopen(argv[argn], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); - exit(EXIT_FAILURE); - } - } else { - /* default input file is stdin */ -#ifdef USE_SETMODE /* need to hack file mode? */ - setmode(fileno(stdin), O_BINARY); -#endif -#ifdef USE_FDOPEN /* need to re-open in binary mode? */ - if ((infile = fdopen(fileno(stdin), READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open stdin\n", progname); - exit(EXIT_FAILURE); - } -#else - infile = stdin; -#endif - } - - /* Scan the JPEG headers. */ - (void) scan_JPEG_header(verbose, raw); - - /* All done. */ - exit(EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/rdppm.c b/code/jpeg-9f/rdppm.c deleted file mode 100644 index ca638678..00000000 --- a/code/jpeg-9f/rdppm.c +++ /dev/null @@ -1,501 +0,0 @@ -/* - * rdppm.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2009-2020 by Bill Allombert, Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to read input images in PPM/PGM format. - * The extended 2-byte-per-sample raw PPM/PGM formats are supported. - * The PBMPLUS library is NOT required to compile this software - * (but it is highly useful as a set of PPM image manipulation programs). - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume input from - * an ordinary stdio stream. They further assume that reading begins - * at the start of the file; start_input may need work if the - * user interface has already read some data (e.g., to determine that - * the file is indeed PPM format). - */ - -/* Portions of this code are based on the PBMPLUS library, which is: -** -** Copyright (C) 1988 by Jef Poskanzer. -** -** Permission to use, copy, modify, and distribute this software and its -** documentation for any purpose and without fee is hereby granted, provided -** that the above copyright notice appear in all copies and that both that -** copyright notice and this permission notice appear in supporting -** documentation. This software is provided "as is" without express or -** implied warranty. -*/ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef PPM_SUPPORTED - - -/* Macros to deal with unsigned chars as efficiently as compiler allows */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char U_CHAR; -#define UCH(x) ((int) (x)) -#else /* !HAVE_UNSIGNED_CHAR */ -typedef char U_CHAR; -#ifdef CHAR_IS_UNSIGNED -#define UCH(x) ((int) (x)) -#else -#define UCH(x) ((int) (x) & 0xFF) -#endif -#endif /* HAVE_UNSIGNED_CHAR */ - - -#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) - - -/* - * On most systems, reading individual bytes with getc() is drastically less - * efficient than buffering a row at a time with fread(). On PCs, we must - * allocate the buffer in near data space, because we are assuming small-data - * memory model, wherein fread() can't reach far memory. If you need to - * process very wide images on a PC, you might have to compile in large-memory - * model, or else replace fread() with a getc() loop --- which will be much - * slower. - */ - - -/* Private version of data source object */ - -typedef struct { - struct cjpeg_source_struct pub; /* public fields */ - - /* Usually these two pointers point to the same place: */ - U_CHAR *iobuffer; /* fread's I/O buffer */ - JSAMPROW pixrow; /* compressor input buffer */ - size_t buffer_width; /* width of I/O buffer */ - JSAMPLE *rescale; /* => maxval-remapping array, or NULL */ - unsigned int maxval; -} ppm_source_struct; - -typedef ppm_source_struct * ppm_source_ptr; - - -LOCAL(int) -pbm_getc (FILE * infile) -/* Read next char, skipping over any comments */ -/* A comment/newline sequence is returned as a newline */ -{ - register int ch; - - ch = getc(infile); - if (ch == '#') { - do { - ch = getc(infile); - } while (ch != '\n' && ch != EOF); - } - return ch; -} - - -LOCAL(unsigned int) -read_pbm_integer (j_compress_ptr cinfo, FILE * infile) -/* Read an unsigned decimal integer from the PPM file */ -/* Swallows one trailing character after the integer */ -/* Note that on a 16-bit-int machine, only values up to 64k can be read. */ -/* This should not be a problem in practice. */ -{ - register int ch; - register unsigned int val; - - /* Skip any leading whitespace */ - do { - ch = pbm_getc(infile); - if (ch == EOF) - ERREXIT(cinfo, JERR_INPUT_EOF); - } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); - - if (ch < '0' || ch > '9') - ERREXIT(cinfo, JERR_PPM_NONNUMERIC); - - val = ch - '0'; - while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') { - val *= 10; - val += ch - '0'; - } - return val; -} - - -/* - * Read one row of pixels. - * - * We provide several different versions depending on input file format. - * In all cases, input is scaled to the size of JSAMPLE. - * - * A really fast path is provided for reading byte/sample raw files with - * maxval = MAXJSAMPLE, which is the normal case for 8-bit data. - */ - - -METHODDEF(JDIMENSION) -get_text_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading text-format PGM files with any maxval */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - FILE * infile = source->pub.input_file; - register JSAMPROW ptr; - register JSAMPLE *rescale = source->rescale; - unsigned int maxval = source->maxval; - JDIMENSION col; - - ptr = source->pixrow; - for (col = cinfo->image_width; col > 0; col--) { - register unsigned int temp; - temp = read_pbm_integer(cinfo, infile); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - } - return 1; -} - - -METHODDEF(JDIMENSION) -get_text_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading text-format PPM files with any maxval */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - FILE * infile = source->pub.input_file; - register JSAMPROW ptr; - register JSAMPLE *rescale = source->rescale; - unsigned int maxval = source->maxval; - JDIMENSION col; - - ptr = source->pixrow; - for (col = cinfo->image_width; col > 0; col--) { - register unsigned int temp; - temp = read_pbm_integer(cinfo, infile); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - temp = read_pbm_integer(cinfo, infile); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - temp = read_pbm_integer(cinfo, infile); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - } - return 1; -} - - -METHODDEF(JDIMENSION) -get_scaled_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading raw-byte-format PGM files with any maxval */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - register JSAMPROW ptr; - register U_CHAR * bufferptr; - register JSAMPLE *rescale = source->rescale; - unsigned int maxval = source->maxval; - JDIMENSION col; - - if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) - ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pixrow; - bufferptr = source->iobuffer; - for (col = cinfo->image_width; col > 0; col--) { - register unsigned int temp; - temp = (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - } - return 1; -} - - -METHODDEF(JDIMENSION) -get_scaled_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading raw-byte-format PPM files with any maxval */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - register JSAMPROW ptr; - register U_CHAR * bufferptr; - register JSAMPLE *rescale = source->rescale; - unsigned int maxval = source->maxval; - JDIMENSION col; - - if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) - ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pixrow; - bufferptr = source->iobuffer; - for (col = cinfo->image_width; col > 0; col--) { - register unsigned int temp; - temp = (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - temp = (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - temp = (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - } - return 1; -} - - -METHODDEF(JDIMENSION) -get_raw_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading raw-byte-format files with maxval = MAXJSAMPLE. - * In this case we just read right into the JSAMPLE buffer! - * Note that same code works for PPM and PGM files. - */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - - if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) - ERREXIT(cinfo, JERR_INPUT_EOF); - return 1; -} - - -METHODDEF(JDIMENSION) -get_word_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading raw-word-format PGM files with any maxval */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - register JSAMPROW ptr; - register U_CHAR * bufferptr; - register JSAMPLE *rescale = source->rescale; - unsigned int maxval = source->maxval; - JDIMENSION col; - - if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) - ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pixrow; - bufferptr = source->iobuffer; - for (col = cinfo->image_width; col > 0; col--) { - register unsigned int temp; - temp = ((unsigned int) UCH(*bufferptr++)) << 8; - temp |= (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - } - return 1; -} - - -METHODDEF(JDIMENSION) -get_word_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading raw-word-format PPM files with any maxval */ -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - register JSAMPROW ptr; - register U_CHAR * bufferptr; - register JSAMPLE *rescale = source->rescale; - unsigned int maxval = source->maxval; - JDIMENSION col; - - if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) - ERREXIT(cinfo, JERR_INPUT_EOF); - ptr = source->pixrow; - bufferptr = source->iobuffer; - for (col = cinfo->image_width; col > 0; col--) { - register unsigned int temp; - temp = ((unsigned int) UCH(*bufferptr++)) << 8; - temp |= (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - temp = ((unsigned int) UCH(*bufferptr++)) << 8; - temp |= (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - temp = ((unsigned int) UCH(*bufferptr++)) << 8; - temp |= (unsigned int) UCH(*bufferptr++); - if (temp > maxval) - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - *ptr++ = rescale[temp]; - } - return 1; -} - - -/* - * Read the file header; return image size and component count. - */ - -METHODDEF(void) -start_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - ppm_source_ptr source = (ppm_source_ptr) sinfo; - int c; - unsigned int w, h, maxval; - boolean need_iobuffer, use_raw_buffer, need_rescale; - - if (getc(source->pub.input_file) != 'P') - ERREXIT(cinfo, JERR_PPM_NOT); - - c = getc(source->pub.input_file); /* subformat discriminator character */ - - /* detect unsupported variants (ie, PBM) before trying to read header */ - switch (c) { - case '2': /* it's a text-format PGM file */ - case '3': /* it's a text-format PPM file */ - case '5': /* it's a raw-format PGM file */ - case '6': /* it's a raw-format PPM file */ - break; - default: - ERREXIT(cinfo, JERR_PPM_NOT); - } - - /* fetch the remaining header info */ - w = read_pbm_integer(cinfo, source->pub.input_file); - h = read_pbm_integer(cinfo, source->pub.input_file); - maxval = read_pbm_integer(cinfo, source->pub.input_file); - - if (w <= 0 || h <= 0 || maxval <= 0) /* error check */ - ERREXIT(cinfo, JERR_PPM_NOT); - - if (((long) w >> 24) || /* sanity check for buffer allocation below */ - ((long) maxval >> 16)) /* support max 16-bit (2-byte) sample values */ - ERREXIT(cinfo, JERR_PPM_OUTOFRANGE); - - cinfo->data_precision = BITS_IN_JSAMPLE; /* we always rescale data to this */ - cinfo->image_width = (JDIMENSION) w; - cinfo->image_height = (JDIMENSION) h; - source->maxval = maxval; - - /* initialize flags to most common settings */ - need_iobuffer = TRUE; /* do we need an I/O buffer? */ - use_raw_buffer = FALSE; /* do we map input buffer onto I/O buffer? */ - need_rescale = TRUE; /* do we need a rescale array? */ - - switch (c) { - case '2': /* it's a text-format PGM file */ - cinfo->input_components = 1; - cinfo->in_color_space = JCS_GRAYSCALE; - TRACEMS2(cinfo, 1, JTRC_PGM_TEXT, w, h); - source->pub.get_pixel_rows = get_text_gray_row; - need_iobuffer = FALSE; - break; - - case '3': /* it's a text-format PPM file */ - cinfo->input_components = 3; - cinfo->in_color_space = JCS_RGB; - TRACEMS2(cinfo, 1, JTRC_PPM_TEXT, w, h); - source->pub.get_pixel_rows = get_text_rgb_row; - need_iobuffer = FALSE; - break; - - case '5': /* it's a raw-format PGM file */ - cinfo->input_components = 1; - cinfo->in_color_space = JCS_GRAYSCALE; - TRACEMS2(cinfo, 1, JTRC_PGM, w, h); - if (maxval > 255) { - source->pub.get_pixel_rows = get_word_gray_row; - } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) { - source->pub.get_pixel_rows = get_raw_row; - use_raw_buffer = TRUE; - need_rescale = FALSE; - } else { - source->pub.get_pixel_rows = get_scaled_gray_row; - } - break; - - case '6': /* it's a raw-format PPM file */ - cinfo->input_components = 3; - cinfo->in_color_space = JCS_RGB; - TRACEMS2(cinfo, 1, JTRC_PPM, w, h); - if (maxval > 255) { - source->pub.get_pixel_rows = get_word_rgb_row; - } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) { - source->pub.get_pixel_rows = get_raw_row; - use_raw_buffer = TRUE; - need_rescale = FALSE; - } else { - source->pub.get_pixel_rows = get_scaled_rgb_row; - } - break; - } - - /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */ - if (need_iobuffer) { - source->buffer_width = (size_t) w * (size_t) cinfo->input_components * - ((maxval <= 255) ? SIZEOF(U_CHAR) : (2 * SIZEOF(U_CHAR))); - source->iobuffer = (U_CHAR *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, source->buffer_width); - } - - /* Create compressor input buffer. */ - if (use_raw_buffer) { - /* For unscaled raw-input case, we can just map it onto the I/O buffer. */ - /* Cast here implies near->far pointer conversion on PCs */ - source->pixrow = (JSAMPROW) source->iobuffer; - } else { - /* Need to translate anyway, so make a separate sample buffer. */ - source->pixrow = (JSAMPROW) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, (size_t) w * - (size_t) cinfo->input_components * SIZEOF(JSAMPLE)); - } - /* Synthesize a JSAMPARRAY pointer structure */ - source->pub.buffer = & source->pixrow; - source->pub.buffer_height = 1; - - /* Compute the rescaling array if required. */ - if (need_rescale) { - INT32 val, half_maxval; - - /* On 16-bit-int machines we have to be careful of maxval = 65535 */ - source->rescale = (JSAMPLE *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, - JPOOL_IMAGE, ((size_t) maxval + (size_t) 1) * SIZEOF(JSAMPLE)); - half_maxval = maxval / 2; - for (val = 0; val <= (INT32) maxval; val++) { - /* The multiplication here must be done in 32 bits to avoid overflow */ - source->rescale[val] = (JSAMPLE) ((val * MAXJSAMPLE + half_maxval) / maxval); - } - } -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - /* no work */ -} - - -/* - * The module selection routine for PPM format input. - */ - -GLOBAL(cjpeg_source_ptr) -jinit_read_ppm (j_compress_ptr cinfo) -{ - ppm_source_ptr source; - - /* Create module interface object */ - source = (ppm_source_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(ppm_source_struct)); - /* Fill in method ptrs, except get_pixel_rows which start_input sets */ - source->pub.start_input = start_input_ppm; - source->pub.finish_input = finish_input_ppm; - - return &source->pub; -} - -#endif /* PPM_SUPPORTED */ diff --git a/code/jpeg-9f/rdrle.c b/code/jpeg-9f/rdrle.c deleted file mode 100644 index 06f2e8aa..00000000 --- a/code/jpeg-9f/rdrle.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * rdrle.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to read input images in Utah RLE format. - * The Utah Raster Toolkit library is required (version 3.1 or later). - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume input from - * an ordinary stdio stream. They further assume that reading begins - * at the start of the file; start_input may need work if the - * user interface has already read some data (e.g., to determine that - * the file is indeed RLE format). - * - * Based on code contributed by Mike Lijewski, - * with updates from Robert Hutchinson. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef RLE_SUPPORTED - -/* rle.h is provided by the Utah Raster Toolkit. */ - -#include - -/* - * We assume that JSAMPLE has the same representation as rle_pixel, - * to wit, "unsigned char". Hence we can't cope with 12- or 16-bit samples. - */ - -#if BITS_IN_JSAMPLE != 8 - Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ -#endif - -/* - * We support the following types of RLE files: - * - * GRAYSCALE - 8 bits, no colormap - * MAPPEDGRAY - 8 bits, 1 channel colomap - * PSEUDOCOLOR - 8 bits, 3 channel colormap - * TRUECOLOR - 24 bits, 3 channel colormap - * DIRECTCOLOR - 24 bits, no colormap - * - * For now, we ignore any alpha channel in the image. - */ - -typedef enum - { GRAYSCALE, MAPPEDGRAY, PSEUDOCOLOR, TRUECOLOR, DIRECTCOLOR } rle_kind; - - -/* - * Since RLE stores scanlines bottom-to-top, we have to invert the image - * to conform to JPEG's top-to-bottom order. To do this, we read the - * incoming image into a virtual array on the first get_pixel_rows call, - * then fetch the required row from the virtual array on subsequent calls. - */ - -typedef struct _rle_source_struct * rle_source_ptr; - -typedef struct _rle_source_struct { - struct cjpeg_source_struct pub; /* public fields */ - - rle_kind visual; /* actual type of input file */ - jvirt_sarray_ptr image; /* virtual array to hold the image */ - JDIMENSION row; /* current row # in the virtual array */ - rle_hdr header; /* Input file information */ - rle_pixel **rle_row; /* holds a row returned by rle_getrow() */ - -} rle_source_struct; - - -/* - * Read the file header; return image size and component count. - */ - -METHODDEF(void) -start_input_rle (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - rle_source_ptr source = (rle_source_ptr) sinfo; - JDIMENSION width, height; -#ifdef PROGRESS_REPORT - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; -#endif - - /* Use RLE library routine to get the header info */ - source->header = *rle_hdr_init(NULL); - source->header.rle_file = source->pub.input_file; - switch (rle_get_setup(&(source->header))) { - case RLE_SUCCESS: - /* A-OK */ - break; - case RLE_NOT_RLE: - ERREXIT(cinfo, JERR_RLE_NOT); - case RLE_NO_SPACE: - ERREXIT(cinfo, JERR_RLE_MEM); - case RLE_EMPTY: - ERREXIT(cinfo, JERR_RLE_EMPTY); - case RLE_EOF: - ERREXIT(cinfo, JERR_RLE_EOF); - default: - ERREXIT(cinfo, JERR_RLE_BADERROR); - } - - /* Figure out what we have, set private vars and return values accordingly */ - - width = source->header.xmax - source->header.xmin + 1; - height = source->header.ymax - source->header.ymin + 1; - source->header.xmin = 0; /* realign horizontally */ - source->header.xmax = width-1; - - cinfo->image_width = width; - cinfo->image_height = height; - cinfo->data_precision = 8; /* we can only handle 8 bit data */ - - if (source->header.ncolors == 1 && source->header.ncmap == 0) { - source->visual = GRAYSCALE; - TRACEMS2(cinfo, 1, JTRC_RLE_GRAY, width, height); - } else if (source->header.ncolors == 1 && source->header.ncmap == 1) { - source->visual = MAPPEDGRAY; - TRACEMS3(cinfo, 1, JTRC_RLE_MAPGRAY, width, height, - 1 << source->header.cmaplen); - } else if (source->header.ncolors == 1 && source->header.ncmap == 3) { - source->visual = PSEUDOCOLOR; - TRACEMS3(cinfo, 1, JTRC_RLE_MAPPED, width, height, - 1 << source->header.cmaplen); - } else if (source->header.ncolors == 3 && source->header.ncmap == 3) { - source->visual = TRUECOLOR; - TRACEMS3(cinfo, 1, JTRC_RLE_FULLMAP, width, height, - 1 << source->header.cmaplen); - } else if (source->header.ncolors == 3 && source->header.ncmap == 0) { - source->visual = DIRECTCOLOR; - TRACEMS2(cinfo, 1, JTRC_RLE, width, height); - } else - ERREXIT(cinfo, JERR_RLE_UNSUPPORTED); - - if (source->visual == GRAYSCALE || source->visual == MAPPEDGRAY) { - cinfo->in_color_space = JCS_GRAYSCALE; - cinfo->input_components = 1; - } else { - cinfo->in_color_space = JCS_RGB; - cinfo->input_components = 3; - } - - /* - * A place to hold each scanline while it's converted. - * (GRAYSCALE scanlines don't need converting) - */ - if (source->visual != GRAYSCALE) { - source->rle_row = (rle_pixel **) (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - width, (JDIMENSION) cinfo->input_components); - } - - /* request a virtual array to hold the image */ - source->image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - width * (JDIMENSION) source->header.ncolors, height, (JDIMENSION) 1); - -#ifdef PROGRESS_REPORT - if (progress != NULL) { - /* count file input as separate pass */ - progress->total_extra_passes++; - } -#endif - - source->pub.buffer_height = 1; -} - - -/* - * Read one row of pixels. - * Called only after load_image has read the image into the virtual array. - * Used for GRAYSCALE, MAPPEDGRAY, TRUECOLOR, and DIRECTCOLOR images. - */ - -METHODDEF(JDIMENSION) -get_rle_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - rle_source_ptr source = (rle_source_ptr) sinfo; - - source->row--; - source->pub.buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, source->image, source->row, (JDIMENSION) 1, FALSE); - - return 1; -} - -/* - * Read one row of pixels. - * Called only after load_image has read the image into the virtual array. - * Used for PSEUDOCOLOR images. - */ - -METHODDEF(JDIMENSION) -get_pseudocolor_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - rle_source_ptr source = (rle_source_ptr) sinfo; - JSAMPROW src_row, dest_row; - JDIMENSION col; - rle_map *colormap; - int val; - - colormap = source->header.cmap; - dest_row = source->pub.buffer[0]; - source->row--; - src_row = * (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, source->image, source->row, (JDIMENSION) 1, FALSE); - - for (col = cinfo->image_width; col > 0; col--) { - val = GETJSAMPLE(*src_row++); - *dest_row++ = (JSAMPLE) (colormap[val ] >> 8); - *dest_row++ = (JSAMPLE) (colormap[val + 256] >> 8); - *dest_row++ = (JSAMPLE) (colormap[val + 512] >> 8); - } - - return 1; -} - - -/* - * Load the image into a virtual array. We have to do this because RLE - * files start at the lower left while the JPEG standard has them starting - * in the upper left. This is called the first time we want to get a row - * of input. What we do is load the RLE data into the array and then call - * the appropriate routine to read one row from the array. Before returning, - * we set source->pub.get_pixel_rows so that subsequent calls go straight to - * the appropriate row-reading routine. - */ - -METHODDEF(JDIMENSION) -load_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - rle_source_ptr source = (rle_source_ptr) sinfo; - JDIMENSION row, col; - JSAMPROW scanline, red_ptr, green_ptr, blue_ptr; - rle_pixel **rle_row; - rle_map *colormap; - char channel; -#ifdef PROGRESS_REPORT - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; -#endif - - /* Read the RLE data into our virtual array. - * We assume here that (a) rle_pixel is represented the same as JSAMPLE, - * and (b) we are not on a machine where FAR pointers differ from regular. - */ - RLE_CLR_BIT(source->header, RLE_ALPHA); /* don't read the alpha channel */ - -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_limit = cinfo->image_height; - progress->pub.pass_counter = 0; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - - switch (source->visual) { - - case GRAYSCALE: - case PSEUDOCOLOR: - for (row = 0; row < cinfo->image_height; row++) { - rle_row = (rle_pixel **) (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE); - rle_getrow(&source->header, rle_row); -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_counter++; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - } - break; - - case MAPPEDGRAY: - case TRUECOLOR: - rle_row = source->rle_row; - colormap = source->header.cmap; - for (row = 0; row < cinfo->image_height; row++) { - rle_getrow(&source->header, rle_row); - scanline = * (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE); - - for (col = 0; col < cinfo->image_width; col++) { - for (channel = 0; channel < source->header.ncolors; channel++) { - *scanline++ = (JSAMPLE) - (colormap[GETJSAMPLE(rle_row[channel][col]) + 256 * channel] >> 8); - } - } - -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_counter++; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - } - break; - - case DIRECTCOLOR: - rle_row = source->rle_row; - for (row = 0; row < cinfo->image_height; row++) { - rle_getrow(&source->header, rle_row); - scanline = * (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, source->image, row, (JDIMENSION) 1, TRUE); - - red_ptr = rle_row[0]; - green_ptr = rle_row[1]; - blue_ptr = rle_row[2]; - - for (col = cinfo->image_width; col > 0; col--) { - *scanline++ = *red_ptr++; - *scanline++ = *green_ptr++; - *scanline++ = *blue_ptr++; - } - -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_counter++; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - } - } - -#ifdef PROGRESS_REPORT - if (progress != NULL) - progress->completed_extra_passes++; -#endif - - /* Set up to call proper row-extraction routine in future */ - if (source->visual == PSEUDOCOLOR) { - source->pub.buffer = source->rle_row; - source->pub.get_pixel_rows = get_pseudocolor_row; - } else { - source->pub.get_pixel_rows = get_rle_row; - } - source->row = cinfo->image_height; - - /* And fetch the topmost (bottommost) row */ - return (*source->pub.get_pixel_rows) (cinfo, sinfo); -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_input_rle (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - /* no work */ -} - - -/* - * The module selection routine for RLE format input. - */ - -GLOBAL(cjpeg_source_ptr) -jinit_read_rle (j_compress_ptr cinfo) -{ - rle_source_ptr source; - - /* Create module interface object */ - source = (rle_source_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(rle_source_struct)); - /* Fill in method ptrs */ - source->pub.start_input = start_input_rle; - source->pub.finish_input = finish_input_rle; - source->pub.get_pixel_rows = load_image; - - return &source->pub; -} - -#endif /* RLE_SUPPORTED */ diff --git a/code/jpeg-9f/rdswitch.c b/code/jpeg-9f/rdswitch.c deleted file mode 100644 index 8a6675db..00000000 --- a/code/jpeg-9f/rdswitch.c +++ /dev/null @@ -1,363 +0,0 @@ -/* - * rdswitch.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2003-2020 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to process some of cjpeg's more complicated - * command-line switches. Switches processed here are: - * -qtables file Read quantization tables from text file - * -scans file Read scan script from text file - * -quality N[,N,...] Set quality ratings - * -qslots N[,N,...] Set component quantization table selectors - * -sample HxV[,HxV,...] Set component sampling factors - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ -#include /* to declare isdigit(), isspace() */ - - -LOCAL(int) -text_getc (FILE * file) -/* Read next char, skipping over any comments (# to end of line) */ -/* A comment/newline sequence is returned as a newline */ -{ - register int ch; - - ch = getc(file); - if (ch == '#') { - do { - ch = getc(file); - } while (ch != '\n' && ch != EOF); - } - return ch; -} - - -LOCAL(boolean) -read_text_integer (FILE * file, long * result, int * termchar) -/* Read an unsigned decimal integer from a file, store it in result */ -/* Reads one trailing character after the integer; returns it in termchar */ -{ - register int ch; - register long val; - - /* Skip any leading whitespace, detect EOF */ - do { - ch = text_getc(file); - if (ch == EOF) { - *termchar = ch; - return FALSE; - } - } while (isspace(ch)); - - if (! isdigit(ch)) { - *termchar = ch; - return FALSE; - } - - val = ch - '0'; - while ((ch = text_getc(file)) != EOF) { - if (! isdigit(ch)) - break; - val *= 10; - val += ch - '0'; - } - *result = val; - *termchar = ch; - return TRUE; -} - - -GLOBAL(boolean) -read_quant_tables (j_compress_ptr cinfo, char * filename, boolean force_baseline) -/* Read a set of quantization tables from the specified file. - * The file is plain ASCII text: decimal numbers with whitespace between. - * Comments preceded by '#' may be included in the file. - * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values. - * The tables are implicitly numbered 0,1,etc. - * NOTE: does not affect the qslots mapping, which will default to selecting - * table 0 for luminance (or primary) components, 1 for chrominance components. - * You must use -qslots if you want a different component->table mapping. - */ -{ - FILE * fp; - int tblno, i, termchar; - long val; - unsigned int table[DCTSIZE2]; - - if ((fp = fopen(filename, "r")) == NULL) { - fprintf(stderr, "Can't open table file %s\n", filename); - return FALSE; - } - tblno = 0; - - while (read_text_integer(fp, &val, &termchar)) { /* read 1st element of table */ - if (tblno >= NUM_QUANT_TBLS) { - fprintf(stderr, "Too many tables in file %s\n", filename); - fclose(fp); - return FALSE; - } - table[0] = (unsigned int) val; - for (i = 1; i < DCTSIZE2; i++) { - if (! read_text_integer(fp, &val, &termchar)) { - fprintf(stderr, "Invalid table data in file %s\n", filename); - fclose(fp); - return FALSE; - } - table[i] = (unsigned int) val; - } - jpeg_add_quant_table(cinfo, tblno, table, cinfo->q_scale_factor[tblno], - force_baseline); - tblno++; - } - - if (termchar != EOF) { - fprintf(stderr, "Non-numeric data in file %s\n", filename); - fclose(fp); - return FALSE; - } - - fclose(fp); - return TRUE; -} - - -#ifdef C_MULTISCAN_FILES_SUPPORTED - -LOCAL(boolean) -read_scan_integer (FILE * file, long * result, int * termchar) -/* Variant of read_text_integer that always looks for a non-space termchar; - * this simplifies parsing of punctuation in scan scripts. - */ -{ - register int ch; - - if (! read_text_integer(file, result, termchar)) - return FALSE; - ch = *termchar; - while (ch != EOF && isspace(ch)) - ch = text_getc(file); - if (isdigit(ch)) { /* oops, put it back */ - if (ungetc(ch, file) == EOF) - return FALSE; - ch = ' '; - } else { - /* Any separators other than ';' and ':' are ignored; - * this allows user to insert commas, etc, if desired. - */ - if (ch != EOF && ch != ';' && ch != ':') - ch = ' '; - } - *termchar = ch; - return TRUE; -} - - -GLOBAL(boolean) -read_scan_script (j_compress_ptr cinfo, char * filename) -/* Read a scan script from the specified text file. - * Each entry in the file defines one scan to be emitted. - * Entries are separated by semicolons ';'. - * An entry contains one to four component indexes, - * optionally followed by a colon ':' and four progressive-JPEG parameters. - * The component indexes denote which component(s) are to be transmitted - * in the current scan. The first component has index 0. - * Sequential JPEG is used if the progressive-JPEG parameters are omitted. - * The file is free format text: any whitespace may appear between numbers - * and the ':' and ';' punctuation marks. Also, other punctuation (such - * as commas or dashes) can be placed between numbers if desired. - * Comments preceded by '#' may be included in the file. - * Note: we do very little validity checking here; - * jcmaster.c will validate the script parameters. - */ -{ - FILE * fp; - int scanno, ncomps, termchar; - long val; - jpeg_scan_info * scanptr; -#define MAX_SCANS 100 /* quite arbitrary limit */ - jpeg_scan_info scans[MAX_SCANS]; - - if ((fp = fopen(filename, "r")) == NULL) { - fprintf(stderr, "Can't open scan definition file %s\n", filename); - return FALSE; - } - scanptr = scans; - scanno = 0; - - while (read_scan_integer(fp, &val, &termchar)) { - if (scanno >= MAX_SCANS) { - fprintf(stderr, "Too many scans defined in file %s\n", filename); - fclose(fp); - return FALSE; - } - scanptr->component_index[0] = (int) val; - ncomps = 1; - while (termchar == ' ') { - if (ncomps >= MAX_COMPS_IN_SCAN) { - fprintf(stderr, "Too many components in one scan in file %s\n", - filename); - fclose(fp); - return FALSE; - } - if (! read_scan_integer(fp, &val, &termchar)) - goto bogus; - scanptr->component_index[ncomps] = (int) val; - ncomps++; - } - scanptr->comps_in_scan = ncomps; - if (termchar == ':') { - if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') - goto bogus; - scanptr->Ss = (int) val; - if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') - goto bogus; - scanptr->Se = (int) val; - if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') - goto bogus; - scanptr->Ah = (int) val; - if (! read_scan_integer(fp, &val, &termchar)) - goto bogus; - scanptr->Al = (int) val; - } else { - /* set non-progressive parameters */ - scanptr->Ss = 0; - scanptr->Se = DCTSIZE2-1; - scanptr->Ah = 0; - scanptr->Al = 0; - } - if (termchar != ';' && termchar != EOF) { -bogus: - fprintf(stderr, "Invalid scan entry format in file %s\n", filename); - fclose(fp); - return FALSE; - } - scanptr++, scanno++; - } - - if (termchar != EOF) { - fprintf(stderr, "Non-numeric data in file %s\n", filename); - fclose(fp); - return FALSE; - } - - if (scanno > 0) { - /* Stash completed scan list in cinfo structure. - * NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data, - * but if you want to compress multiple images you'd want JPOOL_PERMANENT. - */ - scanptr = (jpeg_scan_info *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, scanno * SIZEOF(jpeg_scan_info)); - MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info)); - cinfo->scan_info = scanptr; - cinfo->num_scans = scanno; - } - - fclose(fp); - return TRUE; -} - -#endif /* C_MULTISCAN_FILES_SUPPORTED */ - - -GLOBAL(boolean) -set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline) -/* Process a quality-ratings parameter string, of the form - * N[,N,...] - * If there are more q-table slots than parameters, the last value is replicated. - */ -{ - int val = 75; /* default value */ - int tblno; - char ch; - - for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { - if (*arg) { - ch = ','; /* if not set by sscanf, will be ',' */ - if (sscanf(arg, "%d%c", &val, &ch) < 1) - return FALSE; - if (ch != ',') /* syntax check */ - return FALSE; - /* Convert user 0-100 rating to percentage scaling */ - cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); - while (*arg && *arg++ != ','); /* advance to next segment of arg string */ - } else { - /* reached end of parameter, set remaining factors to last value */ - cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); - } - } - jpeg_default_qtables(cinfo, force_baseline); - return TRUE; -} - - -GLOBAL(boolean) -set_quant_slots (j_compress_ptr cinfo, char *arg) -/* Process a quantization-table-selectors parameter string, of the form - * N[,N,...] - * If there are more components than parameters, the last value is replicated. - */ -{ - int val = 0; /* default table # */ - int ci; - char ch; - - for (ci = 0; ci < MAX_COMPONENTS; ci++) { - if (*arg) { - ch = ','; /* if not set by sscanf, will be ',' */ - if (sscanf(arg, "%d%c", &val, &ch) < 1) - return FALSE; - if (ch != ',') /* syntax check */ - return FALSE; - if (val < 0 || val >= NUM_QUANT_TBLS) { - fprintf(stderr, "JPEG quantization tables are numbered 0..%d\n", - NUM_QUANT_TBLS-1); - return FALSE; - } - cinfo->comp_info[ci].quant_tbl_no = val; - while (*arg && *arg++ != ','); /* advance to next segment of arg string */ - } else { - /* reached end of parameter, set remaining components to last table */ - cinfo->comp_info[ci].quant_tbl_no = val; - } - } - return TRUE; -} - - -GLOBAL(boolean) -set_sample_factors (j_compress_ptr cinfo, char *arg) -/* Process a sample-factors parameter string, of the form - * HxV[,HxV,...] - * If there are more components than parameters, "1x1" is assumed for the rest. - */ -{ - int ci, val1, val2; - char ch1, ch2; - - for (ci = 0; ci < MAX_COMPONENTS; ci++) { - if (*arg) { - ch2 = ','; /* if not set by sscanf, will be ',' */ - if (sscanf(arg, "%d%c%d%c", &val1, &ch1, &val2, &ch2) < 3) - return FALSE; - if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */ - return FALSE; - if (val1 <= 0 || val1 > MAX_SAMP_FACTOR || - val2 <= 0 || val2 > MAX_SAMP_FACTOR) { - fprintf(stderr, "JPEG sampling factors must be 1..%d\n", MAX_SAMP_FACTOR); - return FALSE; - } - cinfo->comp_info[ci].h_samp_factor = val1; - cinfo->comp_info[ci].v_samp_factor = val2; - while (*arg && *arg++ != ','); /* advance to next segment of arg string */ - } else { - /* reached end of parameter, set remaining components to 1x1 sampling */ - cinfo->comp_info[ci].h_samp_factor = 1; - cinfo->comp_info[ci].v_samp_factor = 1; - } - } - return TRUE; -} diff --git a/code/jpeg-9f/rdtarga.c b/code/jpeg-9f/rdtarga.c deleted file mode 100644 index c72ad73f..00000000 --- a/code/jpeg-9f/rdtarga.c +++ /dev/null @@ -1,500 +0,0 @@ -/* - * rdtarga.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2017-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to read input images in Targa format. - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume input from - * an ordinary stdio stream. They further assume that reading begins - * at the start of the file; start_input may need work if the - * user interface has already read some data (e.g., to determine that - * the file is indeed Targa format). - * - * Based on code contributed by Lee Daniel Crocker. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef TARGA_SUPPORTED - - -/* Macros to deal with unsigned chars as efficiently as compiler allows */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char U_CHAR; -#define UCH(x) ((int) (x)) -#else /* !HAVE_UNSIGNED_CHAR */ -typedef char U_CHAR; -#ifdef CHAR_IS_UNSIGNED -#define UCH(x) ((int) (x)) -#else -#define UCH(x) ((int) (x) & 0xFF) -#endif -#endif /* HAVE_UNSIGNED_CHAR */ - - -#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) - - -/* Private version of data source object */ - -typedef struct _tga_source_struct * tga_source_ptr; - -typedef struct _tga_source_struct { - struct cjpeg_source_struct pub; /* public fields */ - - j_compress_ptr cinfo; /* back link saves passing separate parm */ - - JSAMPARRAY colormap; /* Targa colormap (converted to my format) */ - - jvirt_sarray_ptr whole_image; /* Needed if funny input row order */ - JDIMENSION current_row; /* Current logical row number to read */ - - /* Pointer to routine to extract next Targa pixel from input file */ - JMETHOD(void, read_pixel, (tga_source_ptr sinfo)); - - /* Result of read_pixel is delivered here: */ - U_CHAR tga_pixel[4]; - - int pixel_size; /* Bytes per Targa pixel (1 to 4) */ - int cmap_length; /* colormap length */ - - /* State info for reading RLE-coded pixels; both counts must be init to 0 */ - int block_count; /* # of pixels remaining in RLE block */ - int dup_pixel_count; /* # of times to duplicate previous pixel */ - - /* This saves the correct pixel-row-expansion method for preload_image */ - JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo, - cjpeg_source_ptr sinfo)); -} tga_source_struct; - - -/* For expanding 5-bit pixel values to 8-bit with best rounding */ - -static const UINT8 c5to8bits[32] = { - 0, 8, 16, 25, 33, 41, 49, 58, - 66, 74, 82, 90, 99, 107, 115, 123, - 132, 140, 148, 156, 165, 173, 181, 189, - 197, 206, 214, 222, 230, 239, 247, 255 -}; - - - -LOCAL(int) -read_byte (tga_source_ptr sinfo) -/* Read next byte from Targa file */ -{ - register FILE *infile = sinfo->pub.input_file; - register int c; - - if ((c = getc(infile)) == EOF) - ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); - return c; -} - - -LOCAL(void) -read_colormap (tga_source_ptr sinfo, int cmaplen, int mapentrysize) -/* Read the colormap from a Targa file */ -{ - int i; - - /* Presently only handles 24-bit BGR format */ - if (mapentrysize != 24) - ERREXIT(sinfo->cinfo, JERR_TGA_BADCMAP); - - for (i = 0; i < cmaplen; i++) { - sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); - sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); - sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); - } -} - - -/* - * read_pixel methods: get a single pixel from Targa file into tga_pixel[] - */ - -METHODDEF(void) -read_non_rle_pixel (tga_source_ptr sinfo) -/* Read one Targa pixel from the input file; no RLE expansion */ -{ - register int i; - - for (i = 0; i < sinfo->pixel_size; i++) { - sinfo->tga_pixel[i] = (U_CHAR) read_byte(sinfo); - } -} - -METHODDEF(void) -read_rle_pixel (tga_source_ptr sinfo) -/* Read one Targa pixel from the input file, expanding RLE data as needed */ -{ - register int i; - - /* Duplicate previously read pixel? */ - if (sinfo->dup_pixel_count > 0) { - sinfo->dup_pixel_count--; - return; - } - - /* Time to read RLE block header? */ - if (--sinfo->block_count < 0) { /* decrement pixels remaining in block */ - i = read_byte(sinfo); - if (i & 0x80) { /* Start of duplicate-pixel block? */ - sinfo->dup_pixel_count = i & 0x7F; /* number of dups after this one */ - sinfo->block_count = 0; /* then read new block header */ - } else { - sinfo->block_count = i & 0x7F; /* number of pixels after this one */ - } - } - - /* Read next pixel */ - for (i = 0; i < sinfo->pixel_size; i++) { - sinfo->tga_pixel[i] = (U_CHAR) read_byte(sinfo); - } -} - - -/* - * Read one row of pixels. - * - * We provide several different versions depending on input file format. - */ - -METHODDEF(JDIMENSION) -get_8bit_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 8-bit grayscale pixels */ -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - register JSAMPROW ptr; - register JDIMENSION col; - - ptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ - *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]); - } - return 1; -} - -METHODDEF(JDIMENSION) -get_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 8-bit colormap indexes */ -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - register JSAMPROW ptr; - register JSAMPARRAY colormap; - register JDIMENSION col; - register int t; - int cmaplen; - - ptr = source->pub.buffer[0]; - colormap = source->colormap; - cmaplen = source->cmap_length; - for (col = cinfo->image_width; col > 0; col--) { - (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ - t = UCH(source->tga_pixel[0]); - if (t >= cmaplen) - ERREXIT(cinfo, JERR_TGA_BADPARMS); - *ptr++ = colormap[0][t]; - *ptr++ = colormap[1][t]; - *ptr++ = colormap[2][t]; - } - return 1; -} - -METHODDEF(JDIMENSION) -get_16bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 16-bit pixels */ -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - register int t; - register JSAMPROW ptr; - register JDIMENSION col; - - ptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ - t = UCH(source->tga_pixel[0]); - t += UCH(source->tga_pixel[1]) << 8; - /* We expand 5 bit data to 8 bit sample width. - * The format of the 16-bit (LSB first) input word is - * xRRRRRGGGGGBBBBB - */ - ptr[2] = (JSAMPLE) c5to8bits[t & 0x1F]; - t >>= 5; - ptr[1] = (JSAMPLE) c5to8bits[t & 0x1F]; - t >>= 5; - ptr[0] = (JSAMPLE) c5to8bits[t & 0x1F]; - ptr += 3; - } - return 1; -} - -METHODDEF(JDIMENSION) -get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -/* This version is for reading 24-bit pixels */ -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - register JSAMPROW ptr; - register JDIMENSION col; - - ptr = source->pub.buffer[0]; - for (col = cinfo->image_width; col > 0; col--) { - (*source->read_pixel) (source); /* Load next pixel into tga_pixel */ - *ptr++ = (JSAMPLE) UCH(source->tga_pixel[2]); /* change BGR to RGB order */ - *ptr++ = (JSAMPLE) UCH(source->tga_pixel[1]); - *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]); - } - return 1; -} - -/* - * Targa also defines a 32-bit pixel format with order B,G,R,A. - * We presently ignore the attribute byte, so the code for reading - * these pixels is identical to the 24-bit routine above. - * This works because the actual pixel length is only known to read_pixel. - */ - -#define get_32bit_row get_24bit_row - - -/* - * This method is for re-reading the input data in standard top-down - * row order. The entire image has already been read into whole_image - * with proper conversion of pixel format, but it's in a funny row order. - */ - -METHODDEF(JDIMENSION) -get_memory_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - JDIMENSION source_row; - - /* Compute row of source that maps to current_row of normal order */ - /* For now, assume image is bottom-up and not interlaced. */ - /* NEEDS WORK to support interlaced images! */ - source_row = cinfo->image_height - source->current_row - 1; - - /* Fetch that row from virtual array */ - source->pub.buffer = (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - source->whole_image, source_row, (JDIMENSION) 1, FALSE); - - source->current_row++; - return 1; -} - - -/* - * This method loads the image into whole_image during the first call on - * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call - * get_memory_row on subsequent calls. - */ - -METHODDEF(JDIMENSION) -preload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - JDIMENSION row; - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - - /* Read the data into a virtual array in input-file row order. */ - for (row = 0; row < cinfo->image_height; row++) { - if (progress != NULL) { - progress->pub.pass_counter = (long) row; - progress->pub.pass_limit = (long) cinfo->image_height; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } - source->pub.buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, source->whole_image, row, (JDIMENSION) 1, TRUE); - (*source->get_pixel_rows) (cinfo, sinfo); - } - if (progress != NULL) - progress->completed_extra_passes++; - - /* Set up to read from the virtual array in unscrambled order */ - source->pub.get_pixel_rows = get_memory_row; - source->current_row = 0; - /* And read the first row */ - return get_memory_row(cinfo, sinfo); -} - - -/* - * Read the file header; return image size and component count. - */ - -METHODDEF(void) -start_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - tga_source_ptr source = (tga_source_ptr) sinfo; - U_CHAR targaheader[18]; - int idlen, cmaptype, subtype, flags, interlace_type, components; - unsigned int width, height, maplen; - boolean is_bottom_up; - -#define GET_2B(offset) ((unsigned int) UCH(targaheader[offset]) + \ - (((unsigned int) UCH(targaheader[offset+1])) << 8)) - - if (! ReadOK(source->pub.input_file, targaheader, 18)) - ERREXIT(cinfo, JERR_INPUT_EOF); - - /* Pretend "15-bit" pixels are 16-bit --- we ignore attribute bit anyway */ - if (targaheader[16] == 15) - targaheader[16] = 16; - - idlen = UCH(targaheader[0]); - cmaptype = UCH(targaheader[1]); - subtype = UCH(targaheader[2]); - maplen = GET_2B(5); - width = GET_2B(12); - height = GET_2B(14); - source->pixel_size = UCH(targaheader[16]) >> 3; - flags = UCH(targaheader[17]); /* Image Descriptor byte */ - - is_bottom_up = ((flags & 0x20) == 0); /* bit 5 set => top-down */ - interlace_type = flags >> 6; /* bits 6/7 are interlace code */ - - if (cmaptype > 1 || /* cmaptype must be 0 or 1 */ - width <= 0 || height <= 0 || - source->pixel_size < 1 || source->pixel_size > 4 || - (UCH(targaheader[16]) & 7) != 0 || /* bits/pixel must be multiple of 8 */ - interlace_type != 0) /* currently don't allow interlaced image */ - ERREXIT(cinfo, JERR_TGA_BADPARMS); - - if (subtype > 8) { - /* It's an RLE-coded file */ - source->read_pixel = read_rle_pixel; - source->block_count = source->dup_pixel_count = 0; - subtype -= 8; - } else { - /* Non-RLE file */ - source->read_pixel = read_non_rle_pixel; - } - - /* Now should have subtype 1, 2, or 3 */ - components = 3; /* until proven different */ - cinfo->in_color_space = JCS_RGB; - - switch (subtype) { - case 1: /* Colormapped image */ - if (source->pixel_size == 1 && cmaptype == 1) - source->get_pixel_rows = get_8bit_row; - else - ERREXIT(cinfo, JERR_TGA_BADPARMS); - TRACEMS2(cinfo, 1, JTRC_TGA_MAPPED, width, height); - break; - case 2: /* RGB image */ - switch (source->pixel_size) { - case 2: - source->get_pixel_rows = get_16bit_row; - break; - case 3: - source->get_pixel_rows = get_24bit_row; - break; - case 4: - source->get_pixel_rows = get_32bit_row; - break; - default: - ERREXIT(cinfo, JERR_TGA_BADPARMS); - } - TRACEMS2(cinfo, 1, JTRC_TGA, width, height); - break; - case 3: /* Grayscale image */ - components = 1; - cinfo->in_color_space = JCS_GRAYSCALE; - if (source->pixel_size == 1) - source->get_pixel_rows = get_8bit_gray_row; - else - ERREXIT(cinfo, JERR_TGA_BADPARMS); - TRACEMS2(cinfo, 1, JTRC_TGA_GRAY, width, height); - break; - default: - ERREXIT(cinfo, JERR_TGA_BADPARMS); - } - - if (is_bottom_up) { - /* Create a virtual array to buffer the upside-down image. */ - source->whole_image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - (JDIMENSION) width * components, (JDIMENSION) height, (JDIMENSION) 1); - if (cinfo->progress != NULL) { - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - progress->total_extra_passes++; /* count file input as separate pass */ - } - /* source->pub.buffer will point to the virtual array. */ - source->pub.buffer_height = 1; /* in case anyone looks at it */ - source->pub.get_pixel_rows = preload_image; - } else { - /* Don't need a virtual array, but do need a one-row input buffer. */ - source->whole_image = NULL; - source->pub.buffer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) width * components, (JDIMENSION) 1); - source->pub.buffer_height = 1; - source->pub.get_pixel_rows = source->get_pixel_rows; - } - - while (idlen--) /* Throw away ID field */ - (void) read_byte(source); - - if (maplen > 0) { - if (maplen > 256 || GET_2B(3) != 0) - ERREXIT(cinfo, JERR_TGA_BADCMAP); - /* Allocate space to store the colormap */ - source->colormap = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (JDIMENSION) maplen, (JDIMENSION) 3); - source->cmap_length = (int) maplen; - /* and read it from the file */ - read_colormap(source, (int) maplen, UCH(targaheader[7])); - } else { - if (cmaptype) /* but you promised a cmap! */ - ERREXIT(cinfo, JERR_TGA_BADPARMS); - source->colormap = NULL; - source->cmap_length = 0; - } - - cinfo->input_components = components; - cinfo->data_precision = 8; - cinfo->image_width = width; - cinfo->image_height = height; -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) -{ - /* no work */ -} - - -/* - * The module selection routine for Targa format input. - */ - -GLOBAL(cjpeg_source_ptr) -jinit_read_targa (j_compress_ptr cinfo) -{ - tga_source_ptr source; - - /* Create module interface object */ - source = (tga_source_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(tga_source_struct)); - source->cinfo = cinfo; /* make back link for subroutines */ - /* Fill in method ptrs, except get_pixel_rows which start_input sets */ - source->pub.start_input = start_input_tga; - source->pub.finish_input = finish_input_tga; - - return &source->pub; -} - -#endif /* TARGA_SUPPORTED */ diff --git a/code/jpeg-9f/transupp.c b/code/jpeg-9f/transupp.c deleted file mode 100644 index 6518936a..00000000 --- a/code/jpeg-9f/transupp.c +++ /dev/null @@ -1,2433 +0,0 @@ -/* - * transupp.c - * - * Copyright (C) 1997-2023, Thomas G. Lane, Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains image transformation routines and other utility code - * used by the jpegtran sample application. These are NOT part of the core - * JPEG library. But we keep these routines separate from jpegtran.c to - * ease the task of maintaining jpegtran-like programs that have other user - * interfaces. - */ - -/* Although this file really shouldn't have access to the library internals, - * it's helpful to let it call jround_up() and jcopy_block_row(). - * Also, the (switchable) virtual memory adaptation code for - * the drop feature has dependencies on library internals. - */ -#define JPEG_INTERNALS - -#include "jinclude.h" -#include "jpeglib.h" -#include "transupp.h" /* My own external interface */ -#include /* to declare isdigit() */ - - -#if TRANSFORMS_SUPPORTED - -/* - * Lossless image transformation routines. These routines work on DCT - * coefficient arrays and thus do not require any lossy decompression - * or recompression of the image. - * Thanks to Guido Vollbeding for the initial design and code of this feature, - * and to Ben Jackson for introducing the cropping feature. - * - * Horizontal flipping is done in-place, using a single top-to-bottom - * pass through the virtual source array. It will thus be much the - * fastest option for images larger than main memory. - * - * The other routines require a set of destination virtual arrays, so they - * need twice as much memory as jpegtran normally does. The destination - * arrays are always written in normal scan order (top to bottom) because - * the virtual array manager expects this. The source arrays will be scanned - * in the corresponding order, which means multiple passes through the source - * arrays for most of the transforms. That could result in much thrashing - * if the image is larger than main memory. - * - * If cropping or trimming is involved, the destination arrays may be smaller - * than the source arrays. Note it is not possible to do horizontal flip - * in-place when a nonzero Y crop offset is specified, since we'd have to move - * data from one block row to another but the virtual array manager doesn't - * guarantee we can touch more than one row at a time. So in that case, - * we have to use a separate destination array. - * - * Some notes about the operating environment of the individual transform - * routines: - * 1. Both the source and destination virtual arrays are allocated from the - * source JPEG object, and therefore should be manipulated by calling the - * source's memory manager. - * 2. The destination's component count should be used. It may be smaller - * than the source's when forcing to grayscale. - * 3. Likewise the destination's sampling factors should be used. When - * forcing to grayscale the destination's sampling factors will be all 1, - * and we may as well take that as the effective iMCU size. - * 4. When "trim" is in effect, the destination's dimensions will be the - * trimmed values but the source's will be untrimmed. - * 5. When "crop" is in effect, the destination's dimensions will be the - * cropped values but the source's will be uncropped. Each transform - * routine is responsible for picking up source data starting at the - * correct X and Y offset for the crop region. (The X and Y offsets - * passed to the transform routines are measured in iMCU blocks of the - * destination.) - * 6. All the routines assume that the source and destination buffers are - * padded out to a full iMCU boundary. This is true, although for the - * source buffer it is an undocumented property of jdcoefct.c. - */ - - -/* Drop code may be used with or without virtual memory adaptation code. - * This code has some dependencies on internal library behavior, so you - * may choose to disable it. For example, it doesn't make a difference - * if you only use jmemnobs anyway. - */ -#ifndef DROP_REQUEST_FROM_SRC -#define DROP_REQUEST_FROM_SRC 1 /* 0 disables adaptation */ -#endif - - -#if DROP_REQUEST_FROM_SRC -/* Force jpeg_read_coefficients to request - * the virtual coefficient arrays from - * the source decompression object. - */ -METHODDEF(jvirt_barray_ptr) -drop_request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, - JDIMENSION blocksperrow, JDIMENSION numrows, - JDIMENSION maxaccess) -{ - j_common_ptr srcinfo = (j_common_ptr) cinfo->client_data; - - return (*srcinfo->mem->request_virt_barray) - (srcinfo, pool_id, pre_zero, - blocksperrow, numrows, maxaccess); -} - - -/* Force jpeg_read_coefficients to return - * after requesting and before accessing - * the virtual coefficient arrays. - */ -METHODDEF(int) -drop_consume_input (j_decompress_ptr cinfo) -{ - return JPEG_SUSPENDED; -} - - -METHODDEF(void) -drop_start_input_pass (j_decompress_ptr cinfo) -{ - cinfo->inputctl->consume_input = drop_consume_input; -} - - -LOCAL(void) -drop_request_from_src (j_decompress_ptr dropinfo, j_decompress_ptr srcinfo) -{ - void *save_client_data; - JMETHOD(jvirt_barray_ptr, save_request_virt_barray, - (j_common_ptr cinfo, int pool_id, boolean pre_zero, - JDIMENSION blocksperrow, JDIMENSION numrows, JDIMENSION maxaccess)); - JMETHOD(void, save_start_input_pass, (j_decompress_ptr cinfo)); - - /* Set custom method pointers, save original pointers */ - save_client_data = dropinfo->client_data; - dropinfo->client_data = (void *) srcinfo; - save_request_virt_barray = dropinfo->mem->request_virt_barray; - dropinfo->mem->request_virt_barray = drop_request_virt_barray; - save_start_input_pass = dropinfo->inputctl->start_input_pass; - dropinfo->inputctl->start_input_pass = drop_start_input_pass; - - /* Execute only initialization part. - * Requested coefficient arrays will be realized later by the srcinfo object. - * Next call to the same function will then do the actual data reading. - * NB: since we request the coefficient arrays from another object, - * the inherent realization call is effectively a no-op. - */ - (void) jpeg_read_coefficients(dropinfo); - - /* Reset method pointers */ - dropinfo->client_data = save_client_data; - dropinfo->mem->request_virt_barray = save_request_virt_barray; - dropinfo->inputctl->start_input_pass = save_start_input_pass; - /* Do input initialization for first scan now, - * which also resets the consume_input method. - */ - (*save_start_input_pass)(dropinfo); -} -#endif /* DROP_REQUEST_FROM_SRC */ - - -LOCAL(void) -dequant_comp (j_decompress_ptr cinfo, jpeg_component_info *compptr, - jvirt_barray_ptr coef_array, JQUANT_TBL *qtblptr1) -{ - JDIMENSION blk_x, blk_y; - int offset_y, k; - JQUANT_TBL *qtblptr; - JBLOCKARRAY buffer; - JBLOCKROW block; - JCOEFPTR ptr; - - qtblptr = compptr->quant_table; - for (blk_y = 0; blk_y < compptr->height_in_blocks; - blk_y += compptr->v_samp_factor) { - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef_array, blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - block = buffer[offset_y]; - for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) { - ptr = block[blk_x]; - for (k = 0; k < DCTSIZE2; k++) - if (qtblptr->quantval[k] != qtblptr1->quantval[k]) - ptr[k] *= qtblptr->quantval[k] / qtblptr1->quantval[k]; - } - } - } -} - - -LOCAL(void) -requant_comp (j_decompress_ptr cinfo, jpeg_component_info *compptr, - jvirt_barray_ptr coef_array, JQUANT_TBL *qtblptr1) -{ - JDIMENSION blk_x, blk_y; - int offset_y, k, temp, qval; - JQUANT_TBL *qtblptr; - JBLOCKARRAY buffer; - JBLOCKROW block; - JCOEFPTR ptr; - - qtblptr = compptr->quant_table; - for (blk_y = 0; blk_y < compptr->height_in_blocks; - blk_y += compptr->v_samp_factor) { - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef_array, blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - block = buffer[offset_y]; - for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) { - ptr = block[blk_x]; - for (k = 0; k < DCTSIZE2; k++) { - qval = qtblptr1->quantval[k]; - if (qval == 0) continue; - temp = qtblptr->quantval[k]; - if (temp == qval) continue; - temp *= ptr[k]; - /* The following quantization code is a copy from jcdctmgr.c */ -#ifdef FAST_DIVIDE -#define DIVIDE_BY(a,b) a /= b -#else -#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0 -#endif - if (temp < 0) { - temp = -temp; - temp += qval>>1; /* for rounding */ - DIVIDE_BY(temp, qval); - temp = -temp; - } else { - temp += qval>>1; /* for rounding */ - DIVIDE_BY(temp, qval); - } - ptr[k] = (JCOEF) temp; - } - } - } - } -} - - -/* Calculate largest common denominator with Euclid's algorithm. - */ -LOCAL(JCOEF) -largest_common_denominator(JCOEF a, JCOEF b) -{ - JCOEF c; - - while (b) { - c = a % b; - a = b; - b = c; - } - - return a; -} - - -LOCAL(void) -adjust_quant(j_decompress_ptr srcinfo, jvirt_barray_ptr *src_coef_arrays, - j_decompress_ptr dropinfo, jvirt_barray_ptr *drop_coef_arrays, - boolean trim, j_compress_ptr dstinfo) -{ - jpeg_component_info *compptr1, *compptr2; - JQUANT_TBL *qtblptr1, *qtblptr2, *qtblptr3; - int ci, k; - - for (ci = 0; ci < dstinfo->num_components && - ci < dropinfo->num_components; ci++) { - compptr1 = srcinfo->comp_info + ci; - compptr2 = dropinfo->comp_info + ci; - qtblptr1 = compptr1->quant_table; - qtblptr2 = compptr2->quant_table; - for (k = 0; k < DCTSIZE2; k++) { - if (qtblptr1->quantval[k] != qtblptr2->quantval[k]) { - if (trim) - requant_comp(dropinfo, compptr2, drop_coef_arrays[ci], qtblptr1); - else { - qtblptr3 = dstinfo->quant_tbl_ptrs[compptr1->quant_tbl_no]; - for (k = 0; k < DCTSIZE2; k++) - if (qtblptr1->quantval[k] != qtblptr2->quantval[k]) - qtblptr3->quantval[k] = largest_common_denominator - (qtblptr1->quantval[k], qtblptr2->quantval[k]); - dequant_comp(srcinfo, compptr1, src_coef_arrays[ci], qtblptr3); - dequant_comp(dropinfo, compptr2, drop_coef_arrays[ci], qtblptr3); - } - break; - } - } - } -} - - -LOCAL(void) -do_drop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - j_decompress_ptr dropinfo, jvirt_barray_ptr *drop_coef_arrays, - JDIMENSION drop_width, JDIMENSION drop_height) -/* Drop. If the dropinfo component number is smaller than the destination's, - * we fill in the remaining components with zero. This provides the feature - * of dropping grayscale into (arbitrarily sampled) color images. - */ -{ - JDIMENSION comp_width, comp_height; - JDIMENSION blk_y, x_drop_blocks, y_drop_blocks; - int ci, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - jpeg_component_info *compptr; - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = drop_width * compptr->h_samp_factor; - comp_height = drop_height * compptr->v_samp_factor; - x_drop_blocks = x_crop_offset * compptr->h_samp_factor; - y_drop_blocks = y_crop_offset * compptr->v_samp_factor; - for (blk_y = 0; blk_y < comp_height; blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y + y_drop_blocks, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (ci < dropinfo->num_components) { -#if DROP_REQUEST_FROM_SRC - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, drop_coef_arrays[ci], blk_y, -#else - src_buffer = (*dropinfo->mem->access_virt_barray) - ((j_common_ptr) dropinfo, drop_coef_arrays[ci], blk_y, -#endif - (JDIMENSION) compptr->v_samp_factor, FALSE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - jcopy_block_row(src_buffer[offset_y], - dst_buffer[offset_y] + x_drop_blocks, - comp_width); - } - } else { - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - FMEMZERO(dst_buffer[offset_y] + x_drop_blocks, - comp_width * SIZEOF(JBLOCK)); - } - } - } - } -} - - -LOCAL(void) -do_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Crop. This is only used when no rotate/flip is requested with the crop. */ -{ - JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - jpeg_component_info *compptr; - - /* We simply have to copy the right amount of data (the destination's - * image size) starting at the given X and Y offsets in the source. - */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, - dst_buffer[offset_y], - compptr->width_in_blocks); - } - } - } -} - - -LOCAL(void) -do_crop_ext_zero (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Crop. This is only used when no rotate/flip is requested with the crop. - * Extension: If the destination size is larger than the source, we fill in - * the extra area with zero (neutral gray). Note we also have to zero partial - * iMCUs at the right and bottom edge of the source image area in this case. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height; - JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->output_width / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - MCU_rows = srcinfo->output_height / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (dstinfo->jpeg_height > srcinfo->output_height) { - if (dst_blk_y < y_crop_blocks || - dst_blk_y >= y_crop_blocks + comp_height) { - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - FMEMZERO(dst_buffer[offset_y], - compptr->width_in_blocks * SIZEOF(JBLOCK)); - } - continue; - } - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y - y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (dstinfo->jpeg_width > srcinfo->output_width) { - if (x_crop_blocks > 0) { - FMEMZERO(dst_buffer[offset_y], - x_crop_blocks * SIZEOF(JBLOCK)); - } - jcopy_block_row(src_buffer[offset_y], - dst_buffer[offset_y] + x_crop_blocks, - comp_width); - if (compptr->width_in_blocks > x_crop_blocks + comp_width) { - FMEMZERO(dst_buffer[offset_y] + - x_crop_blocks + comp_width, - (compptr->width_in_blocks - - x_crop_blocks - comp_width) * SIZEOF(JBLOCK)); - } - } else { - jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, - dst_buffer[offset_y], - compptr->width_in_blocks); - } - } - } - } -} - - -LOCAL(void) -do_crop_ext_flat (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Crop. This is only used when no rotate/flip is requested with the crop. - * Extension: The destination width is larger than the source and we fill in - * the extra area with the DC of the adjacent block. Note we also have to - * fill partial iMCUs at the right and bottom edge of the source image area - * in this case. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height; - JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, offset_y; - JCOEF dc; - JBLOCKARRAY src_buffer, dst_buffer; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->output_width / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - MCU_rows = srcinfo->output_height / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (dstinfo->jpeg_height > srcinfo->output_height) { - if (dst_blk_y < y_crop_blocks || - dst_blk_y >= y_crop_blocks + comp_height) { - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - FMEMZERO(dst_buffer[offset_y], - compptr->width_in_blocks * SIZEOF(JBLOCK)); - } - continue; - } - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y - y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (x_crop_blocks > 0) { - FMEMZERO(dst_buffer[offset_y], - x_crop_blocks * SIZEOF(JBLOCK)); - dc = src_buffer[offset_y][0][0]; - for (dst_blk_x = 0; dst_blk_x < x_crop_blocks; dst_blk_x++) { - dst_buffer[offset_y][dst_blk_x][0] = dc; - } - } - jcopy_block_row(src_buffer[offset_y], - dst_buffer[offset_y] + x_crop_blocks, - comp_width); - if (compptr->width_in_blocks > x_crop_blocks + comp_width) { - FMEMZERO(dst_buffer[offset_y] + - x_crop_blocks + comp_width, - (compptr->width_in_blocks - - x_crop_blocks - comp_width) * SIZEOF(JBLOCK)); - dc = src_buffer[offset_y][comp_width - 1][0]; - for (dst_blk_x = x_crop_blocks + comp_width; - dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - dst_buffer[offset_y][dst_blk_x][0] = dc; - } - } - } - } - } -} - - -LOCAL(void) -do_crop_ext_reflect (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Crop. This is only used when no rotate/flip is requested with the crop. - * Extension: The destination width is larger than the source and we fill in - * the extra area with repeated reflections of the source region. Note we - * also have to fill partial iMCUs at the right and bottom edge of the source - * image area in this case. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, src_blk_x; - JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, k, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->output_width / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - MCU_rows = srcinfo->output_height / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (dstinfo->jpeg_height > srcinfo->output_height) { - if (dst_blk_y < y_crop_blocks || - dst_blk_y >= y_crop_blocks + comp_height) { - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - FMEMZERO(dst_buffer[offset_y], - compptr->width_in_blocks * SIZEOF(JBLOCK)); - } - continue; - } - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y - y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - /* Copy source region */ - jcopy_block_row(src_buffer[offset_y], - dst_buffer[offset_y] + x_crop_blocks, - comp_width); - if (x_crop_blocks > 0) { - /* Reflect to left */ - dst_row_ptr = dst_buffer[offset_y] + x_crop_blocks; - for (dst_blk_x = x_crop_blocks; dst_blk_x > 0;) { - src_row_ptr = dst_row_ptr; /* (re)set axis of reflection */ - for (src_blk_x = comp_width; src_blk_x > 0 && dst_blk_x > 0; - src_blk_x--, dst_blk_x--) { - dst_ptr = *--dst_row_ptr; /* destination goes left */ - src_ptr = *src_row_ptr++; /* source goes right */ - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - *dst_ptr++ = *src_ptr++; /* copy even column */ - *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ - } - } - } - } - if (compptr->width_in_blocks > x_crop_blocks + comp_width) { - /* Reflect to right */ - dst_row_ptr = dst_buffer[offset_y] + x_crop_blocks + comp_width; - for (dst_blk_x = compptr->width_in_blocks - x_crop_blocks - comp_width; - dst_blk_x > 0;) { - src_row_ptr = dst_row_ptr; /* (re)set axis of reflection */ - for (src_blk_x = comp_width; src_blk_x > 0 && dst_blk_x > 0; - src_blk_x--, dst_blk_x--) { - dst_ptr = *dst_row_ptr++; /* destination goes right */ - src_ptr = *--src_row_ptr; /* source goes left */ - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - *dst_ptr++ = *src_ptr++; /* copy even column */ - *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ - } - } - } - } - } - } - } -} - - -LOCAL(void) -do_wipe (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - JDIMENSION drop_width, JDIMENSION drop_height) -/* Wipe - drop content of specified area, fill with zero (neutral gray) */ -{ - JDIMENSION x_wipe_blocks, wipe_width; - JDIMENSION y_wipe_blocks, wipe_bottom; - int ci, offset_y; - JBLOCKARRAY buffer; - jpeg_component_info *compptr; - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_wipe_blocks = x_crop_offset * compptr->h_samp_factor; - wipe_width = drop_width * compptr->h_samp_factor; - y_wipe_blocks = y_crop_offset * compptr->v_samp_factor; - wipe_bottom = drop_height * compptr->v_samp_factor + y_wipe_blocks; - for (; y_wipe_blocks < wipe_bottom; - y_wipe_blocks += compptr->v_samp_factor) { - buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], y_wipe_blocks, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - FMEMZERO(buffer[offset_y] + x_wipe_blocks, - wipe_width * SIZEOF(JBLOCK)); - } - } - } -} - - -LOCAL(void) -do_flatten (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - JDIMENSION drop_width, JDIMENSION drop_height) -/* Flatten - drop content of specified area, similar to wipe, - * but fill with average of adjacent blocks, instead of zero. - */ -{ - JDIMENSION x_wipe_blocks, wipe_width, wipe_right; - JDIMENSION y_wipe_blocks, wipe_bottom, blk_x; - int ci, offset_y, dc_left_value, dc_right_value, average; - JBLOCKARRAY buffer; - jpeg_component_info *compptr; - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_wipe_blocks = x_crop_offset * compptr->h_samp_factor; - wipe_width = drop_width * compptr->h_samp_factor; - wipe_right = wipe_width + x_wipe_blocks; - y_wipe_blocks = y_crop_offset * compptr->v_samp_factor; - wipe_bottom = drop_height * compptr->v_samp_factor + y_wipe_blocks; - for (; y_wipe_blocks < wipe_bottom; - y_wipe_blocks += compptr->v_samp_factor) { - buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], y_wipe_blocks, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - FMEMZERO(buffer[offset_y] + x_wipe_blocks, - wipe_width * SIZEOF(JBLOCK)); - if (x_wipe_blocks > 0) { - dc_left_value = buffer[offset_y][x_wipe_blocks - 1][0]; - if (wipe_right < compptr->width_in_blocks) { - dc_right_value = buffer[offset_y][wipe_right][0]; - average = (dc_left_value + dc_right_value) >> 1; - } else { - average = dc_left_value; - } - } else if (wipe_right < compptr->width_in_blocks) { - average = buffer[offset_y][wipe_right][0]; - } else continue; - for (blk_x = x_wipe_blocks; blk_x < wipe_right; blk_x++) { - buffer[offset_y][blk_x][0] = (JCOEF) average; - } - } - } - } -} - - -LOCAL(void) -do_reflect (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - JDIMENSION drop_width, JDIMENSION drop_height) -/* Reflect - drop content of specified area, similar to wipe, but - * fill with repeated reflections of the outside area, instead of zero. - * NB: y_crop_offset is assumed to be zero. - */ -{ - JDIMENSION x_wipe_blocks, wipe_width; - JDIMENSION y_wipe_blocks, wipe_bottom; - JDIMENSION src_blk_x, dst_blk_x; - int ci, k, offset_y; - JBLOCKARRAY buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_wipe_blocks = x_crop_offset * compptr->h_samp_factor; - wipe_width = drop_width * compptr->h_samp_factor; - wipe_bottom = drop_height * compptr->v_samp_factor; - for (y_wipe_blocks = 0; y_wipe_blocks < wipe_bottom; - y_wipe_blocks += compptr->v_samp_factor) { - buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], y_wipe_blocks, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (x_wipe_blocks > 0) { - /* Reflect from left */ - dst_row_ptr = buffer[offset_y] + x_wipe_blocks; - for (dst_blk_x = wipe_width; dst_blk_x > 0;) { - src_row_ptr = dst_row_ptr; /* (re)set axis of reflection */ - for (src_blk_x = x_wipe_blocks; - src_blk_x > 0 && dst_blk_x > 0; src_blk_x--, dst_blk_x--) { - dst_ptr = *dst_row_ptr++; /* destination goes right */ - src_ptr = *--src_row_ptr; /* source goes left */ - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - *dst_ptr++ = *src_ptr++; /* copy even column */ - *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ - } - } - } - } else if (compptr->width_in_blocks > x_wipe_blocks + wipe_width) { - /* Reflect from right */ - dst_row_ptr = buffer[offset_y] + x_wipe_blocks + wipe_width; - for (dst_blk_x = wipe_width; dst_blk_x > 0;) { - src_row_ptr = dst_row_ptr; /* (re)set axis of reflection */ - src_blk_x = compptr->width_in_blocks - x_wipe_blocks - wipe_width; - for (; src_blk_x > 0 && dst_blk_x > 0; src_blk_x--, dst_blk_x--) { - dst_ptr = *--dst_row_ptr; /* destination goes left */ - src_ptr = *src_row_ptr++; /* source goes right */ - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - *dst_ptr++ = *src_ptr++; /* copy even column */ - *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ - } - } - } - } else { - FMEMZERO(buffer[offset_y] + x_wipe_blocks, - wipe_width * SIZEOF(JBLOCK)); - } - } - } - } -} - - -LOCAL(void) -do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, - jvirt_barray_ptr *src_coef_arrays) -/* Horizontal flip; done in-place, so no separate dest array is required. - * NB: this only works when y_crop_offset is zero. - */ -{ - JDIMENSION MCU_cols, comp_width, blk_x, blk_y, x_crop_blocks; - int ci, k, offset_y; - JBLOCKARRAY buffer; - JCOEFPTR ptr1, ptr2; - JCOEF temp1, temp2; - jpeg_component_info *compptr; - - /* Horizontal mirroring of DCT blocks is accomplished by swapping - * pairs of blocks in-place. Within a DCT block, we perform horizontal - * mirroring by changing the signs of odd-numbered columns. - * Partial iMCUs at the right edge are left untouched. - */ - MCU_cols = srcinfo->output_width / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - for (blk_y = 0; blk_y < compptr->height_in_blocks; - blk_y += compptr->v_samp_factor) { - buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - /* Do the mirroring */ - for (blk_x = 0; blk_x * 2 < comp_width; blk_x++) { - ptr1 = buffer[offset_y][blk_x]; - ptr2 = buffer[offset_y][comp_width - blk_x - 1]; - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - temp1 = *ptr1; /* swap even column */ - temp2 = *ptr2; - *ptr1++ = temp2; - *ptr2++ = temp1; - temp1 = *ptr1; /* swap odd column with sign change */ - temp2 = *ptr2; - *ptr1++ = -temp2; - *ptr2++ = -temp1; - } - } - if (x_crop_blocks > 0) { - /* Now left-justify the portion of the data to be kept. - * We can't use a single jcopy_block_row() call because that routine - * depends on memcpy(), whose behavior is unspecified for overlapping - * source and destination areas. Sigh. - */ - for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) { - jcopy_block_row(buffer[offset_y] + blk_x + x_crop_blocks, - buffer[offset_y] + blk_x, - (JDIMENSION) 1); - } - } - } - } - } -} - - -LOCAL(void) -do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Horizontal flip in general cropping case */ -{ - JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, k, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Here we must output into a separate array because we can't touch - * different rows of a single virtual array simultaneously. Otherwise, - * this is essentially the same as the routine above. - */ - MCU_cols = srcinfo->output_width / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[offset_y]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Do the mirrorable blocks */ - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - *dst_ptr++ = *src_ptr++; /* copy even column */ - *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ - } - } else { - /* Copy last partial block(s) verbatim */ - jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks, - dst_row_ptr + dst_blk_x, - (JDIMENSION) 1); - } - } - } - } - } -} - - -LOCAL(void) -do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Vertical flip */ -{ - JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* We output into a separate array because we can't touch different - * rows of the source virtual array simultaneously. Otherwise, this - * is a pretty straightforward analog of horizontal flip. - * Within a DCT block, vertical mirroring is done by changing the signs - * of odd-numbered rows. - * Partial iMCUs at the bottom edge are copied verbatim. - */ - MCU_rows = srcinfo->output_height / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_height - y_crop_blocks - dst_blk_y - - (JDIMENSION) compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - /* Bottom-edge blocks will be copied verbatim. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; - src_row_ptr += x_crop_blocks; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[dst_blk_x]; - for (i = 0; i < DCTSIZE; i += 2) { - /* copy even row */ - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = *src_ptr++; - /* copy odd row with sign change */ - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = - *src_ptr++; - } - } - } else { - /* Just copy row verbatim. */ - jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, - dst_buffer[offset_y], - compptr->width_in_blocks); - } - } - } - } -} - - -LOCAL(void) -do_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Transpose source into destination */ -{ - JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Transposing pixels within a block just requires transposing the - * DCT coefficients. - * Partial iMCUs at the edges require no special treatment; we simply - * process all the available DCT blocks for every component. - */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - src_ptr = src_buffer[offset_x][dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } -} - - -LOCAL(void) -do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 90 degree rotation is equivalent to - * 1. Transposing the image; - * 2. Horizontal mirroring. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Because of the horizontal mirror step, we can't process partial iMCUs - * at the (output) right edge properly. They just get transposed and - * not mirrored. - */ - MCU_cols = srcinfo->output_height / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_width - x_crop_blocks - dst_blk_x - - (JDIMENSION) compptr->h_samp_factor, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } else { - /* Edge blocks are transposed but not mirrored. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - i++; - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } else { - /* Edge blocks are transposed but not mirrored. */ - src_ptr = src_buffer[offset_x] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } -} - - -LOCAL(void) -do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 270 degree rotation is equivalent to - * 1. Horizontal mirroring; - * 2. Transposing the image. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Because of the horizontal mirror step, we can't process partial iMCUs - * at the (output) bottom edge properly. They just get transposed and - * not mirrored. - */ - MCU_rows = srcinfo->output_width / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[offset_x] - [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } - } else { - /* Edge blocks are transposed but not mirrored. */ - src_ptr = src_buffer[offset_x] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } -} - - -LOCAL(void) -do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 180 degree rotation is equivalent to - * 1. Vertical mirroring; - * 2. Horizontal mirroring. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->output_width / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - MCU_rows = srcinfo->output_height / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the vertically mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_height - y_crop_blocks - dst_blk_y - - (JDIMENSION) compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - /* Bottom-edge rows are only mirrored horizontally. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - dst_row_ptr = dst_buffer[offset_y]; - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Process the blocks that can be mirrored both ways. */ - src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; - for (i = 0; i < DCTSIZE; i += 2) { - /* For even row, negate every odd column. */ - for (j = 0; j < DCTSIZE; j += 2) { - *dst_ptr++ = *src_ptr++; - *dst_ptr++ = - *src_ptr++; - } - /* For odd row, negate every even column. */ - for (j = 0; j < DCTSIZE; j += 2) { - *dst_ptr++ = - *src_ptr++; - *dst_ptr++ = *src_ptr++; - } - } - } else { - /* Any remaining right-edge blocks are only mirrored vertically. */ - src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x]; - for (i = 0; i < DCTSIZE; i += 2) { - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = *src_ptr++; - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = - *src_ptr++; - } - } - } - } else { - /* Remaining rows are just mirrored horizontally. */ - src_row_ptr = src_buffer[offset_y]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Process the blocks that can be mirrored. */ - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; - for (i = 0; i < DCTSIZE2; i += 2) { - *dst_ptr++ = *src_ptr++; - *dst_ptr++ = - *src_ptr++; - } - } else { - /* Any remaining right-edge blocks are only copied. */ - jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks, - dst_row_ptr + dst_blk_x, - (JDIMENSION) 1); - } - } - } - } - } - } -} - - -LOCAL(void) -do_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Transverse transpose is equivalent to - * 1. 180 degree rotation; - * 2. Transposition; - * or - * 1. Horizontal mirroring; - * 2. Transposition; - * 3. Horizontal mirroring. - * These steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->output_height / - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); - MCU_rows = srcinfo->output_width / - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_width - x_crop_blocks - dst_blk_x - - (JDIMENSION) compptr->h_samp_factor, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } else { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (y_crop_blocks + dst_blk_y < comp_height) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] - [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - i++; - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } else { - /* Right-edge blocks are mirrored in y only */ - src_ptr = src_buffer[offset_x] - [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } - } - } else { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Bottom-edge blocks are mirrored in x only */ - src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - i++; - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } else { - /* At lower right corner, just transpose, no mirroring */ - src_ptr = src_buffer[offset_x] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } - } -} - - -/* Parse an unsigned integer: subroutine for jtransform_parse_crop_spec. - * Returns TRUE if valid integer found, FALSE if not. - * *strptr is advanced over the digit string, and *result is set to its value. - */ - -LOCAL(boolean) -jt_read_integer (const char ** strptr, JDIMENSION * result) -{ - const char * ptr = *strptr; - JDIMENSION val = 0; - - for (; isdigit(*ptr); ptr++) { - val = val * 10 + (JDIMENSION) (*ptr - '0'); - } - *result = val; - if (ptr == *strptr) - return FALSE; /* oops, no digits */ - *strptr = ptr; - return TRUE; -} - - -/* Parse a crop specification (written in X11 geometry style). - * The routine returns TRUE if the spec string is valid, FALSE if not. - * - * The crop spec string should have the format - * [{fr}]x[{fr}]{+-}{+-} - * where width, height, xoffset, and yoffset are unsigned integers. - * Each of the elements can be omitted to indicate a default value. - * (A weakness of this style is that it is not possible to omit xoffset - * while specifying yoffset, since they look alike.) - * - * This code is loosely based on XParseGeometry from the X11 distribution. - */ - -GLOBAL(boolean) -jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec) -{ - info->crop = FALSE; - info->crop_width_set = JCROP_UNSET; - info->crop_height_set = JCROP_UNSET; - info->crop_xoffset_set = JCROP_UNSET; - info->crop_yoffset_set = JCROP_UNSET; - - if (isdigit(*spec)) { - /* fetch width */ - if (! jt_read_integer(&spec, &info->crop_width)) - return FALSE; - if (*spec == 'f' || *spec == 'F') { - spec++; - info->crop_width_set = JCROP_FORCE; - } else if (*spec == 'r' || *spec == 'R') { - spec++; - info->crop_width_set = JCROP_REFLECT; - } else - info->crop_width_set = JCROP_POS; - } - if (*spec == 'x' || *spec == 'X') { - /* fetch height */ - spec++; - if (! jt_read_integer(&spec, &info->crop_height)) - return FALSE; - if (*spec == 'f' || *spec == 'F') { - spec++; - info->crop_height_set = JCROP_FORCE; - } else if (*spec == 'r' || *spec == 'R') { - spec++; - info->crop_height_set = JCROP_REFLECT; - } else - info->crop_height_set = JCROP_POS; - } - if (*spec == '+' || *spec == '-') { - /* fetch xoffset */ - info->crop_xoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS; - spec++; - if (! jt_read_integer(&spec, &info->crop_xoffset)) - return FALSE; - } - if (*spec == '+' || *spec == '-') { - /* fetch yoffset */ - info->crop_yoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS; - spec++; - if (! jt_read_integer(&spec, &info->crop_yoffset)) - return FALSE; - } - /* We had better have gotten to the end of the string. */ - if (*spec != '\0') - return FALSE; - info->crop = TRUE; - return TRUE; -} - - -/* Trim off any partial iMCUs on the indicated destination edge */ - -LOCAL(void) -trim_right_edge (jpeg_transform_info *info, JDIMENSION full_width) -{ - JDIMENSION MCU_cols; - - MCU_cols = info->output_width / info->iMCU_sample_width; - if (MCU_cols > 0 && info->x_crop_offset + MCU_cols == - full_width / info->iMCU_sample_width) - info->output_width = MCU_cols * info->iMCU_sample_width; -} - -LOCAL(void) -trim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height) -{ - JDIMENSION MCU_rows; - - MCU_rows = info->output_height / info->iMCU_sample_height; - if (MCU_rows > 0 && info->y_crop_offset + MCU_rows == - full_height / info->iMCU_sample_height) - info->output_height = MCU_rows * info->iMCU_sample_height; -} - - -/* Request any required workspace. - * - * This routine figures out the size that the output image will be - * (which implies that all the transform parameters must be set before - * it is called). - * - * We allocate the workspace virtual arrays from the source decompression - * object, so that all the arrays (both the original data and the workspace) - * will be taken into account while making memory management decisions. - * Hence, this routine must be called after jpeg_read_header (which reads - * the image dimensions) and before jpeg_read_coefficients (which realizes - * the source's virtual arrays). - * - * This function returns FALSE right away if -perfect is given - * and transformation is not perfect. Otherwise returns TRUE. - */ - -GLOBAL(boolean) -jtransform_request_workspace (j_decompress_ptr srcinfo, - jpeg_transform_info *info) -{ - jvirt_barray_ptr *coef_arrays; - boolean need_workspace, transpose_it; - jpeg_component_info *compptr; - JDIMENSION xoffset, yoffset, dtemp; - JDIMENSION width_in_iMCUs, height_in_iMCUs; - JDIMENSION width_in_blocks, height_in_blocks; - int itemp, ci, h_samp_factor, v_samp_factor; - - /* Determine number of components in output image */ - if (info->force_grayscale && - (srcinfo->jpeg_color_space == JCS_YCbCr || - srcinfo->jpeg_color_space == JCS_BG_YCC) && - srcinfo->num_components == 3) - /* We'll only process the first component */ - info->num_components = 1; - else - /* Process all the components */ - info->num_components = srcinfo->num_components; - - /* Compute output image dimensions and related values. */ - jpeg_core_output_dimensions(srcinfo); - - /* Return right away if -perfect is given and transformation is not perfect. - */ - if (info->perfect) { - if (info->num_components == 1) { - if (!jtransform_perfect_transform(srcinfo->output_width, - srcinfo->output_height, - srcinfo->min_DCT_h_scaled_size, - srcinfo->min_DCT_v_scaled_size, - info->transform)) - return FALSE; - } else { - if (!jtransform_perfect_transform(srcinfo->output_width, - srcinfo->output_height, - srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size, - srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size, - info->transform)) - return FALSE; - } - } - - /* If there is only one output component, force the iMCU size to be 1; - * else use the source iMCU size. (This allows us to do the right thing - * when reducing color to grayscale, and also provides a handy way of - * cleaning up "funny" grayscale images whose sampling factors are not 1x1.) - */ - switch (info->transform) { - case JXFORM_TRANSPOSE: - case JXFORM_TRANSVERSE: - case JXFORM_ROT_90: - case JXFORM_ROT_270: - info->output_width = srcinfo->output_height; - info->output_height = srcinfo->output_width; - if (info->num_components == 1) { - info->iMCU_sample_width = srcinfo->min_DCT_v_scaled_size; - info->iMCU_sample_height = srcinfo->min_DCT_h_scaled_size; - } else { - info->iMCU_sample_width = - srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size; - info->iMCU_sample_height = - srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size; - } - break; - default: - info->output_width = srcinfo->output_width; - info->output_height = srcinfo->output_height; - if (info->num_components == 1) { - info->iMCU_sample_width = srcinfo->min_DCT_h_scaled_size; - info->iMCU_sample_height = srcinfo->min_DCT_v_scaled_size; - } else { - info->iMCU_sample_width = - srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size; - info->iMCU_sample_height = - srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size; - } - } - - /* If cropping has been requested, compute the crop area's position and - * dimensions, ensuring that its upper left corner falls at an iMCU boundary. - */ - if (info->crop) { - /* Insert default values for unset crop parameters */ - if (info->crop_xoffset_set == JCROP_UNSET) - info->crop_xoffset = 0; /* default to +0 */ - if (info->crop_yoffset_set == JCROP_UNSET) - info->crop_yoffset = 0; /* default to +0 */ - if (info->crop_width_set == JCROP_UNSET) { - if (info->crop_xoffset >= info->output_width) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - info->crop_width = info->output_width - info->crop_xoffset; - } else { - /* Check for crop extension */ - if (info->crop_width > info->output_width) { - /* Crop extension does not work when transforming! */ - if (info->transform != JXFORM_NONE || - info->crop_xoffset >= info->crop_width || - info->crop_xoffset > info->crop_width - info->output_width) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - } else { - if (info->crop_xoffset >= info->output_width || - info->crop_width <= 0 || - info->crop_xoffset > info->output_width - info->crop_width) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - } - } - if (info->crop_height_set == JCROP_UNSET) { - if (info->crop_yoffset >= info->output_height) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - info->crop_height = info->output_height - info->crop_yoffset; - } else { - /* Check for crop extension */ - if (info->crop_height > info->output_height) { - /* Crop extension does not work when transforming! */ - if (info->transform != JXFORM_NONE || - info->crop_yoffset >= info->crop_height || - info->crop_yoffset > info->crop_height - info->output_height) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - } else { - if (info->crop_yoffset >= info->output_height || - info->crop_height <= 0 || - info->crop_yoffset > info->output_height - info->crop_height) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - } - } - /* Convert negative crop offsets into regular offsets */ - if (info->crop_xoffset_set != JCROP_NEG) - xoffset = info->crop_xoffset; - else if (info->crop_width > info->output_width) /* crop extension */ - xoffset = info->crop_width - info->output_width - info->crop_xoffset; - else - xoffset = info->output_width - info->crop_width - info->crop_xoffset; - if (info->crop_yoffset_set != JCROP_NEG) - yoffset = info->crop_yoffset; - else if (info->crop_height > info->output_height) /* crop extension */ - yoffset = info->crop_height - info->output_height - info->crop_yoffset; - else - yoffset = info->output_height - info->crop_height - info->crop_yoffset; - /* Now adjust so that upper left corner falls at an iMCU boundary */ - switch (info->transform) { - case JXFORM_DROP: - /* Ensure the effective drop region will not exceed the requested */ - itemp = info->iMCU_sample_width; - dtemp = itemp - 1 - ((xoffset + itemp - 1) % itemp); - xoffset += dtemp; - if (info->crop_width <= dtemp) - info->drop_width = 0; - else if (xoffset + info->crop_width - dtemp == info->output_width) - /* Matching right edge: include partial iMCU */ - info->drop_width = (info->crop_width - dtemp + itemp - 1) / itemp; - else - info->drop_width = (info->crop_width - dtemp) / itemp; - itemp = info->iMCU_sample_height; - dtemp = itemp - 1 - ((yoffset + itemp - 1) % itemp); - yoffset += dtemp; - if (info->crop_height <= dtemp) - info->drop_height = 0; - else if (yoffset + info->crop_height - dtemp == info->output_height) - /* Matching bottom edge: include partial iMCU */ - info->drop_height = (info->crop_height - dtemp + itemp - 1) / itemp; - else - info->drop_height = (info->crop_height - dtemp) / itemp; - /* Check if sampling factors match for dropping */ - if (info->drop_width != 0 && info->drop_height != 0) - for (ci = 0; ci < info->num_components && - ci < info->drop_ptr->num_components; ci++) { - if (info->drop_ptr->comp_info[ci].h_samp_factor * - srcinfo->max_h_samp_factor != - srcinfo->comp_info[ci].h_samp_factor * - info->drop_ptr->max_h_samp_factor) - ERREXIT6(srcinfo, JERR_BAD_DROP_SAMPLING, ci, - info->drop_ptr->comp_info[ci].h_samp_factor, - info->drop_ptr->max_h_samp_factor, - srcinfo->comp_info[ci].h_samp_factor, - srcinfo->max_h_samp_factor, 'h'); - if (info->drop_ptr->comp_info[ci].v_samp_factor * - srcinfo->max_v_samp_factor != - srcinfo->comp_info[ci].v_samp_factor * - info->drop_ptr->max_v_samp_factor) - ERREXIT6(srcinfo, JERR_BAD_DROP_SAMPLING, ci, - info->drop_ptr->comp_info[ci].v_samp_factor, - info->drop_ptr->max_v_samp_factor, - srcinfo->comp_info[ci].v_samp_factor, - srcinfo->max_v_samp_factor, 'v'); - } - break; - case JXFORM_WIPE: - /* Ensure the effective wipe region will cover the requested */ - info->drop_width = (JDIMENSION) jdiv_round_up - ((long) (info->crop_width + (xoffset % info->iMCU_sample_width)), - (long) info->iMCU_sample_width); - info->drop_height = (JDIMENSION) jdiv_round_up - ((long) (info->crop_height + (yoffset % info->iMCU_sample_height)), - (long) info->iMCU_sample_height); - break; - default: - /* Ensure the effective crop region will cover the requested */ - if (info->crop_width_set == JCROP_FORCE || - info->crop_width > info->output_width) - info->output_width = info->crop_width; - else - info->output_width = - info->crop_width + (xoffset % info->iMCU_sample_width); - if (info->crop_height_set == JCROP_FORCE || - info->crop_height > info->output_height) - info->output_height = info->crop_height; - else - info->output_height = - info->crop_height + (yoffset % info->iMCU_sample_height); - } - /* Save x/y offsets measured in iMCUs */ - info->x_crop_offset = xoffset / info->iMCU_sample_width; - info->y_crop_offset = yoffset / info->iMCU_sample_height; - } else { - info->x_crop_offset = 0; - info->y_crop_offset = 0; - } - - /* Figure out whether we need workspace arrays, - * and if so whether they are transposed relative to the source. - */ - need_workspace = FALSE; - transpose_it = FALSE; - switch (info->transform) { - case JXFORM_NONE: - if (info->x_crop_offset != 0 || info->y_crop_offset != 0 || - info->output_width > srcinfo->output_width || - info->output_height > srcinfo->output_height) - need_workspace = TRUE; - /* No workspace needed if neither cropping nor transforming */ - break; - case JXFORM_FLIP_H: - if (info->trim) - trim_right_edge(info, srcinfo->output_width); - if (info->y_crop_offset != 0) - need_workspace = TRUE; - /* do_flip_h_no_crop doesn't need a workspace array */ - break; - case JXFORM_FLIP_V: - if (info->trim) - trim_bottom_edge(info, srcinfo->output_height); - /* Need workspace arrays having same dimensions as source image. */ - need_workspace = TRUE; - break; - case JXFORM_TRANSPOSE: - /* transpose does NOT have to trim anything */ - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_TRANSVERSE: - if (info->trim) { - trim_right_edge(info, srcinfo->output_height); - trim_bottom_edge(info, srcinfo->output_width); - } - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_ROT_90: - if (info->trim) - trim_right_edge(info, srcinfo->output_height); - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_ROT_180: - if (info->trim) { - trim_right_edge(info, srcinfo->output_width); - trim_bottom_edge(info, srcinfo->output_height); - } - /* Need workspace arrays having same dimensions as source image. */ - need_workspace = TRUE; - break; - case JXFORM_ROT_270: - if (info->trim) - trim_bottom_edge(info, srcinfo->output_width); - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_WIPE: - break; - case JXFORM_DROP: -#if DROP_REQUEST_FROM_SRC - drop_request_from_src(info->drop_ptr, srcinfo); -#endif - break; - } - - /* Allocate workspace if needed. - * Note that we allocate arrays padded out to the next iMCU boundary, - * so that transform routines need not worry about missing edge blocks. - */ - if (need_workspace) { - coef_arrays = (jvirt_barray_ptr *) (*srcinfo->mem->alloc_small) - ((j_common_ptr) srcinfo, JPOOL_IMAGE, - SIZEOF(jvirt_barray_ptr) * info->num_components); - width_in_iMCUs = (JDIMENSION) jdiv_round_up - ((long) info->output_width, (long) info->iMCU_sample_width); - height_in_iMCUs = (JDIMENSION) jdiv_round_up - ((long) info->output_height, (long) info->iMCU_sample_height); - for (ci = 0; ci < info->num_components; ci++) { - compptr = srcinfo->comp_info + ci; - if (info->num_components == 1) { - /* we're going to force samp factors to 1x1 in this case */ - h_samp_factor = v_samp_factor = 1; - } else if (transpose_it) { - h_samp_factor = compptr->v_samp_factor; - v_samp_factor = compptr->h_samp_factor; - } else { - h_samp_factor = compptr->h_samp_factor; - v_samp_factor = compptr->v_samp_factor; - } - width_in_blocks = width_in_iMCUs * h_samp_factor; - height_in_blocks = height_in_iMCUs * v_samp_factor; - coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) - ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, - width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor); - } - info->workspace_coef_arrays = coef_arrays; - } else - info->workspace_coef_arrays = NULL; - - return TRUE; -} - - -/* Transpose destination image parameters */ - -LOCAL(void) -transpose_critical_parameters (j_compress_ptr dstinfo) -{ - int tblno, i, j, ci, itemp; - jpeg_component_info *compptr; - JQUANT_TBL *qtblptr; - JDIMENSION jtemp; - UINT16 qtemp; - - /* Transpose image dimensions */ - jtemp = dstinfo->image_width; - dstinfo->image_width = dstinfo->image_height; - dstinfo->image_height = jtemp; - itemp = dstinfo->min_DCT_h_scaled_size; - dstinfo->min_DCT_h_scaled_size = dstinfo->min_DCT_v_scaled_size; - dstinfo->min_DCT_v_scaled_size = itemp; - - /* Transpose sampling factors */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - itemp = compptr->h_samp_factor; - compptr->h_samp_factor = compptr->v_samp_factor; - compptr->v_samp_factor = itemp; - } - - /* Transpose quantization tables */ - for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { - qtblptr = dstinfo->quant_tbl_ptrs[tblno]; - if (qtblptr != NULL) { - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < i; j++) { - qtemp = qtblptr->quantval[i*DCTSIZE+j]; - qtblptr->quantval[i*DCTSIZE+j] = qtblptr->quantval[j*DCTSIZE+i]; - qtblptr->quantval[j*DCTSIZE+i] = qtemp; - } - } - } - } -} - - -/* Adjust Exif image parameters. - * - * We try to adjust the Tags ExifImageWidth and ExifImageHeight if possible. - */ - -LOCAL(void) -adjust_exif_parameters (JOCTET FAR * data, unsigned int length, - JDIMENSION new_width, JDIMENSION new_height) -{ - boolean is_motorola; /* Flag for byte order */ - unsigned int number_of_tags, tagnum; - unsigned int firstoffset, offset; - JDIMENSION new_value; - - if (length < 12) return; /* Length of an IFD entry */ - - /* Discover byte order */ - if (GETJOCTET(data[0]) == 0x49 && GETJOCTET(data[1]) == 0x49) - is_motorola = FALSE; - else if (GETJOCTET(data[0]) == 0x4D && GETJOCTET(data[1]) == 0x4D) - is_motorola = TRUE; - else - return; - - /* Check Tag Mark */ - if (is_motorola) { - if (GETJOCTET(data[2]) != 0) return; - if (GETJOCTET(data[3]) != 0x2A) return; - } else { - if (GETJOCTET(data[3]) != 0) return; - if (GETJOCTET(data[2]) != 0x2A) return; - } - - /* Get first IFD offset (offset to IFD0) */ - if (is_motorola) { - if (GETJOCTET(data[4]) != 0) return; - if (GETJOCTET(data[5]) != 0) return; - firstoffset = GETJOCTET(data[6]); - firstoffset <<= 8; - firstoffset += GETJOCTET(data[7]); - } else { - if (GETJOCTET(data[7]) != 0) return; - if (GETJOCTET(data[6]) != 0) return; - firstoffset = GETJOCTET(data[5]); - firstoffset <<= 8; - firstoffset += GETJOCTET(data[4]); - } - if (firstoffset > length - 2) return; /* check end of data segment */ - - /* Get the number of directory entries contained in this IFD */ - if (is_motorola) { - number_of_tags = GETJOCTET(data[firstoffset]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[firstoffset+1]); - } else { - number_of_tags = GETJOCTET(data[firstoffset+1]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[firstoffset]); - } - if (number_of_tags == 0) return; - firstoffset += 2; - - /* Search for ExifSubIFD offset Tag in IFD0 */ - for (;;) { - if (firstoffset > length - 12) return; /* check end of data segment */ - /* Get Tag number */ - if (is_motorola) { - tagnum = GETJOCTET(data[firstoffset]); - tagnum <<= 8; - tagnum += GETJOCTET(data[firstoffset+1]); - } else { - tagnum = GETJOCTET(data[firstoffset+1]); - tagnum <<= 8; - tagnum += GETJOCTET(data[firstoffset]); - } - if (tagnum == 0x8769) break; /* found ExifSubIFD offset Tag */ - if (--number_of_tags == 0) return; - firstoffset += 12; - } - - /* Get the ExifSubIFD offset */ - if (is_motorola) { - if (GETJOCTET(data[firstoffset+8]) != 0) return; - if (GETJOCTET(data[firstoffset+9]) != 0) return; - offset = GETJOCTET(data[firstoffset+10]); - offset <<= 8; - offset += GETJOCTET(data[firstoffset+11]); - } else { - if (GETJOCTET(data[firstoffset+11]) != 0) return; - if (GETJOCTET(data[firstoffset+10]) != 0) return; - offset = GETJOCTET(data[firstoffset+9]); - offset <<= 8; - offset += GETJOCTET(data[firstoffset+8]); - } - if (offset > length - 2) return; /* check end of data segment */ - - /* Get the number of directory entries contained in this SubIFD */ - if (is_motorola) { - number_of_tags = GETJOCTET(data[offset]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[offset+1]); - } else { - number_of_tags = GETJOCTET(data[offset+1]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[offset]); - } - if (number_of_tags < 2) return; - offset += 2; - - /* Search for ExifImageWidth and ExifImageHeight Tags in this SubIFD */ - do { - if (offset > length - 12) return; /* check end of data segment */ - /* Get Tag number */ - if (is_motorola) { - tagnum = GETJOCTET(data[offset]); - tagnum <<= 8; - tagnum += GETJOCTET(data[offset+1]); - } else { - tagnum = GETJOCTET(data[offset+1]); - tagnum <<= 8; - tagnum += GETJOCTET(data[offset]); - } - if (tagnum == 0xA002 || tagnum == 0xA003) { - if (tagnum == 0xA002) - new_value = new_width; /* ExifImageWidth Tag */ - else - new_value = new_height; /* ExifImageHeight Tag */ - if (is_motorola) { - data[offset+2] = 0; /* Format = unsigned long (4 octets) */ - data[offset+3] = 4; - data[offset+4] = 0; /* Number Of Components = 1 */ - data[offset+5] = 0; - data[offset+6] = 0; - data[offset+7] = 1; - data[offset+8] = 0; - data[offset+9] = 0; - data[offset+10] = (JOCTET)((new_value >> 8) & 0xFF); - data[offset+11] = (JOCTET)(new_value & 0xFF); - } else { - data[offset+2] = 4; /* Format = unsigned long (4 octets) */ - data[offset+3] = 0; - data[offset+4] = 1; /* Number Of Components = 1 */ - data[offset+5] = 0; - data[offset+6] = 0; - data[offset+7] = 0; - data[offset+8] = (JOCTET)(new_value & 0xFF); - data[offset+9] = (JOCTET)((new_value >> 8) & 0xFF); - data[offset+10] = 0; - data[offset+11] = 0; - } - } - offset += 12; - } while (--number_of_tags); -} - - -/* Adjust output image parameters as needed. - * - * This must be called after jpeg_copy_critical_parameters() - * and before jpeg_write_coefficients(). - * - * The return value is the set of virtual coefficient arrays to be written - * (either the ones allocated by jtransform_request_workspace, or the - * original source data arrays). The caller will need to pass this value - * to jpeg_write_coefficients(). - */ - -GLOBAL(jvirt_barray_ptr *) -jtransform_adjust_parameters (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info) -{ - /* If force-to-grayscale is requested, adjust destination parameters */ - if (info->force_grayscale) { - /* First, ensure we have YCC or grayscale data, and that the source's - * Y channel is full resolution. (No reasonable person would make Y - * be less than full resolution, so actually coping with that case - * isn't worth extra code space. But we check it to avoid crashing.) - */ - if ((((dstinfo->jpeg_color_space == JCS_YCbCr || - dstinfo->jpeg_color_space == JCS_BG_YCC) && - dstinfo->num_components == 3) || - (dstinfo->jpeg_color_space == JCS_GRAYSCALE && - dstinfo->num_components == 1)) && - srcinfo->comp_info[0].h_samp_factor == srcinfo->max_h_samp_factor && - srcinfo->comp_info[0].v_samp_factor == srcinfo->max_v_samp_factor) { - /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed - * properly. Among other things, it sets the target h_samp_factor & - * v_samp_factor to 1, which typically won't match the source. - * We have to preserve the source's quantization table number, however. - */ - int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no; - jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE); - dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no; - } else { - /* Sorry, can't do it */ - ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL); - } - } else if (info->num_components == 1) { - /* For a single-component source, we force the destination sampling factors - * to 1x1, with or without force_grayscale. This is useful because some - * decoders choke on grayscale images with other sampling factors. - */ - dstinfo->comp_info[0].h_samp_factor = 1; - dstinfo->comp_info[0].v_samp_factor = 1; - } - - /* Correct the destination's image dimensions as necessary - * for rotate/flip, resize, and crop operations. - */ - dstinfo->jpeg_width = info->output_width; - dstinfo->jpeg_height = info->output_height; - - /* Transpose destination image parameters, adjust quantization */ - switch (info->transform) { - case JXFORM_TRANSPOSE: - case JXFORM_TRANSVERSE: - case JXFORM_ROT_90: - case JXFORM_ROT_270: - transpose_critical_parameters(dstinfo); - break; - case JXFORM_DROP: - if (info->drop_width != 0 && info->drop_height != 0) - adjust_quant(srcinfo, src_coef_arrays, - info->drop_ptr, info->drop_coef_arrays, - info->trim, dstinfo); - break; - default: - break; - } - - /* Adjust Exif properties */ - if (srcinfo->marker_list != NULL && - srcinfo->marker_list->marker == JPEG_APP0+1 && - srcinfo->marker_list->data_length >= 6 && - GETJOCTET(srcinfo->marker_list->data[0]) == 0x45 && - GETJOCTET(srcinfo->marker_list->data[1]) == 0x78 && - GETJOCTET(srcinfo->marker_list->data[2]) == 0x69 && - GETJOCTET(srcinfo->marker_list->data[3]) == 0x66 && - GETJOCTET(srcinfo->marker_list->data[4]) == 0 && - GETJOCTET(srcinfo->marker_list->data[5]) == 0) { - /* Suppress output of JFIF marker */ - dstinfo->write_JFIF_header = FALSE; - /* Adjust Exif image parameters */ - if (dstinfo->jpeg_width != srcinfo->image_width || - dstinfo->jpeg_height != srcinfo->image_height) - /* Align data segment to start of TIFF structure for parsing */ - adjust_exif_parameters(srcinfo->marker_list->data + 6, - srcinfo->marker_list->data_length - 6, - dstinfo->jpeg_width, dstinfo->jpeg_height); - } - - /* Return the appropriate output data set */ - if (info->workspace_coef_arrays != NULL) - return info->workspace_coef_arrays; - return src_coef_arrays; -} - - -/* Execute the actual transformation, if any. - * - * This must be called *after* jpeg_write_coefficients, because it depends - * on jpeg_write_coefficients to have computed subsidiary values such as - * the per-component width and height fields in the destination object. - * - * Note that some transformations will modify the source data arrays! - */ - -GLOBAL(void) -jtransform_execute_transform (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info) -{ - jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays; - - /* Note: conditions tested here should match those in switch statement - * in jtransform_request_workspace() - */ - switch (info->transform) { - case JXFORM_NONE: - if (info->output_width > srcinfo->output_width || - info->output_height > srcinfo->output_height) { - if (info->output_width > srcinfo->output_width && - info->crop_width_set == JCROP_REFLECT) - do_crop_ext_reflect(srcinfo, dstinfo, - info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - else if (info->output_width > srcinfo->output_width && - info->crop_width_set == JCROP_FORCE) - do_crop_ext_flat(srcinfo, dstinfo, - info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - else - do_crop_ext_zero(srcinfo, dstinfo, - info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - } else if (info->x_crop_offset != 0 || info->y_crop_offset != 0) - do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_FLIP_H: - if (info->y_crop_offset != 0) - do_flip_h(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - else - do_flip_h_no_crop(srcinfo, dstinfo, info->x_crop_offset, - src_coef_arrays); - break; - case JXFORM_FLIP_V: - do_flip_v(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_TRANSPOSE: - do_transpose(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_TRANSVERSE: - do_transverse(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_90: - do_rot_90(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_180: - do_rot_180(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_270: - do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_WIPE: - if (info->crop_width_set == JCROP_REFLECT && - info->y_crop_offset == 0 && info->drop_height == - (JDIMENSION) jdiv_round_up - ((long) info->output_height, (long) info->iMCU_sample_height) && - (info->x_crop_offset == 0 || - info->x_crop_offset + info->drop_width == - (JDIMENSION) jdiv_round_up - ((long) info->output_width, (long) info->iMCU_sample_width))) - do_reflect(srcinfo, dstinfo, info->x_crop_offset, - src_coef_arrays, info->drop_width, info->drop_height); - else if (info->crop_width_set == JCROP_FORCE) - do_flatten(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, info->drop_width, info->drop_height); - else - do_wipe(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, info->drop_width, info->drop_height); - break; - case JXFORM_DROP: - if (info->drop_width != 0 && info->drop_height != 0) - do_drop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, info->drop_ptr, info->drop_coef_arrays, - info->drop_width, info->drop_height); - break; - } -} - -/* jtransform_perfect_transform - * - * Determine whether lossless transformation is perfectly - * possible for a specified image and transformation. - * - * Inputs: - * image_width, image_height: source image dimensions. - * MCU_width, MCU_height: pixel dimensions of MCU. - * transform: transformation identifier. - * Parameter sources from initialized jpeg_struct - * (after reading source header): - * image_width = cinfo.image_width - * image_height = cinfo.image_height - * MCU_width = cinfo.max_h_samp_factor * cinfo.block_size - * MCU_height = cinfo.max_v_samp_factor * cinfo.block_size - * Result: - * TRUE = perfect transformation possible - * FALSE = perfect transformation not possible - * (may use custom action then) - */ - -GLOBAL(boolean) -jtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height, - int MCU_width, int MCU_height, - JXFORM_CODE transform) -{ - boolean result = TRUE; /* initialize TRUE */ - - switch (transform) { - case JXFORM_FLIP_H: - case JXFORM_ROT_270: - if (image_width % (JDIMENSION) MCU_width) - result = FALSE; - break; - case JXFORM_FLIP_V: - case JXFORM_ROT_90: - if (image_height % (JDIMENSION) MCU_height) - result = FALSE; - break; - case JXFORM_TRANSVERSE: - case JXFORM_ROT_180: - if (image_width % (JDIMENSION) MCU_width) - result = FALSE; - if (image_height % (JDIMENSION) MCU_height) - result = FALSE; - break; - default: - break; - } - - return result; -} - -#endif /* TRANSFORMS_SUPPORTED */ - - -/* Setup decompression object to save desired markers in memory. - * This must be called before jpeg_read_header() to have the desired effect. - */ - -GLOBAL(void) -jcopy_markers_setup (j_decompress_ptr srcinfo, JCOPY_OPTION option) -{ -#ifdef SAVE_MARKERS_SUPPORTED - int m; - - /* Save comments except under NONE option */ - if (option != JCOPYOPT_NONE) { - jpeg_save_markers(srcinfo, JPEG_COM, 0xFFFF); - } - /* Save all types of APPn markers iff ALL option */ - if (option == JCOPYOPT_ALL) { - for (m = 0; m < 16; m++) - jpeg_save_markers(srcinfo, JPEG_APP0 + m, 0xFFFF); - } -#endif /* SAVE_MARKERS_SUPPORTED */ -} - -/* Copy markers saved in the given source object to the destination object. - * This should be called just after jpeg_start_compress() or - * jpeg_write_coefficients(). - * Note that those routines will have written the SOI, and also the - * JFIF APP0 or Adobe APP14 markers if selected. - */ - -GLOBAL(void) -jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JCOPY_OPTION option) -{ - jpeg_saved_marker_ptr marker; - - /* In the current implementation, we don't actually need to examine the - * option flag here; we just copy everything that got saved. - * But to avoid confusion, we do not output JFIF and Adobe APP14 markers - * if the encoder library already wrote one. - */ - for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { - if (dstinfo->write_JFIF_header && - marker->marker == JPEG_APP0 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x4A && - GETJOCTET(marker->data[1]) == 0x46 && - GETJOCTET(marker->data[2]) == 0x49 && - GETJOCTET(marker->data[3]) == 0x46 && - GETJOCTET(marker->data[4]) == 0) - continue; /* reject duplicate JFIF */ - if (dstinfo->write_Adobe_marker && - marker->marker == JPEG_APP0+14 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x41 && - GETJOCTET(marker->data[1]) == 0x64 && - GETJOCTET(marker->data[2]) == 0x6F && - GETJOCTET(marker->data[3]) == 0x62 && - GETJOCTET(marker->data[4]) == 0x65) - continue; /* reject duplicate Adobe */ -#ifdef NEED_FAR_POINTERS - /* We could use jpeg_write_marker if the data weren't FAR... */ - { - unsigned int i; - jpeg_write_m_header(dstinfo, marker->marker, marker->data_length); - for (i = 0; i < marker->data_length; i++) - jpeg_write_m_byte(dstinfo, marker->data[i]); - } -#else - jpeg_write_marker(dstinfo, marker->marker, - marker->data, marker->data_length); -#endif - } -} diff --git a/code/jpeg-9f/wrbmp.c b/code/jpeg-9f/wrbmp.c deleted file mode 100644 index bed699ff..00000000 --- a/code/jpeg-9f/wrbmp.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - * wrbmp.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2017-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write output images in Microsoft "BMP" - * format (MS Windows 3.x and OS/2 1.x flavors). - * Either 8-bit colormapped or 24-bit full-color format can be written. - * No compression is supported. - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume output to - * an ordinary stdio stream. - * - * This code contributed by James Arthur Boucher. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef BMP_SUPPORTED - - -/* - * To support 12-bit JPEG data, we'd have to scale output down to 8 bits. - * This is not yet implemented. - */ - -#if BITS_IN_JSAMPLE != 8 - Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ -#endif - -/* - * Since BMP stores scanlines bottom-to-top, we have to invert the image - * from JPEG's top-to-bottom order. To do this, we save the outgoing data - * in a virtual array during put_pixel_row calls, then actually emit the - * BMP file during finish_output. The virtual array contains one JSAMPLE per - * pixel if the output is grayscale or colormapped, three if it is full color. - */ - -/* Private version of data destination object */ - -typedef struct { - struct djpeg_dest_struct pub; /* public fields */ - - boolean is_os2; /* saves the OS2 format request flag */ - - jvirt_sarray_ptr whole_image; /* needed to reverse row order */ - JDIMENSION data_width; /* JSAMPLEs per row */ - JDIMENSION row_width; /* physical width of one row in the BMP file */ - int pad_bytes; /* number of padding bytes needed per row */ - JDIMENSION cur_output_row; /* next row# to write to virtual array */ -} bmp_dest_struct; - -typedef bmp_dest_struct * bmp_dest_ptr; - - -/* Forward declarations */ -LOCAL(void) write_colormap - JPP((j_decompress_ptr cinfo, bmp_dest_ptr dest, - int map_colors, int map_entry_size)); - - -/* - * Write some pixel data. - * In this module rows_supplied will always be 1. - */ - -METHODDEF(void) -put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -/* This version is for writing 24-bit pixels */ -{ - bmp_dest_ptr dest = (bmp_dest_ptr) dinfo; - register JSAMPROW inptr, outptr; - register JDIMENSION col; - int pad; - - /* Access next row in virtual array */ - outptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - dest->whole_image, dest->cur_output_row, (JDIMENSION) 1, TRUE); - dest->cur_output_row++; - - /* Transfer data. Note destination values must be in BGR order - * (even though Microsoft's own documents say the opposite). - */ - inptr = dest->pub.buffer[0]; - for (col = cinfo->output_width; col > 0; col--) { - outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ - outptr[1] = *inptr++; - outptr[0] = *inptr++; - outptr += 3; - } - - /* Zero out the pad bytes. */ - pad = dest->pad_bytes; - while (--pad >= 0) - *outptr++ = 0; -} - -METHODDEF(void) -put_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -/* This version is for grayscale OR quantized color output */ -{ - bmp_dest_ptr dest = (bmp_dest_ptr) dinfo; - register JSAMPROW inptr, outptr; - register JDIMENSION col; - int pad; - - /* Access next row in virtual array */ - outptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - dest->whole_image, dest->cur_output_row, (JDIMENSION) 1, TRUE); - dest->cur_output_row++; - - /* Transfer data. */ - inptr = dest->pub.buffer[0]; - for (col = cinfo->output_width; col > 0; col--) { - *outptr++ = *inptr++; /* can omit GETJSAMPLE() safely */ - } - - /* Zero out the pad bytes. */ - pad = dest->pad_bytes; - while (--pad >= 0) - *outptr++ = 0; -} - - -/* - * Startup: normally writes the file header. - * In this module we may as well postpone everything until finish_output. - */ - -METHODDEF(void) -start_output_bmp (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - /* no work here */ -} - - -/* - * Finish up at the end of the file. - * - * Here is where we really output the BMP file. - * - * First, routines to write the Windows and OS/2 variants of the file header. - */ - -LOCAL(void) -write_bmp_header (j_decompress_ptr cinfo, bmp_dest_ptr dest) -/* Write a Windows-style BMP file header, including colormap if needed */ -{ - char bmpfileheader[14]; - char bmpinfoheader[40]; -#define PUT_2B(array, offset, value) \ - (array[offset] = (char) ((value) & 0xFF), \ - array[offset+1] = (char) (((value) >> 8) & 0xFF)) -#define PUT_4B(array, offset, value) \ - (array[offset] = (char) ((value) & 0xFF), \ - array[offset+1] = (char) (((value) >> 8) & 0xFF), \ - array[offset+2] = (char) (((value) >> 16) & 0xFF), \ - array[offset+3] = (char) (((value) >> 24) & 0xFF)) - INT32 headersize, bfSize; - int bits_per_pixel, cmap_entries; - - /* Compute colormap size and total file size */ - if (cinfo->out_color_space == JCS_RGB) { - if (cinfo->quantize_colors) { - /* Colormapped RGB */ - bits_per_pixel = 8; - cmap_entries = 256; - } else { - /* Unquantized, full color RGB */ - bits_per_pixel = 24; - cmap_entries = 0; - } - } else { - /* Grayscale output. We need to fake a 256-entry colormap. */ - bits_per_pixel = 8; - cmap_entries = 256; - } - /* File size */ - headersize = 14 + 40 + cmap_entries * 4; /* Header and colormap */ - bfSize = headersize + (INT32) dest->row_width * (INT32) cinfo->output_height; - - /* Set unused fields of header to 0 */ - MEMZERO(bmpfileheader, SIZEOF(bmpfileheader)); - MEMZERO(bmpinfoheader, SIZEOF(bmpinfoheader)); - - /* Fill the file header */ - bmpfileheader[0] = 0x42; /* first 2 bytes are ASCII 'B', 'M' */ - bmpfileheader[1] = 0x4D; - PUT_4B(bmpfileheader, 2, bfSize); /* bfSize */ - /* we leave bfReserved1 & bfReserved2 = 0 */ - PUT_4B(bmpfileheader, 10, headersize); /* bfOffBits */ - - /* Fill the info header (Microsoft calls this a BITMAPINFOHEADER) */ - PUT_2B(bmpinfoheader, 0, 40); /* biSize */ - PUT_4B(bmpinfoheader, 4, cinfo->output_width); /* biWidth */ - PUT_4B(bmpinfoheader, 8, cinfo->output_height); /* biHeight */ - PUT_2B(bmpinfoheader, 12, 1); /* biPlanes - must be 1 */ - PUT_2B(bmpinfoheader, 14, bits_per_pixel); /* biBitCount */ - /* we leave biCompression = 0, for none */ - /* we leave biSizeImage = 0; this is correct for uncompressed data */ - if (cinfo->density_unit == 2) { /* if have density in dots/cm, then */ - PUT_4B(bmpinfoheader, 24, (INT32) (cinfo->X_density*100)); /* XPels/M */ - PUT_4B(bmpinfoheader, 28, (INT32) (cinfo->Y_density*100)); /* XPels/M */ - } - PUT_2B(bmpinfoheader, 32, cmap_entries); /* biClrUsed */ - /* we leave biClrImportant = 0 */ - - if (JFWRITE(dest->pub.output_file, bmpfileheader, 14) != (size_t) 14) - ERREXIT(cinfo, JERR_FILE_WRITE); - if (JFWRITE(dest->pub.output_file, bmpinfoheader, 40) != (size_t) 40) - ERREXIT(cinfo, JERR_FILE_WRITE); - - if (cmap_entries > 0) - write_colormap(cinfo, dest, cmap_entries, 4); -} - - -LOCAL(void) -write_os2_header (j_decompress_ptr cinfo, bmp_dest_ptr dest) -/* Write an OS2-style BMP file header, including colormap if needed */ -{ - char bmpfileheader[14]; - char bmpcoreheader[12]; - INT32 headersize, bfSize; - int bits_per_pixel, cmap_entries; - - /* Compute colormap size and total file size */ - if (cinfo->out_color_space == JCS_RGB) { - if (cinfo->quantize_colors) { - /* Colormapped RGB */ - bits_per_pixel = 8; - cmap_entries = 256; - } else { - /* Unquantized, full color RGB */ - bits_per_pixel = 24; - cmap_entries = 0; - } - } else { - /* Grayscale output. We need to fake a 256-entry colormap. */ - bits_per_pixel = 8; - cmap_entries = 256; - } - /* File size */ - headersize = 14 + 12 + cmap_entries * 3; /* Header and colormap */ - bfSize = headersize + (INT32) dest->row_width * (INT32) cinfo->output_height; - - /* Set unused fields of header to 0 */ - MEMZERO(bmpfileheader, SIZEOF(bmpfileheader)); - MEMZERO(bmpcoreheader, SIZEOF(bmpcoreheader)); - - /* Fill the file header */ - bmpfileheader[0] = 0x42; /* first 2 bytes are ASCII 'B', 'M' */ - bmpfileheader[1] = 0x4D; - PUT_4B(bmpfileheader, 2, bfSize); /* bfSize */ - /* we leave bfReserved1 & bfReserved2 = 0 */ - PUT_4B(bmpfileheader, 10, headersize); /* bfOffBits */ - - /* Fill the info header (Microsoft calls this a BITMAPCOREHEADER) */ - PUT_2B(bmpcoreheader, 0, 12); /* bcSize */ - PUT_2B(bmpcoreheader, 4, cinfo->output_width); /* bcWidth */ - PUT_2B(bmpcoreheader, 6, cinfo->output_height); /* bcHeight */ - PUT_2B(bmpcoreheader, 8, 1); /* bcPlanes - must be 1 */ - PUT_2B(bmpcoreheader, 10, bits_per_pixel); /* bcBitCount */ - - if (JFWRITE(dest->pub.output_file, bmpfileheader, 14) != (size_t) 14) - ERREXIT(cinfo, JERR_FILE_WRITE); - if (JFWRITE(dest->pub.output_file, bmpcoreheader, 12) != (size_t) 12) - ERREXIT(cinfo, JERR_FILE_WRITE); - - if (cmap_entries > 0) - write_colormap(cinfo, dest, cmap_entries, 3); -} - - -/* - * Write the colormap. - * Windows uses BGR0 map entries; OS/2 uses BGR entries. - */ - -LOCAL(void) -write_colormap (j_decompress_ptr cinfo, bmp_dest_ptr dest, - int map_colors, int map_entry_size) -{ - JSAMPARRAY colormap = cinfo->colormap; - int num_colors = cinfo->actual_number_of_colors; - FILE * outfile = dest->pub.output_file; - int i; - - if (colormap != NULL) { - if (cinfo->out_color_components == 3) { - /* Normal case with RGB colormap */ - for (i = 0; i < num_colors; i++) { - putc(GETJSAMPLE(colormap[2][i]), outfile); - putc(GETJSAMPLE(colormap[1][i]), outfile); - putc(GETJSAMPLE(colormap[0][i]), outfile); - if (map_entry_size == 4) - putc(0, outfile); - } - } else { - /* Grayscale colormap (only happens with grayscale quantization) */ - for (i = 0; i < num_colors; i++) { - putc(GETJSAMPLE(colormap[0][i]), outfile); - putc(GETJSAMPLE(colormap[0][i]), outfile); - putc(GETJSAMPLE(colormap[0][i]), outfile); - if (map_entry_size == 4) - putc(0, outfile); - } - } - } else { - /* If no colormap, must be grayscale data. Generate a linear "map". */ - for (i = 0; i < 256; i++) { - putc(i, outfile); - putc(i, outfile); - putc(i, outfile); - if (map_entry_size == 4) - putc(0, outfile); - } - } - /* Pad colormap to ensure specified number of colormap entries */ - if (i > map_colors) - ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, i); - for (; i < map_colors; i++) { - putc(CENTERJSAMPLE, outfile); - putc(CENTERJSAMPLE, outfile); - putc(CENTERJSAMPLE, outfile); - if (map_entry_size == 4) - putc(0, outfile); - } -} - - -METHODDEF(void) -finish_output_bmp (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - bmp_dest_ptr dest = (bmp_dest_ptr) dinfo; - register FILE * outfile = dest->pub.output_file; - register JSAMPROW data_ptr; - JDIMENSION row; - register JDIMENSION col; - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - - /* Write the header and colormap */ - if (dest->is_os2) - write_os2_header(cinfo, dest); - else - write_bmp_header(cinfo, dest); - - /* Write the file body from our virtual array */ - for (row = cinfo->output_height; row > 0; row--) { - if (progress != NULL) { - progress->pub.pass_counter = (long) (cinfo->output_height - row); - progress->pub.pass_limit = (long) cinfo->output_height; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } - data_ptr = * (*cinfo->mem->access_virt_sarray) ((j_common_ptr) cinfo, - dest->whole_image, row - 1, (JDIMENSION) 1, FALSE); - for (col = dest->row_width; col > 0; col--) { - putc(GETJSAMPLE(*data_ptr), outfile); - data_ptr++; - } - } - if (progress != NULL) - progress->completed_extra_passes++; - - /* Make sure we wrote the output file OK */ - JFFLUSH(outfile); - if (JFERROR(outfile)) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * The module selection routine for BMP format output. - */ - -GLOBAL(djpeg_dest_ptr) -jinit_write_bmp (j_decompress_ptr cinfo, boolean is_os2) -{ - bmp_dest_ptr dest; - JDIMENSION row_width; - - /* Create module interface object, fill in method pointers */ - dest = (bmp_dest_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(bmp_dest_struct)); - dest->pub.start_output = start_output_bmp; - dest->pub.finish_output = finish_output_bmp; - dest->is_os2 = is_os2; - - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - dest->pub.put_pixel_rows = put_gray_rows; - break; - case JCS_RGB: - if (cinfo->quantize_colors) - dest->pub.put_pixel_rows = put_gray_rows; - else - dest->pub.put_pixel_rows = put_pixel_rows; - break; - default: - ERREXIT(cinfo, JERR_BMP_COLORSPACE); - } - - /* Calculate output image dimensions so we can allocate space */ - jpeg_calc_output_dimensions(cinfo); - - /* Determine width of rows in the BMP file (padded to 4-byte boundary). */ - row_width = cinfo->output_width * cinfo->output_components; - dest->data_width = row_width; - while ((row_width & 3) != 0) row_width++; - dest->row_width = row_width; - dest->pad_bytes = (int) (row_width - dest->data_width); - - /* Allocate space for inversion array, prepare for write pass */ - dest->whole_image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - row_width, cinfo->output_height, (JDIMENSION) 1); - dest->cur_output_row = 0; - if (cinfo->progress != NULL) { - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; - progress->total_extra_passes++; /* count file input as separate pass */ - } - - /* Create decompressor output buffer. */ - dest->pub.buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, row_width, (JDIMENSION) 1); - dest->pub.buffer_height = 1; - - return &dest->pub; -} - -#endif /* BMP_SUPPORTED */ diff --git a/code/jpeg-9f/wrgif.c b/code/jpeg-9f/wrgif.c deleted file mode 100644 index 9d472de1..00000000 --- a/code/jpeg-9f/wrgif.c +++ /dev/null @@ -1,566 +0,0 @@ -/* - * wrgif.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2015-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write output images in GIF format. - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume output to - * an ordinary stdio stream. - */ - -/* - * This code is loosely based on ppmtogif from the PBMPLUS distribution - * of Feb. 1991. That file contains the following copyright notice: - * Based on GIFENCODE by David Rowley . - * Lempel-Ziv compression based on "compress" by Spencer W. Thomas et al. - * Copyright (C) 1989 by Jef Poskanzer. - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, provided - * that the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. This software is provided "as is" without express or - * implied warranty. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef GIF_SUPPORTED - - -#define MAX_LZW_BITS 12 /* maximum LZW code size (4096 symbols) */ - -typedef INT16 code_int; /* must hold -1 .. 2**MAX_LZW_BITS */ - -#define LZW_TABLE_SIZE ((code_int) 1 << MAX_LZW_BITS) - -#define HSIZE 5003 /* hash table size for 80% occupancy */ - -typedef int hash_int; /* must hold -2*HSIZE..2*HSIZE */ - -#define MAXCODE(n_bits) (((code_int) 1 << (n_bits)) - 1) - - -/* - * The LZW hash table consists of two parallel arrays: - * hash_code[i] code of symbol in slot i, or 0 if empty slot - * hash_value[i] symbol's value; undefined if empty slot - * where slot values (i) range from 0 to HSIZE-1. The symbol value is - * its prefix symbol's code concatenated with its suffix character. - * - * Algorithm: use open addressing double hashing (no chaining) on the - * prefix code / suffix character combination. We do a variant of Knuth's - * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime - * secondary probe. - * - * The hash_value[] table is allocated from FAR heap space since it would - * use up rather a lot of the near data space in a PC. - */ - -typedef INT32 hash_entry; /* must hold (code_int<<8) | byte */ - -#define HASH_ENTRY(prefix, suffix) ((((hash_entry) (prefix)) << 8) | (suffix)) - - -/* Private version of data destination object */ - -typedef struct { - struct djpeg_dest_struct pub; /* public fields */ - - j_decompress_ptr cinfo; /* back link saves passing separate parm */ - - /* State for packing variable-width codes into a bitstream */ - int n_bits; /* current number of bits/code */ - code_int maxcode; /* maximum code, given n_bits */ - int init_bits; /* initial n_bits ... restored after clear */ - INT32 cur_accum; /* holds bits not yet output */ - int cur_bits; /* # of bits in cur_accum */ - - /* LZW string construction */ - code_int waiting_code; /* symbol not yet output; may be extendable */ - boolean first_byte; /* if TRUE, waiting_code is not valid */ - - /* State for GIF code assignment */ - code_int ClearCode; /* clear code (doesn't change) */ - code_int EOFCode; /* EOF code (ditto) */ - code_int free_code; /* LZW: first not-yet-used symbol code */ - code_int code_counter; /* not LZW: counts output symbols */ - - /* LZW hash table */ - code_int *hash_code; /* => hash table of symbol codes */ - hash_entry FAR *hash_value; /* => hash table of symbol values */ - - /* GIF data packet construction buffer */ - int bytesinpkt; /* # of bytes in current packet */ - char packetbuf[256]; /* workspace for accumulating packet */ - -} gif_dest_struct; - -typedef gif_dest_struct * gif_dest_ptr; - - -/* - * Routines to package finished data bytes into GIF data blocks. - * A data block consists of a count byte (1..255) and that many data bytes. - */ - -LOCAL(void) -flush_packet (gif_dest_ptr dinfo) -/* flush any accumulated data */ -{ - if (dinfo->bytesinpkt > 0) { /* never write zero-length packet */ - dinfo->packetbuf[0] = (char) dinfo->bytesinpkt++; - if (JFWRITE(dinfo->pub.output_file, dinfo->packetbuf, dinfo->bytesinpkt) - != (size_t) dinfo->bytesinpkt) - ERREXIT(dinfo->cinfo, JERR_FILE_WRITE); - dinfo->bytesinpkt = 0; - } -} - - -/* Add a character to current packet; flush to disk if necessary */ -#define CHAR_OUT(dinfo, c) \ - { (dinfo)->packetbuf[++(dinfo)->bytesinpkt] = (char) (c); \ - if ((dinfo)->bytesinpkt >= 255) \ - flush_packet(dinfo); \ - } - - -/* Routine to convert variable-width codes into a byte stream */ - -LOCAL(void) -output (gif_dest_ptr dinfo, code_int code) -/* Emit a code of n_bits bits */ -/* Uses cur_accum and cur_bits to reblock into 8-bit bytes */ -{ - dinfo->cur_accum |= ((INT32) code) << dinfo->cur_bits; - dinfo->cur_bits += dinfo->n_bits; - - while (dinfo->cur_bits >= 8) { - CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF); - dinfo->cur_accum >>= 8; - dinfo->cur_bits -= 8; - } - - /* - * If the next entry is going to be too big for the code size, - * then increase it, if possible. We do this here to ensure - * that it's done in sync with the decoder's codesize increases. - */ - if (dinfo->free_code > dinfo->maxcode) { - dinfo->n_bits++; - if (dinfo->n_bits == MAX_LZW_BITS) - dinfo->maxcode = LZW_TABLE_SIZE; /* free_code will never exceed this */ - else - dinfo->maxcode = MAXCODE(dinfo->n_bits); - } -} - - -/* Compression initialization & termination */ - - -LOCAL(void) -clear_hash (gif_dest_ptr dinfo) -/* Fill the hash table with empty entries */ -{ - /* It's sufficient to zero hash_code[] */ - MEMZERO(dinfo->hash_code, HSIZE * SIZEOF(code_int)); -} - - -LOCAL(void) -clear_block (gif_dest_ptr dinfo) -/* Reset compressor and issue a Clear code */ -{ - clear_hash(dinfo); /* delete all the symbols */ - dinfo->free_code = dinfo->ClearCode + 2; - output(dinfo, dinfo->ClearCode); /* inform decoder */ - dinfo->n_bits = dinfo->init_bits; /* reset code size */ - dinfo->maxcode = MAXCODE(dinfo->n_bits); -} - - -LOCAL(void) -compress_init (gif_dest_ptr dinfo, int i_bits) -/* Initialize compressor */ -{ - /* init all the state variables */ - dinfo->n_bits = dinfo->init_bits = i_bits; - dinfo->maxcode = MAXCODE(dinfo->n_bits); - dinfo->ClearCode = ((code_int) 1 << (i_bits - 1)); - dinfo->EOFCode = dinfo->ClearCode + 1; - dinfo->code_counter = dinfo->free_code = dinfo->ClearCode + 2; - dinfo->first_byte = TRUE; /* no waiting symbol yet */ - /* init output buffering vars */ - dinfo->bytesinpkt = 0; - dinfo->cur_accum = 0; - dinfo->cur_bits = 0; - /* clear hash table */ - if (dinfo->hash_code != NULL) - clear_hash(dinfo); - /* GIF specifies an initial Clear code */ - output(dinfo, dinfo->ClearCode); -} - - -LOCAL(void) -compress_term (gif_dest_ptr dinfo) -/* Clean up at end */ -{ - /* Flush out the buffered LZW code */ - if (! dinfo->first_byte) - output(dinfo, dinfo->waiting_code); - /* Send an EOF code */ - output(dinfo, dinfo->EOFCode); - /* Flush the bit-packing buffer */ - if (dinfo->cur_bits > 0) { - CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF); - } - /* Flush the packet buffer */ - flush_packet(dinfo); -} - - -/* GIF header construction */ - - -LOCAL(void) -put_word (gif_dest_ptr dinfo, unsigned int w) -/* Emit a 16-bit word, LSB first */ -{ - putc(w & 0xFF, dinfo->pub.output_file); - putc((w >> 8) & 0xFF, dinfo->pub.output_file); -} - - -LOCAL(void) -put_3bytes (gif_dest_ptr dinfo, int val) -/* Emit 3 copies of same byte value --- handy subr for colormap construction */ -{ - putc(val, dinfo->pub.output_file); - putc(val, dinfo->pub.output_file); - putc(val, dinfo->pub.output_file); -} - - -LOCAL(void) -emit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap) -/* Output the GIF file header, including color map */ -/* If colormap == NULL, synthesize a grayscale colormap */ -{ - int BitsPerPixel, ColorMapSize, InitCodeSize, FlagByte; - int cshift = dinfo->cinfo->data_precision - 8; - int i; - - if (num_colors > 256) - ERREXIT1(dinfo->cinfo, JERR_TOO_MANY_COLORS, num_colors); - /* Compute bits/pixel and related values */ - BitsPerPixel = 1; - while (num_colors > (1 << BitsPerPixel)) - BitsPerPixel++; - ColorMapSize = 1 << BitsPerPixel; - if (BitsPerPixel <= 1) - InitCodeSize = 2; - else - InitCodeSize = BitsPerPixel; - /* - * Write the GIF header. - * Note that we generate a plain GIF87 header for maximum compatibility. - */ - putc('G', dinfo->pub.output_file); - putc('I', dinfo->pub.output_file); - putc('F', dinfo->pub.output_file); - putc('8', dinfo->pub.output_file); - putc('7', dinfo->pub.output_file); - putc('a', dinfo->pub.output_file); - /* Write the Logical Screen Descriptor */ - put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); - put_word(dinfo, (unsigned int) dinfo->cinfo->output_height); - FlagByte = 0x80; /* Yes, there is a global color table */ - FlagByte |= (BitsPerPixel - 1) << 4; /* color resolution */ - FlagByte |= (BitsPerPixel - 1); /* size of global color table */ - putc(FlagByte, dinfo->pub.output_file); - putc(0, dinfo->pub.output_file); /* Background color index */ - putc(0, dinfo->pub.output_file); /* Reserved (aspect ratio in GIF89) */ - /* Write the Global Color Map */ - /* If the color map is more than 8 bits precision, */ - /* we reduce it to 8 bits by shifting */ - for (i = 0; i < ColorMapSize; i++) { - if (i < num_colors) { - if (colormap != NULL) { - if (dinfo->cinfo->out_color_space == JCS_RGB) { - /* Normal case: RGB color map */ - putc(GETJSAMPLE(colormap[0][i]) >> cshift, dinfo->pub.output_file); - putc(GETJSAMPLE(colormap[1][i]) >> cshift, dinfo->pub.output_file); - putc(GETJSAMPLE(colormap[2][i]) >> cshift, dinfo->pub.output_file); - } else { - /* Grayscale "color map": possible if quantizing grayscale image */ - put_3bytes(dinfo, GETJSAMPLE(colormap[0][i]) >> cshift); - } - } else { - /* Create a grayscale map of num_colors values, range 0..255 */ - put_3bytes(dinfo, (i * 255 + (num_colors - 1) / 2) / (num_colors - 1)); - } - } else { - /* fill out the map to a power of 2 */ - put_3bytes(dinfo, CENTERJSAMPLE >> cshift); - } - } - /* Write image separator and Image Descriptor */ - putc(',', dinfo->pub.output_file); /* separator */ - put_word(dinfo, 0); /* left/top offset */ - put_word(dinfo, 0); - put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); /* image size */ - put_word(dinfo, (unsigned int) dinfo->cinfo->output_height); - /* flag byte: not interlaced, no local color map */ - putc(0x00, dinfo->pub.output_file); - /* Write Initial Code Size byte */ - putc(InitCodeSize, dinfo->pub.output_file); - - /* Initialize for compression of image data */ - compress_init(dinfo, InitCodeSize + 1); -} - - -/* - * Startup: write the file header. - */ - -METHODDEF(void) -start_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - gif_dest_ptr dest = (gif_dest_ptr) dinfo; - - if (cinfo->quantize_colors) - emit_header(dest, cinfo->actual_number_of_colors, cinfo->colormap); - else - emit_header(dest, 256, (JSAMPARRAY) NULL); -} - - -/* - * Write some pixel data. - * In this module rows_supplied will always be 1. - */ - - -/* - * The LZW algorithm proper - */ - -METHODDEF(void) -put_LZW_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - gif_dest_ptr dest = (gif_dest_ptr) dinfo; - register JSAMPROW ptr; - register JDIMENSION col; - code_int c; - register hash_int i; - register hash_int disp; - register hash_entry probe_value; - - ptr = dest->pub.buffer[0]; - for (col = cinfo->output_width; col > 0; col--) { - /* Accept and compress one 8-bit byte */ - c = (code_int) GETJSAMPLE(*ptr++); - - if (dest->first_byte) { /* need to initialize waiting_code */ - dest->waiting_code = c; - dest->first_byte = FALSE; - continue; - } - - /* Probe hash table to see if a symbol exists for - * waiting_code followed by c. - * If so, replace waiting_code by that symbol and continue. - */ - i = ((hash_int) c << (MAX_LZW_BITS-8)) + dest->waiting_code; - /* i is less than twice 2**MAX_LZW_BITS, therefore less than twice HSIZE */ - if (i >= HSIZE) - i -= HSIZE; - - probe_value = HASH_ENTRY(dest->waiting_code, c); - - if (dest->hash_code[i] == 0) { - /* hit empty slot; desired symbol not in table */ - output(dest, dest->waiting_code); - if (dest->free_code < LZW_TABLE_SIZE) { - dest->hash_code[i] = dest->free_code++; /* add symbol to hashtable */ - dest->hash_value[i] = probe_value; - } else - clear_block(dest); - dest->waiting_code = c; - continue; - } - if (dest->hash_value[i] == probe_value) { - dest->waiting_code = dest->hash_code[i]; - continue; - } - - if (i == 0) /* secondary hash (after G. Knott) */ - disp = 1; - else - disp = HSIZE - i; - for (;;) { - i -= disp; - if (i < 0) - i += HSIZE; - if (dest->hash_code[i] == 0) { - /* hit empty slot; desired symbol not in table */ - output(dest, dest->waiting_code); - if (dest->free_code < LZW_TABLE_SIZE) { - dest->hash_code[i] = dest->free_code++; /* add symbol to hashtable */ - dest->hash_value[i] = probe_value; - } else - clear_block(dest); - dest->waiting_code = c; - break; - } - if (dest->hash_value[i] == probe_value) { - dest->waiting_code = dest->hash_code[i]; - break; - } - } - } -} - - -/* - * The pseudo-compression algorithm. - * - * In this version we simply output each pixel value as a separate symbol; - * thus, no compression occurs. In fact, there is expansion of one bit per - * pixel, because we use a symbol width one bit wider than the pixel width. - * - * GIF ordinarily uses variable-width symbols, and the decoder will expect - * to ratchet up the symbol width after a fixed number of symbols. - * To simplify the logic and keep the expansion penalty down, we emit a - * GIF Clear code to reset the decoder just before the width would ratchet up. - * Thus, all the symbols in the output file will have the same bit width. - * Note that emitting the Clear codes at the right times is a mere matter of - * counting output symbols and is in no way dependent on the LZW algorithm. - * - * With a small basic pixel width (low color count), Clear codes will be - * needed very frequently, causing the file to expand even more. So this - * simplistic approach wouldn't work too well on bilevel images, for example. - * But for output of JPEG conversions the pixel width will usually be 8 bits - * (129 to 256 colors), so the overhead added by Clear symbols is only about - * one symbol in every 256. - */ - -METHODDEF(void) -put_raw_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - gif_dest_ptr dest = (gif_dest_ptr) dinfo; - register JSAMPROW ptr; - register JDIMENSION col; - code_int c; - - ptr = dest->pub.buffer[0]; - for (col = cinfo->output_width; col > 0; col--) { - c = (code_int) GETJSAMPLE(*ptr++); - /* Accept and output one pixel value. - * The given value must be less than n_bits wide. - */ - - /* Output the given pixel value as a symbol. */ - output(dest, c); - /* Issue Clear codes often enough to keep the reader from ratcheting up - * its symbol size. - */ - if (dest->code_counter < dest->maxcode) { - dest->code_counter++; - } else { - output(dest, dest->ClearCode); - dest->code_counter = dest->ClearCode + 2; /* reset the counter */ - } - } -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - gif_dest_ptr dest = (gif_dest_ptr) dinfo; - - /* Flush compression mechanism */ - compress_term(dest); - /* Write a zero-length data block to end the series */ - putc(0, dest->pub.output_file); - /* Write the GIF terminator mark */ - putc(';', dest->pub.output_file); - /* Make sure we wrote the output file OK */ - JFFLUSH(dest->pub.output_file); - if (JFERROR(dest->pub.output_file)) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * The module selection routine for GIF format output. - */ - -GLOBAL(djpeg_dest_ptr) -jinit_write_gif (j_decompress_ptr cinfo, boolean is_lzw) -{ - gif_dest_ptr dest; - - /* Create module interface object, fill in method pointers */ - dest = (gif_dest_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(gif_dest_struct)); - dest->cinfo = cinfo; /* make back link for subroutines */ - dest->pub.start_output = start_output_gif; - dest->pub.finish_output = finish_output_gif; - - if (cinfo->out_color_space != JCS_GRAYSCALE && - cinfo->out_color_space != JCS_RGB) - ERREXIT(cinfo, JERR_GIF_COLORSPACE); - - /* Force quantization if color or if > 8 bits input */ - if (cinfo->out_color_space != JCS_GRAYSCALE || cinfo->data_precision > 8) { - /* Force quantization to at most 256 colors */ - cinfo->quantize_colors = TRUE; - if (cinfo->desired_number_of_colors > 256) - cinfo->desired_number_of_colors = 256; - } - - /* Calculate output image dimensions so we can allocate space */ - jpeg_calc_output_dimensions(cinfo); - - if (cinfo->output_components != 1) /* safety check: just one component? */ - ERREXIT(cinfo, JERR_GIF_BUG); - - /* Create decompressor output buffer. */ - dest->pub.buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) 1); - dest->pub.buffer_height = 1; - - if (is_lzw) { - dest->pub.put_pixel_rows = put_LZW_pixel_rows; - /* Allocate space for hash table */ - dest->hash_code = (code_int *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, HSIZE * SIZEOF(code_int)); - dest->hash_value = (hash_entry FAR *) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, HSIZE * SIZEOF(hash_entry)); - } else { - dest->pub.put_pixel_rows = put_raw_pixel_rows; - /* Mark tables unused */ - dest->hash_code = NULL; - dest->hash_value = NULL; - } - - return &dest->pub; -} - -#endif /* GIF_SUPPORTED */ diff --git a/code/jpeg-9f/wrjpgcom.c b/code/jpeg-9f/wrjpgcom.c deleted file mode 100644 index 571e9d07..00000000 --- a/code/jpeg-9f/wrjpgcom.c +++ /dev/null @@ -1,599 +0,0 @@ -/* - * wrjpgcom.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 2015-2017 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a very simple stand-alone application that inserts - * user-supplied text as a COM (comment) marker in a JFIF file. - * This may be useful as an example of the minimum logic needed to parse - * JPEG markers. - */ - -#define JPEG_CJPEG_DJPEG /* to get the command-line config symbols */ -#include "jinclude.h" /* get auto-config symbols, */ - -#ifndef HAVE_STDLIB_H /* should declare malloc() */ -extern void * malloc (); -#endif -#include /* to declare isupper(), tolower() */ -#ifdef USE_SETMODE -#include /* to declare setmode()'s parameter macros */ -/* If you have setmode() but not , just delete this line: */ -#include /* to declare setmode() */ -#endif - -#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ -#ifdef __MWERKS__ -#include /* Metrowerks needs this */ -#include /* ... and this */ -#endif -#ifdef THINK_C -#include /* Think declares it here */ -#endif -#endif - -#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ -#define READ_BINARY "r" -#define WRITE_BINARY "w" -#else -#ifdef VMS /* VMS is very nonstandard */ -#define READ_BINARY "rb", "ctx=stm" -#define WRITE_BINARY "wb", "ctx=stm" -#else /* standard ANSI-compliant case */ -#define READ_BINARY "rb" -#define WRITE_BINARY "wb" -#endif -#endif - -#ifndef EXIT_FAILURE /* define exit() codes if not provided */ -#define EXIT_FAILURE 1 -#endif -#ifndef EXIT_SUCCESS -#ifdef VMS -#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ -#else -#define EXIT_SUCCESS 0 -#endif -#endif - -/* Reduce this value if your malloc() can't allocate blocks up to 64K. - * On DOS, compiling in large model is usually a better solution. - */ - -#ifndef MAX_COM_LENGTH -#define MAX_COM_LENGTH 65000L /* must be <= 65533 in any case */ -#endif - - -/* - * These macros are used to read the input file and write the output file. - * To reuse this code in another application, you might need to change these. - */ - -static FILE * infile; /* input JPEG file */ - -/* Return next input byte, or EOF if no more */ -#define NEXTBYTE() getc(infile) - -static FILE * outfile; /* output JPEG file */ - -/* Emit an output byte */ -#define PUTBYTE(x) putc((x), outfile) - - -/* Error exit handler */ -#define ERREXIT(msg) (fprintf(stderr, "%s\n", msg), exit(EXIT_FAILURE)) - - -/* Read one byte, testing for EOF */ -static int -read_1_byte (void) -{ - int c; - - c = NEXTBYTE(); - if (c == EOF) - ERREXIT("Premature EOF in JPEG file"); - return c; -} - -/* Read 2 bytes, convert to unsigned int */ -/* All 2-byte quantities in JPEG markers are MSB first */ -static unsigned int -read_2_bytes (void) -{ - int c1, c2; - - c1 = NEXTBYTE(); - if (c1 == EOF) - ERREXIT("Premature EOF in JPEG file"); - c2 = NEXTBYTE(); - if (c2 == EOF) - ERREXIT("Premature EOF in JPEG file"); - return (((unsigned int) c1) << 8) + ((unsigned int) c2); -} - - -/* Routines to write data to output file */ - -static void -write_1_byte (int c) -{ - PUTBYTE(c); -} - -static void -write_2_bytes (unsigned int val) -{ - PUTBYTE((val >> 8) & 0xFF); - PUTBYTE(val & 0xFF); -} - -static void -write_marker (int marker) -{ - PUTBYTE(0xFF); - PUTBYTE(marker); -} - -static void -copy_rest_of_file (void) -{ - int c; - - while ((c = NEXTBYTE()) != EOF) - PUTBYTE(c); -} - - -/* - * JPEG markers consist of one or more 0xFF bytes, followed by a marker - * code byte (which is not an FF). Here are the marker codes of interest - * in this program. (See jdmarker.c for a more complete list.) - */ - -#define M_SOF0 0xC0 /* Start Of Frame N */ -#define M_SOF1 0xC1 /* N indicates which compression process */ -#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */ -#define M_SOF3 0xC3 -#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */ -#define M_SOF6 0xC6 -#define M_SOF7 0xC7 -#define M_SOF9 0xC9 -#define M_SOF10 0xCA -#define M_SOF11 0xCB -#define M_SOF13 0xCD -#define M_SOF14 0xCE -#define M_SOF15 0xCF -#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */ -#define M_EOI 0xD9 /* End Of Image (end of datastream) */ -#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */ -#define M_COM 0xFE /* COMment */ - - -/* - * Find the next JPEG marker and return its marker code. - * We expect at least one FF byte, possibly more if the compressor used FFs - * to pad the file. (Padding FFs will NOT be replicated in the output file.) - * There could also be non-FF garbage between markers. The treatment of such - * garbage is unspecified; we choose to skip over it but emit a warning msg. - * NB: this routine must not be used after seeing SOS marker, since it will - * not deal correctly with FF/00 sequences in the compressed image data... - */ - -static int -next_marker (void) -{ - int c; - int discarded_bytes = 0; - - /* Find 0xFF byte; count and skip any non-FFs. */ - c = read_1_byte(); - while (c != 0xFF) { - discarded_bytes++; - c = read_1_byte(); - } - /* Get marker code byte, swallowing any duplicate FF bytes. Extra FFs - * are legal as pad bytes, so don't count them in discarded_bytes. - */ - do { - c = read_1_byte(); - } while (c == 0xFF); - - if (discarded_bytes != 0) { - fprintf(stderr, "Warning: garbage data found in JPEG file\n"); - } - - return c; -} - - -/* - * Read the initial marker, which should be SOI. - * For a JFIF file, the first two bytes of the file should be literally - * 0xFF M_SOI. To be more general, we could use next_marker, but if the - * input file weren't actually JPEG at all, next_marker might read the whole - * file and then return a misleading error message... - */ - -static int -first_marker (void) -{ - int c1, c2; - - c1 = NEXTBYTE(); - c2 = NEXTBYTE(); - if (c1 != 0xFF || c2 != M_SOI) - ERREXIT("Not a JPEG file"); - return c2; -} - - -/* - * Most types of marker are followed by a variable-length parameter segment. - * This routine skips over the parameters for any marker we don't otherwise - * want to process. - * Note that we MUST skip the parameter segment explicitly in order not to - * be fooled by 0xFF bytes that might appear within the parameter segment; - * such bytes do NOT introduce new markers. - */ - -static void -copy_variable (void) -/* Copy an unknown or uninteresting variable-length marker */ -{ - unsigned int length; - - /* Get the marker parameter length count */ - length = read_2_bytes(); - write_2_bytes(length); - /* Length includes itself, so must be at least 2 */ - if (length < 2) - ERREXIT("Erroneous JPEG marker length"); - length -= 2; - /* Copy the remaining bytes */ - while (length > 0) { - write_1_byte(read_1_byte()); - length--; - } -} - -static void -skip_variable (void) -/* Skip over an unknown or uninteresting variable-length marker */ -{ - unsigned int length; - - /* Get the marker parameter length count */ - length = read_2_bytes(); - /* Length includes itself, so must be at least 2 */ - if (length < 2) - ERREXIT("Erroneous JPEG marker length"); - length -= 2; - /* Skip over the remaining bytes */ - while (length > 0) { - (void) read_1_byte(); - length--; - } -} - - -/* - * Parse the marker stream until SOFn or EOI is seen; - * copy data to output, but discard COM markers unless keep_COM is true. - */ - -static int -scan_JPEG_header (int keep_COM) -{ - int marker; - - /* Expect SOI at start of file */ - if (first_marker() != M_SOI) - ERREXIT("Expected SOI marker first"); - write_marker(M_SOI); - - /* Scan miscellaneous markers until we reach SOFn. */ - for (;;) { - marker = next_marker(); - switch (marker) { - /* Note that marker codes 0xC4, 0xC8, 0xCC are not, and must not be, - * treated as SOFn. C4 in particular is actually DHT. - */ - case M_SOF0: /* Baseline */ - case M_SOF1: /* Extended sequential, Huffman */ - case M_SOF2: /* Progressive, Huffman */ - case M_SOF3: /* Lossless, Huffman */ - case M_SOF5: /* Differential sequential, Huffman */ - case M_SOF6: /* Differential progressive, Huffman */ - case M_SOF7: /* Differential lossless, Huffman */ - case M_SOF9: /* Extended sequential, arithmetic */ - case M_SOF10: /* Progressive, arithmetic */ - case M_SOF11: /* Lossless, arithmetic */ - case M_SOF13: /* Differential sequential, arithmetic */ - case M_SOF14: /* Differential progressive, arithmetic */ - case M_SOF15: /* Differential lossless, arithmetic */ - return marker; - - case M_SOS: /* should not see compressed data before SOF */ - ERREXIT("SOS without prior SOFn"); - break; - - case M_EOI: /* in case it's a tables-only JPEG stream */ - return marker; - - case M_COM: /* Existing COM: conditionally discard */ - if (keep_COM) { - write_marker(marker); - copy_variable(); - } else { - skip_variable(); - } - break; - - default: /* Anything else just gets copied */ - write_marker(marker); - copy_variable(); /* we assume it has a parameter count... */ - break; - } - } /* end loop */ -} - - -/* Command line parsing code */ - -static const char * progname; /* program name for error messages */ - - -static void -usage (void) -/* complain about bad command line */ -{ - fprintf(stderr, "wrjpgcom inserts a textual comment in a JPEG file.\n"); - fprintf(stderr, "You can add to or replace any existing comment(s).\n"); - - fprintf(stderr, "Usage: %s [switches] ", progname); -#ifdef TWO_FILE_COMMANDLINE - fprintf(stderr, "inputfile outputfile\n"); -#else - fprintf(stderr, "[inputfile]\n"); -#endif - - fprintf(stderr, "Switches (names may be abbreviated):\n"); - fprintf(stderr, " -replace Delete any existing comments\n"); - fprintf(stderr, " -comment \"text\" Insert comment with given text\n"); - fprintf(stderr, " -cfile name Read comment from named file\n"); - fprintf(stderr, "Notice that you must put quotes around the comment text\n"); - fprintf(stderr, "when you use -comment.\n"); - fprintf(stderr, "If you do not give either -comment or -cfile on the command line,\n"); - fprintf(stderr, "then the comment text is read from standard input.\n"); - fprintf(stderr, "It can be multiple lines, up to %u characters total.\n", - (unsigned int) MAX_COM_LENGTH); -#ifndef TWO_FILE_COMMANDLINE - fprintf(stderr, "You must specify an input JPEG file name when supplying\n"); - fprintf(stderr, "comment text from standard input.\n"); -#endif - - exit(EXIT_FAILURE); -} - - -static int -keymatch (char * arg, const char * keyword, int minchars) -/* Case-insensitive matching of (possibly abbreviated) keyword switches. */ -/* keyword is the constant keyword (must be lower case already), */ -/* minchars is length of minimum legal abbreviation. */ -{ - register int ca, ck; - register int nmatched = 0; - - while ((ca = *arg++) != '\0') { - if ((ck = *keyword++) == '\0') - return 0; /* arg longer than keyword, no good */ - if (isupper(ca)) /* force arg to lcase (assume ck is already) */ - ca = tolower(ca); - if (ca != ck) - return 0; /* no good */ - nmatched++; /* count matched characters */ - } - /* reached end of argument; fail if it's too short for unique abbrev */ - if (nmatched < minchars) - return 0; - return 1; /* A-OK */ -} - - -/* - * The main program. - */ - -int -main (int argc, char **argv) -{ - int argn; - char * arg; - int keep_COM = 1; - char * comment_arg = NULL; - FILE * comment_file = NULL; - unsigned int comment_length = 0; - int marker; - - /* On Mac, fetch a command line. */ -#ifdef USE_CCOMMAND - argc = ccommand(&argv); -#endif - - progname = argv[0]; - if (progname == NULL || progname[0] == 0) - progname = "wrjpgcom"; /* in case C library doesn't provide it */ - - /* Parse switches, if any */ - for (argn = 1; argn < argc; argn++) { - arg = argv[argn]; - if (arg[0] != '-') - break; /* not switch, must be file name */ - arg++; /* advance over '-' */ - if (keymatch(arg, "replace", 1)) { - keep_COM = 0; - } else if (keymatch(arg, "cfile", 2)) { - if (++argn >= argc) usage(); - if ((comment_file = fopen(argv[argn], "r")) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); - exit(EXIT_FAILURE); - } - } else if (keymatch(arg, "comment", 1)) { - if (++argn >= argc) usage(); - comment_arg = argv[argn]; - /* If the comment text starts with '"', then we are probably running - * under MS-DOG and must parse out the quoted string ourselves. Sigh. - */ - if (comment_arg[0] == '"') { - comment_arg = (char *) malloc((size_t) MAX_COM_LENGTH); - if (comment_arg == NULL) - ERREXIT("Insufficient memory"); - if (strlen(argv[argn]+1) >= (size_t) MAX_COM_LENGTH) { - fprintf(stderr, "Comment text may not exceed %u bytes\n", - (unsigned int) MAX_COM_LENGTH); - exit(EXIT_FAILURE); - } - strcpy(comment_arg, argv[argn]+1); - for (;;) { - comment_length = (unsigned int) strlen(comment_arg); - if (comment_length > 0 && comment_arg[comment_length-1] == '"') { - comment_arg[comment_length-1] = '\0'; /* zap terminating quote */ - break; - } - if (++argn >= argc) - ERREXIT("Missing ending quote mark"); - if (strlen(comment_arg) + 1 + strlen(argv[argn]) >= - (size_t) MAX_COM_LENGTH) { - fprintf(stderr, "Comment text may not exceed %u bytes\n", - (unsigned int) MAX_COM_LENGTH); - exit(EXIT_FAILURE); - } - strcat(comment_arg, " "); - strcat(comment_arg, argv[argn]); - } - } else if (strlen(comment_arg) >= (size_t) MAX_COM_LENGTH) { - fprintf(stderr, "Comment text may not exceed %u bytes\n", - (unsigned int) MAX_COM_LENGTH); - exit(EXIT_FAILURE); - } - comment_length = (unsigned int) strlen(comment_arg); - } else - usage(); - } - - /* Cannot use both -comment and -cfile. */ - if (comment_arg != NULL && comment_file != NULL) - usage(); - /* If there is neither -comment nor -cfile, we will read the comment text - * from stdin; in this case there MUST be an input JPEG file name. - */ - if (comment_arg == NULL && comment_file == NULL && argn >= argc) - usage(); - - /* Open the input file. */ - if (argn < argc) { - if ((infile = fopen(argv[argn], READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]); - exit(EXIT_FAILURE); - } - } else { - /* default input file is stdin */ -#ifdef USE_SETMODE /* need to hack file mode? */ - setmode(fileno(stdin), O_BINARY); -#endif -#ifdef USE_FDOPEN /* need to re-open in binary mode? */ - if ((infile = fdopen(fileno(stdin), READ_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open stdin\n", progname); - exit(EXIT_FAILURE); - } -#else - infile = stdin; -#endif - } - - /* Open the output file. */ -#ifdef TWO_FILE_COMMANDLINE - /* Must have explicit output file name */ - if (argn != argc-2) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - if ((outfile = fopen(argv[argn+1], WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open %s\n", progname, argv[argn+1]); - exit(EXIT_FAILURE); - } -#else - /* Unix style: expect zero or one file name */ - if (argn < argc-1) { - fprintf(stderr, "%s: only one input file\n", progname); - usage(); - } - /* default output file is stdout */ -#ifdef USE_SETMODE /* need to hack file mode? */ - setmode(fileno(stdout), O_BINARY); -#endif -#ifdef USE_FDOPEN /* need to re-open in binary mode? */ - if ((outfile = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { - fprintf(stderr, "%s: can't open stdout\n", progname); - exit(EXIT_FAILURE); - } -#else - outfile = stdout; -#endif -#endif /* TWO_FILE_COMMANDLINE */ - - /* Collect comment text from comment_file or stdin, if necessary */ - if (comment_arg == NULL) { - FILE * src_file; - int c; - - comment_arg = (char *) malloc((size_t) MAX_COM_LENGTH); - if (comment_arg == NULL) - ERREXIT("Insufficient memory"); - comment_length = 0; - src_file = (comment_file != NULL ? comment_file : stdin); - while ((c = getc(src_file)) != EOF) { - if (comment_length >= (unsigned int) MAX_COM_LENGTH) { - fprintf(stderr, "Comment text may not exceed %u bytes\n", - (unsigned int) MAX_COM_LENGTH); - exit(EXIT_FAILURE); - } - comment_arg[comment_length++] = (char) c; - } - if (comment_file != NULL) - fclose(comment_file); - } - - /* Copy JPEG headers until SOFn marker; - * we will insert the new comment marker just before SOFn. - * This (a) causes the new comment to appear after, rather than before, - * existing comments; and (b) ensures that comments come after any JFIF - * or JFXX markers, as required by the JFIF specification. - */ - marker = scan_JPEG_header(keep_COM); - /* Insert the new COM marker, but only if nonempty text has been supplied */ - if (comment_length > 0) { - write_marker(M_COM); - write_2_bytes(comment_length + 2); - while (comment_length > 0) { - write_1_byte(*comment_arg++); - comment_length--; - } - } - /* Duplicate the remainder of the source file. - * Note that any COM markers occuring after SOF will not be touched. - */ - write_marker(marker); - copy_rest_of_file(); - - /* All done. */ - exit(EXIT_SUCCESS); - return 0; /* suppress no-return-value warnings */ -} diff --git a/code/jpeg-9f/wrppm.c b/code/jpeg-9f/wrppm.c deleted file mode 100644 index c9e03ad1..00000000 --- a/code/jpeg-9f/wrppm.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * wrppm.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2009-2020 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write output images in PPM/PGM format. - * The extended 2-byte-per-sample raw PPM/PGM formats are supported. - * The PBMPLUS library is NOT required to compile this software - * (but it is highly useful as a set of PPM image manipulation programs). - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume output to - * an ordinary stdio stream. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef PPM_SUPPORTED - - -/* - * For 12-bit JPEG data, we either downscale the values to 8 bits - * (to write standard byte-per-sample PPM/PGM files), or output - * nonstandard word-per-sample PPM/PGM files. Downscaling is done - * if PPM_NORAWWORD is defined (this can be done in the Makefile - * or in jconfig.h). - * (When the core library supports data precision reduction, a cleaner - * implementation will be to ask for that instead.) - */ - -#if BITS_IN_JSAMPLE == 8 -#define PUTPPMSAMPLE(ptr,v) *ptr++ = (char) (v) -#define BYTESPERSAMPLE 1 -#define PPM_MAXVAL 255 -#else -#ifdef PPM_NORAWWORD -#define PUTPPMSAMPLE(ptr,v) *ptr++ = (char) ((v) >> (BITS_IN_JSAMPLE-8)) -#define BYTESPERSAMPLE 1 -#define PPM_MAXVAL 255 -#else -/* The word-per-sample format always puts the MSB first. */ -#define PUTPPMSAMPLE(ptr,v) \ - { register int val_ = v; \ - *ptr++ = (char) ((val_ >> 8) & 0xFF); \ - *ptr++ = (char) (val_ & 0xFF); \ - } -#define BYTESPERSAMPLE 2 -#define PPM_MAXVAL ((1<pub.output_file, dest->iobuffer, dest->buffer_width); -} - - -/* - * This code is used when we have to copy the data and apply a pixel - * format translation. Typically this only happens in 12-bit mode. - */ - -METHODDEF(void) -copy_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; - register char * bufferptr; - register JSAMPROW ptr; - register JDIMENSION col; - - ptr = dest->pixrow; - bufferptr = dest->iobuffer; - for (col = dest->samples_per_row; col > 0; col--) { - PUTPPMSAMPLE(bufferptr, GETJSAMPLE(*ptr++)); - } - (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); -} - - -/* - * Write some pixel data when color quantization is in effect. - * We have to demap the color index values to straight data. - */ - -METHODDEF(void) -put_demapped_rgb (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; - register char * bufferptr; - register int pixval; - register JSAMPROW ptr; - register JSAMPROW color_map0 = cinfo->colormap[0]; - register JSAMPROW color_map1 = cinfo->colormap[1]; - register JSAMPROW color_map2 = cinfo->colormap[2]; - register JDIMENSION col; - - ptr = dest->pixrow; - bufferptr = dest->iobuffer; - for (col = cinfo->output_width; col > 0; col--) { - pixval = GETJSAMPLE(*ptr++); - PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map0[pixval])); - PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map1[pixval])); - PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map2[pixval])); - } - (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); -} - -METHODDEF(void) -put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - ppm_dest_ptr dest = (ppm_dest_ptr) dinfo; - register char * bufferptr; - register JSAMPROW ptr; - register JSAMPROW color_map0 = cinfo->colormap[0]; - register JDIMENSION col; - - ptr = dest->pixrow; - bufferptr = dest->iobuffer; - for (col = cinfo->output_width; col > 0; col--) { - PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map0[GETJSAMPLE(*ptr++)])); - } - (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); -} - - -/* - * Startup: write the file header. - */ - -METHODDEF(void) -start_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - /* Emit file header */ - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - /* emit header for raw PGM format */ - fprintf(dinfo->output_file, "P5\n%ld %ld\n%d\n", - (long) cinfo->output_width, (long) cinfo->output_height, - PPM_MAXVAL); - break; - case JCS_RGB: - /* emit header for raw PPM format */ - fprintf(dinfo->output_file, "P6\n%ld %ld\n%d\n", - (long) cinfo->output_width, (long) cinfo->output_height, - PPM_MAXVAL); - break; - default: - ERREXIT(cinfo, JERR_PPM_COLORSPACE); - } -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - /* Make sure we wrote the output file OK */ - JFFLUSH(dinfo->output_file); - if (JFERROR(dinfo->output_file)) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * The module selection routine for PPM format output. - */ - -GLOBAL(djpeg_dest_ptr) -jinit_write_ppm (j_decompress_ptr cinfo) -{ - ppm_dest_ptr dest; - - /* Create module interface object, fill in method pointers */ - dest = (ppm_dest_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(ppm_dest_struct)); - dest->pub.start_output = start_output_ppm; - dest->pub.finish_output = finish_output_ppm; - - /* Calculate output image dimensions so we can allocate space */ - jpeg_calc_output_dimensions(cinfo); - - /* Create physical I/O buffer. Note we make this near on a PC. */ - dest->samples_per_row = cinfo->output_width * cinfo->out_color_components; - dest->buffer_width = dest->samples_per_row * (BYTESPERSAMPLE * SIZEOF(char)); - dest->iobuffer = (char *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width); - - if (cinfo->quantize_colors || BITS_IN_JSAMPLE != 8 || - SIZEOF(JSAMPLE) != SIZEOF(char)) { - /* When quantizing, we need an output buffer for colormap indexes - * that's separate from the physical I/O buffer. We also need a - * separate buffer if pixel format translation must take place. - */ - dest->pixrow = (JSAMPROW) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, (size_t) cinfo->output_width * - (size_t) cinfo->output_components * SIZEOF(JSAMPLE)); - if (! cinfo->quantize_colors) - dest->pub.put_pixel_rows = copy_pixel_rows; - else if (cinfo->out_color_space == JCS_GRAYSCALE) - dest->pub.put_pixel_rows = put_demapped_gray; - else - dest->pub.put_pixel_rows = put_demapped_rgb; - } else { - /* We will fwrite() directly from decompressor output buffer. */ - /* Cast here implies near->far pointer conversion on PCs */ - dest->pixrow = (JSAMPROW) dest->iobuffer; - dest->pub.put_pixel_rows = put_pixel_rows; - } - /* Synthesize a JSAMPARRAY pointer structure */ - dest->pub.buffer = & dest->pixrow; - dest->pub.buffer_height = 1; - - return &dest->pub; -} - -#endif /* PPM_SUPPORTED */ diff --git a/code/jpeg-9f/wrrle.c b/code/jpeg-9f/wrrle.c deleted file mode 100644 index dc2fadb8..00000000 --- a/code/jpeg-9f/wrrle.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - * wrrle.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2017-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write output images in RLE format. - * The Utah Raster Toolkit library is required (version 3.1 or later). - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume output to - * an ordinary stdio stream. - * - * Based on code contributed by Mike Lijewski, - * with updates from Robert Hutchinson. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef RLE_SUPPORTED - -/* rle.h is provided by the Utah Raster Toolkit. */ - -#include - -/* - * We assume that JSAMPLE has the same representation as rle_pixel, - * to wit, "unsigned char". Hence we can't cope with 12- or 16-bit samples. - */ - -#if BITS_IN_JSAMPLE != 8 - Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ -#endif - - -/* - * Since RLE stores scanlines bottom-to-top, we have to invert the image - * from JPEG's top-to-bottom order. To do this, we save the outgoing data - * in a virtual array during put_pixel_row calls, then actually emit the - * RLE file during finish_output. - */ - - -/* - * For now, if we emit an RLE color map then it is always 256 entries long, - * though not all of the entries need be used. - */ - -#define CMAPBITS 8 -#define CMAPLENGTH (1<<(CMAPBITS)) - -typedef struct { - struct djpeg_dest_struct pub; /* public fields */ - - jvirt_sarray_ptr image; /* virtual array to store the output image */ - rle_map *colormap; /* RLE-style color map, or NULL if none */ - rle_pixel **rle_row; /* To pass rows to rle_putrow() */ - -} rle_dest_struct; - -typedef rle_dest_struct * rle_dest_ptr; - - -/* Forward declarations */ -METHODDEF(void) rle_put_pixel_rows - JPP((j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied)); - - -/* - * Write the file header. - * - * In this module it's easier to wait till finish_output to write anything. - */ - -METHODDEF(void) -start_output_rle (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - rle_dest_ptr dest = (rle_dest_ptr) dinfo; - size_t cmapsize; - int ci, i; -#ifdef PROGRESS_REPORT - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; -#endif - - /* - * Make sure the image can be stored in RLE format. - * - * - RLE stores image dimensions as *signed* 16 bit integers. JPEG - * uses unsigned, so we have to check the width. - * - * - Colorspace is expected to be grayscale or RGB. - * - * - The number of channels (components) is expected to be 1 (grayscale/ - * pseudocolor) or 3 (truecolor/directcolor). - * (could be 2 or 4 if using an alpha channel, but we aren't) - */ - - if (cinfo->output_width > 32767 || cinfo->output_height > 32767) - ERREXIT2(cinfo, JERR_RLE_DIMENSIONS, cinfo->output_width, - cinfo->output_height); - - if (cinfo->out_color_space != JCS_GRAYSCALE && - cinfo->out_color_space != JCS_RGB) - ERREXIT(cinfo, JERR_RLE_COLORSPACE); - - if (cinfo->output_components != 1 && cinfo->output_components != 3) - ERREXIT1(cinfo, JERR_RLE_TOOMANYCHANNELS, cinfo->num_components); - - /* Convert colormap, if any, to RLE format. */ - - dest->colormap = NULL; - - if (cinfo->quantize_colors) { - /* Allocate storage for RLE-style cmap, zero any extra entries */ - cmapsize = cinfo->out_color_components * CMAPLENGTH * SIZEOF(rle_map); - dest->colormap = (rle_map *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, cmapsize); - MEMZERO(dest->colormap, cmapsize); - - /* Save away data in RLE format --- note 8-bit left shift! */ - /* Shifting would need adjustment for JSAMPLEs wider than 8 bits. */ - for (ci = 0; ci < cinfo->out_color_components; ci++) { - for (i = 0; i < cinfo->actual_number_of_colors; i++) { - dest->colormap[ci * CMAPLENGTH + i] = - GETJSAMPLE(cinfo->colormap[ci][i]) << 8; - } - } - } - - /* Set the output buffer to the first row */ - dest->pub.buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, dest->image, (JDIMENSION) 0, (JDIMENSION) 1, TRUE); - dest->pub.buffer_height = 1; - - dest->pub.put_pixel_rows = rle_put_pixel_rows; - -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->total_extra_passes++; /* count file writing as separate pass */ - } -#endif -} - - -/* - * Write some pixel data. - * - * This routine just saves the data away in a virtual array. - */ - -METHODDEF(void) -rle_put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - rle_dest_ptr dest = (rle_dest_ptr) dinfo; - - if (cinfo->output_scanline < cinfo->output_height) { - dest->pub.buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, dest->image, - cinfo->output_scanline, (JDIMENSION) 1, TRUE); - } -} - - -/* - * Finish up at the end of the file. - * - * Here is where we really output the RLE file. - */ - -METHODDEF(void) -finish_output_rle (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - rle_dest_ptr dest = (rle_dest_ptr) dinfo; - rle_hdr header; /* Output file information */ - rle_pixel **rle_row, *red_ptr, *green_ptr, *blue_ptr; - JSAMPROW output_row; - char cmapcomment[80]; - int row, col; - int ci; -#ifdef PROGRESS_REPORT - cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; -#endif - - /* Initialize the header info */ - header = *rle_hdr_init(NULL); - header.rle_file = dest->pub.output_file; - header.xmin = 0; - header.xmax = cinfo->output_width - 1; - header.ymin = 0; - header.ymax = cinfo->output_height - 1; - header.alpha = 0; - header.ncolors = cinfo->output_components; - for (ci = 0; ci < cinfo->output_components; ci++) { - RLE_SET_BIT(header, ci); - } - if (cinfo->quantize_colors) { - header.ncmap = cinfo->out_color_components; - header.cmaplen = CMAPBITS; - header.cmap = dest->colormap; - /* Add a comment to the output image with the true colormap length. */ - sprintf(cmapcomment, "color_map_length=%d", cinfo->actual_number_of_colors); - rle_putcom(cmapcomment, &header); - } - - /* Emit the RLE header and color map (if any) */ - rle_put_setup(&header); - - /* Now output the RLE data from our virtual array. - * We assume here that (a) rle_pixel is represented the same as JSAMPLE, - * and (b) we are not on a machine where FAR pointers differ from regular. - */ - -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_limit = cinfo->output_height; - progress->pub.pass_counter = 0; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - - if (cinfo->output_components == 1) { - for (row = cinfo->output_height - 1; row >= 0; row--) { - rle_row = (rle_pixel **) (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, dest->image, - (JDIMENSION) row, (JDIMENSION) 1, FALSE); - rle_putrow(rle_row, (int) cinfo->output_width, &header); -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_counter++; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - } - } else { - for (row = cinfo->output_height - 1; row >= 0; row--) { - output_row = * (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, dest->image, - (JDIMENSION) row, (JDIMENSION) 1, FALSE); - rle_row = dest->rle_row; - red_ptr = rle_row[0]; - green_ptr = rle_row[1]; - blue_ptr = rle_row[2]; - for (col = cinfo->output_width; col > 0; col--) { - *red_ptr++ = GETJSAMPLE(*output_row++); - *green_ptr++ = GETJSAMPLE(*output_row++); - *blue_ptr++ = GETJSAMPLE(*output_row++); - } - rle_putrow(rle_row, (int) cinfo->output_width, &header); -#ifdef PROGRESS_REPORT - if (progress != NULL) { - progress->pub.pass_counter++; - (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); - } -#endif - } - } - -#ifdef PROGRESS_REPORT - if (progress != NULL) - progress->completed_extra_passes++; -#endif - - /* Emit file trailer */ - rle_puteof(&header); - JFFLUSH(dest->pub.output_file); - if (JFERROR(dest->pub.output_file)) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * The module selection routine for RLE format output. - */ - -GLOBAL(djpeg_dest_ptr) -jinit_write_rle (j_decompress_ptr cinfo) -{ - rle_dest_ptr dest; - - /* Create module interface object, fill in method pointers */ - dest = (rle_dest_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(rle_dest_struct)); - dest->pub.start_output = start_output_rle; - dest->pub.finish_output = finish_output_rle; - - /* Calculate output image dimensions so we can allocate space */ - jpeg_calc_output_dimensions(cinfo); - - /* Allocate a work array for output to the RLE library. */ - dest->rle_row = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) cinfo->output_components); - - /* Allocate a virtual array to hold the image. */ - dest->image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - cinfo->output_width * (JDIMENSION) cinfo->output_components, - cinfo->output_height, (JDIMENSION) 1); - - return &dest->pub; -} - -#endif /* RLE_SUPPORTED */ diff --git a/code/jpeg-9f/wrtarga.c b/code/jpeg-9f/wrtarga.c deleted file mode 100644 index 8ded5183..00000000 --- a/code/jpeg-9f/wrtarga.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * wrtarga.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * Modified 2015-2019 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write output images in Targa format. - * - * These routines may need modification for non-Unix environments or - * specialized applications. As they stand, they assume output to - * an ordinary stdio stream. - * - * Based on code contributed by Lee Daniel Crocker. - */ - -#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ - -#ifdef TARGA_SUPPORTED - - -/* - * To support 12-bit JPEG data, we'd have to scale output down to 8 bits. - * This is not yet implemented. - */ - -#if BITS_IN_JSAMPLE != 8 - Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ -#endif - -/* - * The output buffer needs to be writable by fwrite(). On PCs, we must - * allocate the buffer in near data space, because we are assuming small-data - * memory model, wherein fwrite() can't reach far memory. If you need to - * process very wide images on a PC, you might have to compile in large-memory - * model, or else replace fwrite() with a putc() loop --- which will be much - * slower. - */ - - -/* Private version of data destination object */ - -typedef struct { - struct djpeg_dest_struct pub; /* public fields */ - - char *iobuffer; /* physical I/O buffer */ - JDIMENSION buffer_width; /* width of one row */ -} tga_dest_struct; - -typedef tga_dest_struct * tga_dest_ptr; - - -LOCAL(void) -write_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors) -/* Create and write a Targa header */ -{ - char targaheader[18]; - - /* Set unused fields of header to 0 */ - MEMZERO(targaheader, SIZEOF(targaheader)); - - if (num_colors > 0) { - targaheader[1] = 1; /* color map type 1 */ - targaheader[5] = (char) (num_colors & 0xFF); - targaheader[6] = (char) (num_colors >> 8); - targaheader[7] = 24; /* 24 bits per cmap entry */ - } - - targaheader[12] = (char) (cinfo->output_width & 0xFF); - targaheader[13] = (char) (cinfo->output_width >> 8); - targaheader[14] = (char) (cinfo->output_height & 0xFF); - targaheader[15] = (char) (cinfo->output_height >> 8); - targaheader[17] = 0x20; /* Top-down, non-interlaced */ - - if (cinfo->out_color_space == JCS_GRAYSCALE) { - targaheader[2] = 3; /* image type = uncompressed grayscale */ - targaheader[16] = 8; /* bits per pixel */ - } else { /* must be RGB */ - if (num_colors > 0) { - targaheader[2] = 1; /* image type = colormapped RGB */ - targaheader[16] = 8; - } else { - targaheader[2] = 2; /* image type = uncompressed RGB */ - targaheader[16] = 24; - } - } - - if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * Write some pixel data. - * In this module rows_supplied will always be 1. - */ - -METHODDEF(void) -put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -/* used for unquantized full-color output */ -{ - tga_dest_ptr dest = (tga_dest_ptr) dinfo; - register JSAMPROW inptr; - register char * outptr; - register JDIMENSION col; - - inptr = dest->pub.buffer[0]; - outptr = dest->iobuffer; - for (col = cinfo->output_width; col > 0; col--) { - outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */ - outptr[1] = (char) GETJSAMPLE(inptr[1]); - outptr[2] = (char) GETJSAMPLE(inptr[0]); - inptr += 3, outptr += 3; - } - (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); -} - -METHODDEF(void) -put_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -/* used for grayscale OR quantized color output */ -{ - tga_dest_ptr dest = (tga_dest_ptr) dinfo; - register JSAMPROW inptr; - register char * outptr; - register JDIMENSION col; - - inptr = dest->pub.buffer[0]; - outptr = dest->iobuffer; - for (col = cinfo->output_width; col > 0; col--) { - *outptr++ = (char) GETJSAMPLE(*inptr++); - } - (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); -} - - -/* - * Write some demapped pixel data when color quantization is in effect. - * For Targa, this is only applied to grayscale data. - */ - -METHODDEF(void) -put_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied) -{ - tga_dest_ptr dest = (tga_dest_ptr) dinfo; - register JSAMPROW inptr; - register char * outptr; - register JSAMPROW color_map0 = cinfo->colormap[0]; - register JDIMENSION col; - - inptr = dest->pub.buffer[0]; - outptr = dest->iobuffer; - for (col = cinfo->output_width; col > 0; col--) { - *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]); - } - (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); -} - - -/* - * Startup: write the file header. - */ - -METHODDEF(void) -start_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - int num_colors, i; - FILE *outfile; - - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - /* Targa doesn't have a mapped grayscale format, so we will */ - /* demap quantized gray output. Never emit a colormap. */ - write_header(cinfo, dinfo, 0); - if (cinfo->quantize_colors) - dinfo->put_pixel_rows = put_demapped_gray; - else - dinfo->put_pixel_rows = put_gray_rows; - break; - case JCS_RGB: - if (cinfo->quantize_colors) { - /* We only support 8-bit colormap indexes, so only 256 colors */ - num_colors = cinfo->actual_number_of_colors; - if (num_colors > 256) - ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors); - write_header(cinfo, dinfo, num_colors); - /* Write the colormap. Note Targa uses BGR byte order */ - outfile = dinfo->output_file; - for (i = 0; i < num_colors; i++) { - putc(GETJSAMPLE(cinfo->colormap[2][i]), outfile); - putc(GETJSAMPLE(cinfo->colormap[1][i]), outfile); - putc(GETJSAMPLE(cinfo->colormap[0][i]), outfile); - } - dinfo->put_pixel_rows = put_gray_rows; - } else { - write_header(cinfo, dinfo, 0); - dinfo->put_pixel_rows = put_pixel_rows; - } - break; - default: - ERREXIT(cinfo, JERR_TGA_COLORSPACE); - } -} - - -/* - * Finish up at the end of the file. - */ - -METHODDEF(void) -finish_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) -{ - /* Make sure we wrote the output file OK */ - JFFLUSH(dinfo->output_file); - if (JFERROR(dinfo->output_file)) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * The module selection routine for Targa format output. - */ - -GLOBAL(djpeg_dest_ptr) -jinit_write_targa (j_decompress_ptr cinfo) -{ - tga_dest_ptr dest; - - /* Create module interface object, fill in method pointers */ - dest = (tga_dest_ptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(tga_dest_struct)); - dest->pub.start_output = start_output_tga; - dest->pub.finish_output = finish_output_tga; - - /* Calculate output image dimensions so we can allocate space */ - jpeg_calc_output_dimensions(cinfo); - - /* Create I/O buffer. Note we make this near on a PC. */ - dest->buffer_width = cinfo->output_width * cinfo->output_components; - dest->iobuffer = (char *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, - JPOOL_IMAGE, (size_t) dest->buffer_width * SIZEOF(char)); - - /* Create decompressor output buffer. */ - dest->pub.buffer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, - JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1); - dest->pub.buffer_height = 1; - - return &dest->pub; -} - -#endif /* TARGA_SUPPORTED */ diff --git a/code/libs/win32/libcurl.a b/code/libs/win32/libcurl.a deleted file mode 100644 index 47f4d284c0fba3815c0997ee5a277e1a76db381c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434836 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

` 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�q=OS0+;qCEJ+Xr$wE8U&*Gdx|t>0C6T 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 VCHjWGuWZHQcx%uSz`st3{x536yrcjC diff --git a/code/libs/win64/libcurl.a b/code/libs/win64/libcurl.a deleted file mode 100644 index d343d480d87273902a1b0d26b5b3b684ec25cbb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504330 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�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 z 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%0A|pd!vs@y`S5@j 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, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +struct curl_header { + char *name; /* this might not use the same case */ + char *value; + size_t amount; /* number of headers using this name */ + size_t index; /* ... of this instance, 0 or higher */ + unsigned int origin; /* see bits below */ + void *anchor; /* handle privately used by libcurl */ +}; + +/* 'origin' bits */ +#define CURLH_HEADER (1<<0) /* plain server header */ +#define CURLH_TRAILER (1<<1) /* trailers */ +#define CURLH_CONNECT (1<<2) /* CONNECT headers */ +#define CURLH_1XX (1<<3) /* 1xx headers */ +#define CURLH_PSEUDO (1<<4) /* pseudo headers */ + +typedef enum { + CURLHE_OK, + CURLHE_BADINDEX, /* header exists but not with this index */ + CURLHE_MISSING, /* no such header exists */ + CURLHE_NOHEADERS, /* no headers at all exist (yet) */ + CURLHE_NOREQUEST, /* no request with this number was used */ + CURLHE_OUT_OF_MEMORY, /* out of memory while processing */ + CURLHE_BAD_ARGUMENT, /* a function argument was not okay */ + CURLHE_NOT_BUILT_IN /* if API was disabled in the build */ +} CURLHcode; + +CURL_EXTERN CURLHcode curl_easy_header(CURL *easy, + const char *name, + size_t index, + unsigned int origin, + int request, + struct curl_header **hout); + +CURL_EXTERN struct curl_header *curl_easy_nextheader(CURL *easy, + unsigned int origin, + int request, + struct curl_header *prev); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif /* CURLINC_HEADER_H */ diff --git a/code/curl-7.54.0/include/curl/mprintf.h b/code/thirdparty/curl-8.15.0/include/curl/mprintf.h similarity index 100% rename from code/curl-7.54.0/include/curl/mprintf.h rename to code/thirdparty/curl-8.15.0/include/curl/mprintf.h diff --git a/code/curl-7.54.0/include/curl/multi.h b/code/thirdparty/curl-8.15.0/include/curl/multi.h similarity index 100% rename from code/curl-7.54.0/include/curl/multi.h rename to code/thirdparty/curl-8.15.0/include/curl/multi.h diff --git a/code/thirdparty/curl-8.15.0/include/curl/options.h b/code/thirdparty/curl-8.15.0/include/curl/options.h new file mode 100644 index 00000000..1ed76a95 --- /dev/null +++ b/code/thirdparty/curl-8.15.0/include/curl/options.h @@ -0,0 +1,70 @@ +#ifndef CURLINC_OPTIONS_H +#define CURLINC_OPTIONS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + CURLOT_LONG, /* long (a range of values) */ + CURLOT_VALUES, /* (a defined set or bitmask) */ + CURLOT_OFF_T, /* curl_off_t (a range of values) */ + CURLOT_OBJECT, /* pointer (void *) */ + CURLOT_STRING, /* (char * to null-terminated buffer) */ + CURLOT_SLIST, /* (struct curl_slist *) */ + CURLOT_CBPTR, /* (void * passed as-is to a callback) */ + CURLOT_BLOB, /* blob (struct curl_blob *) */ + CURLOT_FUNCTION /* function pointer */ +} curl_easytype; + +/* Flag bits */ + +/* "alias" means it is provided for old programs to remain functional, + we prefer another name */ +#define CURLOT_FLAG_ALIAS (1<<0) + +/* The CURLOPTTYPE_* id ranges can still be used to figure out what type/size + to use for curl_easy_setopt() for the given id */ +struct curl_easyoption { + const char *name; + CURLoption id; + curl_easytype type; + unsigned int flags; +}; + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_by_name(const char *name); + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_by_id(CURLoption id); + +CURL_EXTERN const struct curl_easyoption * +curl_easy_option_next(const struct curl_easyoption *prev); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif +#endif /* CURLINC_OPTIONS_H */ diff --git a/code/curl-7.54.0/include/curl/stdcheaders.h b/code/thirdparty/curl-8.15.0/include/curl/stdcheaders.h similarity index 100% rename from code/curl-7.54.0/include/curl/stdcheaders.h rename to code/thirdparty/curl-8.15.0/include/curl/stdcheaders.h diff --git a/code/thirdparty/curl-8.15.0/include/curl/system.h b/code/thirdparty/curl-8.15.0/include/curl/system.h new file mode 100644 index 00000000..ebcdc5e4 --- /dev/null +++ b/code/thirdparty/curl-8.15.0/include/curl/system.h @@ -0,0 +1,402 @@ +#ifndef CURLINC_SYSTEM_H +#define CURLINC_SYSTEM_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +/* + * Try to keep one section per platform, compiler and architecture, otherwise, + * if an existing section is reused for a different one and later on the + * original is adjusted, probably the piggybacking one can be adversely + * changed. + * + * In order to differentiate between platforms/compilers/architectures use + * only compiler built-in predefined preprocessor symbols. + * + * curl_off_t + * ---------- + * + * For any given platform/compiler curl_off_t MUST be typedef'ed to a 64-bit + * wide signed integral data type. The width of this data type must remain + * constant and independent of any possible large file support settings. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall + * only be violated if off_t is the only 64-bit data type available and the + * size of off_t is independent of large file support settings. Keep your + * build on the safe side avoiding an off_t gating. If you have a 64-bit + * off_t then take for sure that another 64-bit data type exists, dig deeper + * and you will find it. + * + */ + +#ifdef __DJGPP__ +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__BORLANDC__) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__POCC__) +# if defined(_MSC_VER) +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__LCC__) +# if defined(__MCST__) /* MCST eLbrus Compiler Collection */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# else /* Local (or Little) C Compiler */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# endif + +#elif defined(macintosh) +# include +# if TYPE_LONGLONG +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int + +#elif defined(__TANDEM) +# if !defined(__LP64) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# endif + +#elif defined(UNDER_CE) +# if defined(__MINGW32CE__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# else +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# endif + +#elif defined(__MINGW32__) +# include +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T PRId64 +# define CURL_FORMAT_CURL_OFF_TU PRIu64 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_PULL_SYS_TYPES_H 1 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int + +#elif defined(__OS400__) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__MVS__) +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else /* _LP64 and default */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else /* _LP64 and default */ +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +#elif defined(__TINYC__) /* also known as tcc */ +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */ +# if !defined(__LP64) && (defined(__ILP32) || \ + defined(__i386) || \ + defined(__sparcv8) || \ + defined(__sparcv8plus)) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64) || \ + defined(__amd64) || defined(__sparcv9) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__xlc__) /* IBM xlc compiler */ +# if !defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#elif defined(__hpux) /* HP aCC compiler */ +# if !defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 1800) +# include +# define CURL_FORMAT_CURL_OFF_T PRId64 +# define CURL_FORMAT_CURL_OFF_TU PRIu64 +# else +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# endif +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) && !defined(_SCO_DS) +# if !defined(__LP64__) && \ + (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \ + defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__) || \ + defined(__XTENSA__) || \ + (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \ + (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L)) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_POPCOUNT64(x) __builtin_popcountll(x) +# define CURL_CTZ64(x) __builtin_ctzll(x) +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \ + defined(__e2k__) || \ + (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \ + (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_POPCOUNT64(x) __builtin_popcountl(x) +# define CURL_CTZ64(x) __builtin_ctzl(x) +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +/* generic "safe guess" on old 32-bit style */ +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +#endif + +#ifdef _AIX +/* AIX needs */ +#define CURL_PULL_SYS_POLL_H +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */ +/* sys/poll.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* CURLINC_SYSTEM_H */ diff --git a/code/thirdparty/curl-8.15.0/include/curl/typecheck-gcc.h b/code/thirdparty/curl-8.15.0/include/curl/typecheck-gcc.h new file mode 100644 index 00000000..ca0c0ef9 --- /dev/null +++ b/code/thirdparty/curl-8.15.0/include/curl/typecheck-gcc.h @@ -0,0 +1,867 @@ +#ifndef CURLINC_TYPECHECK_GCC_H +#define CURLINC_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(curlcheck_sometype_option(_curl_opt)) + * if(!curlcheck_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define curlcheck_sometype_option, curlcheck_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you will + * just need to extend the appropriate _curl_*_option macro + */ + +#define curl_easy_setopt(handle, option, value) \ + __extension__({ \ + if(__builtin_constant_p(option)) { \ + CURL_IGNORE_DEPRECATION( \ + if(curlcheck_long_option(option)) \ + if(!curlcheck_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(curlcheck_off_t_option(option)) \ + if(!curlcheck_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(curlcheck_string_option(option)) \ + if(!curlcheck_string(value)) \ + _curl_easy_setopt_err_string(); \ + if((option) == CURLOPT_PRIVATE) { } \ + if(curlcheck_write_cb_option(option)) \ + if(!curlcheck_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if(curlcheck_curl_option(option)) \ + if(!curlcheck_curl(value)) \ + _curl_easy_setopt_err_curl(); \ + if((option) == CURLOPT_RESOLVER_START_FUNCTION) \ + if(!curlcheck_resolver_start_callback(value)) \ + _curl_easy_setopt_err_resolver_start_callback(); \ + if((option) == CURLOPT_READFUNCTION) \ + if(!curlcheck_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((option) == CURLOPT_IOCTLFUNCTION) \ + if(!curlcheck_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((option) == CURLOPT_SOCKOPTFUNCTION) \ + if(!curlcheck_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((option) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!curlcheck_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((option) == CURLOPT_PROGRESSFUNCTION) \ + if(!curlcheck_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((option) == CURLOPT_XFERINFOFUNCTION) \ + if(!curlcheck_xferinfo_cb(value)) \ + _curl_easy_setopt_err_xferinfo_cb(); \ + if((option) == CURLOPT_DEBUGFUNCTION) \ + if(!curlcheck_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((option) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!curlcheck_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(curlcheck_conv_cb_option(option)) \ + if(!curlcheck_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((option) == CURLOPT_SEEKFUNCTION) \ + if(!curlcheck_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if((option) == CURLOPT_CHUNK_BGN_FUNCTION) \ + if(!curlcheck_chunk_bgn_cb(value)) \ + _curl_easy_setopt_err_chunk_bgn_cb(); \ + if((option) == CURLOPT_CHUNK_END_FUNCTION) \ + if(!curlcheck_chunk_end_cb(value)) \ + _curl_easy_setopt_err_chunk_end_cb(); \ + if((option) == CURLOPT_CLOSESOCKETFUNCTION) \ + if(!curlcheck_close_socket_cb(value)) \ + _curl_easy_setopt_err_close_socket_cb(); \ + if((option) == CURLOPT_FNMATCH_FUNCTION) \ + if(!curlcheck_fnmatch_cb(value)) \ + _curl_easy_setopt_err_fnmatch_cb(); \ + if((option) == CURLOPT_HSTSREADFUNCTION) \ + if(!curlcheck_hstsread_cb(value)) \ + _curl_easy_setopt_err_hstsread_cb(); \ + if((option) == CURLOPT_HSTSWRITEFUNCTION) \ + if(!curlcheck_hstswrite_cb(value)) \ + _curl_easy_setopt_err_hstswrite_cb(); \ + if((option) == CURLOPT_SSH_HOSTKEYFUNCTION) \ + if(!curlcheck_ssh_hostkey_cb(value)) \ + _curl_easy_setopt_err_ssh_hostkey_cb(); \ + if((option) == CURLOPT_SSH_KEYFUNCTION) \ + if(!curlcheck_ssh_key_cb(value)) \ + _curl_easy_setopt_err_ssh_key_cb(); \ + if((option) == CURLOPT_INTERLEAVEFUNCTION) \ + if(!curlcheck_interleave_cb(value)) \ + _curl_easy_setopt_err_interleave_cb(); \ + if((option) == CURLOPT_PREREQFUNCTION) \ + if(!curlcheck_prereq_cb(value)) \ + _curl_easy_setopt_err_prereq_cb(); \ + if((option) == CURLOPT_TRAILERFUNCTION) \ + if(!curlcheck_trailer_cb(value)) \ + _curl_easy_setopt_err_trailer_cb(); \ + if(curlcheck_cb_data_option(option)) \ + if(!curlcheck_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((option) == CURLOPT_ERRORBUFFER) \ + if(!curlcheck_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((option) == CURLOPT_CURLU) \ + if(!curlcheck_ptr((value), CURLU)) \ + _curl_easy_setopt_err_curlu(); \ + if((option) == CURLOPT_STDERR) \ + if(!curlcheck_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(curlcheck_postfields_option(option)) \ + if(!curlcheck_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((option) == CURLOPT_HTTPPOST) \ + if(!curlcheck_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if((option) == CURLOPT_MIMEPOST) \ + if(!curlcheck_ptr((value), curl_mime)) \ + _curl_easy_setopt_err_curl_mimepost(); \ + if(curlcheck_slist_option(option)) \ + if(!curlcheck_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((option) == CURLOPT_SHARE) \ + if(!curlcheck_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + ) \ + } \ + curl_easy_setopt(handle, option, value); \ + }) + +/* wraps curl_easy_getinfo() with typechecking */ +#define curl_easy_getinfo(handle, info, arg) \ + __extension__({ \ + if(__builtin_constant_p(info)) { \ + CURL_IGNORE_DEPRECATION( \ + if(curlcheck_string_info(info)) \ + if(!curlcheck_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(curlcheck_long_info(info)) \ + if(!curlcheck_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(curlcheck_double_info(info)) \ + if(!curlcheck_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(curlcheck_slist_info(info)) \ + if(!curlcheck_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + if(curlcheck_tlssessioninfo_info(info)) \ + if(!curlcheck_arr((arg), struct curl_tlssessioninfo *)) \ + _curl_easy_getinfo_err_curl_tlssessioninfo(); \ + if(curlcheck_certinfo_info(info)) \ + if(!curlcheck_arr((arg), struct curl_certinfo *)) \ + _curl_easy_getinfo_err_curl_certinfo(); \ + if(curlcheck_socket_info(info)) \ + if(!curlcheck_arr((arg), curl_socket_t)) \ + _curl_easy_getinfo_err_curl_socket(); \ + if(curlcheck_off_t_info(info)) \ + if(!curlcheck_arr((arg), curl_off_t)) \ + _curl_easy_getinfo_err_curl_off_t(); \ + ) \ + } \ + curl_easy_getinfo(handle, info, arg); \ + }) + +/* + * For now, just make sure that the functions are called with three arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define CURLWARNING(id, message) \ + static void __attribute__((__warning__(message))) \ + __attribute__((__unused__)) __attribute__((__noinline__)) \ + id(void) { __asm__(""); } + +CURLWARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument") +CURLWARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument") +CURLWARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string ('char *' or char[]) argument") +CURLWARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument") +CURLWARNING(_curl_easy_setopt_err_resolver_start_callback, + "curl_easy_setopt expects a " + "curl_resolver_start_callback argument") +CURLWARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument") +CURLWARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument") +CURLWARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument") +CURLWARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument") +CURLWARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument") +CURLWARNING(_curl_easy_setopt_err_xferinfo_cb, + "curl_easy_setopt expects a curl_xferinfo_callback argument") +CURLWARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument") +CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument") +CURLWARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument") +CURLWARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument") +CURLWARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument") +CURLWARNING(_curl_easy_setopt_err_chunk_bgn_cb, + "curl_easy_setopt expects a curl_chunk_bgn_callback argument") +CURLWARNING(_curl_easy_setopt_err_chunk_end_cb, + "curl_easy_setopt expects a curl_chunk_end_callback argument") +CURLWARNING(_curl_easy_setopt_err_close_socket_cb, + "curl_easy_setopt expects a curl_closesocket_callback argument") +CURLWARNING(_curl_easy_setopt_err_fnmatch_cb, + "curl_easy_setopt expects a curl_fnmatch_callback argument") +CURLWARNING(_curl_easy_setopt_err_hstsread_cb, + "curl_easy_setopt expects a curl_hstsread_callback argument") +CURLWARNING(_curl_easy_setopt_err_hstswrite_cb, + "curl_easy_setopt expects a curl_hstswrite_callback argument") +CURLWARNING(_curl_easy_setopt_err_ssh_key_cb, + "curl_easy_setopt expects a curl_sshkeycallback argument") +CURLWARNING(_curl_easy_setopt_err_ssh_hostkey_cb, + "curl_easy_setopt expects a curl_sshhostkeycallback argument") +CURLWARNING(_curl_easy_setopt_err_interleave_cb, + "curl_easy_setopt expects a curl_interleave_callback argument") +CURLWARNING(_curl_easy_setopt_err_prereq_cb, + "curl_easy_setopt expects a curl_prereq_callback argument") +CURLWARNING(_curl_easy_setopt_err_trailer_cb, + "curl_easy_setopt expects a curl_trailerfunc_ok argument") +CURLWARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument") +CURLWARNING(_curl_easy_setopt_err_curlu, + "curl_easy_setopt expects a 'CURLU *' argument") +CURLWARNING(_curl_easy_setopt_err_curl, + "curl_easy_setopt expects a 'CURL *' argument") +CURLWARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a 'FILE *' argument") +CURLWARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a 'void *' or 'char *' argument") +CURLWARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a 'struct curl_httppost *' " + "argument") +CURLWARNING(_curl_easy_setopt_err_curl_mimepost, + "curl_easy_setopt expects a 'curl_mime *' " + "argument") +CURLWARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a 'struct curl_slist *' argument") +CURLWARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument") +CURLWARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to 'char *'") +CURLWARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long") +CURLWARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double") +CURLWARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to 'struct curl_slist *'") +CURLWARNING(_curl_easy_getinfo_err_curl_tlssessioninfo, + "curl_easy_getinfo expects a pointer to " + "'struct curl_tlssessioninfo *'") +CURLWARNING(_curl_easy_getinfo_err_curl_certinfo, + "curl_easy_getinfo expects a pointer to " + "'struct curl_certinfo *'") +CURLWARNING(_curl_easy_getinfo_err_curl_socket, + "curl_easy_getinfo expects a pointer to curl_socket_t") +CURLWARNING(_curl_easy_getinfo_err_curl_off_t, + "curl_easy_getinfo expects a pointer to curl_off_t") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* evaluates to true if option takes a long argument */ +#define curlcheck_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define curlcheck_off_t_option(option) \ + (((option) > CURLOPTTYPE_OFF_T) && ((option) < CURLOPTTYPE_BLOB)) + +/* option takes a CURL * argument */ +#define curlcheck_curl_option(option) \ + ((option) == CURLOPT_STREAM_DEPENDS || \ + (option) == CURLOPT_STREAM_DEPENDS_E || \ + 0) + +/* evaluates to true if option takes a char* argument */ +#define curlcheck_string_option(option) \ + ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_ALTSVC || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_DEFAULT_PROTOCOL || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_DOH_URL || \ + (option) == CURLOPT_ECH || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_HAPROXY_CLIENT_IP || \ + (option) == CURLOPT_HSTS || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ + (option) == CURLOPT_MAIL_AUTH || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PRE_PROXY || \ + (option) == CURLOPT_PROTOCOLS_STR || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_PROXY_CAINFO || \ + (option) == CURLOPT_PROXY_CAPATH || \ + (option) == CURLOPT_PROXY_CRLFILE || \ + (option) == CURLOPT_PROXY_ISSUERCERT || \ + (option) == CURLOPT_PROXY_KEYPASSWD || \ + (option) == CURLOPT_PROXY_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PROXY_SERVICE_NAME || \ + (option) == CURLOPT_PROXY_SSL_CIPHER_LIST || \ + (option) == CURLOPT_PROXY_SSLCERT || \ + (option) == CURLOPT_PROXY_SSLCERTTYPE || \ + (option) == CURLOPT_PROXY_SSLKEY || \ + (option) == CURLOPT_PROXY_SSLKEYTYPE || \ + (option) == CURLOPT_PROXY_TLS13_CIPHERS || \ + (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_PROXY_TLSAUTH_TYPE || \ + (option) == CURLOPT_PROXY_TLSAUTH_USERNAME || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_REDIR_PROTOCOLS_STR || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_REQUEST_TARGET || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_SASL_AUTHZID || \ + (option) == CURLOPT_SERVICE_NAME || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_SSL_EC_CURVES || \ + (option) == CURLOPT_SSL_SIGNATURE_ALGORITHMS || \ + (option) == CURLOPT_TLS13_CIPHERS || \ + (option) == CURLOPT_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_TLSAUTH_TYPE || \ + (option) == CURLOPT_TLSAUTH_USERNAME || \ + (option) == CURLOPT_UNIX_SOCKET_PATH || \ + (option) == CURLOPT_URL || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_AWS_SIGV4 || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define curlcheck_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define curlcheck_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define curlcheck_cb_data_option(option) \ + ((option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_CLOSESOCKETDATA || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + (option) == CURLOPT_HEADERDATA || \ + (option) == CURLOPT_HSTSREADDATA || \ + (option) == CURLOPT_HSTSWRITEDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PREREQDATA || \ + (option) == CURLOPT_XFERINFODATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_WRITEDATA || \ + (option) == CURLOPT_RESOLVER_START_DATA || \ + (option) == CURLOPT_TRAILERDATA || \ + (option) == CURLOPT_SSH_HOSTKEYDATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define curlcheck_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define curlcheck_slist_option(option) \ + ((option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_MAIL_RCPT || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_PROXYHEADER || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_RESOLVE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + (option) == CURLOPT_CONNECT_TO || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define curlcheck_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG && \ + (info) != CURLINFO_PRIVATE) + +/* evaluates to true if info expects a pointer to long argument */ +#define curlcheck_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define curlcheck_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define curlcheck_slist_info(info) \ + (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST)) + +/* true if info expects a pointer to struct curl_tlssessioninfo * argument */ +#define curlcheck_tlssessioninfo_info(info) \ + (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION)) + +/* true if info expects a pointer to struct curl_certinfo * argument */ +#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO) + +/* true if info expects a pointer to struct curl_socket_t argument */ +#define curlcheck_socket_info(info) \ + (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T) + +/* true if info expects a pointer to curl_off_t argument */ +#define curlcheck_off_t_info(info) \ + (CURLINFO_OFF_T < (info)) + + +/* typecheck helpers -- check whether given expression has requested type */ + +/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true if expr is a pointer */ +#define curlcheck_any_ptr(expr) \ + (sizeof(expr) == sizeof(void *)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define curlcheck_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define curlcheck_ptr(expr, type) \ + (curlcheck_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define curlcheck_arr(expr, type) \ + (curlcheck_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define curlcheck_string(expr) \ + (curlcheck_arr((expr), char) || \ + curlcheck_arr((expr), signed char) || \ + curlcheck_arr((expr), unsigned char)) + +/* evaluates to true if expr is a CURL * */ +#define curlcheck_curl(expr) \ + (curlcheck_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), CURL *)) + + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define curlcheck_long(expr) \ + ( \ + ((sizeof(long) != sizeof(int)) && \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long))) \ + || \ + ((sizeof(long) == sizeof(int)) && \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char))) \ + ) + +/* evaluates to true if expr is of type curl_off_t */ +#define curlcheck_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define curlcheck_error_buffer(expr) \ + (curlcheck_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define curlcheck_cb_data(expr) \ + (curlcheck_ptr((expr), void) || \ + curlcheck_ptr((expr), FILE)) +#else /* be less strict */ +#define curlcheck_cb_data(expr) \ + curlcheck_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define curlcheck_FILE(expr) \ + (curlcheck_NULL(expr) || \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *))) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define curlcheck_postfields(expr) \ + (curlcheck_ptr((expr), void) || \ + curlcheck_arr((expr), char) || \ + curlcheck_arr((expr), unsigned char)) + +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define curlcheck_cb_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func) *, type)) + +/* evaluates to true if expr is of type curl_resolver_start_callback */ +#define curlcheck_resolver_start_callback(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_resolver_start_callback)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define curlcheck_read_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), __typeof__(fread) *) || \ + curlcheck_cb_compatible((expr), curl_read_callback) || \ + curlcheck_cb_compatible((expr), _curl_read_callback1) || \ + curlcheck_cb_compatible((expr), _curl_read_callback2) || \ + curlcheck_cb_compatible((expr), _curl_read_callback3) || \ + curlcheck_cb_compatible((expr), _curl_read_callback4) || \ + curlcheck_cb_compatible((expr), _curl_read_callback5) || \ + curlcheck_cb_compatible((expr), _curl_read_callback6)) +typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *); +typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *); +typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *); +typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *); +typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *); +typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define curlcheck_write_cb(expr) \ + (curlcheck_read_cb(expr) || \ + curlcheck_cb_compatible((expr), __typeof__(fwrite) *) || \ + curlcheck_cb_compatible((expr), curl_write_callback) || \ + curlcheck_cb_compatible((expr), _curl_write_callback1) || \ + curlcheck_cb_compatible((expr), _curl_write_callback2) || \ + curlcheck_cb_compatible((expr), _curl_write_callback3) || \ + curlcheck_cb_compatible((expr), _curl_write_callback4) || \ + curlcheck_cb_compatible((expr), _curl_write_callback5) || \ + curlcheck_cb_compatible((expr), _curl_write_callback6)) +typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *); +typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t, + const void *); +typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *); +typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *); +typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t, + const void *); +typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define curlcheck_ioctl_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_ioctl_callback) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback1) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback2) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback3) || \ + curlcheck_cb_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *); +typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *); +typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *); +typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define curlcheck_sockopt_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_sockopt_callback) || \ + curlcheck_cb_compatible((expr), _curl_sockopt_callback1) || \ + curlcheck_cb_compatible((expr), _curl_sockopt_callback2)) +typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define curlcheck_opensocket_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_opensocket_callback) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback1) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback2) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback3) || \ + curlcheck_cb_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (*_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (*_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define curlcheck_progress_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_progress_callback) || \ + curlcheck_cb_compatible((expr), _curl_progress_callback1) || \ + curlcheck_cb_compatible((expr), _curl_progress_callback2)) +typedef int (*_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (*_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_xferinfo_callback */ +#define curlcheck_xferinfo_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_xferinfo_callback)) + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define curlcheck_debug_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_debug_callback) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback1) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback2) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback3) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback4) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback5) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback6) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback7) || \ + curlcheck_cb_compatible((expr), _curl_debug_callback8)) +typedef int (*_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (*_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (*_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (*_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); +typedef int (*_curl_debug_callback5) (CURL *, + curl_infotype, unsigned char *, size_t, void *); +typedef int (*_curl_debug_callback6) (CURL *, + curl_infotype, unsigned char *, size_t, const void *); +typedef int (*_curl_debug_callback7) (CURL *, + curl_infotype, const unsigned char *, size_t, void *); +typedef int (*_curl_debug_callback8) (CURL *, + curl_infotype, const unsigned char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define curlcheck_ssl_ctx_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) || \ + curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *, + const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we are included before OpenSSL headers... + */ +typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX *, const void *); +typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX *, void *); +typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX *, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define curlcheck_conv_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_conv_callback) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback1) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback2) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback3) || \ + curlcheck_cb_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define curlcheck_seek_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_seek_callback) || \ + curlcheck_cb_compatible((expr), _curl_seek_callback1) || \ + curlcheck_cb_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + +/* evaluates to true if expr is of type curl_chunk_bgn_callback */ +#define curlcheck_chunk_bgn_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_chunk_bgn_callback) || \ + curlcheck_cb_compatible((expr), _curl_chunk_bgn_callback1) || \ + curlcheck_cb_compatible((expr), _curl_chunk_bgn_callback2)) +typedef long (*_curl_chunk_bgn_callback1)(struct curl_fileinfo *, + void *, int); +typedef long (*_curl_chunk_bgn_callback2)(void *, void *, int); + +/* evaluates to true if expr is of type curl_chunk_end_callback */ +#define curlcheck_chunk_end_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_chunk_end_callback)) + +/* evaluates to true if expr is of type curl_closesocket_callback */ +#define curlcheck_close_socket_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_closesocket_callback)) + +/* evaluates to true if expr is of type curl_fnmatch_callback */ +#define curlcheck_fnmatch_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_fnmatch_callback)) + +/* evaluates to true if expr is of type curl_hstsread_callback */ +#define curlcheck_hstsread_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_hstsread_callback)) + +/* evaluates to true if expr is of type curl_hstswrite_callback */ +#define curlcheck_hstswrite_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_hstswrite_callback)) + +/* evaluates to true if expr is of type curl_sshhostkeycallback */ +#define curlcheck_ssh_hostkey_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_sshhostkeycallback)) + +/* evaluates to true if expr is of type curl_sshkeycallback */ +#define curlcheck_ssh_key_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_sshkeycallback)) + +/* evaluates to true if expr is of type curl_interleave_callback */ +#define curlcheck_interleave_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), _curl_interleave_callback1) || \ + curlcheck_cb_compatible((expr), _curl_interleave_callback2)) +typedef size_t (*_curl_interleave_callback1)(void *p, size_t s, + size_t n, void *u); +typedef size_t (*_curl_interleave_callback2)(char *p, size_t s, + size_t n, void *u); + +/* evaluates to true if expr is of type curl_prereq_callback */ +#define curlcheck_prereq_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_prereq_callback)) + +/* evaluates to true if expr is of type curl_trailer_callback */ +#define curlcheck_trailer_cb(expr) \ + (curlcheck_NULL(expr) || \ + curlcheck_cb_compatible((expr), curl_trailer_callback)) + +#endif /* CURLINC_TYPECHECK_GCC_H */ diff --git a/code/thirdparty/curl-8.15.0/include/curl/urlapi.h b/code/thirdparty/curl-8.15.0/include/curl/urlapi.h new file mode 100644 index 00000000..b4a6e5d5 --- /dev/null +++ b/code/thirdparty/curl-8.15.0/include/curl/urlapi.h @@ -0,0 +1,155 @@ +#ifndef CURLINC_URLAPI_H +#define CURLINC_URLAPI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* the error codes for the URL API */ +typedef enum { + CURLUE_OK, + CURLUE_BAD_HANDLE, /* 1 */ + CURLUE_BAD_PARTPOINTER, /* 2 */ + CURLUE_MALFORMED_INPUT, /* 3 */ + CURLUE_BAD_PORT_NUMBER, /* 4 */ + CURLUE_UNSUPPORTED_SCHEME, /* 5 */ + CURLUE_URLDECODE, /* 6 */ + CURLUE_OUT_OF_MEMORY, /* 7 */ + CURLUE_USER_NOT_ALLOWED, /* 8 */ + CURLUE_UNKNOWN_PART, /* 9 */ + CURLUE_NO_SCHEME, /* 10 */ + CURLUE_NO_USER, /* 11 */ + CURLUE_NO_PASSWORD, /* 12 */ + CURLUE_NO_OPTIONS, /* 13 */ + CURLUE_NO_HOST, /* 14 */ + CURLUE_NO_PORT, /* 15 */ + CURLUE_NO_QUERY, /* 16 */ + CURLUE_NO_FRAGMENT, /* 17 */ + CURLUE_NO_ZONEID, /* 18 */ + CURLUE_BAD_FILE_URL, /* 19 */ + CURLUE_BAD_FRAGMENT, /* 20 */ + CURLUE_BAD_HOSTNAME, /* 21 */ + CURLUE_BAD_IPV6, /* 22 */ + CURLUE_BAD_LOGIN, /* 23 */ + CURLUE_BAD_PASSWORD, /* 24 */ + CURLUE_BAD_PATH, /* 25 */ + CURLUE_BAD_QUERY, /* 26 */ + CURLUE_BAD_SCHEME, /* 27 */ + CURLUE_BAD_SLASHES, /* 28 */ + CURLUE_BAD_USER, /* 29 */ + CURLUE_LACKS_IDN, /* 30 */ + CURLUE_TOO_LARGE, /* 31 */ + CURLUE_LAST +} CURLUcode; + +typedef enum { + CURLUPART_URL, + CURLUPART_SCHEME, + CURLUPART_USER, + CURLUPART_PASSWORD, + CURLUPART_OPTIONS, + CURLUPART_HOST, + CURLUPART_PORT, + CURLUPART_PATH, + CURLUPART_QUERY, + CURLUPART_FRAGMENT, + CURLUPART_ZONEID /* added in 7.65.0 */ +} CURLUPart; + +#define CURLU_DEFAULT_PORT (1<<0) /* return default port number */ +#define CURLU_NO_DEFAULT_PORT (1<<1) /* act as if no port number was set, + if the port number matches the + default for the scheme */ +#define CURLU_DEFAULT_SCHEME (1<<2) /* return default scheme if + missing */ +#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */ +#define CURLU_PATH_AS_IS (1<<4) /* leave dot sequences */ +#define CURLU_DISALLOW_USER (1<<5) /* no user+password allowed */ +#define CURLU_URLDECODE (1<<6) /* URL decode on get */ +#define CURLU_URLENCODE (1<<7) /* URL encode on set */ +#define CURLU_APPENDQUERY (1<<8) /* append a form style part */ +#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */ +#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the + scheme is unknown. */ +#define CURLU_ALLOW_SPACE (1<<11) /* Allow spaces in the URL */ +#define CURLU_PUNYCODE (1<<12) /* get the hostname in punycode */ +#define CURLU_PUNY2IDN (1<<13) /* punycode => IDN conversion */ +#define CURLU_GET_EMPTY (1<<14) /* allow empty queries and fragments + when extracting the URL or the + components */ +#define CURLU_NO_GUESS_SCHEME (1<<15) /* for get, do not accept a guess */ + +typedef struct Curl_URL CURLU; + +/* + * curl_url() creates a new CURLU handle and returns a pointer to it. + * Must be freed with curl_url_cleanup(). + */ +CURL_EXTERN CURLU *curl_url(void); + +/* + * curl_url_cleanup() frees the CURLU handle and related resources used for + * the URL parsing. It will not free strings previously returned with the URL + * API. + */ +CURL_EXTERN void curl_url_cleanup(CURLU *handle); + +/* + * curl_url_dup() duplicates a CURLU handle and returns a new copy. The new + * handle must also be freed with curl_url_cleanup(). + */ +CURL_EXTERN CURLU *curl_url_dup(const CURLU *in); + +/* + * curl_url_get() extracts a specific part of the URL from a CURLU + * handle. Returns error code. The returned pointer MUST be freed with + * curl_free() afterwards. + */ +CURL_EXTERN CURLUcode curl_url_get(const CURLU *handle, CURLUPart what, + char **part, unsigned int flags); + +/* + * curl_url_set() sets a specific part of the URL in a CURLU handle. Returns + * error code. The passed in string will be copied. Passing a NULL instead of + * a part string, clears that part. + */ +CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what, + const char *part, unsigned int flags); + +/* + * curl_url_strerror() turns a CURLUcode value into the equivalent human + * readable error string. This is useful for printing meaningful error + * messages. + */ +CURL_EXTERN const char *curl_url_strerror(CURLUcode); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif /* CURLINC_URLAPI_H */ diff --git a/code/thirdparty/curl-8.15.0/include/curl/websockets.h b/code/thirdparty/curl-8.15.0/include/curl/websockets.h new file mode 100644 index 00000000..afb86b4e --- /dev/null +++ b/code/thirdparty/curl-8.15.0/include/curl/websockets.h @@ -0,0 +1,85 @@ +#ifndef CURLINC_WEBSOCKETS_H +#define CURLINC_WEBSOCKETS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +struct curl_ws_frame { + int age; /* zero */ + int flags; /* See the CURLWS_* defines */ + curl_off_t offset; /* the offset of this data into the frame */ + curl_off_t bytesleft; /* number of pending bytes left of the payload */ + size_t len; /* size of the current data chunk */ +}; + +/* flag bits */ +#define CURLWS_TEXT (1<<0) +#define CURLWS_BINARY (1<<1) +#define CURLWS_CONT (1<<2) +#define CURLWS_CLOSE (1<<3) +#define CURLWS_PING (1<<4) +#define CURLWS_OFFSET (1<<5) + +/* + * NAME curl_ws_recv() + * + * DESCRIPTION + * + * Receives data from the websocket connection. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_ws_recv(CURL *curl, void *buffer, size_t buflen, + size_t *recv, + const struct curl_ws_frame **metap); + +/* flags for curl_ws_send() */ +#define CURLWS_PONG (1<<6) + +/* + * NAME curl_ws_send() + * + * DESCRIPTION + * + * Sends data over the websocket connection. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_ws_send(CURL *curl, const void *buffer, + size_t buflen, size_t *sent, + curl_off_t fragsize, + unsigned int flags); + +/* bits for the CURLOPT_WS_OPTIONS bitmask: */ +#define CURLWS_RAW_MODE (1<<0) +#define CURLWS_NOAUTOPONG (1<<1) + +CURL_EXTERN const struct curl_ws_frame *curl_ws_meta(CURL *curl); + +#ifdef __cplusplus +} +#endif + +#endif /* CURLINC_WEBSOCKETS_H */ diff --git a/code/jpeg-9f/cderror.h b/code/thirdparty/jpeg-9f/cderror.h similarity index 100% rename from code/jpeg-9f/cderror.h rename to code/thirdparty/jpeg-9f/cderror.h diff --git a/code/jpeg-9f/cdjpeg.h b/code/thirdparty/jpeg-9f/cdjpeg.h similarity index 100% rename from code/jpeg-9f/cdjpeg.h rename to code/thirdparty/jpeg-9f/cdjpeg.h diff --git a/code/jpeg-9f/jaricom.c b/code/thirdparty/jpeg-9f/jaricom.c similarity index 100% rename from code/jpeg-9f/jaricom.c rename to code/thirdparty/jpeg-9f/jaricom.c diff --git a/code/jpeg-9f/jcapimin.c b/code/thirdparty/jpeg-9f/jcapimin.c similarity index 100% rename from code/jpeg-9f/jcapimin.c rename to code/thirdparty/jpeg-9f/jcapimin.c diff --git a/code/jpeg-9f/jcapistd.c b/code/thirdparty/jpeg-9f/jcapistd.c similarity index 100% rename from code/jpeg-9f/jcapistd.c rename to code/thirdparty/jpeg-9f/jcapistd.c diff --git a/code/jpeg-9f/jcarith.c b/code/thirdparty/jpeg-9f/jcarith.c similarity index 100% rename from code/jpeg-9f/jcarith.c rename to code/thirdparty/jpeg-9f/jcarith.c diff --git a/code/jpeg-9f/jccoefct.c b/code/thirdparty/jpeg-9f/jccoefct.c similarity index 100% rename from code/jpeg-9f/jccoefct.c rename to code/thirdparty/jpeg-9f/jccoefct.c diff --git a/code/jpeg-9f/jccolor.c b/code/thirdparty/jpeg-9f/jccolor.c similarity index 100% rename from code/jpeg-9f/jccolor.c rename to code/thirdparty/jpeg-9f/jccolor.c diff --git a/code/jpeg-9f/jcdctmgr.c b/code/thirdparty/jpeg-9f/jcdctmgr.c similarity index 100% rename from code/jpeg-9f/jcdctmgr.c rename to code/thirdparty/jpeg-9f/jcdctmgr.c diff --git a/code/jpeg-9f/jchuff.c b/code/thirdparty/jpeg-9f/jchuff.c similarity index 100% rename from code/jpeg-9f/jchuff.c rename to code/thirdparty/jpeg-9f/jchuff.c diff --git a/code/jpeg-9f/jcinit.c b/code/thirdparty/jpeg-9f/jcinit.c similarity index 100% rename from code/jpeg-9f/jcinit.c rename to code/thirdparty/jpeg-9f/jcinit.c diff --git a/code/jpeg-9f/jcmainct.c b/code/thirdparty/jpeg-9f/jcmainct.c similarity index 100% rename from code/jpeg-9f/jcmainct.c rename to code/thirdparty/jpeg-9f/jcmainct.c diff --git a/code/jpeg-9f/jcmarker.c b/code/thirdparty/jpeg-9f/jcmarker.c similarity index 100% rename from code/jpeg-9f/jcmarker.c rename to code/thirdparty/jpeg-9f/jcmarker.c diff --git a/code/jpeg-9f/jcmaster.c b/code/thirdparty/jpeg-9f/jcmaster.c similarity index 100% rename from code/jpeg-9f/jcmaster.c rename to code/thirdparty/jpeg-9f/jcmaster.c diff --git a/code/jpeg-9f/jcomapi.c b/code/thirdparty/jpeg-9f/jcomapi.c similarity index 100% rename from code/jpeg-9f/jcomapi.c rename to code/thirdparty/jpeg-9f/jcomapi.c diff --git a/code/jpeg-9f/jconfig.h b/code/thirdparty/jpeg-9f/jconfig.h similarity index 100% rename from code/jpeg-9f/jconfig.h rename to code/thirdparty/jpeg-9f/jconfig.h diff --git a/code/jpeg-9f/jcparam.c b/code/thirdparty/jpeg-9f/jcparam.c similarity index 100% rename from code/jpeg-9f/jcparam.c rename to code/thirdparty/jpeg-9f/jcparam.c diff --git a/code/jpeg-9f/jcprepct.c b/code/thirdparty/jpeg-9f/jcprepct.c similarity index 100% rename from code/jpeg-9f/jcprepct.c rename to code/thirdparty/jpeg-9f/jcprepct.c diff --git a/code/jpeg-9f/jcsample.c b/code/thirdparty/jpeg-9f/jcsample.c similarity index 100% rename from code/jpeg-9f/jcsample.c rename to code/thirdparty/jpeg-9f/jcsample.c diff --git a/code/jpeg-9f/jctrans.c b/code/thirdparty/jpeg-9f/jctrans.c similarity index 100% rename from code/jpeg-9f/jctrans.c rename to code/thirdparty/jpeg-9f/jctrans.c diff --git a/code/jpeg-9f/jdapimin.c b/code/thirdparty/jpeg-9f/jdapimin.c similarity index 100% rename from code/jpeg-9f/jdapimin.c rename to code/thirdparty/jpeg-9f/jdapimin.c diff --git a/code/jpeg-9f/jdapistd.c b/code/thirdparty/jpeg-9f/jdapistd.c similarity index 100% rename from code/jpeg-9f/jdapistd.c rename to code/thirdparty/jpeg-9f/jdapistd.c diff --git a/code/jpeg-9f/jdarith.c b/code/thirdparty/jpeg-9f/jdarith.c similarity index 100% rename from code/jpeg-9f/jdarith.c rename to code/thirdparty/jpeg-9f/jdarith.c diff --git a/code/jpeg-9f/jdatadst.c b/code/thirdparty/jpeg-9f/jdatadst.c similarity index 100% rename from code/jpeg-9f/jdatadst.c rename to code/thirdparty/jpeg-9f/jdatadst.c diff --git a/code/jpeg-9f/jdatasrc.c b/code/thirdparty/jpeg-9f/jdatasrc.c similarity index 100% rename from code/jpeg-9f/jdatasrc.c rename to code/thirdparty/jpeg-9f/jdatasrc.c diff --git a/code/jpeg-9f/jdcoefct.c b/code/thirdparty/jpeg-9f/jdcoefct.c similarity index 100% rename from code/jpeg-9f/jdcoefct.c rename to code/thirdparty/jpeg-9f/jdcoefct.c diff --git a/code/jpeg-9f/jdcolor.c b/code/thirdparty/jpeg-9f/jdcolor.c similarity index 100% rename from code/jpeg-9f/jdcolor.c rename to code/thirdparty/jpeg-9f/jdcolor.c diff --git a/code/jpeg-9f/jdct.h b/code/thirdparty/jpeg-9f/jdct.h similarity index 100% rename from code/jpeg-9f/jdct.h rename to code/thirdparty/jpeg-9f/jdct.h diff --git a/code/jpeg-9f/jddctmgr.c b/code/thirdparty/jpeg-9f/jddctmgr.c similarity index 100% rename from code/jpeg-9f/jddctmgr.c rename to code/thirdparty/jpeg-9f/jddctmgr.c diff --git a/code/jpeg-9f/jdhuff.c b/code/thirdparty/jpeg-9f/jdhuff.c similarity index 100% rename from code/jpeg-9f/jdhuff.c rename to code/thirdparty/jpeg-9f/jdhuff.c diff --git a/code/jpeg-9f/jdinput.c b/code/thirdparty/jpeg-9f/jdinput.c similarity index 100% rename from code/jpeg-9f/jdinput.c rename to code/thirdparty/jpeg-9f/jdinput.c diff --git a/code/jpeg-9f/jdmainct.c b/code/thirdparty/jpeg-9f/jdmainct.c similarity index 100% rename from code/jpeg-9f/jdmainct.c rename to code/thirdparty/jpeg-9f/jdmainct.c diff --git a/code/jpeg-9f/jdmarker.c b/code/thirdparty/jpeg-9f/jdmarker.c similarity index 100% rename from code/jpeg-9f/jdmarker.c rename to code/thirdparty/jpeg-9f/jdmarker.c diff --git a/code/jpeg-9f/jdmaster.c b/code/thirdparty/jpeg-9f/jdmaster.c similarity index 100% rename from code/jpeg-9f/jdmaster.c rename to code/thirdparty/jpeg-9f/jdmaster.c diff --git a/code/jpeg-9f/jdmerge.c b/code/thirdparty/jpeg-9f/jdmerge.c similarity index 100% rename from code/jpeg-9f/jdmerge.c rename to code/thirdparty/jpeg-9f/jdmerge.c diff --git a/code/jpeg-9f/jdpostct.c b/code/thirdparty/jpeg-9f/jdpostct.c similarity index 100% rename from code/jpeg-9f/jdpostct.c rename to code/thirdparty/jpeg-9f/jdpostct.c diff --git a/code/jpeg-9f/jdsample.c b/code/thirdparty/jpeg-9f/jdsample.c similarity index 100% rename from code/jpeg-9f/jdsample.c rename to code/thirdparty/jpeg-9f/jdsample.c diff --git a/code/jpeg-9f/jdtrans.c b/code/thirdparty/jpeg-9f/jdtrans.c similarity index 100% rename from code/jpeg-9f/jdtrans.c rename to code/thirdparty/jpeg-9f/jdtrans.c diff --git a/code/jpeg-9f/jerror.c b/code/thirdparty/jpeg-9f/jerror.c similarity index 100% rename from code/jpeg-9f/jerror.c rename to code/thirdparty/jpeg-9f/jerror.c diff --git a/code/jpeg-9f/jerror.h b/code/thirdparty/jpeg-9f/jerror.h similarity index 100% rename from code/jpeg-9f/jerror.h rename to code/thirdparty/jpeg-9f/jerror.h diff --git a/code/jpeg-9f/jfdctflt.c b/code/thirdparty/jpeg-9f/jfdctflt.c similarity index 100% rename from code/jpeg-9f/jfdctflt.c rename to code/thirdparty/jpeg-9f/jfdctflt.c diff --git a/code/jpeg-9f/jfdctfst.c b/code/thirdparty/jpeg-9f/jfdctfst.c similarity index 100% rename from code/jpeg-9f/jfdctfst.c rename to code/thirdparty/jpeg-9f/jfdctfst.c diff --git a/code/jpeg-9f/jfdctint.c b/code/thirdparty/jpeg-9f/jfdctint.c similarity index 100% rename from code/jpeg-9f/jfdctint.c rename to code/thirdparty/jpeg-9f/jfdctint.c diff --git a/code/jpeg-9f/jidctflt.c b/code/thirdparty/jpeg-9f/jidctflt.c similarity index 100% rename from code/jpeg-9f/jidctflt.c rename to code/thirdparty/jpeg-9f/jidctflt.c diff --git a/code/jpeg-9f/jidctfst.c b/code/thirdparty/jpeg-9f/jidctfst.c similarity index 100% rename from code/jpeg-9f/jidctfst.c rename to code/thirdparty/jpeg-9f/jidctfst.c diff --git a/code/jpeg-9f/jidctint.c b/code/thirdparty/jpeg-9f/jidctint.c similarity index 100% rename from code/jpeg-9f/jidctint.c rename to code/thirdparty/jpeg-9f/jidctint.c diff --git a/code/jpeg-9f/jinclude.h b/code/thirdparty/jpeg-9f/jinclude.h similarity index 100% rename from code/jpeg-9f/jinclude.h rename to code/thirdparty/jpeg-9f/jinclude.h diff --git a/code/jpeg-9f/jmemmgr.c b/code/thirdparty/jpeg-9f/jmemmgr.c similarity index 100% rename from code/jpeg-9f/jmemmgr.c rename to code/thirdparty/jpeg-9f/jmemmgr.c diff --git a/code/jpeg-9f/jmemnobs.c b/code/thirdparty/jpeg-9f/jmemnobs.c similarity index 100% rename from code/jpeg-9f/jmemnobs.c rename to code/thirdparty/jpeg-9f/jmemnobs.c diff --git a/code/jpeg-9f/jmemsys.h b/code/thirdparty/jpeg-9f/jmemsys.h similarity index 100% rename from code/jpeg-9f/jmemsys.h rename to code/thirdparty/jpeg-9f/jmemsys.h diff --git a/code/jpeg-9f/jmorecfg.h b/code/thirdparty/jpeg-9f/jmorecfg.h similarity index 100% rename from code/jpeg-9f/jmorecfg.h rename to code/thirdparty/jpeg-9f/jmorecfg.h diff --git a/code/jpeg-9f/jpegint.h b/code/thirdparty/jpeg-9f/jpegint.h similarity index 100% rename from code/jpeg-9f/jpegint.h rename to code/thirdparty/jpeg-9f/jpegint.h diff --git a/code/jpeg-9f/jpeglib.h b/code/thirdparty/jpeg-9f/jpeglib.h similarity index 100% rename from code/jpeg-9f/jpeglib.h rename to code/thirdparty/jpeg-9f/jpeglib.h diff --git a/code/jpeg-9f/jquant1.c b/code/thirdparty/jpeg-9f/jquant1.c similarity index 100% rename from code/jpeg-9f/jquant1.c rename to code/thirdparty/jpeg-9f/jquant1.c diff --git a/code/jpeg-9f/jquant2.c b/code/thirdparty/jpeg-9f/jquant2.c similarity index 100% rename from code/jpeg-9f/jquant2.c rename to code/thirdparty/jpeg-9f/jquant2.c diff --git a/code/jpeg-9f/jutils.c b/code/thirdparty/jpeg-9f/jutils.c similarity index 100% rename from code/jpeg-9f/jutils.c rename to code/thirdparty/jpeg-9f/jutils.c diff --git a/code/jpeg-9f/jversion.h b/code/thirdparty/jpeg-9f/jversion.h similarity index 100% rename from code/jpeg-9f/jversion.h rename to code/thirdparty/jpeg-9f/jversion.h diff --git a/code/jpeg-9f/transupp.h b/code/thirdparty/jpeg-9f/transupp.h similarity index 100% rename from code/jpeg-9f/transupp.h rename to code/thirdparty/jpeg-9f/transupp.h diff --git a/code/libmad/.github/workflows/build.yml b/code/thirdparty/libmad/.github/workflows/build.yml similarity index 100% rename from code/libmad/.github/workflows/build.yml rename to code/thirdparty/libmad/.github/workflows/build.yml diff --git a/code/libmad/.gitignore b/code/thirdparty/libmad/.gitignore similarity index 100% rename from code/libmad/.gitignore rename to code/thirdparty/libmad/.gitignore diff --git a/code/libmad/CHANGES b/code/thirdparty/libmad/CHANGES similarity index 100% rename from code/libmad/CHANGES rename to code/thirdparty/libmad/CHANGES diff --git a/code/libmad/CMakeLists.txt b/code/thirdparty/libmad/CMakeLists.txt similarity index 100% rename from code/libmad/CMakeLists.txt rename to code/thirdparty/libmad/CMakeLists.txt diff --git a/code/libmad/COPYING b/code/thirdparty/libmad/COPYING similarity index 100% rename from code/libmad/COPYING rename to code/thirdparty/libmad/COPYING diff --git a/code/libmad/COPYRIGHT b/code/thirdparty/libmad/COPYRIGHT similarity index 100% rename from code/libmad/COPYRIGHT rename to code/thirdparty/libmad/COPYRIGHT diff --git a/code/libmad/CREDITS b/code/thirdparty/libmad/CREDITS similarity index 100% rename from code/libmad/CREDITS rename to code/thirdparty/libmad/CREDITS diff --git a/code/libmad/D.dat b/code/thirdparty/libmad/D.dat similarity index 100% rename from code/libmad/D.dat rename to code/thirdparty/libmad/D.dat diff --git a/code/libmad/README.md b/code/thirdparty/libmad/README.md similarity index 100% rename from code/libmad/README.md rename to code/thirdparty/libmad/README.md diff --git a/code/libmad/TODO b/code/thirdparty/libmad/TODO similarity index 100% rename from code/libmad/TODO rename to code/thirdparty/libmad/TODO diff --git a/code/libmad/bit.c b/code/thirdparty/libmad/bit.c similarity index 100% rename from code/libmad/bit.c rename to code/thirdparty/libmad/bit.c diff --git a/code/libmad/decoder.c b/code/thirdparty/libmad/decoder.c similarity index 100% rename from code/libmad/decoder.c rename to code/thirdparty/libmad/decoder.c diff --git a/code/libmad/fixed.c b/code/thirdparty/libmad/fixed.c similarity index 100% rename from code/libmad/fixed.c rename to code/thirdparty/libmad/fixed.c diff --git a/code/libmad/frame.c b/code/thirdparty/libmad/frame.c similarity index 100% rename from code/libmad/frame.c rename to code/thirdparty/libmad/frame.c diff --git a/code/libmad/global.h b/code/thirdparty/libmad/global.h similarity index 100% rename from code/libmad/global.h rename to code/thirdparty/libmad/global.h diff --git a/code/libmad/huffman.c b/code/thirdparty/libmad/huffman.c similarity index 100% rename from code/libmad/huffman.c rename to code/thirdparty/libmad/huffman.c diff --git a/code/libmad/huffman.h b/code/thirdparty/libmad/huffman.h similarity index 100% rename from code/libmad/huffman.h rename to code/thirdparty/libmad/huffman.h diff --git a/code/libmad/imdct_l_arm.S b/code/thirdparty/libmad/imdct_l_arm.S similarity index 100% rename from code/libmad/imdct_l_arm.S rename to code/thirdparty/libmad/imdct_l_arm.S diff --git a/code/libmad/imdct_s.dat b/code/thirdparty/libmad/imdct_s.dat similarity index 100% rename from code/libmad/imdct_s.dat rename to code/thirdparty/libmad/imdct_s.dat diff --git a/code/libmad/layer12.c b/code/thirdparty/libmad/layer12.c similarity index 100% rename from code/libmad/layer12.c rename to code/thirdparty/libmad/layer12.c diff --git a/code/libmad/layer12.h b/code/thirdparty/libmad/layer12.h similarity index 100% rename from code/libmad/layer12.h rename to code/thirdparty/libmad/layer12.h diff --git a/code/libmad/layer3.c b/code/thirdparty/libmad/layer3.c similarity index 100% rename from code/libmad/layer3.c rename to code/thirdparty/libmad/layer3.c diff --git a/code/libmad/layer3.h b/code/thirdparty/libmad/layer3.h similarity index 100% rename from code/libmad/layer3.h rename to code/thirdparty/libmad/layer3.h diff --git a/code/libmad/mad.h.in b/code/thirdparty/libmad/mad.h.in similarity index 100% rename from code/libmad/mad.h.in rename to code/thirdparty/libmad/mad.h.in diff --git a/code/libmad/minimad.c b/code/thirdparty/libmad/minimad.c similarity index 100% rename from code/libmad/minimad.c rename to code/thirdparty/libmad/minimad.c diff --git a/code/libmad/packaging/mad.pc.in b/code/thirdparty/libmad/packaging/mad.pc.in similarity index 100% rename from code/libmad/packaging/mad.pc.in rename to code/thirdparty/libmad/packaging/mad.pc.in diff --git a/code/libmad/packaging/madConfig.cmake.in b/code/thirdparty/libmad/packaging/madConfig.cmake.in similarity index 100% rename from code/libmad/packaging/madConfig.cmake.in rename to code/thirdparty/libmad/packaging/madConfig.cmake.in diff --git a/code/libmad/qc_table.dat b/code/thirdparty/libmad/qc_table.dat similarity index 100% rename from code/libmad/qc_table.dat rename to code/thirdparty/libmad/qc_table.dat diff --git a/code/libmad/rq_table.dat b/code/thirdparty/libmad/rq_table.dat similarity index 100% rename from code/libmad/rq_table.dat rename to code/thirdparty/libmad/rq_table.dat diff --git a/code/libmad/sf_table.dat b/code/thirdparty/libmad/sf_table.dat similarity index 100% rename from code/libmad/sf_table.dat rename to code/thirdparty/libmad/sf_table.dat diff --git a/code/libmad/stream.c b/code/thirdparty/libmad/stream.c similarity index 100% rename from code/libmad/stream.c rename to code/thirdparty/libmad/stream.c diff --git a/code/libmad/synth.c b/code/thirdparty/libmad/synth.c similarity index 100% rename from code/libmad/synth.c rename to code/thirdparty/libmad/synth.c diff --git a/code/libmad/timer.c b/code/thirdparty/libmad/timer.c similarity index 100% rename from code/libmad/timer.c rename to code/thirdparty/libmad/timer.c diff --git a/code/libmad/version.c b/code/thirdparty/libmad/version.c similarity index 100% rename from code/libmad/version.c rename to code/thirdparty/libmad/version.c diff --git a/code/libogg-1.3.6/include/ogg/config_types.h b/code/thirdparty/libogg-1.3.6/include/ogg/config_types.h similarity index 100% rename from code/libogg-1.3.6/include/ogg/config_types.h rename to code/thirdparty/libogg-1.3.6/include/ogg/config_types.h diff --git a/code/libogg-1.3.6/include/ogg/ogg.h b/code/thirdparty/libogg-1.3.6/include/ogg/ogg.h similarity index 100% rename from code/libogg-1.3.6/include/ogg/ogg.h rename to code/thirdparty/libogg-1.3.6/include/ogg/ogg.h diff --git a/code/libogg-1.3.6/include/ogg/os_types.h b/code/thirdparty/libogg-1.3.6/include/ogg/os_types.h similarity index 100% rename from code/libogg-1.3.6/include/ogg/os_types.h rename to code/thirdparty/libogg-1.3.6/include/ogg/os_types.h diff --git a/code/libogg-1.3.6/src/bitwise.c b/code/thirdparty/libogg-1.3.6/src/bitwise.c similarity index 100% rename from code/libogg-1.3.6/src/bitwise.c rename to code/thirdparty/libogg-1.3.6/src/bitwise.c diff --git a/code/libogg-1.3.6/src/crctable.h b/code/thirdparty/libogg-1.3.6/src/crctable.h similarity index 100% rename from code/libogg-1.3.6/src/crctable.h rename to code/thirdparty/libogg-1.3.6/src/crctable.h diff --git a/code/libogg-1.3.6/src/framing.c b/code/thirdparty/libogg-1.3.6/src/framing.c similarity index 100% rename from code/libogg-1.3.6/src/framing.c rename to code/thirdparty/libogg-1.3.6/src/framing.c diff --git a/code/libs/macos/libSDL2-2.0.0.dylib b/code/thirdparty/libs/macos/libSDL2-2.0.0.dylib similarity index 100% rename from code/libs/macos/libSDL2-2.0.0.dylib rename to code/thirdparty/libs/macos/libSDL2-2.0.0.dylib diff --git a/code/libs/macos/libSDL2main.a b/code/thirdparty/libs/macos/libSDL2main.a similarity index 100% rename from code/libs/macos/libSDL2main.a rename to code/thirdparty/libs/macos/libSDL2main.a diff --git a/code/libs/win32/SDL2.dll b/code/thirdparty/libs/win32/SDL2.dll similarity index 100% rename from code/libs/win32/SDL2.dll rename to code/thirdparty/libs/win32/SDL2.dll diff --git a/code/libs/win32/SDL2.lib b/code/thirdparty/libs/win32/SDL2.lib similarity index 100% rename from code/libs/win32/SDL2.lib rename to code/thirdparty/libs/win32/SDL2.lib diff --git a/code/libs/win32/SDL2main.lib b/code/thirdparty/libs/win32/SDL2main.lib similarity index 100% rename from code/libs/win32/SDL2main.lib rename to code/thirdparty/libs/win32/SDL2main.lib diff --git a/code/libs/win32/libSDL2.dll.a b/code/thirdparty/libs/win32/libSDL2.dll.a similarity index 100% rename from code/libs/win32/libSDL2.dll.a rename to code/thirdparty/libs/win32/libSDL2.dll.a diff --git a/code/libs/win32/libSDL2main.a b/code/thirdparty/libs/win32/libSDL2main.a similarity index 100% rename from code/libs/win32/libSDL2main.a rename to code/thirdparty/libs/win32/libSDL2main.a diff --git a/code/libs/win64/SDL2.dll b/code/thirdparty/libs/win64/SDL2.dll similarity index 100% rename from code/libs/win64/SDL2.dll rename to code/thirdparty/libs/win64/SDL2.dll diff --git a/code/libs/win64/SDL2.lib b/code/thirdparty/libs/win64/SDL2.lib similarity index 100% rename from code/libs/win64/SDL2.lib rename to code/thirdparty/libs/win64/SDL2.lib diff --git a/code/libs/win64/SDL2main.lib b/code/thirdparty/libs/win64/SDL2main.lib similarity index 100% rename from code/libs/win64/SDL2main.lib rename to code/thirdparty/libs/win64/SDL2main.lib diff --git a/code/libs/win64/libSDL2.dll.a b/code/thirdparty/libs/win64/libSDL2.dll.a similarity index 100% rename from code/libs/win64/libSDL2.dll.a rename to code/thirdparty/libs/win64/libSDL2.dll.a diff --git a/code/libs/win64/libSDL2main.a b/code/thirdparty/libs/win64/libSDL2main.a similarity index 100% rename from code/libs/win64/libSDL2main.a rename to code/thirdparty/libs/win64/libSDL2main.a diff --git a/code/libvorbis-1.3.7/include/vorbis/codec.h b/code/thirdparty/libvorbis-1.3.7/include/vorbis/codec.h similarity index 100% rename from code/libvorbis-1.3.7/include/vorbis/codec.h rename to code/thirdparty/libvorbis-1.3.7/include/vorbis/codec.h diff --git a/code/libvorbis-1.3.7/include/vorbis/vorbisenc.h b/code/thirdparty/libvorbis-1.3.7/include/vorbis/vorbisenc.h similarity index 100% rename from code/libvorbis-1.3.7/include/vorbis/vorbisenc.h rename to code/thirdparty/libvorbis-1.3.7/include/vorbis/vorbisenc.h diff --git a/code/libvorbis-1.3.7/include/vorbis/vorbisfile.h b/code/thirdparty/libvorbis-1.3.7/include/vorbis/vorbisfile.h similarity index 100% rename from code/libvorbis-1.3.7/include/vorbis/vorbisfile.h rename to code/thirdparty/libvorbis-1.3.7/include/vorbis/vorbisfile.h diff --git a/code/libvorbis-1.3.7/lib/analysis.c b/code/thirdparty/libvorbis-1.3.7/lib/analysis.c similarity index 100% rename from code/libvorbis-1.3.7/lib/analysis.c rename to code/thirdparty/libvorbis-1.3.7/lib/analysis.c diff --git a/code/libvorbis-1.3.7/lib/backends.h b/code/thirdparty/libvorbis-1.3.7/lib/backends.h similarity index 100% rename from code/libvorbis-1.3.7/lib/backends.h rename to code/thirdparty/libvorbis-1.3.7/lib/backends.h diff --git a/code/libvorbis-1.3.7/lib/bitrate.c b/code/thirdparty/libvorbis-1.3.7/lib/bitrate.c similarity index 100% rename from code/libvorbis-1.3.7/lib/bitrate.c rename to code/thirdparty/libvorbis-1.3.7/lib/bitrate.c diff --git a/code/libvorbis-1.3.7/lib/bitrate.h b/code/thirdparty/libvorbis-1.3.7/lib/bitrate.h similarity index 100% rename from code/libvorbis-1.3.7/lib/bitrate.h rename to code/thirdparty/libvorbis-1.3.7/lib/bitrate.h diff --git a/code/libvorbis-1.3.7/lib/block.c b/code/thirdparty/libvorbis-1.3.7/lib/block.c similarity index 100% rename from code/libvorbis-1.3.7/lib/block.c rename to code/thirdparty/libvorbis-1.3.7/lib/block.c diff --git a/code/libvorbis-1.3.7/lib/books/coupled/res_books_51.h b/code/thirdparty/libvorbis-1.3.7/lib/books/coupled/res_books_51.h similarity index 100% rename from code/libvorbis-1.3.7/lib/books/coupled/res_books_51.h rename to code/thirdparty/libvorbis-1.3.7/lib/books/coupled/res_books_51.h diff --git a/code/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h b/code/thirdparty/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h similarity index 100% rename from code/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h rename to code/thirdparty/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h diff --git a/code/libvorbis-1.3.7/lib/books/floor/floor_books.h b/code/thirdparty/libvorbis-1.3.7/lib/books/floor/floor_books.h similarity index 100% rename from code/libvorbis-1.3.7/lib/books/floor/floor_books.h rename to code/thirdparty/libvorbis-1.3.7/lib/books/floor/floor_books.h diff --git a/code/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h b/code/thirdparty/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h similarity index 100% rename from code/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h rename to code/thirdparty/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h diff --git a/code/libvorbis-1.3.7/lib/codebook.c b/code/thirdparty/libvorbis-1.3.7/lib/codebook.c similarity index 100% rename from code/libvorbis-1.3.7/lib/codebook.c rename to code/thirdparty/libvorbis-1.3.7/lib/codebook.c diff --git a/code/libvorbis-1.3.7/lib/codebook.h b/code/thirdparty/libvorbis-1.3.7/lib/codebook.h similarity index 100% rename from code/libvorbis-1.3.7/lib/codebook.h rename to code/thirdparty/libvorbis-1.3.7/lib/codebook.h diff --git a/code/libvorbis-1.3.7/lib/codec_internal.h b/code/thirdparty/libvorbis-1.3.7/lib/codec_internal.h similarity index 100% rename from code/libvorbis-1.3.7/lib/codec_internal.h rename to code/thirdparty/libvorbis-1.3.7/lib/codec_internal.h diff --git a/code/libvorbis-1.3.7/lib/envelope.c b/code/thirdparty/libvorbis-1.3.7/lib/envelope.c similarity index 100% rename from code/libvorbis-1.3.7/lib/envelope.c rename to code/thirdparty/libvorbis-1.3.7/lib/envelope.c diff --git a/code/libvorbis-1.3.7/lib/envelope.h b/code/thirdparty/libvorbis-1.3.7/lib/envelope.h similarity index 100% rename from code/libvorbis-1.3.7/lib/envelope.h rename to code/thirdparty/libvorbis-1.3.7/lib/envelope.h diff --git a/code/libvorbis-1.3.7/lib/floor0.c b/code/thirdparty/libvorbis-1.3.7/lib/floor0.c similarity index 100% rename from code/libvorbis-1.3.7/lib/floor0.c rename to code/thirdparty/libvorbis-1.3.7/lib/floor0.c diff --git a/code/libvorbis-1.3.7/lib/floor1.c b/code/thirdparty/libvorbis-1.3.7/lib/floor1.c similarity index 100% rename from code/libvorbis-1.3.7/lib/floor1.c rename to code/thirdparty/libvorbis-1.3.7/lib/floor1.c diff --git a/code/libvorbis-1.3.7/lib/highlevel.h b/code/thirdparty/libvorbis-1.3.7/lib/highlevel.h similarity index 100% rename from code/libvorbis-1.3.7/lib/highlevel.h rename to code/thirdparty/libvorbis-1.3.7/lib/highlevel.h diff --git a/code/libvorbis-1.3.7/lib/info.c b/code/thirdparty/libvorbis-1.3.7/lib/info.c similarity index 100% rename from code/libvorbis-1.3.7/lib/info.c rename to code/thirdparty/libvorbis-1.3.7/lib/info.c diff --git a/code/libvorbis-1.3.7/lib/lookup.c b/code/thirdparty/libvorbis-1.3.7/lib/lookup.c similarity index 100% rename from code/libvorbis-1.3.7/lib/lookup.c rename to code/thirdparty/libvorbis-1.3.7/lib/lookup.c diff --git a/code/libvorbis-1.3.7/lib/lookup.h b/code/thirdparty/libvorbis-1.3.7/lib/lookup.h similarity index 100% rename from code/libvorbis-1.3.7/lib/lookup.h rename to code/thirdparty/libvorbis-1.3.7/lib/lookup.h diff --git a/code/libvorbis-1.3.7/lib/lookup_data.h b/code/thirdparty/libvorbis-1.3.7/lib/lookup_data.h similarity index 100% rename from code/libvorbis-1.3.7/lib/lookup_data.h rename to code/thirdparty/libvorbis-1.3.7/lib/lookup_data.h diff --git a/code/libvorbis-1.3.7/lib/lpc.c b/code/thirdparty/libvorbis-1.3.7/lib/lpc.c similarity index 100% rename from code/libvorbis-1.3.7/lib/lpc.c rename to code/thirdparty/libvorbis-1.3.7/lib/lpc.c diff --git a/code/libvorbis-1.3.7/lib/lpc.h b/code/thirdparty/libvorbis-1.3.7/lib/lpc.h similarity index 100% rename from code/libvorbis-1.3.7/lib/lpc.h rename to code/thirdparty/libvorbis-1.3.7/lib/lpc.h diff --git a/code/libvorbis-1.3.7/lib/lsp.c b/code/thirdparty/libvorbis-1.3.7/lib/lsp.c similarity index 100% rename from code/libvorbis-1.3.7/lib/lsp.c rename to code/thirdparty/libvorbis-1.3.7/lib/lsp.c diff --git a/code/libvorbis-1.3.7/lib/lsp.h b/code/thirdparty/libvorbis-1.3.7/lib/lsp.h similarity index 100% rename from code/libvorbis-1.3.7/lib/lsp.h rename to code/thirdparty/libvorbis-1.3.7/lib/lsp.h diff --git a/code/libvorbis-1.3.7/lib/mapping0.c b/code/thirdparty/libvorbis-1.3.7/lib/mapping0.c similarity index 100% rename from code/libvorbis-1.3.7/lib/mapping0.c rename to code/thirdparty/libvorbis-1.3.7/lib/mapping0.c diff --git a/code/libvorbis-1.3.7/lib/masking.h b/code/thirdparty/libvorbis-1.3.7/lib/masking.h similarity index 100% rename from code/libvorbis-1.3.7/lib/masking.h rename to code/thirdparty/libvorbis-1.3.7/lib/masking.h diff --git a/code/libvorbis-1.3.7/lib/mdct.c b/code/thirdparty/libvorbis-1.3.7/lib/mdct.c similarity index 100% rename from code/libvorbis-1.3.7/lib/mdct.c rename to code/thirdparty/libvorbis-1.3.7/lib/mdct.c diff --git a/code/libvorbis-1.3.7/lib/mdct.h b/code/thirdparty/libvorbis-1.3.7/lib/mdct.h similarity index 100% rename from code/libvorbis-1.3.7/lib/mdct.h rename to code/thirdparty/libvorbis-1.3.7/lib/mdct.h diff --git a/code/libvorbis-1.3.7/lib/misc.h b/code/thirdparty/libvorbis-1.3.7/lib/misc.h similarity index 100% rename from code/libvorbis-1.3.7/lib/misc.h rename to code/thirdparty/libvorbis-1.3.7/lib/misc.h diff --git a/code/libvorbis-1.3.7/lib/modes/floor_all.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/floor_all.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/floor_all.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/floor_all.h diff --git a/code/libvorbis-1.3.7/lib/modes/psych_11.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/psych_11.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/psych_11.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/psych_11.h diff --git a/code/libvorbis-1.3.7/lib/modes/psych_16.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/psych_16.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/psych_16.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/psych_16.h diff --git a/code/libvorbis-1.3.7/lib/modes/psych_44.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/psych_44.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/psych_44.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/psych_44.h diff --git a/code/libvorbis-1.3.7/lib/modes/psych_8.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/psych_8.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/psych_8.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/psych_8.h diff --git a/code/libvorbis-1.3.7/lib/modes/residue_16.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/residue_16.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/residue_16.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/residue_16.h diff --git a/code/libvorbis-1.3.7/lib/modes/residue_44.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/residue_44.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/residue_44.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/residue_44.h diff --git a/code/libvorbis-1.3.7/lib/modes/residue_44p51.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/residue_44p51.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/residue_44p51.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/residue_44p51.h diff --git a/code/libvorbis-1.3.7/lib/modes/residue_44u.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/residue_44u.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/residue_44u.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/residue_44u.h diff --git a/code/libvorbis-1.3.7/lib/modes/residue_8.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/residue_8.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/residue_8.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/residue_8.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_11.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_11.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_11.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_11.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_16.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_16.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_16.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_16.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_22.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_22.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_22.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_22.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_32.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_32.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_32.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_32.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_44.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_44.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_44.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_44.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_44p51.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_44p51.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_44p51.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_44p51.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_44u.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_44u.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_44u.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_44u.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_8.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_8.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_8.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_8.h diff --git a/code/libvorbis-1.3.7/lib/modes/setup_X.h b/code/thirdparty/libvorbis-1.3.7/lib/modes/setup_X.h similarity index 100% rename from code/libvorbis-1.3.7/lib/modes/setup_X.h rename to code/thirdparty/libvorbis-1.3.7/lib/modes/setup_X.h diff --git a/code/libvorbis-1.3.7/lib/os.h b/code/thirdparty/libvorbis-1.3.7/lib/os.h similarity index 100% rename from code/libvorbis-1.3.7/lib/os.h rename to code/thirdparty/libvorbis-1.3.7/lib/os.h diff --git a/code/libvorbis-1.3.7/lib/psy.c b/code/thirdparty/libvorbis-1.3.7/lib/psy.c similarity index 100% rename from code/libvorbis-1.3.7/lib/psy.c rename to code/thirdparty/libvorbis-1.3.7/lib/psy.c diff --git a/code/libvorbis-1.3.7/lib/psy.h b/code/thirdparty/libvorbis-1.3.7/lib/psy.h similarity index 100% rename from code/libvorbis-1.3.7/lib/psy.h rename to code/thirdparty/libvorbis-1.3.7/lib/psy.h diff --git a/code/libvorbis-1.3.7/lib/registry.c b/code/thirdparty/libvorbis-1.3.7/lib/registry.c similarity index 100% rename from code/libvorbis-1.3.7/lib/registry.c rename to code/thirdparty/libvorbis-1.3.7/lib/registry.c diff --git a/code/libvorbis-1.3.7/lib/registry.h b/code/thirdparty/libvorbis-1.3.7/lib/registry.h similarity index 100% rename from code/libvorbis-1.3.7/lib/registry.h rename to code/thirdparty/libvorbis-1.3.7/lib/registry.h diff --git a/code/libvorbis-1.3.7/lib/res0.c b/code/thirdparty/libvorbis-1.3.7/lib/res0.c similarity index 100% rename from code/libvorbis-1.3.7/lib/res0.c rename to code/thirdparty/libvorbis-1.3.7/lib/res0.c diff --git a/code/libvorbis-1.3.7/lib/scales.h b/code/thirdparty/libvorbis-1.3.7/lib/scales.h similarity index 100% rename from code/libvorbis-1.3.7/lib/scales.h rename to code/thirdparty/libvorbis-1.3.7/lib/scales.h diff --git a/code/libvorbis-1.3.7/lib/sharedbook.c b/code/thirdparty/libvorbis-1.3.7/lib/sharedbook.c similarity index 100% rename from code/libvorbis-1.3.7/lib/sharedbook.c rename to code/thirdparty/libvorbis-1.3.7/lib/sharedbook.c diff --git a/code/libvorbis-1.3.7/lib/smallft.c b/code/thirdparty/libvorbis-1.3.7/lib/smallft.c similarity index 100% rename from code/libvorbis-1.3.7/lib/smallft.c rename to code/thirdparty/libvorbis-1.3.7/lib/smallft.c diff --git a/code/libvorbis-1.3.7/lib/smallft.h b/code/thirdparty/libvorbis-1.3.7/lib/smallft.h similarity index 100% rename from code/libvorbis-1.3.7/lib/smallft.h rename to code/thirdparty/libvorbis-1.3.7/lib/smallft.h diff --git a/code/libvorbis-1.3.7/lib/synthesis.c b/code/thirdparty/libvorbis-1.3.7/lib/synthesis.c similarity index 100% rename from code/libvorbis-1.3.7/lib/synthesis.c rename to code/thirdparty/libvorbis-1.3.7/lib/synthesis.c diff --git a/code/libvorbis-1.3.7/lib/vorbisenc.c b/code/thirdparty/libvorbis-1.3.7/lib/vorbisenc.c similarity index 100% rename from code/libvorbis-1.3.7/lib/vorbisenc.c rename to code/thirdparty/libvorbis-1.3.7/lib/vorbisenc.c diff --git a/code/libvorbis-1.3.7/lib/vorbisfile.c b/code/thirdparty/libvorbis-1.3.7/lib/vorbisfile.c similarity index 100% rename from code/libvorbis-1.3.7/lib/vorbisfile.c rename to code/thirdparty/libvorbis-1.3.7/lib/vorbisfile.c diff --git a/code/libvorbis-1.3.7/lib/window.c b/code/thirdparty/libvorbis-1.3.7/lib/window.c similarity index 100% rename from code/libvorbis-1.3.7/lib/window.c rename to code/thirdparty/libvorbis-1.3.7/lib/window.c diff --git a/code/libvorbis-1.3.7/lib/window.h b/code/thirdparty/libvorbis-1.3.7/lib/window.h similarity index 100% rename from code/libvorbis-1.3.7/lib/window.h rename to code/thirdparty/libvorbis-1.3.7/lib/window.h diff --git a/code/openal-soft-1.24.3/include/AL/al.h b/code/thirdparty/openal-soft-1.24.3/include/AL/al.h similarity index 100% rename from code/openal-soft-1.24.3/include/AL/al.h rename to code/thirdparty/openal-soft-1.24.3/include/AL/al.h diff --git a/code/openal-soft-1.24.3/include/AL/alc.h b/code/thirdparty/openal-soft-1.24.3/include/AL/alc.h similarity index 100% rename from code/openal-soft-1.24.3/include/AL/alc.h rename to code/thirdparty/openal-soft-1.24.3/include/AL/alc.h diff --git a/code/openal-soft-1.24.3/include/AL/alext.h b/code/thirdparty/openal-soft-1.24.3/include/AL/alext.h similarity index 100% rename from code/openal-soft-1.24.3/include/AL/alext.h rename to code/thirdparty/openal-soft-1.24.3/include/AL/alext.h diff --git a/code/openal-soft-1.24.3/include/AL/efx-creative.h b/code/thirdparty/openal-soft-1.24.3/include/AL/efx-creative.h similarity index 100% rename from code/openal-soft-1.24.3/include/AL/efx-creative.h rename to code/thirdparty/openal-soft-1.24.3/include/AL/efx-creative.h diff --git a/code/openal-soft-1.24.3/include/AL/efx-presets.h b/code/thirdparty/openal-soft-1.24.3/include/AL/efx-presets.h similarity index 100% rename from code/openal-soft-1.24.3/include/AL/efx-presets.h rename to code/thirdparty/openal-soft-1.24.3/include/AL/efx-presets.h diff --git a/code/openal-soft-1.24.3/include/AL/efx.h b/code/thirdparty/openal-soft-1.24.3/include/AL/efx.h similarity index 100% rename from code/openal-soft-1.24.3/include/AL/efx.h rename to code/thirdparty/openal-soft-1.24.3/include/AL/efx.h diff --git a/code/opus-1.5.2/celt/_kiss_fft_guts.h b/code/thirdparty/opus-1.5.2/celt/_kiss_fft_guts.h similarity index 100% rename from code/opus-1.5.2/celt/_kiss_fft_guts.h rename to code/thirdparty/opus-1.5.2/celt/_kiss_fft_guts.h diff --git a/code/opus-1.5.2/celt/arch.h b/code/thirdparty/opus-1.5.2/celt/arch.h similarity index 100% rename from code/opus-1.5.2/celt/arch.h rename to code/thirdparty/opus-1.5.2/celt/arch.h diff --git a/code/opus-1.5.2/celt/bands.c b/code/thirdparty/opus-1.5.2/celt/bands.c similarity index 100% rename from code/opus-1.5.2/celt/bands.c rename to code/thirdparty/opus-1.5.2/celt/bands.c diff --git a/code/opus-1.5.2/celt/bands.h b/code/thirdparty/opus-1.5.2/celt/bands.h similarity index 100% rename from code/opus-1.5.2/celt/bands.h rename to code/thirdparty/opus-1.5.2/celt/bands.h diff --git a/code/opus-1.5.2/celt/celt.c b/code/thirdparty/opus-1.5.2/celt/celt.c similarity index 100% rename from code/opus-1.5.2/celt/celt.c rename to code/thirdparty/opus-1.5.2/celt/celt.c diff --git a/code/opus-1.5.2/celt/celt.h b/code/thirdparty/opus-1.5.2/celt/celt.h similarity index 100% rename from code/opus-1.5.2/celt/celt.h rename to code/thirdparty/opus-1.5.2/celt/celt.h diff --git a/code/opus-1.5.2/celt/celt_decoder.c b/code/thirdparty/opus-1.5.2/celt/celt_decoder.c similarity index 100% rename from code/opus-1.5.2/celt/celt_decoder.c rename to code/thirdparty/opus-1.5.2/celt/celt_decoder.c diff --git a/code/opus-1.5.2/celt/celt_encoder.c b/code/thirdparty/opus-1.5.2/celt/celt_encoder.c similarity index 100% rename from code/opus-1.5.2/celt/celt_encoder.c rename to code/thirdparty/opus-1.5.2/celt/celt_encoder.c diff --git a/code/opus-1.5.2/celt/celt_lpc.c b/code/thirdparty/opus-1.5.2/celt/celt_lpc.c similarity index 100% rename from code/opus-1.5.2/celt/celt_lpc.c rename to code/thirdparty/opus-1.5.2/celt/celt_lpc.c diff --git a/code/opus-1.5.2/celt/celt_lpc.h b/code/thirdparty/opus-1.5.2/celt/celt_lpc.h similarity index 100% rename from code/opus-1.5.2/celt/celt_lpc.h rename to code/thirdparty/opus-1.5.2/celt/celt_lpc.h diff --git a/code/opus-1.5.2/celt/cpu_support.h b/code/thirdparty/opus-1.5.2/celt/cpu_support.h similarity index 100% rename from code/opus-1.5.2/celt/cpu_support.h rename to code/thirdparty/opus-1.5.2/celt/cpu_support.h diff --git a/code/opus-1.5.2/celt/cwrs.c b/code/thirdparty/opus-1.5.2/celt/cwrs.c similarity index 100% rename from code/opus-1.5.2/celt/cwrs.c rename to code/thirdparty/opus-1.5.2/celt/cwrs.c diff --git a/code/opus-1.5.2/celt/cwrs.h b/code/thirdparty/opus-1.5.2/celt/cwrs.h similarity index 100% rename from code/opus-1.5.2/celt/cwrs.h rename to code/thirdparty/opus-1.5.2/celt/cwrs.h diff --git a/code/opus-1.5.2/celt/ecintrin.h b/code/thirdparty/opus-1.5.2/celt/ecintrin.h similarity index 100% rename from code/opus-1.5.2/celt/ecintrin.h rename to code/thirdparty/opus-1.5.2/celt/ecintrin.h diff --git a/code/opus-1.5.2/celt/entcode.c b/code/thirdparty/opus-1.5.2/celt/entcode.c similarity index 100% rename from code/opus-1.5.2/celt/entcode.c rename to code/thirdparty/opus-1.5.2/celt/entcode.c diff --git a/code/opus-1.5.2/celt/entcode.h b/code/thirdparty/opus-1.5.2/celt/entcode.h similarity index 100% rename from code/opus-1.5.2/celt/entcode.h rename to code/thirdparty/opus-1.5.2/celt/entcode.h diff --git a/code/opus-1.5.2/celt/entdec.c b/code/thirdparty/opus-1.5.2/celt/entdec.c similarity index 100% rename from code/opus-1.5.2/celt/entdec.c rename to code/thirdparty/opus-1.5.2/celt/entdec.c diff --git a/code/opus-1.5.2/celt/entdec.h b/code/thirdparty/opus-1.5.2/celt/entdec.h similarity index 100% rename from code/opus-1.5.2/celt/entdec.h rename to code/thirdparty/opus-1.5.2/celt/entdec.h diff --git a/code/opus-1.5.2/celt/entenc.c b/code/thirdparty/opus-1.5.2/celt/entenc.c similarity index 100% rename from code/opus-1.5.2/celt/entenc.c rename to code/thirdparty/opus-1.5.2/celt/entenc.c diff --git a/code/opus-1.5.2/celt/entenc.h b/code/thirdparty/opus-1.5.2/celt/entenc.h similarity index 100% rename from code/opus-1.5.2/celt/entenc.h rename to code/thirdparty/opus-1.5.2/celt/entenc.h diff --git a/code/opus-1.5.2/celt/float_cast.h b/code/thirdparty/opus-1.5.2/celt/float_cast.h similarity index 100% rename from code/opus-1.5.2/celt/float_cast.h rename to code/thirdparty/opus-1.5.2/celt/float_cast.h diff --git a/code/opus-1.5.2/celt/kiss_fft.c b/code/thirdparty/opus-1.5.2/celt/kiss_fft.c similarity index 100% rename from code/opus-1.5.2/celt/kiss_fft.c rename to code/thirdparty/opus-1.5.2/celt/kiss_fft.c diff --git a/code/opus-1.5.2/celt/kiss_fft.h b/code/thirdparty/opus-1.5.2/celt/kiss_fft.h similarity index 100% rename from code/opus-1.5.2/celt/kiss_fft.h rename to code/thirdparty/opus-1.5.2/celt/kiss_fft.h diff --git a/code/opus-1.5.2/celt/laplace.c b/code/thirdparty/opus-1.5.2/celt/laplace.c similarity index 100% rename from code/opus-1.5.2/celt/laplace.c rename to code/thirdparty/opus-1.5.2/celt/laplace.c diff --git a/code/opus-1.5.2/celt/laplace.h b/code/thirdparty/opus-1.5.2/celt/laplace.h similarity index 100% rename from code/opus-1.5.2/celt/laplace.h rename to code/thirdparty/opus-1.5.2/celt/laplace.h diff --git a/code/opus-1.5.2/celt/mathops.c b/code/thirdparty/opus-1.5.2/celt/mathops.c similarity index 100% rename from code/opus-1.5.2/celt/mathops.c rename to code/thirdparty/opus-1.5.2/celt/mathops.c diff --git a/code/opus-1.5.2/celt/mathops.h b/code/thirdparty/opus-1.5.2/celt/mathops.h similarity index 100% rename from code/opus-1.5.2/celt/mathops.h rename to code/thirdparty/opus-1.5.2/celt/mathops.h diff --git a/code/opus-1.5.2/celt/mdct.c b/code/thirdparty/opus-1.5.2/celt/mdct.c similarity index 100% rename from code/opus-1.5.2/celt/mdct.c rename to code/thirdparty/opus-1.5.2/celt/mdct.c diff --git a/code/opus-1.5.2/celt/mdct.h b/code/thirdparty/opus-1.5.2/celt/mdct.h similarity index 100% rename from code/opus-1.5.2/celt/mdct.h rename to code/thirdparty/opus-1.5.2/celt/mdct.h diff --git a/code/opus-1.5.2/celt/mfrngcod.h b/code/thirdparty/opus-1.5.2/celt/mfrngcod.h similarity index 100% rename from code/opus-1.5.2/celt/mfrngcod.h rename to code/thirdparty/opus-1.5.2/celt/mfrngcod.h diff --git a/code/opus-1.5.2/celt/modes.c b/code/thirdparty/opus-1.5.2/celt/modes.c similarity index 100% rename from code/opus-1.5.2/celt/modes.c rename to code/thirdparty/opus-1.5.2/celt/modes.c diff --git a/code/opus-1.5.2/celt/modes.h b/code/thirdparty/opus-1.5.2/celt/modes.h similarity index 100% rename from code/opus-1.5.2/celt/modes.h rename to code/thirdparty/opus-1.5.2/celt/modes.h diff --git a/code/opus-1.5.2/celt/os_support.h b/code/thirdparty/opus-1.5.2/celt/os_support.h similarity index 100% rename from code/opus-1.5.2/celt/os_support.h rename to code/thirdparty/opus-1.5.2/celt/os_support.h diff --git a/code/opus-1.5.2/celt/pitch.c b/code/thirdparty/opus-1.5.2/celt/pitch.c similarity index 100% rename from code/opus-1.5.2/celt/pitch.c rename to code/thirdparty/opus-1.5.2/celt/pitch.c diff --git a/code/opus-1.5.2/celt/pitch.h b/code/thirdparty/opus-1.5.2/celt/pitch.h similarity index 100% rename from code/opus-1.5.2/celt/pitch.h rename to code/thirdparty/opus-1.5.2/celt/pitch.h diff --git a/code/opus-1.5.2/celt/quant_bands.c b/code/thirdparty/opus-1.5.2/celt/quant_bands.c similarity index 100% rename from code/opus-1.5.2/celt/quant_bands.c rename to code/thirdparty/opus-1.5.2/celt/quant_bands.c diff --git a/code/opus-1.5.2/celt/quant_bands.h b/code/thirdparty/opus-1.5.2/celt/quant_bands.h similarity index 100% rename from code/opus-1.5.2/celt/quant_bands.h rename to code/thirdparty/opus-1.5.2/celt/quant_bands.h diff --git a/code/opus-1.5.2/celt/rate.c b/code/thirdparty/opus-1.5.2/celt/rate.c similarity index 100% rename from code/opus-1.5.2/celt/rate.c rename to code/thirdparty/opus-1.5.2/celt/rate.c diff --git a/code/opus-1.5.2/celt/rate.h b/code/thirdparty/opus-1.5.2/celt/rate.h similarity index 100% rename from code/opus-1.5.2/celt/rate.h rename to code/thirdparty/opus-1.5.2/celt/rate.h diff --git a/code/opus-1.5.2/celt/stack_alloc.h b/code/thirdparty/opus-1.5.2/celt/stack_alloc.h similarity index 100% rename from code/opus-1.5.2/celt/stack_alloc.h rename to code/thirdparty/opus-1.5.2/celt/stack_alloc.h diff --git a/code/opus-1.5.2/celt/static_modes_float.h b/code/thirdparty/opus-1.5.2/celt/static_modes_float.h similarity index 100% rename from code/opus-1.5.2/celt/static_modes_float.h rename to code/thirdparty/opus-1.5.2/celt/static_modes_float.h diff --git a/code/opus-1.5.2/celt/vq.c b/code/thirdparty/opus-1.5.2/celt/vq.c similarity index 100% rename from code/opus-1.5.2/celt/vq.c rename to code/thirdparty/opus-1.5.2/celt/vq.c diff --git a/code/opus-1.5.2/celt/vq.h b/code/thirdparty/opus-1.5.2/celt/vq.h similarity index 100% rename from code/opus-1.5.2/celt/vq.h rename to code/thirdparty/opus-1.5.2/celt/vq.h diff --git a/code/opus-1.5.2/include/opus.h b/code/thirdparty/opus-1.5.2/include/opus.h similarity index 100% rename from code/opus-1.5.2/include/opus.h rename to code/thirdparty/opus-1.5.2/include/opus.h diff --git a/code/opus-1.5.2/include/opus_custom.h b/code/thirdparty/opus-1.5.2/include/opus_custom.h similarity index 100% rename from code/opus-1.5.2/include/opus_custom.h rename to code/thirdparty/opus-1.5.2/include/opus_custom.h diff --git a/code/opus-1.5.2/include/opus_defines.h b/code/thirdparty/opus-1.5.2/include/opus_defines.h similarity index 100% rename from code/opus-1.5.2/include/opus_defines.h rename to code/thirdparty/opus-1.5.2/include/opus_defines.h diff --git a/code/opus-1.5.2/include/opus_multistream.h b/code/thirdparty/opus-1.5.2/include/opus_multistream.h similarity index 100% rename from code/opus-1.5.2/include/opus_multistream.h rename to code/thirdparty/opus-1.5.2/include/opus_multistream.h diff --git a/code/opus-1.5.2/include/opus_projection.h b/code/thirdparty/opus-1.5.2/include/opus_projection.h similarity index 100% rename from code/opus-1.5.2/include/opus_projection.h rename to code/thirdparty/opus-1.5.2/include/opus_projection.h diff --git a/code/opus-1.5.2/include/opus_types.h b/code/thirdparty/opus-1.5.2/include/opus_types.h similarity index 100% rename from code/opus-1.5.2/include/opus_types.h rename to code/thirdparty/opus-1.5.2/include/opus_types.h diff --git a/code/opus-1.5.2/silk/A2NLSF.c b/code/thirdparty/opus-1.5.2/silk/A2NLSF.c similarity index 100% rename from code/opus-1.5.2/silk/A2NLSF.c rename to code/thirdparty/opus-1.5.2/silk/A2NLSF.c diff --git a/code/opus-1.5.2/silk/API.h b/code/thirdparty/opus-1.5.2/silk/API.h similarity index 100% rename from code/opus-1.5.2/silk/API.h rename to code/thirdparty/opus-1.5.2/silk/API.h diff --git a/code/opus-1.5.2/silk/CNG.c b/code/thirdparty/opus-1.5.2/silk/CNG.c similarity index 100% rename from code/opus-1.5.2/silk/CNG.c rename to code/thirdparty/opus-1.5.2/silk/CNG.c diff --git a/code/opus-1.5.2/silk/HP_variable_cutoff.c b/code/thirdparty/opus-1.5.2/silk/HP_variable_cutoff.c similarity index 100% rename from code/opus-1.5.2/silk/HP_variable_cutoff.c rename to code/thirdparty/opus-1.5.2/silk/HP_variable_cutoff.c diff --git a/code/opus-1.5.2/silk/Inlines.h b/code/thirdparty/opus-1.5.2/silk/Inlines.h similarity index 100% rename from code/opus-1.5.2/silk/Inlines.h rename to code/thirdparty/opus-1.5.2/silk/Inlines.h diff --git a/code/opus-1.5.2/silk/LPC_analysis_filter.c b/code/thirdparty/opus-1.5.2/silk/LPC_analysis_filter.c similarity index 100% rename from code/opus-1.5.2/silk/LPC_analysis_filter.c rename to code/thirdparty/opus-1.5.2/silk/LPC_analysis_filter.c diff --git a/code/opus-1.5.2/silk/LPC_fit.c b/code/thirdparty/opus-1.5.2/silk/LPC_fit.c similarity index 100% rename from code/opus-1.5.2/silk/LPC_fit.c rename to code/thirdparty/opus-1.5.2/silk/LPC_fit.c diff --git a/code/opus-1.5.2/silk/LPC_inv_pred_gain.c b/code/thirdparty/opus-1.5.2/silk/LPC_inv_pred_gain.c similarity index 100% rename from code/opus-1.5.2/silk/LPC_inv_pred_gain.c rename to code/thirdparty/opus-1.5.2/silk/LPC_inv_pred_gain.c diff --git a/code/opus-1.5.2/silk/LP_variable_cutoff.c b/code/thirdparty/opus-1.5.2/silk/LP_variable_cutoff.c similarity index 100% rename from code/opus-1.5.2/silk/LP_variable_cutoff.c rename to code/thirdparty/opus-1.5.2/silk/LP_variable_cutoff.c diff --git a/code/opus-1.5.2/silk/MacroCount.h b/code/thirdparty/opus-1.5.2/silk/MacroCount.h similarity index 100% rename from code/opus-1.5.2/silk/MacroCount.h rename to code/thirdparty/opus-1.5.2/silk/MacroCount.h diff --git a/code/opus-1.5.2/silk/MacroDebug.h b/code/thirdparty/opus-1.5.2/silk/MacroDebug.h similarity index 100% rename from code/opus-1.5.2/silk/MacroDebug.h rename to code/thirdparty/opus-1.5.2/silk/MacroDebug.h diff --git a/code/opus-1.5.2/silk/NLSF2A.c b/code/thirdparty/opus-1.5.2/silk/NLSF2A.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF2A.c rename to code/thirdparty/opus-1.5.2/silk/NLSF2A.c diff --git a/code/opus-1.5.2/silk/NLSF_VQ.c b/code/thirdparty/opus-1.5.2/silk/NLSF_VQ.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_VQ.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_VQ.c diff --git a/code/opus-1.5.2/silk/NLSF_VQ_weights_laroia.c b/code/thirdparty/opus-1.5.2/silk/NLSF_VQ_weights_laroia.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_VQ_weights_laroia.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_VQ_weights_laroia.c diff --git a/code/opus-1.5.2/silk/NLSF_decode.c b/code/thirdparty/opus-1.5.2/silk/NLSF_decode.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_decode.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_decode.c diff --git a/code/opus-1.5.2/silk/NLSF_del_dec_quant.c b/code/thirdparty/opus-1.5.2/silk/NLSF_del_dec_quant.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_del_dec_quant.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_del_dec_quant.c diff --git a/code/opus-1.5.2/silk/NLSF_encode.c b/code/thirdparty/opus-1.5.2/silk/NLSF_encode.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_encode.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_encode.c diff --git a/code/opus-1.5.2/silk/NLSF_stabilize.c b/code/thirdparty/opus-1.5.2/silk/NLSF_stabilize.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_stabilize.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_stabilize.c diff --git a/code/opus-1.5.2/silk/NLSF_unpack.c b/code/thirdparty/opus-1.5.2/silk/NLSF_unpack.c similarity index 100% rename from code/opus-1.5.2/silk/NLSF_unpack.c rename to code/thirdparty/opus-1.5.2/silk/NLSF_unpack.c diff --git a/code/opus-1.5.2/silk/NSQ.c b/code/thirdparty/opus-1.5.2/silk/NSQ.c similarity index 100% rename from code/opus-1.5.2/silk/NSQ.c rename to code/thirdparty/opus-1.5.2/silk/NSQ.c diff --git a/code/opus-1.5.2/silk/NSQ.h b/code/thirdparty/opus-1.5.2/silk/NSQ.h similarity index 100% rename from code/opus-1.5.2/silk/NSQ.h rename to code/thirdparty/opus-1.5.2/silk/NSQ.h diff --git a/code/opus-1.5.2/silk/NSQ_del_dec.c b/code/thirdparty/opus-1.5.2/silk/NSQ_del_dec.c similarity index 100% rename from code/opus-1.5.2/silk/NSQ_del_dec.c rename to code/thirdparty/opus-1.5.2/silk/NSQ_del_dec.c diff --git a/code/opus-1.5.2/silk/PLC.c b/code/thirdparty/opus-1.5.2/silk/PLC.c similarity index 100% rename from code/opus-1.5.2/silk/PLC.c rename to code/thirdparty/opus-1.5.2/silk/PLC.c diff --git a/code/opus-1.5.2/silk/PLC.h b/code/thirdparty/opus-1.5.2/silk/PLC.h similarity index 100% rename from code/opus-1.5.2/silk/PLC.h rename to code/thirdparty/opus-1.5.2/silk/PLC.h diff --git a/code/opus-1.5.2/silk/SigProc_FIX.h b/code/thirdparty/opus-1.5.2/silk/SigProc_FIX.h similarity index 100% rename from code/opus-1.5.2/silk/SigProc_FIX.h rename to code/thirdparty/opus-1.5.2/silk/SigProc_FIX.h diff --git a/code/opus-1.5.2/silk/VAD.c b/code/thirdparty/opus-1.5.2/silk/VAD.c similarity index 100% rename from code/opus-1.5.2/silk/VAD.c rename to code/thirdparty/opus-1.5.2/silk/VAD.c diff --git a/code/opus-1.5.2/silk/VQ_WMat_EC.c b/code/thirdparty/opus-1.5.2/silk/VQ_WMat_EC.c similarity index 100% rename from code/opus-1.5.2/silk/VQ_WMat_EC.c rename to code/thirdparty/opus-1.5.2/silk/VQ_WMat_EC.c diff --git a/code/opus-1.5.2/silk/ana_filt_bank_1.c b/code/thirdparty/opus-1.5.2/silk/ana_filt_bank_1.c similarity index 100% rename from code/opus-1.5.2/silk/ana_filt_bank_1.c rename to code/thirdparty/opus-1.5.2/silk/ana_filt_bank_1.c diff --git a/code/opus-1.5.2/silk/biquad_alt.c b/code/thirdparty/opus-1.5.2/silk/biquad_alt.c similarity index 100% rename from code/opus-1.5.2/silk/biquad_alt.c rename to code/thirdparty/opus-1.5.2/silk/biquad_alt.c diff --git a/code/opus-1.5.2/silk/bwexpander.c b/code/thirdparty/opus-1.5.2/silk/bwexpander.c similarity index 100% rename from code/opus-1.5.2/silk/bwexpander.c rename to code/thirdparty/opus-1.5.2/silk/bwexpander.c diff --git a/code/opus-1.5.2/silk/bwexpander_32.c b/code/thirdparty/opus-1.5.2/silk/bwexpander_32.c similarity index 100% rename from code/opus-1.5.2/silk/bwexpander_32.c rename to code/thirdparty/opus-1.5.2/silk/bwexpander_32.c diff --git a/code/opus-1.5.2/silk/check_control_input.c b/code/thirdparty/opus-1.5.2/silk/check_control_input.c similarity index 100% rename from code/opus-1.5.2/silk/check_control_input.c rename to code/thirdparty/opus-1.5.2/silk/check_control_input.c diff --git a/code/opus-1.5.2/silk/code_signs.c b/code/thirdparty/opus-1.5.2/silk/code_signs.c similarity index 100% rename from code/opus-1.5.2/silk/code_signs.c rename to code/thirdparty/opus-1.5.2/silk/code_signs.c diff --git a/code/opus-1.5.2/silk/control.h b/code/thirdparty/opus-1.5.2/silk/control.h similarity index 100% rename from code/opus-1.5.2/silk/control.h rename to code/thirdparty/opus-1.5.2/silk/control.h diff --git a/code/opus-1.5.2/silk/control_SNR.c b/code/thirdparty/opus-1.5.2/silk/control_SNR.c similarity index 100% rename from code/opus-1.5.2/silk/control_SNR.c rename to code/thirdparty/opus-1.5.2/silk/control_SNR.c diff --git a/code/opus-1.5.2/silk/control_audio_bandwidth.c b/code/thirdparty/opus-1.5.2/silk/control_audio_bandwidth.c similarity index 100% rename from code/opus-1.5.2/silk/control_audio_bandwidth.c rename to code/thirdparty/opus-1.5.2/silk/control_audio_bandwidth.c diff --git a/code/opus-1.5.2/silk/control_codec.c b/code/thirdparty/opus-1.5.2/silk/control_codec.c similarity index 100% rename from code/opus-1.5.2/silk/control_codec.c rename to code/thirdparty/opus-1.5.2/silk/control_codec.c diff --git a/code/opus-1.5.2/silk/debug.c b/code/thirdparty/opus-1.5.2/silk/debug.c similarity index 100% rename from code/opus-1.5.2/silk/debug.c rename to code/thirdparty/opus-1.5.2/silk/debug.c diff --git a/code/opus-1.5.2/silk/debug.h b/code/thirdparty/opus-1.5.2/silk/debug.h similarity index 100% rename from code/opus-1.5.2/silk/debug.h rename to code/thirdparty/opus-1.5.2/silk/debug.h diff --git a/code/opus-1.5.2/silk/dec_API.c b/code/thirdparty/opus-1.5.2/silk/dec_API.c similarity index 100% rename from code/opus-1.5.2/silk/dec_API.c rename to code/thirdparty/opus-1.5.2/silk/dec_API.c diff --git a/code/opus-1.5.2/silk/decode_core.c b/code/thirdparty/opus-1.5.2/silk/decode_core.c similarity index 100% rename from code/opus-1.5.2/silk/decode_core.c rename to code/thirdparty/opus-1.5.2/silk/decode_core.c diff --git a/code/opus-1.5.2/silk/decode_frame.c b/code/thirdparty/opus-1.5.2/silk/decode_frame.c similarity index 100% rename from code/opus-1.5.2/silk/decode_frame.c rename to code/thirdparty/opus-1.5.2/silk/decode_frame.c diff --git a/code/opus-1.5.2/silk/decode_indices.c b/code/thirdparty/opus-1.5.2/silk/decode_indices.c similarity index 100% rename from code/opus-1.5.2/silk/decode_indices.c rename to code/thirdparty/opus-1.5.2/silk/decode_indices.c diff --git a/code/opus-1.5.2/silk/decode_parameters.c b/code/thirdparty/opus-1.5.2/silk/decode_parameters.c similarity index 100% rename from code/opus-1.5.2/silk/decode_parameters.c rename to code/thirdparty/opus-1.5.2/silk/decode_parameters.c diff --git a/code/opus-1.5.2/silk/decode_pitch.c b/code/thirdparty/opus-1.5.2/silk/decode_pitch.c similarity index 100% rename from code/opus-1.5.2/silk/decode_pitch.c rename to code/thirdparty/opus-1.5.2/silk/decode_pitch.c diff --git a/code/opus-1.5.2/silk/decode_pulses.c b/code/thirdparty/opus-1.5.2/silk/decode_pulses.c similarity index 100% rename from code/opus-1.5.2/silk/decode_pulses.c rename to code/thirdparty/opus-1.5.2/silk/decode_pulses.c diff --git a/code/opus-1.5.2/silk/decoder_set_fs.c b/code/thirdparty/opus-1.5.2/silk/decoder_set_fs.c similarity index 100% rename from code/opus-1.5.2/silk/decoder_set_fs.c rename to code/thirdparty/opus-1.5.2/silk/decoder_set_fs.c diff --git a/code/opus-1.5.2/silk/define.h b/code/thirdparty/opus-1.5.2/silk/define.h similarity index 100% rename from code/opus-1.5.2/silk/define.h rename to code/thirdparty/opus-1.5.2/silk/define.h diff --git a/code/opus-1.5.2/silk/enc_API.c b/code/thirdparty/opus-1.5.2/silk/enc_API.c similarity index 100% rename from code/opus-1.5.2/silk/enc_API.c rename to code/thirdparty/opus-1.5.2/silk/enc_API.c diff --git a/code/opus-1.5.2/silk/encode_indices.c b/code/thirdparty/opus-1.5.2/silk/encode_indices.c similarity index 100% rename from code/opus-1.5.2/silk/encode_indices.c rename to code/thirdparty/opus-1.5.2/silk/encode_indices.c diff --git a/code/opus-1.5.2/silk/encode_pulses.c b/code/thirdparty/opus-1.5.2/silk/encode_pulses.c similarity index 100% rename from code/opus-1.5.2/silk/encode_pulses.c rename to code/thirdparty/opus-1.5.2/silk/encode_pulses.c diff --git a/code/opus-1.5.2/silk/errors.h b/code/thirdparty/opus-1.5.2/silk/errors.h similarity index 100% rename from code/opus-1.5.2/silk/errors.h rename to code/thirdparty/opus-1.5.2/silk/errors.h diff --git a/code/opus-1.5.2/silk/float/LPC_analysis_filter_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/LPC_analysis_filter_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/LPC_analysis_filter_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/LPC_analysis_filter_FLP.c diff --git a/code/opus-1.5.2/silk/float/LPC_inv_pred_gain_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/LPC_inv_pred_gain_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/LPC_inv_pred_gain_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/LPC_inv_pred_gain_FLP.c diff --git a/code/opus-1.5.2/silk/float/LTP_analysis_filter_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/LTP_analysis_filter_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/LTP_analysis_filter_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/LTP_analysis_filter_FLP.c diff --git a/code/opus-1.5.2/silk/float/LTP_scale_ctrl_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/LTP_scale_ctrl_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/LTP_scale_ctrl_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/LTP_scale_ctrl_FLP.c diff --git a/code/opus-1.5.2/silk/float/SigProc_FLP.h b/code/thirdparty/opus-1.5.2/silk/float/SigProc_FLP.h similarity index 100% rename from code/opus-1.5.2/silk/float/SigProc_FLP.h rename to code/thirdparty/opus-1.5.2/silk/float/SigProc_FLP.h diff --git a/code/opus-1.5.2/silk/float/apply_sine_window_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/apply_sine_window_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/apply_sine_window_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/apply_sine_window_FLP.c diff --git a/code/opus-1.5.2/silk/float/autocorrelation_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/autocorrelation_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/autocorrelation_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/autocorrelation_FLP.c diff --git a/code/opus-1.5.2/silk/float/burg_modified_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/burg_modified_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/burg_modified_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/burg_modified_FLP.c diff --git a/code/opus-1.5.2/silk/float/bwexpander_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/bwexpander_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/bwexpander_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/bwexpander_FLP.c diff --git a/code/opus-1.5.2/silk/float/corrMatrix_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/corrMatrix_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/corrMatrix_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/corrMatrix_FLP.c diff --git a/code/opus-1.5.2/silk/float/encode_frame_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/encode_frame_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/encode_frame_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/encode_frame_FLP.c diff --git a/code/opus-1.5.2/silk/float/energy_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/energy_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/energy_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/energy_FLP.c diff --git a/code/opus-1.5.2/silk/float/find_LPC_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/find_LPC_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/find_LPC_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/find_LPC_FLP.c diff --git a/code/opus-1.5.2/silk/float/find_LTP_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/find_LTP_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/find_LTP_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/find_LTP_FLP.c diff --git a/code/opus-1.5.2/silk/float/find_pitch_lags_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/find_pitch_lags_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/find_pitch_lags_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/find_pitch_lags_FLP.c diff --git a/code/opus-1.5.2/silk/float/find_pred_coefs_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/find_pred_coefs_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/find_pred_coefs_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/find_pred_coefs_FLP.c diff --git a/code/opus-1.5.2/silk/float/inner_product_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/inner_product_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/inner_product_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/inner_product_FLP.c diff --git a/code/opus-1.5.2/silk/float/k2a_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/k2a_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/k2a_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/k2a_FLP.c diff --git a/code/opus-1.5.2/silk/float/main_FLP.h b/code/thirdparty/opus-1.5.2/silk/float/main_FLP.h similarity index 100% rename from code/opus-1.5.2/silk/float/main_FLP.h rename to code/thirdparty/opus-1.5.2/silk/float/main_FLP.h diff --git a/code/opus-1.5.2/silk/float/noise_shape_analysis_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/noise_shape_analysis_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/noise_shape_analysis_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/noise_shape_analysis_FLP.c diff --git a/code/opus-1.5.2/silk/float/pitch_analysis_core_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/pitch_analysis_core_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/pitch_analysis_core_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/pitch_analysis_core_FLP.c diff --git a/code/opus-1.5.2/silk/float/process_gains_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/process_gains_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/process_gains_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/process_gains_FLP.c diff --git a/code/opus-1.5.2/silk/float/regularize_correlations_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/regularize_correlations_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/regularize_correlations_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/regularize_correlations_FLP.c diff --git a/code/opus-1.5.2/silk/float/residual_energy_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/residual_energy_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/residual_energy_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/residual_energy_FLP.c diff --git a/code/opus-1.5.2/silk/float/scale_copy_vector_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/scale_copy_vector_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/scale_copy_vector_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/scale_copy_vector_FLP.c diff --git a/code/opus-1.5.2/silk/float/scale_vector_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/scale_vector_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/scale_vector_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/scale_vector_FLP.c diff --git a/code/opus-1.5.2/silk/float/schur_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/schur_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/schur_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/schur_FLP.c diff --git a/code/opus-1.5.2/silk/float/sort_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/sort_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/sort_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/sort_FLP.c diff --git a/code/opus-1.5.2/silk/float/structs_FLP.h b/code/thirdparty/opus-1.5.2/silk/float/structs_FLP.h similarity index 100% rename from code/opus-1.5.2/silk/float/structs_FLP.h rename to code/thirdparty/opus-1.5.2/silk/float/structs_FLP.h diff --git a/code/opus-1.5.2/silk/float/warped_autocorrelation_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/warped_autocorrelation_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/warped_autocorrelation_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/warped_autocorrelation_FLP.c diff --git a/code/opus-1.5.2/silk/float/wrappers_FLP.c b/code/thirdparty/opus-1.5.2/silk/float/wrappers_FLP.c similarity index 100% rename from code/opus-1.5.2/silk/float/wrappers_FLP.c rename to code/thirdparty/opus-1.5.2/silk/float/wrappers_FLP.c diff --git a/code/opus-1.5.2/silk/gain_quant.c b/code/thirdparty/opus-1.5.2/silk/gain_quant.c similarity index 100% rename from code/opus-1.5.2/silk/gain_quant.c rename to code/thirdparty/opus-1.5.2/silk/gain_quant.c diff --git a/code/opus-1.5.2/silk/init_decoder.c b/code/thirdparty/opus-1.5.2/silk/init_decoder.c similarity index 100% rename from code/opus-1.5.2/silk/init_decoder.c rename to code/thirdparty/opus-1.5.2/silk/init_decoder.c diff --git a/code/opus-1.5.2/silk/init_encoder.c b/code/thirdparty/opus-1.5.2/silk/init_encoder.c similarity index 100% rename from code/opus-1.5.2/silk/init_encoder.c rename to code/thirdparty/opus-1.5.2/silk/init_encoder.c diff --git a/code/opus-1.5.2/silk/inner_prod_aligned.c b/code/thirdparty/opus-1.5.2/silk/inner_prod_aligned.c similarity index 100% rename from code/opus-1.5.2/silk/inner_prod_aligned.c rename to code/thirdparty/opus-1.5.2/silk/inner_prod_aligned.c diff --git a/code/opus-1.5.2/silk/interpolate.c b/code/thirdparty/opus-1.5.2/silk/interpolate.c similarity index 100% rename from code/opus-1.5.2/silk/interpolate.c rename to code/thirdparty/opus-1.5.2/silk/interpolate.c diff --git a/code/opus-1.5.2/silk/lin2log.c b/code/thirdparty/opus-1.5.2/silk/lin2log.c similarity index 100% rename from code/opus-1.5.2/silk/lin2log.c rename to code/thirdparty/opus-1.5.2/silk/lin2log.c diff --git a/code/opus-1.5.2/silk/log2lin.c b/code/thirdparty/opus-1.5.2/silk/log2lin.c similarity index 100% rename from code/opus-1.5.2/silk/log2lin.c rename to code/thirdparty/opus-1.5.2/silk/log2lin.c diff --git a/code/opus-1.5.2/silk/macros.h b/code/thirdparty/opus-1.5.2/silk/macros.h similarity index 100% rename from code/opus-1.5.2/silk/macros.h rename to code/thirdparty/opus-1.5.2/silk/macros.h diff --git a/code/opus-1.5.2/silk/main.h b/code/thirdparty/opus-1.5.2/silk/main.h similarity index 100% rename from code/opus-1.5.2/silk/main.h rename to code/thirdparty/opus-1.5.2/silk/main.h diff --git a/code/opus-1.5.2/silk/pitch_est_defines.h b/code/thirdparty/opus-1.5.2/silk/pitch_est_defines.h similarity index 100% rename from code/opus-1.5.2/silk/pitch_est_defines.h rename to code/thirdparty/opus-1.5.2/silk/pitch_est_defines.h diff --git a/code/opus-1.5.2/silk/pitch_est_tables.c b/code/thirdparty/opus-1.5.2/silk/pitch_est_tables.c similarity index 100% rename from code/opus-1.5.2/silk/pitch_est_tables.c rename to code/thirdparty/opus-1.5.2/silk/pitch_est_tables.c diff --git a/code/opus-1.5.2/silk/process_NLSFs.c b/code/thirdparty/opus-1.5.2/silk/process_NLSFs.c similarity index 100% rename from code/opus-1.5.2/silk/process_NLSFs.c rename to code/thirdparty/opus-1.5.2/silk/process_NLSFs.c diff --git a/code/opus-1.5.2/silk/quant_LTP_gains.c b/code/thirdparty/opus-1.5.2/silk/quant_LTP_gains.c similarity index 100% rename from code/opus-1.5.2/silk/quant_LTP_gains.c rename to code/thirdparty/opus-1.5.2/silk/quant_LTP_gains.c diff --git a/code/opus-1.5.2/silk/resampler.c b/code/thirdparty/opus-1.5.2/silk/resampler.c similarity index 100% rename from code/opus-1.5.2/silk/resampler.c rename to code/thirdparty/opus-1.5.2/silk/resampler.c diff --git a/code/opus-1.5.2/silk/resampler_down2.c b/code/thirdparty/opus-1.5.2/silk/resampler_down2.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_down2.c rename to code/thirdparty/opus-1.5.2/silk/resampler_down2.c diff --git a/code/opus-1.5.2/silk/resampler_down2_3.c b/code/thirdparty/opus-1.5.2/silk/resampler_down2_3.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_down2_3.c rename to code/thirdparty/opus-1.5.2/silk/resampler_down2_3.c diff --git a/code/opus-1.5.2/silk/resampler_private.h b/code/thirdparty/opus-1.5.2/silk/resampler_private.h similarity index 100% rename from code/opus-1.5.2/silk/resampler_private.h rename to code/thirdparty/opus-1.5.2/silk/resampler_private.h diff --git a/code/opus-1.5.2/silk/resampler_private_AR2.c b/code/thirdparty/opus-1.5.2/silk/resampler_private_AR2.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_private_AR2.c rename to code/thirdparty/opus-1.5.2/silk/resampler_private_AR2.c diff --git a/code/opus-1.5.2/silk/resampler_private_IIR_FIR.c b/code/thirdparty/opus-1.5.2/silk/resampler_private_IIR_FIR.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_private_IIR_FIR.c rename to code/thirdparty/opus-1.5.2/silk/resampler_private_IIR_FIR.c diff --git a/code/opus-1.5.2/silk/resampler_private_down_FIR.c b/code/thirdparty/opus-1.5.2/silk/resampler_private_down_FIR.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_private_down_FIR.c rename to code/thirdparty/opus-1.5.2/silk/resampler_private_down_FIR.c diff --git a/code/opus-1.5.2/silk/resampler_private_up2_HQ.c b/code/thirdparty/opus-1.5.2/silk/resampler_private_up2_HQ.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_private_up2_HQ.c rename to code/thirdparty/opus-1.5.2/silk/resampler_private_up2_HQ.c diff --git a/code/opus-1.5.2/silk/resampler_rom.c b/code/thirdparty/opus-1.5.2/silk/resampler_rom.c similarity index 100% rename from code/opus-1.5.2/silk/resampler_rom.c rename to code/thirdparty/opus-1.5.2/silk/resampler_rom.c diff --git a/code/opus-1.5.2/silk/resampler_rom.h b/code/thirdparty/opus-1.5.2/silk/resampler_rom.h similarity index 100% rename from code/opus-1.5.2/silk/resampler_rom.h rename to code/thirdparty/opus-1.5.2/silk/resampler_rom.h diff --git a/code/opus-1.5.2/silk/resampler_structs.h b/code/thirdparty/opus-1.5.2/silk/resampler_structs.h similarity index 100% rename from code/opus-1.5.2/silk/resampler_structs.h rename to code/thirdparty/opus-1.5.2/silk/resampler_structs.h diff --git a/code/opus-1.5.2/silk/shell_coder.c b/code/thirdparty/opus-1.5.2/silk/shell_coder.c similarity index 100% rename from code/opus-1.5.2/silk/shell_coder.c rename to code/thirdparty/opus-1.5.2/silk/shell_coder.c diff --git a/code/opus-1.5.2/silk/sigm_Q15.c b/code/thirdparty/opus-1.5.2/silk/sigm_Q15.c similarity index 100% rename from code/opus-1.5.2/silk/sigm_Q15.c rename to code/thirdparty/opus-1.5.2/silk/sigm_Q15.c diff --git a/code/opus-1.5.2/silk/sort.c b/code/thirdparty/opus-1.5.2/silk/sort.c similarity index 100% rename from code/opus-1.5.2/silk/sort.c rename to code/thirdparty/opus-1.5.2/silk/sort.c diff --git a/code/opus-1.5.2/silk/stereo_LR_to_MS.c b/code/thirdparty/opus-1.5.2/silk/stereo_LR_to_MS.c similarity index 100% rename from code/opus-1.5.2/silk/stereo_LR_to_MS.c rename to code/thirdparty/opus-1.5.2/silk/stereo_LR_to_MS.c diff --git a/code/opus-1.5.2/silk/stereo_MS_to_LR.c b/code/thirdparty/opus-1.5.2/silk/stereo_MS_to_LR.c similarity index 100% rename from code/opus-1.5.2/silk/stereo_MS_to_LR.c rename to code/thirdparty/opus-1.5.2/silk/stereo_MS_to_LR.c diff --git a/code/opus-1.5.2/silk/stereo_decode_pred.c b/code/thirdparty/opus-1.5.2/silk/stereo_decode_pred.c similarity index 100% rename from code/opus-1.5.2/silk/stereo_decode_pred.c rename to code/thirdparty/opus-1.5.2/silk/stereo_decode_pred.c diff --git a/code/opus-1.5.2/silk/stereo_encode_pred.c b/code/thirdparty/opus-1.5.2/silk/stereo_encode_pred.c similarity index 100% rename from code/opus-1.5.2/silk/stereo_encode_pred.c rename to code/thirdparty/opus-1.5.2/silk/stereo_encode_pred.c diff --git a/code/opus-1.5.2/silk/stereo_find_predictor.c b/code/thirdparty/opus-1.5.2/silk/stereo_find_predictor.c similarity index 100% rename from code/opus-1.5.2/silk/stereo_find_predictor.c rename to code/thirdparty/opus-1.5.2/silk/stereo_find_predictor.c diff --git a/code/opus-1.5.2/silk/stereo_quant_pred.c b/code/thirdparty/opus-1.5.2/silk/stereo_quant_pred.c similarity index 100% rename from code/opus-1.5.2/silk/stereo_quant_pred.c rename to code/thirdparty/opus-1.5.2/silk/stereo_quant_pred.c diff --git a/code/opus-1.5.2/silk/structs.h b/code/thirdparty/opus-1.5.2/silk/structs.h similarity index 100% rename from code/opus-1.5.2/silk/structs.h rename to code/thirdparty/opus-1.5.2/silk/structs.h diff --git a/code/opus-1.5.2/silk/sum_sqr_shift.c b/code/thirdparty/opus-1.5.2/silk/sum_sqr_shift.c similarity index 100% rename from code/opus-1.5.2/silk/sum_sqr_shift.c rename to code/thirdparty/opus-1.5.2/silk/sum_sqr_shift.c diff --git a/code/opus-1.5.2/silk/table_LSF_cos.c b/code/thirdparty/opus-1.5.2/silk/table_LSF_cos.c similarity index 100% rename from code/opus-1.5.2/silk/table_LSF_cos.c rename to code/thirdparty/opus-1.5.2/silk/table_LSF_cos.c diff --git a/code/opus-1.5.2/silk/tables.h b/code/thirdparty/opus-1.5.2/silk/tables.h similarity index 100% rename from code/opus-1.5.2/silk/tables.h rename to code/thirdparty/opus-1.5.2/silk/tables.h diff --git a/code/opus-1.5.2/silk/tables_LTP.c b/code/thirdparty/opus-1.5.2/silk/tables_LTP.c similarity index 100% rename from code/opus-1.5.2/silk/tables_LTP.c rename to code/thirdparty/opus-1.5.2/silk/tables_LTP.c diff --git a/code/opus-1.5.2/silk/tables_NLSF_CB_NB_MB.c b/code/thirdparty/opus-1.5.2/silk/tables_NLSF_CB_NB_MB.c similarity index 100% rename from code/opus-1.5.2/silk/tables_NLSF_CB_NB_MB.c rename to code/thirdparty/opus-1.5.2/silk/tables_NLSF_CB_NB_MB.c diff --git a/code/opus-1.5.2/silk/tables_NLSF_CB_WB.c b/code/thirdparty/opus-1.5.2/silk/tables_NLSF_CB_WB.c similarity index 100% rename from code/opus-1.5.2/silk/tables_NLSF_CB_WB.c rename to code/thirdparty/opus-1.5.2/silk/tables_NLSF_CB_WB.c diff --git a/code/opus-1.5.2/silk/tables_gain.c b/code/thirdparty/opus-1.5.2/silk/tables_gain.c similarity index 100% rename from code/opus-1.5.2/silk/tables_gain.c rename to code/thirdparty/opus-1.5.2/silk/tables_gain.c diff --git a/code/opus-1.5.2/silk/tables_other.c b/code/thirdparty/opus-1.5.2/silk/tables_other.c similarity index 100% rename from code/opus-1.5.2/silk/tables_other.c rename to code/thirdparty/opus-1.5.2/silk/tables_other.c diff --git a/code/opus-1.5.2/silk/tables_pitch_lag.c b/code/thirdparty/opus-1.5.2/silk/tables_pitch_lag.c similarity index 100% rename from code/opus-1.5.2/silk/tables_pitch_lag.c rename to code/thirdparty/opus-1.5.2/silk/tables_pitch_lag.c diff --git a/code/opus-1.5.2/silk/tables_pulses_per_block.c b/code/thirdparty/opus-1.5.2/silk/tables_pulses_per_block.c similarity index 100% rename from code/opus-1.5.2/silk/tables_pulses_per_block.c rename to code/thirdparty/opus-1.5.2/silk/tables_pulses_per_block.c diff --git a/code/opus-1.5.2/silk/tuning_parameters.h b/code/thirdparty/opus-1.5.2/silk/tuning_parameters.h similarity index 100% rename from code/opus-1.5.2/silk/tuning_parameters.h rename to code/thirdparty/opus-1.5.2/silk/tuning_parameters.h diff --git a/code/opus-1.5.2/silk/typedef.h b/code/thirdparty/opus-1.5.2/silk/typedef.h similarity index 100% rename from code/opus-1.5.2/silk/typedef.h rename to code/thirdparty/opus-1.5.2/silk/typedef.h diff --git a/code/opus-1.5.2/src/analysis.c b/code/thirdparty/opus-1.5.2/src/analysis.c similarity index 100% rename from code/opus-1.5.2/src/analysis.c rename to code/thirdparty/opus-1.5.2/src/analysis.c diff --git a/code/opus-1.5.2/src/analysis.h b/code/thirdparty/opus-1.5.2/src/analysis.h similarity index 100% rename from code/opus-1.5.2/src/analysis.h rename to code/thirdparty/opus-1.5.2/src/analysis.h diff --git a/code/opus-1.5.2/src/extensions.c b/code/thirdparty/opus-1.5.2/src/extensions.c similarity index 100% rename from code/opus-1.5.2/src/extensions.c rename to code/thirdparty/opus-1.5.2/src/extensions.c diff --git a/code/opus-1.5.2/src/mapping_matrix.c b/code/thirdparty/opus-1.5.2/src/mapping_matrix.c similarity index 100% rename from code/opus-1.5.2/src/mapping_matrix.c rename to code/thirdparty/opus-1.5.2/src/mapping_matrix.c diff --git a/code/opus-1.5.2/src/mapping_matrix.h b/code/thirdparty/opus-1.5.2/src/mapping_matrix.h similarity index 100% rename from code/opus-1.5.2/src/mapping_matrix.h rename to code/thirdparty/opus-1.5.2/src/mapping_matrix.h diff --git a/code/opus-1.5.2/src/mlp.c b/code/thirdparty/opus-1.5.2/src/mlp.c similarity index 100% rename from code/opus-1.5.2/src/mlp.c rename to code/thirdparty/opus-1.5.2/src/mlp.c diff --git a/code/opus-1.5.2/src/mlp.h b/code/thirdparty/opus-1.5.2/src/mlp.h similarity index 100% rename from code/opus-1.5.2/src/mlp.h rename to code/thirdparty/opus-1.5.2/src/mlp.h diff --git a/code/opus-1.5.2/src/mlp_data.c b/code/thirdparty/opus-1.5.2/src/mlp_data.c similarity index 100% rename from code/opus-1.5.2/src/mlp_data.c rename to code/thirdparty/opus-1.5.2/src/mlp_data.c diff --git a/code/opus-1.5.2/src/opus.c b/code/thirdparty/opus-1.5.2/src/opus.c similarity index 100% rename from code/opus-1.5.2/src/opus.c rename to code/thirdparty/opus-1.5.2/src/opus.c diff --git a/code/opus-1.5.2/src/opus_decoder.c b/code/thirdparty/opus-1.5.2/src/opus_decoder.c similarity index 100% rename from code/opus-1.5.2/src/opus_decoder.c rename to code/thirdparty/opus-1.5.2/src/opus_decoder.c diff --git a/code/opus-1.5.2/src/opus_encoder.c b/code/thirdparty/opus-1.5.2/src/opus_encoder.c similarity index 100% rename from code/opus-1.5.2/src/opus_encoder.c rename to code/thirdparty/opus-1.5.2/src/opus_encoder.c diff --git a/code/opus-1.5.2/src/opus_multistream.c b/code/thirdparty/opus-1.5.2/src/opus_multistream.c similarity index 100% rename from code/opus-1.5.2/src/opus_multistream.c rename to code/thirdparty/opus-1.5.2/src/opus_multistream.c diff --git a/code/opus-1.5.2/src/opus_multistream_decoder.c b/code/thirdparty/opus-1.5.2/src/opus_multistream_decoder.c similarity index 100% rename from code/opus-1.5.2/src/opus_multistream_decoder.c rename to code/thirdparty/opus-1.5.2/src/opus_multistream_decoder.c diff --git a/code/opus-1.5.2/src/opus_multistream_encoder.c b/code/thirdparty/opus-1.5.2/src/opus_multistream_encoder.c similarity index 100% rename from code/opus-1.5.2/src/opus_multistream_encoder.c rename to code/thirdparty/opus-1.5.2/src/opus_multistream_encoder.c diff --git a/code/opus-1.5.2/src/opus_private.h b/code/thirdparty/opus-1.5.2/src/opus_private.h similarity index 100% rename from code/opus-1.5.2/src/opus_private.h rename to code/thirdparty/opus-1.5.2/src/opus_private.h diff --git a/code/opus-1.5.2/src/opus_projection_decoder.c b/code/thirdparty/opus-1.5.2/src/opus_projection_decoder.c similarity index 100% rename from code/opus-1.5.2/src/opus_projection_decoder.c rename to code/thirdparty/opus-1.5.2/src/opus_projection_decoder.c diff --git a/code/opus-1.5.2/src/opus_projection_encoder.c b/code/thirdparty/opus-1.5.2/src/opus_projection_encoder.c similarity index 100% rename from code/opus-1.5.2/src/opus_projection_encoder.c rename to code/thirdparty/opus-1.5.2/src/opus_projection_encoder.c diff --git a/code/opus-1.5.2/src/repacketizer.c b/code/thirdparty/opus-1.5.2/src/repacketizer.c similarity index 100% rename from code/opus-1.5.2/src/repacketizer.c rename to code/thirdparty/opus-1.5.2/src/repacketizer.c diff --git a/code/opusfile-0.12/include/opusfile.h b/code/thirdparty/opusfile-0.12/include/opusfile.h similarity index 100% rename from code/opusfile-0.12/include/opusfile.h rename to code/thirdparty/opusfile-0.12/include/opusfile.h diff --git a/code/opusfile-0.12/src/http.c b/code/thirdparty/opusfile-0.12/src/http.c similarity index 100% rename from code/opusfile-0.12/src/http.c rename to code/thirdparty/opusfile-0.12/src/http.c diff --git a/code/opusfile-0.12/src/info.c b/code/thirdparty/opusfile-0.12/src/info.c similarity index 100% rename from code/opusfile-0.12/src/info.c rename to code/thirdparty/opusfile-0.12/src/info.c diff --git a/code/opusfile-0.12/src/internal.c b/code/thirdparty/opusfile-0.12/src/internal.c similarity index 100% rename from code/opusfile-0.12/src/internal.c rename to code/thirdparty/opusfile-0.12/src/internal.c diff --git a/code/opusfile-0.12/src/internal.h b/code/thirdparty/opusfile-0.12/src/internal.h similarity index 100% rename from code/opusfile-0.12/src/internal.h rename to code/thirdparty/opusfile-0.12/src/internal.h diff --git a/code/opusfile-0.12/src/opusfile.c b/code/thirdparty/opusfile-0.12/src/opusfile.c similarity index 100% rename from code/opusfile-0.12/src/opusfile.c rename to code/thirdparty/opusfile-0.12/src/opusfile.c diff --git a/code/opusfile-0.12/src/stream.c b/code/thirdparty/opusfile-0.12/src/stream.c similarity index 100% rename from code/opusfile-0.12/src/stream.c rename to code/thirdparty/opusfile-0.12/src/stream.c diff --git a/code/opusfile-0.12/src/wincerts.c b/code/thirdparty/opusfile-0.12/src/wincerts.c similarity index 100% rename from code/opusfile-0.12/src/wincerts.c rename to code/thirdparty/opusfile-0.12/src/wincerts.c diff --git a/code/opusfile-0.12/src/winerrno.h b/code/thirdparty/opusfile-0.12/src/winerrno.h similarity index 100% rename from code/opusfile-0.12/src/winerrno.h rename to code/thirdparty/opusfile-0.12/src/winerrno.h diff --git a/code/recastnavigation/.editorconfig b/code/thirdparty/recastnavigation/.editorconfig similarity index 100% rename from code/recastnavigation/.editorconfig rename to code/thirdparty/recastnavigation/.editorconfig diff --git a/code/recastnavigation/.github/workflows/Build.yaml b/code/thirdparty/recastnavigation/.github/workflows/Build.yaml similarity index 100% rename from code/recastnavigation/.github/workflows/Build.yaml rename to code/thirdparty/recastnavigation/.github/workflows/Build.yaml diff --git a/code/recastnavigation/.github/workflows/Docs.yaml b/code/thirdparty/recastnavigation/.github/workflows/Docs.yaml similarity index 100% rename from code/recastnavigation/.github/workflows/Docs.yaml rename to code/thirdparty/recastnavigation/.github/workflows/Docs.yaml diff --git a/code/recastnavigation/.github/workflows/Tests.yaml b/code/thirdparty/recastnavigation/.github/workflows/Tests.yaml similarity index 100% rename from code/recastnavigation/.github/workflows/Tests.yaml rename to code/thirdparty/recastnavigation/.github/workflows/Tests.yaml diff --git a/code/recastnavigation/.gitignore b/code/thirdparty/recastnavigation/.gitignore similarity index 100% rename from code/recastnavigation/.gitignore rename to code/thirdparty/recastnavigation/.gitignore diff --git a/code/recastnavigation/CHANGELOG.md b/code/thirdparty/recastnavigation/CHANGELOG.md similarity index 100% rename from code/recastnavigation/CHANGELOG.md rename to code/thirdparty/recastnavigation/CHANGELOG.md diff --git a/code/recastnavigation/CMakeLists.txt b/code/thirdparty/recastnavigation/CMakeLists.txt similarity index 100% rename from code/recastnavigation/CMakeLists.txt rename to code/thirdparty/recastnavigation/CMakeLists.txt diff --git a/code/recastnavigation/CODE_OF_CONDUCT.md b/code/thirdparty/recastnavigation/CODE_OF_CONDUCT.md similarity index 100% rename from code/recastnavigation/CODE_OF_CONDUCT.md rename to code/thirdparty/recastnavigation/CODE_OF_CONDUCT.md diff --git a/code/recastnavigation/CONTRIBUTING.md b/code/thirdparty/recastnavigation/CONTRIBUTING.md similarity index 100% rename from code/recastnavigation/CONTRIBUTING.md rename to code/thirdparty/recastnavigation/CONTRIBUTING.md diff --git a/code/recastnavigation/DebugUtils/CMakeLists.txt b/code/thirdparty/recastnavigation/DebugUtils/CMakeLists.txt similarity index 100% rename from code/recastnavigation/DebugUtils/CMakeLists.txt rename to code/thirdparty/recastnavigation/DebugUtils/CMakeLists.txt diff --git a/code/recastnavigation/DebugUtils/Include/DebugDraw.h b/code/thirdparty/recastnavigation/DebugUtils/Include/DebugDraw.h similarity index 100% rename from code/recastnavigation/DebugUtils/Include/DebugDraw.h rename to code/thirdparty/recastnavigation/DebugUtils/Include/DebugDraw.h diff --git a/code/recastnavigation/DebugUtils/Include/DetourDebugDraw.h b/code/thirdparty/recastnavigation/DebugUtils/Include/DetourDebugDraw.h similarity index 100% rename from code/recastnavigation/DebugUtils/Include/DetourDebugDraw.h rename to code/thirdparty/recastnavigation/DebugUtils/Include/DetourDebugDraw.h diff --git a/code/recastnavigation/DebugUtils/Include/RecastDebugDraw.h b/code/thirdparty/recastnavigation/DebugUtils/Include/RecastDebugDraw.h similarity index 100% rename from code/recastnavigation/DebugUtils/Include/RecastDebugDraw.h rename to code/thirdparty/recastnavigation/DebugUtils/Include/RecastDebugDraw.h diff --git a/code/recastnavigation/DebugUtils/Include/RecastDump.h b/code/thirdparty/recastnavigation/DebugUtils/Include/RecastDump.h similarity index 100% rename from code/recastnavigation/DebugUtils/Include/RecastDump.h rename to code/thirdparty/recastnavigation/DebugUtils/Include/RecastDump.h diff --git a/code/recastnavigation/DebugUtils/Source/DebugDraw.cpp b/code/thirdparty/recastnavigation/DebugUtils/Source/DebugDraw.cpp similarity index 100% rename from code/recastnavigation/DebugUtils/Source/DebugDraw.cpp rename to code/thirdparty/recastnavigation/DebugUtils/Source/DebugDraw.cpp diff --git a/code/recastnavigation/DebugUtils/Source/DetourDebugDraw.cpp b/code/thirdparty/recastnavigation/DebugUtils/Source/DetourDebugDraw.cpp similarity index 100% rename from code/recastnavigation/DebugUtils/Source/DetourDebugDraw.cpp rename to code/thirdparty/recastnavigation/DebugUtils/Source/DetourDebugDraw.cpp diff --git a/code/recastnavigation/DebugUtils/Source/RecastDebugDraw.cpp b/code/thirdparty/recastnavigation/DebugUtils/Source/RecastDebugDraw.cpp similarity index 100% rename from code/recastnavigation/DebugUtils/Source/RecastDebugDraw.cpp rename to code/thirdparty/recastnavigation/DebugUtils/Source/RecastDebugDraw.cpp diff --git a/code/recastnavigation/DebugUtils/Source/RecastDump.cpp b/code/thirdparty/recastnavigation/DebugUtils/Source/RecastDump.cpp similarity index 100% rename from code/recastnavigation/DebugUtils/Source/RecastDump.cpp rename to code/thirdparty/recastnavigation/DebugUtils/Source/RecastDump.cpp diff --git a/code/recastnavigation/Detour/CMakeLists.txt b/code/thirdparty/recastnavigation/Detour/CMakeLists.txt similarity index 100% rename from code/recastnavigation/Detour/CMakeLists.txt rename to code/thirdparty/recastnavigation/Detour/CMakeLists.txt diff --git a/code/recastnavigation/Detour/Include/DetourAlloc.h b/code/thirdparty/recastnavigation/Detour/Include/DetourAlloc.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourAlloc.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourAlloc.h diff --git a/code/recastnavigation/Detour/Include/DetourAssert.h b/code/thirdparty/recastnavigation/Detour/Include/DetourAssert.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourAssert.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourAssert.h diff --git a/code/recastnavigation/Detour/Include/DetourCommon.h b/code/thirdparty/recastnavigation/Detour/Include/DetourCommon.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourCommon.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourCommon.h diff --git a/code/recastnavigation/Detour/Include/DetourMath.h b/code/thirdparty/recastnavigation/Detour/Include/DetourMath.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourMath.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourMath.h diff --git a/code/recastnavigation/Detour/Include/DetourNavMesh.h b/code/thirdparty/recastnavigation/Detour/Include/DetourNavMesh.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourNavMesh.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourNavMesh.h diff --git a/code/recastnavigation/Detour/Include/DetourNavMeshBuilder.h b/code/thirdparty/recastnavigation/Detour/Include/DetourNavMeshBuilder.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourNavMeshBuilder.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourNavMeshBuilder.h diff --git a/code/recastnavigation/Detour/Include/DetourNavMeshQuery.h b/code/thirdparty/recastnavigation/Detour/Include/DetourNavMeshQuery.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourNavMeshQuery.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourNavMeshQuery.h diff --git a/code/recastnavigation/Detour/Include/DetourNode.h b/code/thirdparty/recastnavigation/Detour/Include/DetourNode.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourNode.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourNode.h diff --git a/code/recastnavigation/Detour/Include/DetourStatus.h b/code/thirdparty/recastnavigation/Detour/Include/DetourStatus.h similarity index 100% rename from code/recastnavigation/Detour/Include/DetourStatus.h rename to code/thirdparty/recastnavigation/Detour/Include/DetourStatus.h diff --git a/code/recastnavigation/Detour/Source/DetourAlloc.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourAlloc.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourAlloc.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourAlloc.cpp diff --git a/code/recastnavigation/Detour/Source/DetourAssert.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourAssert.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourAssert.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourAssert.cpp diff --git a/code/recastnavigation/Detour/Source/DetourCommon.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourCommon.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourCommon.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourCommon.cpp diff --git a/code/recastnavigation/Detour/Source/DetourNavMesh.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourNavMesh.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourNavMesh.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourNavMesh.cpp diff --git a/code/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp diff --git a/code/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp diff --git a/code/recastnavigation/Detour/Source/DetourNode.cpp b/code/thirdparty/recastnavigation/Detour/Source/DetourNode.cpp similarity index 100% rename from code/recastnavigation/Detour/Source/DetourNode.cpp rename to code/thirdparty/recastnavigation/Detour/Source/DetourNode.cpp diff --git a/code/recastnavigation/DetourCrowd/CMakeLists.txt b/code/thirdparty/recastnavigation/DetourCrowd/CMakeLists.txt similarity index 100% rename from code/recastnavigation/DetourCrowd/CMakeLists.txt rename to code/thirdparty/recastnavigation/DetourCrowd/CMakeLists.txt diff --git a/code/recastnavigation/DetourCrowd/Include/DetourCrowd.h b/code/thirdparty/recastnavigation/DetourCrowd/Include/DetourCrowd.h similarity index 100% rename from code/recastnavigation/DetourCrowd/Include/DetourCrowd.h rename to code/thirdparty/recastnavigation/DetourCrowd/Include/DetourCrowd.h diff --git a/code/recastnavigation/DetourCrowd/Include/DetourLocalBoundary.h b/code/thirdparty/recastnavigation/DetourCrowd/Include/DetourLocalBoundary.h similarity index 100% rename from code/recastnavigation/DetourCrowd/Include/DetourLocalBoundary.h rename to code/thirdparty/recastnavigation/DetourCrowd/Include/DetourLocalBoundary.h diff --git a/code/recastnavigation/DetourCrowd/Include/DetourObstacleAvoidance.h b/code/thirdparty/recastnavigation/DetourCrowd/Include/DetourObstacleAvoidance.h similarity index 100% rename from code/recastnavigation/DetourCrowd/Include/DetourObstacleAvoidance.h rename to code/thirdparty/recastnavigation/DetourCrowd/Include/DetourObstacleAvoidance.h diff --git a/code/recastnavigation/DetourCrowd/Include/DetourPathCorridor.h b/code/thirdparty/recastnavigation/DetourCrowd/Include/DetourPathCorridor.h similarity index 100% rename from code/recastnavigation/DetourCrowd/Include/DetourPathCorridor.h rename to code/thirdparty/recastnavigation/DetourCrowd/Include/DetourPathCorridor.h diff --git a/code/recastnavigation/DetourCrowd/Include/DetourPathQueue.h b/code/thirdparty/recastnavigation/DetourCrowd/Include/DetourPathQueue.h similarity index 100% rename from code/recastnavigation/DetourCrowd/Include/DetourPathQueue.h rename to code/thirdparty/recastnavigation/DetourCrowd/Include/DetourPathQueue.h diff --git a/code/recastnavigation/DetourCrowd/Include/DetourProximityGrid.h b/code/thirdparty/recastnavigation/DetourCrowd/Include/DetourProximityGrid.h similarity index 100% rename from code/recastnavigation/DetourCrowd/Include/DetourProximityGrid.h rename to code/thirdparty/recastnavigation/DetourCrowd/Include/DetourProximityGrid.h diff --git a/code/recastnavigation/DetourCrowd/Source/DetourCrowd.cpp b/code/thirdparty/recastnavigation/DetourCrowd/Source/DetourCrowd.cpp similarity index 100% rename from code/recastnavigation/DetourCrowd/Source/DetourCrowd.cpp rename to code/thirdparty/recastnavigation/DetourCrowd/Source/DetourCrowd.cpp diff --git a/code/recastnavigation/DetourCrowd/Source/DetourLocalBoundary.cpp b/code/thirdparty/recastnavigation/DetourCrowd/Source/DetourLocalBoundary.cpp similarity index 100% rename from code/recastnavigation/DetourCrowd/Source/DetourLocalBoundary.cpp rename to code/thirdparty/recastnavigation/DetourCrowd/Source/DetourLocalBoundary.cpp diff --git a/code/recastnavigation/DetourCrowd/Source/DetourObstacleAvoidance.cpp b/code/thirdparty/recastnavigation/DetourCrowd/Source/DetourObstacleAvoidance.cpp similarity index 100% rename from code/recastnavigation/DetourCrowd/Source/DetourObstacleAvoidance.cpp rename to code/thirdparty/recastnavigation/DetourCrowd/Source/DetourObstacleAvoidance.cpp diff --git a/code/recastnavigation/DetourCrowd/Source/DetourPathCorridor.cpp b/code/thirdparty/recastnavigation/DetourCrowd/Source/DetourPathCorridor.cpp similarity index 100% rename from code/recastnavigation/DetourCrowd/Source/DetourPathCorridor.cpp rename to code/thirdparty/recastnavigation/DetourCrowd/Source/DetourPathCorridor.cpp diff --git a/code/recastnavigation/DetourCrowd/Source/DetourPathQueue.cpp b/code/thirdparty/recastnavigation/DetourCrowd/Source/DetourPathQueue.cpp similarity index 100% rename from code/recastnavigation/DetourCrowd/Source/DetourPathQueue.cpp rename to code/thirdparty/recastnavigation/DetourCrowd/Source/DetourPathQueue.cpp diff --git a/code/recastnavigation/DetourCrowd/Source/DetourProximityGrid.cpp b/code/thirdparty/recastnavigation/DetourCrowd/Source/DetourProximityGrid.cpp similarity index 100% rename from code/recastnavigation/DetourCrowd/Source/DetourProximityGrid.cpp rename to code/thirdparty/recastnavigation/DetourCrowd/Source/DetourProximityGrid.cpp diff --git a/code/recastnavigation/DetourTileCache/CMakeLists.txt b/code/thirdparty/recastnavigation/DetourTileCache/CMakeLists.txt similarity index 100% rename from code/recastnavigation/DetourTileCache/CMakeLists.txt rename to code/thirdparty/recastnavigation/DetourTileCache/CMakeLists.txt diff --git a/code/recastnavigation/DetourTileCache/Include/DetourTileCache.h b/code/thirdparty/recastnavigation/DetourTileCache/Include/DetourTileCache.h similarity index 100% rename from code/recastnavigation/DetourTileCache/Include/DetourTileCache.h rename to code/thirdparty/recastnavigation/DetourTileCache/Include/DetourTileCache.h diff --git a/code/recastnavigation/DetourTileCache/Include/DetourTileCacheBuilder.h b/code/thirdparty/recastnavigation/DetourTileCache/Include/DetourTileCacheBuilder.h similarity index 100% rename from code/recastnavigation/DetourTileCache/Include/DetourTileCacheBuilder.h rename to code/thirdparty/recastnavigation/DetourTileCache/Include/DetourTileCacheBuilder.h diff --git a/code/recastnavigation/DetourTileCache/Source/DetourTileCache.cpp b/code/thirdparty/recastnavigation/DetourTileCache/Source/DetourTileCache.cpp similarity index 100% rename from code/recastnavigation/DetourTileCache/Source/DetourTileCache.cpp rename to code/thirdparty/recastnavigation/DetourTileCache/Source/DetourTileCache.cpp diff --git a/code/recastnavigation/DetourTileCache/Source/DetourTileCacheBuilder.cpp b/code/thirdparty/recastnavigation/DetourTileCache/Source/DetourTileCacheBuilder.cpp similarity index 100% rename from code/recastnavigation/DetourTileCache/Source/DetourTileCacheBuilder.cpp rename to code/thirdparty/recastnavigation/DetourTileCache/Source/DetourTileCacheBuilder.cpp diff --git a/code/recastnavigation/Docs/DoxygenLayout.xml b/code/thirdparty/recastnavigation/Docs/DoxygenLayout.xml similarity index 100% rename from code/recastnavigation/Docs/DoxygenLayout.xml rename to code/thirdparty/recastnavigation/Docs/DoxygenLayout.xml diff --git a/code/recastnavigation/Docs/Extern/Recast_api.txt b/code/thirdparty/recastnavigation/Docs/Extern/Recast_api.txt similarity index 100% rename from code/recastnavigation/Docs/Extern/Recast_api.txt rename to code/thirdparty/recastnavigation/Docs/Extern/Recast_api.txt diff --git a/code/recastnavigation/Docs/Images/screenshot.png b/code/thirdparty/recastnavigation/Docs/Images/screenshot.png similarity index 100% rename from code/recastnavigation/Docs/Images/screenshot.png rename to code/thirdparty/recastnavigation/Docs/Images/screenshot.png diff --git a/code/recastnavigation/Docs/Readme.txt b/code/thirdparty/recastnavigation/Docs/Readme.txt similarity index 100% rename from code/recastnavigation/Docs/Readme.txt rename to code/thirdparty/recastnavigation/Docs/Readme.txt diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/LICENSE b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/LICENSE similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/LICENSE rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/LICENSE diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/README.md b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/README.md similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/README.md rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/README.md diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome.css b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome.css similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome.css rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome.css diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom-alternative.css b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom-alternative.css similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom-alternative.css rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom-alternative.css diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom.css b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom.css similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom.css rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom.css diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/header.html b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/header.html similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/header.html rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/header.html diff --git a/code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/toggle-alternative-theme.js b/code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/toggle-alternative-theme.js similarity index 100% rename from code/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/toggle-alternative-theme.js rename to code/thirdparty/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/toggle-alternative-theme.js diff --git a/code/recastnavigation/Docs/footer.html b/code/thirdparty/recastnavigation/Docs/footer.html similarity index 100% rename from code/recastnavigation/Docs/footer.html rename to code/thirdparty/recastnavigation/Docs/footer.html diff --git a/code/recastnavigation/Docs/header.html b/code/thirdparty/recastnavigation/Docs/header.html similarity index 100% rename from code/recastnavigation/Docs/header.html rename to code/thirdparty/recastnavigation/Docs/header.html diff --git a/code/recastnavigation/Doxyfile b/code/thirdparty/recastnavigation/Doxyfile similarity index 100% rename from code/recastnavigation/Doxyfile rename to code/thirdparty/recastnavigation/Doxyfile diff --git a/code/recastnavigation/License.txt b/code/thirdparty/recastnavigation/License.txt similarity index 100% rename from code/recastnavigation/License.txt rename to code/thirdparty/recastnavigation/License.txt diff --git a/code/recastnavigation/README.md b/code/thirdparty/recastnavigation/README.md similarity index 100% rename from code/recastnavigation/README.md rename to code/thirdparty/recastnavigation/README.md diff --git a/code/recastnavigation/Recast/CMakeLists.txt b/code/thirdparty/recastnavigation/Recast/CMakeLists.txt similarity index 100% rename from code/recastnavigation/Recast/CMakeLists.txt rename to code/thirdparty/recastnavigation/Recast/CMakeLists.txt diff --git a/code/recastnavigation/Recast/Include/Recast.h b/code/thirdparty/recastnavigation/Recast/Include/Recast.h similarity index 100% rename from code/recastnavigation/Recast/Include/Recast.h rename to code/thirdparty/recastnavigation/Recast/Include/Recast.h diff --git a/code/recastnavigation/Recast/Include/RecastAlloc.h b/code/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h similarity index 100% rename from code/recastnavigation/Recast/Include/RecastAlloc.h rename to code/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h diff --git a/code/recastnavigation/Recast/Include/RecastAssert.h b/code/thirdparty/recastnavigation/Recast/Include/RecastAssert.h similarity index 100% rename from code/recastnavigation/Recast/Include/RecastAssert.h rename to code/thirdparty/recastnavigation/Recast/Include/RecastAssert.h diff --git a/code/recastnavigation/Recast/Source/Recast.cpp b/code/thirdparty/recastnavigation/Recast/Source/Recast.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/Recast.cpp rename to code/thirdparty/recastnavigation/Recast/Source/Recast.cpp diff --git a/code/recastnavigation/Recast/Source/RecastAlloc.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastAlloc.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp diff --git a/code/recastnavigation/Recast/Source/RecastArea.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastArea.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastArea.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastArea.cpp diff --git a/code/recastnavigation/Recast/Source/RecastAssert.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastAssert.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastAssert.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastAssert.cpp diff --git a/code/recastnavigation/Recast/Source/RecastContour.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastContour.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp diff --git a/code/recastnavigation/Recast/Source/RecastFilter.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastFilter.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastFilter.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastFilter.cpp diff --git a/code/recastnavigation/Recast/Source/RecastLayers.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastLayers.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastLayers.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastLayers.cpp diff --git a/code/recastnavigation/Recast/Source/RecastMesh.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastMesh.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastMesh.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastMesh.cpp diff --git a/code/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastMeshDetail.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp diff --git a/code/recastnavigation/Recast/Source/RecastRasterization.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastRasterization.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastRasterization.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastRasterization.cpp diff --git a/code/recastnavigation/Recast/Source/RecastRegion.cpp b/code/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp similarity index 100% rename from code/recastnavigation/Recast/Source/RecastRegion.cpp rename to code/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp diff --git a/code/recastnavigation/RecastDemo/Bin/.gitignore b/code/thirdparty/recastnavigation/RecastDemo/Bin/.gitignore similarity index 100% rename from code/recastnavigation/RecastDemo/Bin/.gitignore rename to code/thirdparty/recastnavigation/RecastDemo/Bin/.gitignore diff --git a/code/recastnavigation/RecastDemo/Bin/DroidSans.ttf b/code/thirdparty/recastnavigation/RecastDemo/Bin/DroidSans.ttf similarity index 100% rename from code/recastnavigation/RecastDemo/Bin/DroidSans.ttf rename to code/thirdparty/recastnavigation/RecastDemo/Bin/DroidSans.ttf diff --git a/code/recastnavigation/RecastDemo/Bin/TestCases/movement_test.txt b/code/thirdparty/recastnavigation/RecastDemo/Bin/TestCases/movement_test.txt similarity index 100% rename from code/recastnavigation/RecastDemo/Bin/TestCases/movement_test.txt rename to code/thirdparty/recastnavigation/RecastDemo/Bin/TestCases/movement_test.txt diff --git a/code/recastnavigation/RecastDemo/Bin/TestCases/nav_mesh_test.txt b/code/thirdparty/recastnavigation/RecastDemo/Bin/TestCases/nav_mesh_test.txt similarity index 100% rename from code/recastnavigation/RecastDemo/Bin/TestCases/nav_mesh_test.txt rename to code/thirdparty/recastnavigation/RecastDemo/Bin/TestCases/nav_mesh_test.txt diff --git a/code/recastnavigation/RecastDemo/Bin/TestCases/raycast_test.txt b/code/thirdparty/recastnavigation/RecastDemo/Bin/TestCases/raycast_test.txt similarity index 100% rename from code/recastnavigation/RecastDemo/Bin/TestCases/raycast_test.txt rename to code/thirdparty/recastnavigation/RecastDemo/Bin/TestCases/raycast_test.txt diff --git a/code/recastnavigation/RecastDemo/CMakeLists.txt b/code/thirdparty/recastnavigation/RecastDemo/CMakeLists.txt similarity index 100% rename from code/recastnavigation/RecastDemo/CMakeLists.txt rename to code/thirdparty/recastnavigation/RecastDemo/CMakeLists.txt diff --git a/code/recastnavigation/RecastDemo/Contrib/fastlz/README.TXT b/code/thirdparty/recastnavigation/RecastDemo/Contrib/fastlz/README.TXT similarity index 100% rename from code/recastnavigation/RecastDemo/Contrib/fastlz/README.TXT rename to code/thirdparty/recastnavigation/RecastDemo/Contrib/fastlz/README.TXT diff --git a/code/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.c b/code/thirdparty/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.c similarity index 100% rename from code/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.c rename to code/thirdparty/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.c diff --git a/code/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.h b/code/thirdparty/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.h similarity index 100% rename from code/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.h rename to code/thirdparty/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.h diff --git a/code/recastnavigation/RecastDemo/Contrib/readme-sdl.txt b/code/thirdparty/recastnavigation/RecastDemo/Contrib/readme-sdl.txt similarity index 100% rename from code/recastnavigation/RecastDemo/Contrib/readme-sdl.txt rename to code/thirdparty/recastnavigation/RecastDemo/Contrib/readme-sdl.txt diff --git a/code/recastnavigation/RecastDemo/Contrib/stb_truetype.h b/code/thirdparty/recastnavigation/RecastDemo/Contrib/stb_truetype.h similarity index 100% rename from code/recastnavigation/RecastDemo/Contrib/stb_truetype.h rename to code/thirdparty/recastnavigation/RecastDemo/Contrib/stb_truetype.h diff --git a/code/recastnavigation/RecastDemo/Include/ChunkyTriMesh.h b/code/thirdparty/recastnavigation/RecastDemo/Include/ChunkyTriMesh.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/ChunkyTriMesh.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/ChunkyTriMesh.h diff --git a/code/recastnavigation/RecastDemo/Include/ConvexVolumeTool.h b/code/thirdparty/recastnavigation/RecastDemo/Include/ConvexVolumeTool.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/ConvexVolumeTool.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/ConvexVolumeTool.h diff --git a/code/recastnavigation/RecastDemo/Include/CrowdTool.h b/code/thirdparty/recastnavigation/RecastDemo/Include/CrowdTool.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/CrowdTool.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/CrowdTool.h diff --git a/code/recastnavigation/RecastDemo/Include/Filelist.h b/code/thirdparty/recastnavigation/RecastDemo/Include/Filelist.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/Filelist.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/Filelist.h diff --git a/code/recastnavigation/RecastDemo/Include/InputGeom.h b/code/thirdparty/recastnavigation/RecastDemo/Include/InputGeom.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/InputGeom.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/InputGeom.h diff --git a/code/recastnavigation/RecastDemo/Include/MeshLoaderObj.h b/code/thirdparty/recastnavigation/RecastDemo/Include/MeshLoaderObj.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/MeshLoaderObj.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/MeshLoaderObj.h diff --git a/code/recastnavigation/RecastDemo/Include/NavMeshPruneTool.h b/code/thirdparty/recastnavigation/RecastDemo/Include/NavMeshPruneTool.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/NavMeshPruneTool.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/NavMeshPruneTool.h diff --git a/code/recastnavigation/RecastDemo/Include/NavMeshTesterTool.h b/code/thirdparty/recastnavigation/RecastDemo/Include/NavMeshTesterTool.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/NavMeshTesterTool.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/NavMeshTesterTool.h diff --git a/code/recastnavigation/RecastDemo/Include/OffMeshConnectionTool.h b/code/thirdparty/recastnavigation/RecastDemo/Include/OffMeshConnectionTool.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/OffMeshConnectionTool.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/OffMeshConnectionTool.h diff --git a/code/recastnavigation/RecastDemo/Include/PerfTimer.h b/code/thirdparty/recastnavigation/RecastDemo/Include/PerfTimer.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/PerfTimer.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/PerfTimer.h diff --git a/code/recastnavigation/RecastDemo/Include/Sample.h b/code/thirdparty/recastnavigation/RecastDemo/Include/Sample.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/Sample.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/Sample.h diff --git a/code/recastnavigation/RecastDemo/Include/SampleInterfaces.h b/code/thirdparty/recastnavigation/RecastDemo/Include/SampleInterfaces.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/SampleInterfaces.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/SampleInterfaces.h diff --git a/code/recastnavigation/RecastDemo/Include/Sample_Debug.h b/code/thirdparty/recastnavigation/RecastDemo/Include/Sample_Debug.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/Sample_Debug.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/Sample_Debug.h diff --git a/code/recastnavigation/RecastDemo/Include/Sample_SoloMesh.h b/code/thirdparty/recastnavigation/RecastDemo/Include/Sample_SoloMesh.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/Sample_SoloMesh.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/Sample_SoloMesh.h diff --git a/code/recastnavigation/RecastDemo/Include/Sample_TempObstacles.h b/code/thirdparty/recastnavigation/RecastDemo/Include/Sample_TempObstacles.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/Sample_TempObstacles.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/Sample_TempObstacles.h diff --git a/code/recastnavigation/RecastDemo/Include/Sample_TileMesh.h b/code/thirdparty/recastnavigation/RecastDemo/Include/Sample_TileMesh.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/Sample_TileMesh.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/Sample_TileMesh.h diff --git a/code/recastnavigation/RecastDemo/Include/TestCase.h b/code/thirdparty/recastnavigation/RecastDemo/Include/TestCase.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/TestCase.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/TestCase.h diff --git a/code/recastnavigation/RecastDemo/Include/ValueHistory.h b/code/thirdparty/recastnavigation/RecastDemo/Include/ValueHistory.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/ValueHistory.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/ValueHistory.h diff --git a/code/recastnavigation/RecastDemo/Include/imgui.h b/code/thirdparty/recastnavigation/RecastDemo/Include/imgui.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/imgui.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/imgui.h diff --git a/code/recastnavigation/RecastDemo/Include/imguiRenderGL.h b/code/thirdparty/recastnavigation/RecastDemo/Include/imguiRenderGL.h similarity index 100% rename from code/recastnavigation/RecastDemo/Include/imguiRenderGL.h rename to code/thirdparty/recastnavigation/RecastDemo/Include/imguiRenderGL.h diff --git a/code/recastnavigation/RecastDemo/Source/ChunkyTriMesh.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/ChunkyTriMesh.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/ChunkyTriMesh.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/ChunkyTriMesh.cpp diff --git a/code/recastnavigation/RecastDemo/Source/ConvexVolumeTool.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/ConvexVolumeTool.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/ConvexVolumeTool.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/ConvexVolumeTool.cpp diff --git a/code/recastnavigation/RecastDemo/Source/CrowdTool.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/CrowdTool.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/CrowdTool.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/CrowdTool.cpp diff --git a/code/recastnavigation/RecastDemo/Source/Filelist.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/Filelist.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/Filelist.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/Filelist.cpp diff --git a/code/recastnavigation/RecastDemo/Source/InputGeom.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/InputGeom.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/InputGeom.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/InputGeom.cpp diff --git a/code/recastnavigation/RecastDemo/Source/MeshLoaderObj.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/MeshLoaderObj.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/MeshLoaderObj.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/MeshLoaderObj.cpp diff --git a/code/recastnavigation/RecastDemo/Source/NavMeshPruneTool.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/NavMeshPruneTool.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/NavMeshPruneTool.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/NavMeshPruneTool.cpp diff --git a/code/recastnavigation/RecastDemo/Source/NavMeshTesterTool.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/NavMeshTesterTool.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/NavMeshTesterTool.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/NavMeshTesterTool.cpp diff --git a/code/recastnavigation/RecastDemo/Source/OffMeshConnectionTool.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/OffMeshConnectionTool.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/OffMeshConnectionTool.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/OffMeshConnectionTool.cpp diff --git a/code/recastnavigation/RecastDemo/Source/PerfTimer.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/PerfTimer.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/PerfTimer.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/PerfTimer.cpp diff --git a/code/recastnavigation/RecastDemo/Source/Sample.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/Sample.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/Sample.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/Sample.cpp diff --git a/code/recastnavigation/RecastDemo/Source/SampleInterfaces.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/SampleInterfaces.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/SampleInterfaces.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/SampleInterfaces.cpp diff --git a/code/recastnavigation/RecastDemo/Source/Sample_Debug.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/Sample_Debug.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/Sample_Debug.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/Sample_Debug.cpp diff --git a/code/recastnavigation/RecastDemo/Source/Sample_SoloMesh.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/Sample_SoloMesh.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/Sample_SoloMesh.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/Sample_SoloMesh.cpp diff --git a/code/recastnavigation/RecastDemo/Source/Sample_TempObstacles.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/Sample_TempObstacles.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/Sample_TempObstacles.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/Sample_TempObstacles.cpp diff --git a/code/recastnavigation/RecastDemo/Source/Sample_TileMesh.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/Sample_TileMesh.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/Sample_TileMesh.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/Sample_TileMesh.cpp diff --git a/code/recastnavigation/RecastDemo/Source/TestCase.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/TestCase.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/TestCase.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/TestCase.cpp diff --git a/code/recastnavigation/RecastDemo/Source/ValueHistory.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/ValueHistory.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/ValueHistory.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/ValueHistory.cpp diff --git a/code/recastnavigation/RecastDemo/Source/imgui.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/imgui.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/imgui.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/imgui.cpp diff --git a/code/recastnavigation/RecastDemo/Source/imguiRenderGL.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/imguiRenderGL.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/imguiRenderGL.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/imguiRenderGL.cpp diff --git a/code/recastnavigation/RecastDemo/Source/main.cpp b/code/thirdparty/recastnavigation/RecastDemo/Source/main.cpp similarity index 100% rename from code/recastnavigation/RecastDemo/Source/main.cpp rename to code/thirdparty/recastnavigation/RecastDemo/Source/main.cpp diff --git a/code/recastnavigation/RecastDemo/cmake/FindSDL2.cmake b/code/thirdparty/recastnavigation/RecastDemo/cmake/FindSDL2.cmake similarity index 100% rename from code/recastnavigation/RecastDemo/cmake/FindSDL2.cmake rename to code/thirdparty/recastnavigation/RecastDemo/cmake/FindSDL2.cmake diff --git a/code/recastnavigation/RecastDemo/premake5.lua b/code/thirdparty/recastnavigation/RecastDemo/premake5.lua similarity index 100% rename from code/recastnavigation/RecastDemo/premake5.lua rename to code/thirdparty/recastnavigation/RecastDemo/premake5.lua diff --git a/code/recastnavigation/Roadmap.md b/code/thirdparty/recastnavigation/Roadmap.md similarity index 100% rename from code/recastnavigation/Roadmap.md rename to code/thirdparty/recastnavigation/Roadmap.md diff --git a/code/recastnavigation/Tests/CMakeLists.txt b/code/thirdparty/recastnavigation/Tests/CMakeLists.txt similarity index 100% rename from code/recastnavigation/Tests/CMakeLists.txt rename to code/thirdparty/recastnavigation/Tests/CMakeLists.txt diff --git a/code/recastnavigation/Tests/Contrib/catch2/catch_all.hpp b/code/thirdparty/recastnavigation/Tests/Contrib/catch2/catch_all.hpp similarity index 100% rename from code/recastnavigation/Tests/Contrib/catch2/catch_all.hpp rename to code/thirdparty/recastnavigation/Tests/Contrib/catch2/catch_all.hpp diff --git a/code/recastnavigation/Tests/Contrib/catch2/catch_amalgamated.cpp b/code/thirdparty/recastnavigation/Tests/Contrib/catch2/catch_amalgamated.cpp similarity index 100% rename from code/recastnavigation/Tests/Contrib/catch2/catch_amalgamated.cpp rename to code/thirdparty/recastnavigation/Tests/Contrib/catch2/catch_amalgamated.cpp diff --git a/code/recastnavigation/Tests/Detour/Tests_Detour.cpp b/code/thirdparty/recastnavigation/Tests/Detour/Tests_Detour.cpp similarity index 100% rename from code/recastnavigation/Tests/Detour/Tests_Detour.cpp rename to code/thirdparty/recastnavigation/Tests/Detour/Tests_Detour.cpp diff --git a/code/recastnavigation/Tests/Recast/Tests_Recast.cpp b/code/thirdparty/recastnavigation/Tests/Recast/Tests_Recast.cpp similarity index 100% rename from code/recastnavigation/Tests/Recast/Tests_Recast.cpp rename to code/thirdparty/recastnavigation/Tests/Recast/Tests_Recast.cpp diff --git a/code/recastnavigation/recastnavigation-config.cmake.in b/code/thirdparty/recastnavigation/recastnavigation-config.cmake.in similarity index 100% rename from code/recastnavigation/recastnavigation-config.cmake.in rename to code/thirdparty/recastnavigation/recastnavigation-config.cmake.in diff --git a/code/recastnavigation/recastnavigation.pc.in b/code/thirdparty/recastnavigation/recastnavigation.pc.in similarity index 100% rename from code/recastnavigation/recastnavigation.pc.in rename to code/thirdparty/recastnavigation/recastnavigation.pc.in diff --git a/code/recastnavigation/version.h.in b/code/thirdparty/recastnavigation/version.h.in similarity index 100% rename from code/recastnavigation/version.h.in rename to code/thirdparty/recastnavigation/version.h.in diff --git a/code/zlib-1.3.1/adler32.c b/code/thirdparty/zlib-1.3.1/adler32.c similarity index 100% rename from code/zlib-1.3.1/adler32.c rename to code/thirdparty/zlib-1.3.1/adler32.c diff --git a/code/zlib-1.3.1/compress.c b/code/thirdparty/zlib-1.3.1/compress.c similarity index 100% rename from code/zlib-1.3.1/compress.c rename to code/thirdparty/zlib-1.3.1/compress.c diff --git a/code/zlib-1.3.1/crc32.c b/code/thirdparty/zlib-1.3.1/crc32.c similarity index 100% rename from code/zlib-1.3.1/crc32.c rename to code/thirdparty/zlib-1.3.1/crc32.c diff --git a/code/zlib-1.3.1/crc32.h b/code/thirdparty/zlib-1.3.1/crc32.h similarity index 100% rename from code/zlib-1.3.1/crc32.h rename to code/thirdparty/zlib-1.3.1/crc32.h diff --git a/code/zlib-1.3.1/deflate.c b/code/thirdparty/zlib-1.3.1/deflate.c similarity index 100% rename from code/zlib-1.3.1/deflate.c rename to code/thirdparty/zlib-1.3.1/deflate.c diff --git a/code/zlib-1.3.1/deflate.h b/code/thirdparty/zlib-1.3.1/deflate.h similarity index 100% rename from code/zlib-1.3.1/deflate.h rename to code/thirdparty/zlib-1.3.1/deflate.h diff --git a/code/zlib-1.3.1/gzguts.h b/code/thirdparty/zlib-1.3.1/gzguts.h similarity index 100% rename from code/zlib-1.3.1/gzguts.h rename to code/thirdparty/zlib-1.3.1/gzguts.h diff --git a/code/zlib-1.3.1/infback.c b/code/thirdparty/zlib-1.3.1/infback.c similarity index 100% rename from code/zlib-1.3.1/infback.c rename to code/thirdparty/zlib-1.3.1/infback.c diff --git a/code/zlib-1.3.1/inffast.c b/code/thirdparty/zlib-1.3.1/inffast.c similarity index 100% rename from code/zlib-1.3.1/inffast.c rename to code/thirdparty/zlib-1.3.1/inffast.c diff --git a/code/zlib-1.3.1/inffast.h b/code/thirdparty/zlib-1.3.1/inffast.h similarity index 100% rename from code/zlib-1.3.1/inffast.h rename to code/thirdparty/zlib-1.3.1/inffast.h diff --git a/code/zlib-1.3.1/inffixed.h b/code/thirdparty/zlib-1.3.1/inffixed.h similarity index 100% rename from code/zlib-1.3.1/inffixed.h rename to code/thirdparty/zlib-1.3.1/inffixed.h diff --git a/code/zlib-1.3.1/inflate.c b/code/thirdparty/zlib-1.3.1/inflate.c similarity index 100% rename from code/zlib-1.3.1/inflate.c rename to code/thirdparty/zlib-1.3.1/inflate.c diff --git a/code/zlib-1.3.1/inflate.h b/code/thirdparty/zlib-1.3.1/inflate.h similarity index 100% rename from code/zlib-1.3.1/inflate.h rename to code/thirdparty/zlib-1.3.1/inflate.h diff --git a/code/zlib-1.3.1/inftrees.c b/code/thirdparty/zlib-1.3.1/inftrees.c similarity index 100% rename from code/zlib-1.3.1/inftrees.c rename to code/thirdparty/zlib-1.3.1/inftrees.c diff --git a/code/zlib-1.3.1/inftrees.h b/code/thirdparty/zlib-1.3.1/inftrees.h similarity index 100% rename from code/zlib-1.3.1/inftrees.h rename to code/thirdparty/zlib-1.3.1/inftrees.h diff --git a/code/zlib-1.3.1/trees.c b/code/thirdparty/zlib-1.3.1/trees.c similarity index 100% rename from code/zlib-1.3.1/trees.c rename to code/thirdparty/zlib-1.3.1/trees.c diff --git a/code/zlib-1.3.1/trees.h b/code/thirdparty/zlib-1.3.1/trees.h similarity index 100% rename from code/zlib-1.3.1/trees.h rename to code/thirdparty/zlib-1.3.1/trees.h diff --git a/code/zlib-1.3.1/uncompr.c b/code/thirdparty/zlib-1.3.1/uncompr.c similarity index 100% rename from code/zlib-1.3.1/uncompr.c rename to code/thirdparty/zlib-1.3.1/uncompr.c diff --git a/code/zlib-1.3.1/zconf.h b/code/thirdparty/zlib-1.3.1/zconf.h similarity index 100% rename from code/zlib-1.3.1/zconf.h rename to code/thirdparty/zlib-1.3.1/zconf.h diff --git a/code/zlib-1.3.1/zlib.h b/code/thirdparty/zlib-1.3.1/zlib.h similarity index 100% rename from code/zlib-1.3.1/zlib.h rename to code/thirdparty/zlib-1.3.1/zlib.h diff --git a/code/zlib-1.3.1/zutil.c b/code/thirdparty/zlib-1.3.1/zutil.c similarity index 100% rename from code/zlib-1.3.1/zutil.c rename to code/thirdparty/zlib-1.3.1/zutil.c diff --git a/code/zlib-1.3.1/zutil.h b/code/thirdparty/zlib-1.3.1/zutil.h similarity index 100% rename from code/zlib-1.3.1/zutil.h rename to code/thirdparty/zlib-1.3.1/zutil.h diff --git a/code/zlib-1.3.1/gzclose.c b/code/zlib-1.3.1/gzclose.c deleted file mode 100644 index 48d6a86f..00000000 --- a/code/zlib-1.3.1/gzclose.c +++ /dev/null @@ -1,23 +0,0 @@ -/* gzclose.c -- zlib gzclose() function - * Copyright (C) 2004, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* gzclose() is in a separate file so that it is linked in only if it is used. - That way the other gzclose functions can be used instead to avoid linking in - unneeded compression or decompression routines. */ -int ZEXPORT gzclose(gzFile file) { -#ifndef NO_GZCOMPRESS - gz_statep state; - - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); -#else - return gzclose_r(file); -#endif -} diff --git a/code/zlib-1.3.1/gzlib.c b/code/zlib-1.3.1/gzlib.c deleted file mode 100644 index 983153cc..00000000 --- a/code/zlib-1.3.1/gzlib.c +++ /dev/null @@ -1,582 +0,0 @@ -/* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2024 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -#if defined(_WIN32) && !defined(__BORLANDC__) -# define LSEEK _lseeki64 -#else -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 -# define LSEEK lseek64 -#else -# define LSEEK lseek -#endif -#endif - -#if defined UNDER_CE - -/* Map the Windows error number in ERROR to a locale-dependent error message - string and return a pointer to it. Typically, the values for ERROR come - from GetLastError. - - The string pointed to shall not be modified by the application, but may be - overwritten by a subsequent call to gz_strwinerror - - The gz_strwinerror function does not change the current setting of - GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror(DWORD error) { - static char buf[1024]; - - wchar_t *msgbuf; - DWORD lasterr = GetLastError(); - DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_ALLOCATE_BUFFER, - NULL, - error, - 0, /* Default language */ - (LPVOID)&msgbuf, - 0, - NULL); - if (chars != 0) { - /* If there is an \r\n appended, zap it. */ - if (chars >= 2 - && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { - chars -= 2; - msgbuf[chars] = 0; - } - - if (chars > sizeof (buf) - 1) { - chars = sizeof (buf) - 1; - msgbuf[chars] = 0; - } - - wcstombs(buf, msgbuf, chars + 1); - LocalFree(msgbuf); - } - else { - sprintf(buf, "unknown win32 error (%ld)", error); - } - - SetLastError(lasterr); - return buf; -} - -#endif /* UNDER_CE */ - -/* Reset gzip file state */ -local void gz_reset(gz_statep state) { - state->x.have = 0; /* no output data available */ - if (state->mode == GZ_READ) { /* for reading ... */ - state->eof = 0; /* not at end of file */ - state->past = 0; /* have not read past end yet */ - state->how = LOOK; /* look for gzip header */ - } - else /* for writing ... */ - state->reset = 0; /* no deflateReset pending */ - state->seek = 0; /* no seek request pending */ - gz_error(state, Z_OK, NULL); /* clear error */ - state->x.pos = 0; /* no uncompressed data yet */ - state->strm.avail_in = 0; /* no input data yet */ -} - -/* Open a gzip file either by name or file descriptor. */ -local gzFile gz_open(const void *path, int fd, const char *mode) { - gz_statep state; - z_size_t len; - int oflag; -#ifdef O_CLOEXEC - int cloexec = 0; -#endif -#ifdef O_EXCL - int exclusive = 0; -#endif - - /* check input */ - if (path == NULL) - return NULL; - - /* allocate gzFile structure to return */ - state = (gz_statep)malloc(sizeof(gz_state)); - if (state == NULL) - return NULL; - state->size = 0; /* no buffers allocated yet */ - state->want = GZBUFSIZE; /* requested buffer size */ - state->msg = NULL; /* no error message yet */ - - /* interpret mode */ - state->mode = GZ_NONE; - state->level = Z_DEFAULT_COMPRESSION; - state->strategy = Z_DEFAULT_STRATEGY; - state->direct = 0; - while (*mode) { - if (*mode >= '0' && *mode <= '9') - state->level = *mode - '0'; - else - switch (*mode) { - case 'r': - state->mode = GZ_READ; - break; -#ifndef NO_GZCOMPRESS - case 'w': - state->mode = GZ_WRITE; - break; - case 'a': - state->mode = GZ_APPEND; - break; -#endif - case '+': /* can't read and write at the same time */ - free(state); - return NULL; - case 'b': /* ignore -- will request binary anyway */ - break; -#ifdef O_CLOEXEC - case 'e': - cloexec = 1; - break; -#endif -#ifdef O_EXCL - case 'x': - exclusive = 1; - break; -#endif - case 'f': - state->strategy = Z_FILTERED; - break; - case 'h': - state->strategy = Z_HUFFMAN_ONLY; - break; - case 'R': - state->strategy = Z_RLE; - break; - case 'F': - state->strategy = Z_FIXED; - break; - case 'T': - state->direct = 1; - break; - default: /* could consider as an error, but just ignore */ - ; - } - mode++; - } - - /* must provide an "r", "w", or "a" */ - if (state->mode == GZ_NONE) { - free(state); - return NULL; - } - - /* can't force transparent read */ - if (state->mode == GZ_READ) { - if (state->direct) { - free(state); - return NULL; - } - state->direct = 1; /* for empty file */ - } - - /* save the path name for error messages */ -#ifdef WIDECHAR - if (fd == -2) { - len = wcstombs(NULL, path, 0); - if (len == (z_size_t)-1) - len = 0; - } - else -#endif - len = strlen((const char *)path); - state->path = (char *)malloc(len + 1); - if (state->path == NULL) { - free(state); - return NULL; - } -#ifdef WIDECHAR - if (fd == -2) - if (len) - wcstombs(state->path, path, len + 1); - else - *(state->path) = 0; - else -#endif -#if !defined(NO_snprintf) && !defined(NO_vsnprintf) - (void)snprintf(state->path, len + 1, "%s", (const char *)path); -#else - strcpy(state->path, path); -#endif - - /* compute the flags for open() */ - oflag = -#ifdef O_LARGEFILE - O_LARGEFILE | -#endif -#ifdef O_BINARY - O_BINARY | -#endif -#ifdef O_CLOEXEC - (cloexec ? O_CLOEXEC : 0) | -#endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | -#ifdef O_EXCL - (exclusive ? O_EXCL : 0) | -#endif - (state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))); - - /* open the file with the appropriate flags (or just use fd) */ - state->fd = fd > -1 ? fd : ( -#ifdef WIDECHAR - fd == -2 ? _wopen(path, oflag, 0666) : -#endif - open((const char *)path, oflag, 0666)); - if (state->fd == -1) { - free(state->path); - free(state); - return NULL; - } - if (state->mode == GZ_APPEND) { - LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ - state->mode = GZ_WRITE; /* simplify later checks */ - } - - /* save the current position for rewinding (only if reading) */ - if (state->mode == GZ_READ) { - state->start = LSEEK(state->fd, 0, SEEK_CUR); - if (state->start == -1) state->start = 0; - } - - /* initialize stream */ - gz_reset(state); - - /* return stream */ - return (gzFile)state; -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzopen(const char *path, const char *mode) { - return gz_open(path, -1, mode); -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzopen64(const char *path, const char *mode) { - return gz_open(path, -1, mode); -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzdopen(int fd, const char *mode) { - char *path; /* identifier for error messages */ - gzFile gz; - - if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) - return NULL; -#if !defined(NO_snprintf) && !defined(NO_vsnprintf) - (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); -#else - sprintf(path, "", fd); /* for debugging */ -#endif - gz = gz_open(path, fd, mode); - free(path); - return gz; -} - -/* -- see zlib.h -- */ -#ifdef WIDECHAR -gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) { - return gz_open(path, -2, mode); -} -#endif - -/* -- see zlib.h -- */ -int ZEXPORT gzbuffer(gzFile file, unsigned size) { - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* make sure we haven't already allocated memory */ - if (state->size != 0) - return -1; - - /* check and set requested size */ - if ((size << 1) < size) - return -1; /* need to be able to double it */ - if (size < 8) - size = 8; /* needed to behave well with flushing */ - state->want = size; - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzrewind(gzFile file) { - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* back up and start over */ - if (LSEEK(state->fd, state->start, SEEK_SET) == -1) - return -1; - gz_reset(state); - return 0; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) { - unsigned n; - z_off64_t ret; - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* check that there's no error */ - if (state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - - /* can only seek from start or relative to current position */ - if (whence != SEEK_SET && whence != SEEK_CUR) - return -1; - - /* normalize offset to a SEEK_CUR specification */ - if (whence == SEEK_SET) - offset -= state->x.pos; - else if (state->seek) - offset += state->skip; - state->seek = 0; - - /* if within raw area while reading, just go there */ - if (state->mode == GZ_READ && state->how == COPY && - state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR); - if (ret == -1) - return -1; - state->x.have = 0; - state->eof = 0; - state->past = 0; - state->seek = 0; - gz_error(state, Z_OK, NULL); - state->strm.avail_in = 0; - state->x.pos += offset; - return state->x.pos; - } - - /* calculate skip amount, rewinding if needed for back seek when reading */ - if (offset < 0) { - if (state->mode != GZ_READ) /* writing -- can't go backwards */ - return -1; - offset += state->x.pos; - if (offset < 0) /* before start of file! */ - return -1; - if (gzrewind(file) == -1) /* rewind, then skip to offset */ - return -1; - } - - /* if reading, skip what's in output buffer (one less gzgetc() check) */ - if (state->mode == GZ_READ) { - n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? - (unsigned)offset : state->x.have; - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - offset -= n; - } - - /* request skip (if not zero) */ - if (offset) { - state->seek = 1; - state->skip = offset; - } - return state->x.pos + offset; -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) { - z_off64_t ret; - - ret = gzseek64(file, (z_off64_t)offset, whence); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gztell64(gzFile file) { - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* return position */ - return state->x.pos + (state->seek ? state->skip : 0); -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gztell(gzFile file) { - z_off64_t ret; - - ret = gztell64(file); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gzoffset64(gzFile file) { - z_off64_t offset; - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* compute and return effective offset in file */ - offset = LSEEK(state->fd, 0, SEEK_CUR); - if (offset == -1) - return -1; - if (state->mode == GZ_READ) /* reading */ - offset -= state->strm.avail_in; /* don't count buffered input */ - return offset; -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gzoffset(gzFile file) { - z_off64_t ret; - - ret = gzoffset64(file); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzeof(gzFile file) { - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return 0; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return 0; - - /* return end-of-file state */ - return state->mode == GZ_READ ? state->past : 0; -} - -/* -- see zlib.h -- */ -const char * ZEXPORT gzerror(gzFile file, int *errnum) { - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return NULL; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return NULL; - - /* return error information */ - if (errnum != NULL) - *errnum = state->err; - return state->err == Z_MEM_ERROR ? "out of memory" : - (state->msg == NULL ? "" : state->msg); -} - -/* -- see zlib.h -- */ -void ZEXPORT gzclearerr(gzFile file) { - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return; - - /* clear error and end-of-file */ - if (state->mode == GZ_READ) { - state->eof = 0; - state->past = 0; - } - gz_error(state, Z_OK, NULL); -} - -/* Create an error message in allocated memory and set state->err and - state->msg accordingly. Free any previous error message already there. Do - not try to free or allocate space if the error is Z_MEM_ERROR (out of - memory). Simply save the error message as a static string. If there is an - allocation failure constructing the error message, then convert the error to - out of memory. */ -void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) { - /* free previously allocated message and clear */ - if (state->msg != NULL) { - if (state->err != Z_MEM_ERROR) - free(state->msg); - state->msg = NULL; - } - - /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ - if (err != Z_OK && err != Z_BUF_ERROR) - state->x.have = 0; - - /* set error code, and if no message, then done */ - state->err = err; - if (msg == NULL) - return; - - /* for an out of memory error, return literal string when requested */ - if (err == Z_MEM_ERROR) - return; - - /* construct error message with path */ - if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == - NULL) { - state->err = Z_MEM_ERROR; - return; - } -#if !defined(NO_snprintf) && !defined(NO_vsnprintf) - (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, - "%s%s%s", state->path, ": ", msg); -#else - strcpy(state->msg, state->path); - strcat(state->msg, ": "); - strcat(state->msg, msg); -#endif -} - -/* portably return maximum value for an int (when limits.h presumed not - available) -- we need to do this to cover cases where 2's complement not - used, since C standard permits 1's complement and sign-bit representations, - otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax(void) { -#ifdef INT_MAX - return INT_MAX; -#else - unsigned p = 1, q; - do { - q = p; - p <<= 1; - p++; - } while (p > q); - return q >> 1; -#endif -} diff --git a/code/zlib-1.3.1/gzread.c b/code/zlib-1.3.1/gzread.c deleted file mode 100644 index 4168cbc8..00000000 --- a/code/zlib-1.3.1/gzread.c +++ /dev/null @@ -1,602 +0,0 @@ -/* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004-2017 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from - state->fd, and update state->eof, state->err, and state->msg as appropriate. - This function needs to loop on read(), since read() is not guaranteed to - read the number of bytes requested, depending on the type of descriptor. */ -local int gz_load(gz_statep state, unsigned char *buf, unsigned len, - unsigned *have) { - int ret; - unsigned get, max = ((unsigned)-1 >> 2) + 1; - - *have = 0; - do { - get = len - *have; - if (get > max) - get = max; - ret = read(state->fd, buf + *have, get); - if (ret <= 0) - break; - *have += (unsigned)ret; - } while (*have < len); - if (ret < 0) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - if (ret == 0) - state->eof = 1; - return 0; -} - -/* Load up input buffer and set eof flag if last data loaded -- return -1 on - error, 0 otherwise. Note that the eof flag is set when the end of the input - file is reached, even though there may be unused data in the buffer. Once - that data has been used, no more attempts will be made to read the file. - If strm->avail_in != 0, then the current data is moved to the beginning of - the input buffer, and then the remainder of the buffer is loaded with the - available data from the input file. */ -local int gz_avail(gz_statep state) { - unsigned got; - z_streamp strm = &(state->strm); - - if (state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - if (state->eof == 0) { - if (strm->avail_in) { /* copy what's there to the start */ - unsigned char *p = state->in; - unsigned const char *q = strm->next_in; - unsigned n = strm->avail_in; - do { - *p++ = *q++; - } while (--n); - } - if (gz_load(state, state->in + strm->avail_in, - state->size - strm->avail_in, &got) == -1) - return -1; - strm->avail_in += got; - strm->next_in = state->in; - } - return 0; -} - -/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. - If this is the first time in, allocate required memory. state->how will be - left unchanged if there is no more input data available, will be set to COPY - if there is no gzip header and direct copying will be performed, or it will - be set to GZIP for decompression. If direct copying, then leftover input - data from the input buffer will be copied to the output buffer. In that - case, all further file reads will be directly to either the output buffer or - a user buffer. If decompressing, the inflate state will be initialized. - gz_look() will return 0 on success or -1 on failure. */ -local int gz_look(gz_statep state) { - z_streamp strm = &(state->strm); - - /* allocate read buffers and inflate memory */ - if (state->size == 0) { - /* allocate buffers */ - state->in = (unsigned char *)malloc(state->want); - state->out = (unsigned char *)malloc(state->want << 1); - if (state->in == NULL || state->out == NULL) { - free(state->out); - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - state->size = state->want; - - /* allocate inflate memory */ - state->strm.zalloc = Z_NULL; - state->strm.zfree = Z_NULL; - state->strm.opaque = Z_NULL; - state->strm.avail_in = 0; - state->strm.next_in = Z_NULL; - if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ - free(state->out); - free(state->in); - state->size = 0; - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - } - - /* get at least the magic bytes in the input buffer */ - if (strm->avail_in < 2) { - if (gz_avail(state) == -1) - return -1; - if (strm->avail_in == 0) - return 0; - } - - /* look for gzip magic bytes -- if there, do gzip decoding (note: there is - a logical dilemma here when considering the case of a partially written - gzip file, to wit, if a single 31 byte is written, then we cannot tell - whether this is a single-byte file, or just a partially written gzip - file -- for here we assume that if a gzip file is being written, then - the header will be written in a single operation, so that reading a - single byte is sufficient indication that it is not a gzip file) */ - if (strm->avail_in > 1 && - strm->next_in[0] == 31 && strm->next_in[1] == 139) { - inflateReset(strm); - state->how = GZIP; - state->direct = 0; - return 0; - } - - /* no gzip header -- if we were decoding gzip before, then this is trailing - garbage. Ignore the trailing garbage and finish. */ - if (state->direct == 0) { - strm->avail_in = 0; - state->eof = 1; - state->x.have = 0; - return 0; - } - - /* doing raw i/o, copy any leftover input to output -- this assumes that - the output buffer is larger than the input buffer, which also assures - space for gzungetc() */ - state->x.next = state->out; - memcpy(state->x.next, strm->next_in, strm->avail_in); - state->x.have = strm->avail_in; - strm->avail_in = 0; - state->how = COPY; - state->direct = 1; - return 0; -} - -/* Decompress from input to the provided next_out and avail_out in the state. - On return, state->x.have and state->x.next point to the just decompressed - data. If the gzip stream completes, state->how is reset to LOOK to look for - the next gzip stream or raw data, once state->x.have is depleted. Returns 0 - on success, -1 on failure. */ -local int gz_decomp(gz_statep state) { - int ret = Z_OK; - unsigned had; - z_streamp strm = &(state->strm); - - /* fill output buffer up to end of deflate stream */ - had = strm->avail_out; - do { - /* get more input for inflate() */ - if (strm->avail_in == 0 && gz_avail(state) == -1) - return -1; - if (strm->avail_in == 0) { - gz_error(state, Z_BUF_ERROR, "unexpected end of file"); - break; - } - - /* decompress and handle errors */ - ret = inflate(strm, Z_NO_FLUSH); - if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { - gz_error(state, Z_STREAM_ERROR, - "internal error: inflate stream corrupt"); - return -1; - } - if (ret == Z_MEM_ERROR) { - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ - gz_error(state, Z_DATA_ERROR, - strm->msg == NULL ? "compressed data error" : strm->msg); - return -1; - } - } while (strm->avail_out && ret != Z_STREAM_END); - - /* update available output */ - state->x.have = had - strm->avail_out; - state->x.next = strm->next_out - state->x.have; - - /* if the gzip stream completed successfully, look for another */ - if (ret == Z_STREAM_END) - state->how = LOOK; - - /* good decompression */ - return 0; -} - -/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. - Data is either copied from the input file or decompressed from the input - file depending on state->how. If state->how is LOOK, then a gzip header is - looked for to determine whether to copy or decompress. Returns -1 on error, - otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the - end of the input file has been reached and all data has been processed. */ -local int gz_fetch(gz_statep state) { - z_streamp strm = &(state->strm); - - do { - switch(state->how) { - case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ - if (gz_look(state) == -1) - return -1; - if (state->how == LOOK) - return 0; - break; - case COPY: /* -> COPY */ - if (gz_load(state, state->out, state->size << 1, &(state->x.have)) - == -1) - return -1; - state->x.next = state->out; - return 0; - case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ - strm->avail_out = state->size << 1; - strm->next_out = state->out; - if (gz_decomp(state) == -1) - return -1; - } - } while (state->x.have == 0 && (!state->eof || strm->avail_in)); - return 0; -} - -/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ -local int gz_skip(gz_statep state, z_off64_t len) { - unsigned n; - - /* skip over len bytes or reach end-of-file, whichever comes first */ - while (len) - /* skip over whatever is in output buffer */ - if (state->x.have) { - n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? - (unsigned)len : state->x.have; - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - len -= n; - } - - /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && state->strm.avail_in == 0) - break; - - /* need more data to skip -- load up output buffer */ - else { - /* get more output, looking for header if required */ - if (gz_fetch(state) == -1) - return -1; - } - return 0; -} - -/* Read len bytes into buf from file, or less than len up to the end of the - input. Return the number of bytes read. If zero is returned, either the - end of file was reached, or there was an error. state->err must be - consulted in that case to determine which. */ -local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) { - z_size_t got; - unsigned n; - - /* if len is zero, avoid unnecessary operations */ - if (len == 0) - return 0; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return 0; - } - - /* get len bytes to buf, or less than len if at the end */ - got = 0; - do { - /* set n to the maximum amount of len that fits in an unsigned int */ - n = (unsigned)-1; - if (n > len) - n = (unsigned)len; - - /* first just try copying data from the output buffer */ - if (state->x.have) { - if (state->x.have < n) - n = state->x.have; - memcpy(buf, state->x.next, n); - state->x.next += n; - state->x.have -= n; - } - - /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && state->strm.avail_in == 0) { - state->past = 1; /* tried to read past end */ - break; - } - - /* need output data -- for small len or new stream load up our output - buffer */ - else if (state->how == LOOK || n < (state->size << 1)) { - /* get more output, looking for header if required */ - if (gz_fetch(state) == -1) - return 0; - continue; /* no progress yet -- go back to copy above */ - /* the copy above assures that we will leave with space in the - output buffer, allowing at least one gzungetc() to succeed */ - } - - /* large len -- read directly into user buffer */ - else if (state->how == COPY) { /* read directly */ - if (gz_load(state, (unsigned char *)buf, n, &n) == -1) - return 0; - } - - /* large len -- decompress directly into user buffer */ - else { /* state->how == GZIP */ - state->strm.avail_out = n; - state->strm.next_out = (unsigned char *)buf; - if (gz_decomp(state) == -1) - return 0; - n = state->x.have; - state->x.have = 0; - } - - /* update progress */ - len -= n; - buf = (char *)buf + n; - got += n; - state->x.pos += n; - } while (len); - - /* return number of bytes read into user buffer */ - return got; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) { - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids a flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); - return -1; - } - - /* read len or fewer bytes to buf */ - len = (unsigned)gz_read(state, buf, len); - - /* check for an error */ - if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - - /* return the number of bytes read (this is assured to fit in an int) */ - return (int)len; -} - -/* -- see zlib.h -- */ -z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) { - z_size_t len; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return 0; - - /* compute bytes to read -- error on overflow */ - len = nitems * size; - if (size && len / size != nitems) { - gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); - return 0; - } - - /* read len or fewer bytes to buf, return the number of full items read */ - return len ? gz_read(state, buf, len) / size : 0; -} - -/* -- see zlib.h -- */ -#ifdef Z_PREFIX_SET -# undef z_gzgetc -#else -# undef gzgetc -#endif -int ZEXPORT gzgetc(gzFile file) { - unsigned char buf[1]; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* try output buffer (no need to check for skip request) */ - if (state->x.have) { - state->x.have--; - state->x.pos++; - return *(state->x.next)++; - } - - /* nothing there -- try gz_read() */ - return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; -} - -int ZEXPORT gzgetc_(gzFile file) { - return gzgetc(file); -} - -/* -- see zlib.h -- */ -int ZEXPORT gzungetc(int c, gzFile file) { - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* in case this was just opened, set up the input buffer */ - if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) - (void)gz_look(state); - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return -1; - } - - /* can't push EOF */ - if (c < 0) - return -1; - - /* if output buffer empty, put byte at end (allows more pushing) */ - if (state->x.have == 0) { - state->x.have = 1; - state->x.next = state->out + (state->size << 1) - 1; - state->x.next[0] = (unsigned char)c; - state->x.pos--; - state->past = 0; - return c; - } - - /* if no room, give up (must have already done a gzungetc()) */ - if (state->x.have == (state->size << 1)) { - gz_error(state, Z_DATA_ERROR, "out of room to push characters"); - return -1; - } - - /* slide output data if needed and insert byte before existing data */ - if (state->x.next == state->out) { - unsigned char *src = state->out + state->x.have; - unsigned char *dest = state->out + (state->size << 1); - while (src > state->out) - *--dest = *--src; - state->x.next = dest; - } - state->x.have++; - state->x.next--; - state->x.next[0] = (unsigned char)c; - state->x.pos--; - state->past = 0; - return c; -} - -/* -- see zlib.h -- */ -char * ZEXPORT gzgets(gzFile file, char *buf, int len) { - unsigned left, n; - char *str; - unsigned char *eol; - gz_statep state; - - /* check parameters and get internal structure */ - if (file == NULL || buf == NULL || len < 1) - return NULL; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return NULL; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return NULL; - } - - /* copy output bytes up to new line or len - 1, whichever comes first -- - append a terminating zero to the string (we don't check for a zero in - the contents, let the user worry about that) */ - str = buf; - left = (unsigned)len - 1; - if (left) do { - /* assure that something is in the output buffer */ - if (state->x.have == 0 && gz_fetch(state) == -1) - return NULL; /* error */ - if (state->x.have == 0) { /* end of file */ - state->past = 1; /* read past end */ - break; /* return what we have */ - } - - /* look for end-of-line in current output buffer */ - n = state->x.have > left ? left : state->x.have; - eol = (unsigned char *)memchr(state->x.next, '\n', n); - if (eol != NULL) - n = (unsigned)(eol - state->x.next) + 1; - - /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->x.next, n); - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - left -= n; - buf += n; - } while (left && eol == NULL); - - /* return terminated string, or if nothing, end of file */ - if (buf == str) - return NULL; - buf[0] = 0; - return str; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzdirect(gzFile file) { - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - - /* if the state is not known, but we can find out, then do so (this is - mainly for right after a gzopen() or gzdopen()) */ - if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) - (void)gz_look(state); - - /* return 1 if transparent, 0 if processing a gzip stream */ - return state->direct; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzclose_r(gzFile file) { - int ret, err; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're reading */ - if (state->mode != GZ_READ) - return Z_STREAM_ERROR; - - /* free memory and close file */ - if (state->size) { - inflateEnd(&(state->strm)); - free(state->out); - free(state->in); - } - err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; - gz_error(state, Z_OK, NULL); - free(state->path); - ret = close(state->fd); - free(state); - return ret ? Z_ERRNO : err; -} diff --git a/code/zlib-1.3.1/gzwrite.c b/code/zlib-1.3.1/gzwrite.c deleted file mode 100644 index 435b4621..00000000 --- a/code/zlib-1.3.1/gzwrite.c +++ /dev/null @@ -1,631 +0,0 @@ -/* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004-2019 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* Initialize state for writing a gzip file. Mark initialization by setting - state->size to non-zero. Return -1 on a memory allocation failure, or 0 on - success. */ -local int gz_init(gz_statep state) { - int ret; - z_streamp strm = &(state->strm); - - /* allocate input buffer (double size for gzprintf) */ - state->in = (unsigned char *)malloc(state->want << 1); - if (state->in == NULL) { - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - - /* only need output buffer and deflate state if compressing */ - if (!state->direct) { - /* allocate output buffer */ - state->out = (unsigned char *)malloc(state->want); - if (state->out == NULL) { - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - - /* allocate deflate memory, set up for gzip compression */ - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit2(strm, state->level, Z_DEFLATED, - MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); - if (ret != Z_OK) { - free(state->out); - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - strm->next_in = NULL; - } - - /* mark state as initialized */ - state->size = state->want; - - /* initialize write buffer if compressing */ - if (!state->direct) { - strm->avail_out = state->size; - strm->next_out = state->out; - state->x.next = strm->next_out; - } - return 0; -} - -/* Compress whatever is at avail_in and next_in and write to the output file. - Return -1 if there is an error writing to the output file or if gz_init() - fails to allocate memory, otherwise 0. flush is assumed to be a valid - deflate() flush value. If flush is Z_FINISH, then the deflate() state is - reset to start a new gzip stream. If gz->direct is true, then simply write - to the output file without compressing, and ignore flush. */ -local int gz_comp(gz_statep state, int flush) { - int ret, writ; - unsigned have, put, max = ((unsigned)-1 >> 2) + 1; - z_streamp strm = &(state->strm); - - /* allocate memory if this is the first time through */ - if (state->size == 0 && gz_init(state) == -1) - return -1; - - /* write directly if requested */ - if (state->direct) { - while (strm->avail_in) { - put = strm->avail_in > max ? max : strm->avail_in; - writ = write(state->fd, strm->next_in, put); - if (writ < 0) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - strm->avail_in -= (unsigned)writ; - strm->next_in += writ; - } - return 0; - } - - /* check for a pending reset */ - if (state->reset) { - /* don't start a new gzip member unless there is data to write */ - if (strm->avail_in == 0) - return 0; - deflateReset(strm); - state->reset = 0; - } - - /* run deflate() on provided input until it produces no more output */ - ret = Z_OK; - do { - /* write out current buffer contents if full, or if flushing, but if - doing Z_FINISH then don't write until we get to Z_STREAM_END */ - if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && - (flush != Z_FINISH || ret == Z_STREAM_END))) { - while (strm->next_out > state->x.next) { - put = strm->next_out - state->x.next > (int)max ? max : - (unsigned)(strm->next_out - state->x.next); - writ = write(state->fd, state->x.next, put); - if (writ < 0) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - state->x.next += writ; - } - if (strm->avail_out == 0) { - strm->avail_out = state->size; - strm->next_out = state->out; - state->x.next = state->out; - } - } - - /* compress */ - have = strm->avail_out; - ret = deflate(strm, flush); - if (ret == Z_STREAM_ERROR) { - gz_error(state, Z_STREAM_ERROR, - "internal error: deflate stream corrupt"); - return -1; - } - have -= strm->avail_out; - } while (have); - - /* if that completed a deflate stream, allow another to start */ - if (flush == Z_FINISH) - state->reset = 1; - - /* all done, no errors */ - return 0; -} - -/* Compress len zeros to output. Return -1 on a write error or memory - allocation failure by gz_comp(), or 0 on success. */ -local int gz_zero(gz_statep state, z_off64_t len) { - int first; - unsigned n; - z_streamp strm = &(state->strm); - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return -1; - - /* compress len zeros (len guaranteed > 0) */ - first = 1; - while (len) { - n = GT_OFF(state->size) || (z_off64_t)state->size > len ? - (unsigned)len : state->size; - if (first) { - memset(state->in, 0, n); - first = 0; - } - strm->avail_in = n; - strm->next_in = state->in; - state->x.pos += n; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return -1; - len -= n; - } - return 0; -} - -/* Write len bytes from buf to file. Return the number of bytes written. If - the returned value is less than len, then there was an error. */ -local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) { - z_size_t put = len; - - /* if len is zero, avoid unnecessary operations */ - if (len == 0) - return 0; - - /* allocate memory if this is the first time through */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* for small len, copy to input buffer, otherwise compress directly */ - if (len < state->size) { - /* copy to input buffer, compress when full */ - do { - unsigned have, copy; - - if (state->strm.avail_in == 0) - state->strm.next_in = state->in; - have = (unsigned)((state->strm.next_in + state->strm.avail_in) - - state->in); - copy = state->size - have; - if (copy > len) - copy = (unsigned)len; - memcpy(state->in + have, buf, copy); - state->strm.avail_in += copy; - state->x.pos += copy; - buf = (const char *)buf + copy; - len -= copy; - if (len && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - } while (len); - } - else { - /* consume whatever's left in the input buffer */ - if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* directly compress user buffer to file */ - state->strm.next_in = (z_const Bytef *)buf; - do { - unsigned n = (unsigned)-1; - if (n > len) - n = (unsigned)len; - state->strm.avail_in = n; - state->x.pos += n; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - len -= n; - } while (len); - } - - /* input was all buffered or compressed */ - return put; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) { - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids a flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return 0; - } - - /* write len bytes from buf (the return value will fit in an int) */ - return (int)gz_write(state, buf, len); -} - -/* -- see zlib.h -- */ -z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems, - gzFile file) { - z_size_t len; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* compute bytes to read -- error on overflow */ - len = nitems * size; - if (size && len / size != nitems) { - gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); - return 0; - } - - /* write len bytes to buf, return the number of full items written */ - return len ? gz_write(state, buf, len) / size : 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzputc(gzFile file, int c) { - unsigned have; - unsigned char buf[1]; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return -1; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* try writing to input buffer for speed (state->size == 0 if buffer not - initialized) */ - if (state->size) { - if (strm->avail_in == 0) - strm->next_in = state->in; - have = (unsigned)((strm->next_in + strm->avail_in) - state->in); - if (have < state->size) { - state->in[have] = (unsigned char)c; - strm->avail_in++; - state->x.pos++; - return c & 0xff; - } - } - - /* no room in buffer or not initialized, use gz_write() */ - buf[0] = (unsigned char)c; - if (gz_write(state, buf, 1) != 1) - return -1; - return c & 0xff; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzputs(gzFile file, const char *s) { - z_size_t len, put; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return -1; - - /* write string */ - len = strlen(s); - if ((int)len < 0 || (unsigned)len != len) { - gz_error(state, Z_STREAM_ERROR, "string length does not fit in int"); - return -1; - } - put = gz_write(state, s, len); - return put < len ? -1 : (int)len; -} - -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -#include - -/* -- see zlib.h -- */ -int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { - int len; - unsigned left; - char *next; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return state->err; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return state->err; - } - - /* do the printf() into the input buffer, put length in len -- the input - buffer is double-sized just for this function, so there is guaranteed to - be state->size bytes available after the current contents */ - if (strm->avail_in == 0) - strm->next_in = state->in; - next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); - next[state->size - 1] = 0; -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(next, format, va); - for (len = 0; len < state->size; len++) - if (next[len] == 0) break; -# else - len = vsprintf(next, format, va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(next, state->size, format, va); - len = strlen(next); -# else - len = vsnprintf(next, state->size, format, va); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) - return 0; - - /* update buffer and position, compress first half if past that */ - strm->avail_in += (unsigned)len; - state->x.pos += len; - if (strm->avail_in >= state->size) { - left = strm->avail_in - state->size; - strm->avail_in = state->size; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return state->err; - memmove(state->in, state->in + state->size, left); - strm->next_in = state->in; - strm->avail_in = left; - } - return len; -} - -int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) { - va_list va; - int ret; - - va_start(va, format); - ret = gzvprintf(file, format, va); - va_end(va); - return ret; -} - -#else /* !STDC && !Z_HAVE_STDARG_H */ - -/* -- see zlib.h -- */ -int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3, - int a4, int a5, int a6, int a7, int a8, int a9, int a10, - int a11, int a12, int a13, int a14, int a15, int a16, - int a17, int a18, int a19, int a20) { - unsigned len, left; - char *next; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that can really pass pointer in ints */ - if (sizeof(int) != sizeof(void *)) - return Z_STREAM_ERROR; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return state->error; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return state->error; - } - - /* do the printf() into the input buffer, put length in len -- the input - buffer is double-sized just for this function, so there is guaranteed to - be state->size bytes available after the current contents */ - if (strm->avail_in == 0) - strm->next_in = state->in; - next = (char *)(strm->next_in + strm->avail_in); - next[state->size - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, - a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < size; len++) - if (next[len] == 0) - break; -# else - len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, - a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(next); -# else - len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len == 0 || len >= state->size || next[state->size - 1] != 0) - return 0; - - /* update buffer and position, compress first half if past that */ - strm->avail_in += len; - state->x.pos += len; - if (strm->avail_in >= state->size) { - left = strm->avail_in - state->size; - strm->avail_in = state->size; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return state->err; - memmove(state->in, state->in + state->size, left); - strm->next_in = state->in; - strm->avail_in = left; - } - return (int)len; -} - -#endif - -/* -- see zlib.h -- */ -int ZEXPORT gzflush(gzFile file, int flush) { - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* check flush parameter */ - if (flush < 0 || flush > Z_FINISH) - return Z_STREAM_ERROR; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return state->err; - } - - /* compress remaining data with requested flush */ - (void)gz_comp(state, flush); - return state->err; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzsetparams(gzFile file, int level, int strategy) { - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct) - return Z_STREAM_ERROR; - - /* if no change is requested, then do nothing */ - if (level == state->level && strategy == state->strategy) - return Z_OK; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return state->err; - } - - /* change compression parameters for subsequent input */ - if (state->size) { - /* flush previous input with previous parameters before changing */ - if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) - return state->err; - deflateParams(strm, level, strategy); - } - state->level = level; - state->strategy = strategy; - return Z_OK; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzclose_w(gzFile file) { - int ret = Z_OK; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're writing */ - if (state->mode != GZ_WRITE) - return Z_STREAM_ERROR; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - ret = state->err; - } - - /* flush, free memory, and close file */ - if (gz_comp(state, Z_FINISH) == -1) - ret = state->err; - if (state->size) { - if (!state->direct) { - (void)deflateEnd(&(state->strm)); - free(state->out); - } - free(state->in); - } - gz_error(state, Z_OK, NULL); - free(state->path); - if (close(state->fd) == -1) - ret = Z_ERRNO; - free(state); - return ret; -} diff --git a/misc/update-libs.sh b/misc/update-libs.sh index 5485face..6519bfa2 100755 --- a/misc/update-libs.sh +++ b/misc/update-libs.sh @@ -7,7 +7,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" . ${SCRIPT_DIR}/lib-versions.sh ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" -CODE="${ROOT}/code" +CODE="${ROOT}/code/thirdparty" prepare() {