Merge pull request #87256 from akien-mga/3.x-cherrypicks
Cherry-picks for the 3.x branch (future 3.6) - 16th batch
This commit is contained in:
commit
93ac21cf8b
57 changed files with 2246 additions and 3632 deletions
|
@ -408,7 +408,7 @@ License: Expat
|
||||||
|
|
||||||
Files: ./thirdparty/zlib/
|
Files: ./thirdparty/zlib/
|
||||||
Comment: zlib
|
Comment: zlib
|
||||||
Copyright: 1995-2022, Jean-loup Gailly and Mark Adler
|
Copyright: 1995-2023, Jean-loup Gailly and Mark Adler
|
||||||
License: Zlib
|
License: Zlib
|
||||||
|
|
||||||
Files: ./thirdparty/zstd/
|
Files: ./thirdparty/zstd/
|
||||||
|
|
463
DONORS.md
463
DONORS.md
|
@ -10,363 +10,349 @@ used, are described on [Godot's website](https://godotengine.org/donate).
|
||||||
The following is a list of the current monthly donors, who will have their
|
The following is a list of the current monthly donors, who will have their
|
||||||
generous deed immortalized in the next stable release of Godot Engine.
|
generous deed immortalized in the next stable release of Godot Engine.
|
||||||
|
|
||||||
|
## Patrons
|
||||||
|
|
||||||
|
OSS Capital <https://oss.capital>
|
||||||
|
Re-Logic <https://re-logic.com>
|
||||||
|
|
||||||
## Platinum sponsors
|
## Platinum sponsors
|
||||||
|
|
||||||
Gamblify <https://www.gamblify.com>
|
|
||||||
Heroic Labs <https://heroiclabs.com>
|
Heroic Labs <https://heroiclabs.com>
|
||||||
Spiffcode <http://spiffcode.com>
|
Ramatak <https://ramatak.com>
|
||||||
|
W4 Games <https://w4games.com>
|
||||||
|
|
||||||
## Gold sponsors
|
## Gold sponsors
|
||||||
|
|
||||||
None currently, become one! <https://godotengine.org/donate>
|
Mega Crit <https://www.megacrit.com>
|
||||||
|
Prehensile Tales <https://prehensile-tales.com>
|
||||||
|
Robot Gentleman <http://robotgentleman.com>
|
||||||
|
|
||||||
## Silver sponsors
|
## Silver sponsors
|
||||||
|
|
||||||
Affray Interactive <https://scp.games/pandemic>
|
Affray Interactive <https://scp.games/pandemic>
|
||||||
|
Broken Rules <https://brokenrul.es>
|
||||||
|
Chasing Carrots <https://www.chasing-carrots.com>
|
||||||
Delton Ding
|
Delton Ding
|
||||||
|
Gamblify <https://www.gamblify.com>
|
||||||
|
Null <https://null.com>
|
||||||
|
Orbital Knight <https://www.orbitalknight.com>
|
||||||
Playful Studios <https://playfulstudios.com>
|
Playful Studios <https://playfulstudios.com>
|
||||||
Robot Gentleman <http://robotgentleman.com>
|
|
||||||
|
|
||||||
## Bronze sponsors
|
## Diamond members
|
||||||
|
|
||||||
|
Sylv <https://rankith.itch.io/unnamed-space-idle-prototype>
|
||||||
|
And 4 anonymous donors
|
||||||
|
|
||||||
|
## Titanium members
|
||||||
|
|
||||||
Basically Games
|
Basically Games
|
||||||
Bippinbits <https://bippinbits.com>
|
FDG Entertainment <https://www.fdg-entertainment.com/>
|
||||||
Brandon Lamb
|
Game Dev Artisan <https://gamedevartisan.com/>
|
||||||
Bri
|
|
||||||
Garry Newman
|
Garry Newman
|
||||||
Isaiah smith
|
Isaiah Smith <https://www.isaiahsmith.dev/>
|
||||||
Jb Evain
|
katnamag <https://katnamag.com/>
|
||||||
Keepsake Games <https://keepsake.games>
|
Kenney <https://kenney.nl/>
|
||||||
Kenney <https://kenney.nl>
|
Lucid Silence Games
|
||||||
Kitcat490
|
|
||||||
Kyle Szklenski
|
|
||||||
Matthew Campbell
|
Matthew Campbell
|
||||||
Maxim Karsten
|
Maxim Karsten
|
||||||
Nik Rudenko
|
Midjiwan AB <https://polytopia.io/>
|
||||||
TrampolineTales <https://trampolinetales.com>
|
PolyMars <https://polymars.dev/>
|
||||||
|
Razenpok <https://www.youtube.com/watch?v=-QxI-RP6-HM>
|
||||||
|
RPG in a Box <https://www.rpginabox.com/>
|
||||||
|
Sterling Long <https://www.sterlinglong.me/>
|
||||||
|
Sunshower <https://github.com/Phanterm>
|
||||||
|
TrampolineTales <https://trampolinetales.com/>
|
||||||
|
Wilfred James <https://twitter.com/0430agi>
|
||||||
|
And 7 anonymous donors
|
||||||
|
|
||||||
## Mini sponsors
|
## Platinum members
|
||||||
|
|
||||||
AD Ford
|
AD Ford
|
||||||
Albin Lundahl
|
Andy Touch
|
||||||
Andres Hernandez
|
BlockImperiumGames (BIG)
|
||||||
Andrew Dunai
|
Christian Baune
|
||||||
anti666
|
|
||||||
Christopher Shifflett
|
|
||||||
Christoph Woinke
|
Christoph Woinke
|
||||||
Daniel Edwards
|
Christopher Shifflett
|
||||||
Darrin Massena
|
Darrin Massena
|
||||||
David Mydlarz
|
|
||||||
Edward Flick
|
Edward Flick
|
||||||
Hein-Pieter van Braam
|
F*ckedByUnity
|
||||||
|
Golden Skull Art
|
||||||
|
HP van Braam
|
||||||
Jonah Stich
|
Jonah Stich
|
||||||
Justin Arnold
|
|
||||||
Justin McGettigan
|
Justin McGettigan
|
||||||
Justo Delgado Baudí
|
Justo Delgado Baudí
|
||||||
Kossi Selom Banybah
|
|
||||||
Lloyd Bond
|
|
||||||
Marek Belski
|
Marek Belski
|
||||||
Markus Ort
|
|
||||||
Michael
|
|
||||||
Mike King
|
Mike King
|
||||||
Nassor Paulino da Silva
|
Nassor Paulino da Silva
|
||||||
nate-wilkins
|
|
||||||
Neal Gompa (Conan Kudo)
|
Neal Gompa (Conan Kudo)
|
||||||
Nick Macholl
|
|
||||||
Patrick Horn
|
|
||||||
Rami
|
|
||||||
Ronnie Cheng
|
Ronnie Cheng
|
||||||
Ryan Heath
|
Ryan Heath
|
||||||
Samantha
|
Samantha
|
||||||
|
Scott Pezza
|
||||||
ShikadiGum
|
ShikadiGum
|
||||||
Slobodan Milnovic
|
Silver Creek Entertainment
|
||||||
|
Stephan Kessler
|
||||||
Stephan Lanfermann
|
Stephan Lanfermann
|
||||||
|
TigerJ
|
||||||
Tim Yuen
|
Tim Yuen
|
||||||
Violin Iliev
|
Violin Iliev
|
||||||
Vladimír Chvátil
|
Vladimír Chvátil
|
||||||
|
iCommitGames
|
||||||
|
nate-wilkins
|
||||||
|
And 16 anonymous donors
|
||||||
|
|
||||||
## Gold donors
|
## Gold members
|
||||||
|
|
||||||
Adam Brown
|
@reilaos
|
||||||
albinaask
|
Artur Ilkaev
|
||||||
Allen Pestaluky
|
|
||||||
Asher Glick
|
Asher Glick
|
||||||
Barugon
|
Ashtreighlia
|
||||||
|
Atsui
|
||||||
|
Ben Burbank
|
||||||
|
Ben Rog-Wilhelm
|
||||||
Benito
|
Benito
|
||||||
Carlo Cabanilla
|
Benjamin Sarsgard
|
||||||
|
Benjo Kho
|
||||||
|
Bernd Barsuhn
|
||||||
|
Blake Farnsworth
|
||||||
|
Brian Ernst
|
||||||
|
Brut
|
||||||
|
Chen-Pang He (jdh8)
|
||||||
|
Cosmin Munteanu
|
||||||
|
Coy Humphrey
|
||||||
Daniel James
|
Daniel James
|
||||||
David Fedorchak
|
David Chen Zhen
|
||||||
David Gehrig
|
David Coles
|
||||||
David Hubber
|
David Hubber
|
||||||
David Snopek
|
David Snopek
|
||||||
Dima Paloskin
|
Dehyvis Coronel
|
||||||
|
Dustuu
|
||||||
Ed Morley
|
Ed Morley
|
||||||
Guilherme de Oliveira
|
ElektroFox
|
||||||
Guy Kay Jay
|
Enclusa Games
|
||||||
|
Eric Phy
|
||||||
|
Faisal Al-Kubaisi (QatariGameDev)
|
||||||
|
FeralBytes
|
||||||
|
Frederick Ayala
|
||||||
|
GlassBrick
|
||||||
|
Grau
|
||||||
|
Guangzhou Lingchan
|
||||||
|
Hammster
|
||||||
|
Iggy Zuk
|
||||||
|
Jacob (HACKhalo2 Studios)
|
||||||
|
Jam
|
||||||
|
James Green
|
||||||
|
Jason Cawood
|
||||||
Javier Roman
|
Javier Roman
|
||||||
Jonathan Wright
|
Joel Martinez
|
||||||
|
John Gabriel
|
||||||
Jon Woodward
|
Jon Woodward
|
||||||
Karl Werf
|
José Canepa
|
||||||
Klavdij Voncina
|
João Pedro Braz
|
||||||
Manuele Finocchiaro
|
KAR Games
|
||||||
Markus Wiesner
|
Kamran Wali
|
||||||
Mateo Navarrete
|
Karasu Studio
|
||||||
Matthew Hillier
|
KekLuck
|
||||||
|
Kenneth Christensen
|
||||||
|
Kristian Kriehl
|
||||||
|
Logan Apple
|
||||||
|
Luca Junge
|
||||||
|
Luca Vazzano
|
||||||
|
LyaaaaaGames
|
||||||
|
MHDante
|
||||||
|
Malcolm Nixon
|
||||||
|
Manuel Requena
|
||||||
|
Martin Agnar Dahl
|
||||||
|
Martin Šenkeřík
|
||||||
|
Matheus Gritz
|
||||||
|
Megabit Interactive
|
||||||
|
Mennskr
|
||||||
|
Metanaut
|
||||||
|
Modus Ponens
|
||||||
|
Niklas Wahrman
|
||||||
|
NotNet
|
||||||
|
Obelisk Island Studios
|
||||||
Officine Pixel S.n.c.
|
Officine Pixel S.n.c.
|
||||||
Pedro Silva
|
Oleksii Nosov
|
||||||
Sarksus
|
Pav Soor
|
||||||
Sean
|
Piotr Siuszko
|
||||||
|
RAWRLAB Games
|
||||||
|
RadenTheFolf
|
||||||
|
Request
|
||||||
|
Robin Ward
|
||||||
|
Saltlight Studio
|
||||||
|
Samuel Judd
|
||||||
|
Silverclad Studios
|
||||||
Sofox
|
Sofox
|
||||||
Stephan Kessler
|
Space Kraken Studios
|
||||||
|
Spoony Panda
|
||||||
|
Sympa City
|
||||||
|
ThePolyglotProgrammer
|
||||||
|
Tim Nedvyga
|
||||||
Tom Langwaldt
|
Tom Langwaldt
|
||||||
|
Vincent Foulon
|
||||||
|
Weasel Games
|
||||||
|
WuotanStudios.com
|
||||||
|
Zi
|
||||||
|
albinaask
|
||||||
|
endaye
|
||||||
|
getIntoGameDev
|
||||||
|
nezticle
|
||||||
|
ohanaya3
|
||||||
|
re:thinc
|
||||||
tukon
|
tukon
|
||||||
|
杨烈胜(zedrun)
|
||||||
|
|
||||||
␣
|
|
||||||
Acheron
|
|
||||||
AdamRatai
|
|
||||||
Alexander Erlemann
|
Alexander Erlemann
|
||||||
Alexandre VALIN
|
Alexandre VALIN
|
||||||
Alexej Kowalew
|
|
||||||
Alex Khayrullin
|
Alex Khayrullin
|
||||||
Algebrute
|
Algebrute
|
||||||
alice gambrell
|
|
||||||
Alo Mis
|
|
||||||
Andriy
|
Andriy
|
||||||
Antanas Paskauskas
|
Antanas Paskauskas
|
||||||
|
anti666
|
||||||
Ari
|
Ari
|
||||||
Arisaka Mayuki
|
Arisaka Mayuki
|
||||||
Arthur S. Muszynski
|
Arthur S. Muszynski
|
||||||
BasicIncomePlz
|
Bread
|
||||||
Brandon Hawkinson
|
|
||||||
BrizzleBrip
|
|
||||||
c64cosmin
|
|
||||||
Cameron Connolly
|
Cameron Connolly
|
||||||
Carlo del Mundo
|
|
||||||
Charlie Whitfield
|
Charlie Whitfield
|
||||||
Chris Petrich
|
|
||||||
Chris Serino
|
|
||||||
Craig Ostrin
|
Craig Ostrin
|
||||||
Craig Scarborough
|
Craig Swain
|
||||||
Craig Smith
|
|
||||||
CzechBlueBear
|
CzechBlueBear
|
||||||
Daniel Eichler
|
Daniel Eichler
|
||||||
Daniel Grice
|
|
||||||
Daniel Reed
|
Daniel Reed
|
||||||
Daniel Tebbutt
|
|
||||||
Dennis Belfrage
|
Dennis Belfrage
|
||||||
Donn Eddy
|
|
||||||
Emily A. Bellows
|
Emily A. Bellows
|
||||||
Eric Brand
|
Eric Brand
|
||||||
Eugenio Hugo Salgüero Jáñez
|
|
||||||
Felix Winterhalter
|
Felix Winterhalter
|
||||||
Florencio Olsen
|
|
||||||
Fransiska
|
Fransiska
|
||||||
Furroy
|
|
||||||
Gabrielius Vaiškūnas
|
|
||||||
Gary Hulst
|
|
||||||
Geoffroy Warin
|
|
||||||
George Venizelos
|
George Venizelos
|
||||||
GlassBrick
|
|
||||||
GrayDwarf
|
|
||||||
Guilherme Felipe de C. G. da Silva
|
|
||||||
Guillaume Pham Ngoc
|
|
||||||
Harry Tumber
|
Harry Tumber
|
||||||
Harvey Fong
|
Harvey Fong
|
||||||
Horváth-Lázár Péter
|
Horváth-Lázár Péter
|
||||||
illuxxium
|
illuxxium
|
||||||
Jamal Bencharki
|
|
||||||
James Couzens
|
James Couzens
|
||||||
Jared White
|
Jared White
|
||||||
Jason Yundt
|
|
||||||
Jesús Chicharro
|
Jesús Chicharro
|
||||||
Jihun Moon
|
|
||||||
Joel Fivat
|
Joel Fivat
|
||||||
Johnathan Kupferer
|
Johnathan Kupferer
|
||||||
Josef Stumpfegger
|
Josef Stumpfegger
|
||||||
|
Josh Nygaard
|
||||||
Joshua Lesperance
|
Joshua Lesperance
|
||||||
Judd
|
|
||||||
Julian Todd
|
|
||||||
JUSTIN CARROLL
|
|
||||||
Kelson Ball
|
|
||||||
Kelteseth
|
Kelteseth
|
||||||
Khora
|
Khora
|
||||||
kickmaniac
|
kickmaniac
|
||||||
kinfox
|
|
||||||
leetNightshade
|
|
||||||
Liam Smyth
|
Liam Smyth
|
||||||
LoparPanda
|
LoparPanda
|
||||||
Lucaaa
|
|
||||||
Luca Vazzano
|
|
||||||
LyaaaaaGames
|
|
||||||
Marcus Dobler
|
Marcus Dobler
|
||||||
Marcus Richter
|
|
||||||
Mark Barrett
|
|
||||||
Martin Eigel
|
|
||||||
Martin Gulliksson
|
Martin Gulliksson
|
||||||
Martin Kotz
|
|
||||||
Martin Soucek
|
Martin Soucek
|
||||||
Matt Greene
|
Matt Greene
|
||||||
Matthew Dana
|
Matthew Dana
|
||||||
Matthieu Huvé
|
|
||||||
Michael Dürwald
|
Michael Dürwald
|
||||||
Michael Policastro
|
Michael Policastro
|
||||||
MikadoSC
|
|
||||||
n00sh
|
n00sh
|
||||||
nate etan
|
nate etan
|
||||||
Nicola Cocchiaro
|
|
||||||
Nicolás Monner Sans
|
Nicolás Monner Sans
|
||||||
Nikita Blizniuk
|
|
||||||
Nikita Rotskov
|
Nikita Rotskov
|
||||||
Nikola Whallon
|
Nikola Whallon
|
||||||
Oliver Dick
|
Oliver Dick
|
||||||
Otis Clark
|
|
||||||
Patrick Wuttke
|
Patrick Wuttke
|
||||||
Paul Hocker
|
|
||||||
Pete Goodwin
|
Pete Goodwin
|
||||||
Petr Malac
|
|
||||||
Petrus Prinsloo
|
|
||||||
Philip Woods
|
Philip Woods
|
||||||
Rebekah Farr
|
|
||||||
red1939
|
|
||||||
Reilt
|
Reilt
|
||||||
Rene Tailleur
|
|
||||||
Rickard Hermanson
|
Rickard Hermanson
|
||||||
Rob
|
Rob
|
||||||
Rob McInroy
|
Rob McInroy
|
||||||
RodZilla
|
RodZilla
|
||||||
Ronan Zeegers
|
|
||||||
Ronnie Ashlock
|
Ronnie Ashlock
|
||||||
Ronny Mühle
|
Ruzgud
|
||||||
Ryan Breaker
|
Ryan Breaker
|
||||||
"Sage Automatic Systems, LLC"
|
"Sage Automatic Systems, LLC"
|
||||||
Samuel Hummerstone
|
|
||||||
Samuel Judd
|
|
||||||
schroedinger's possum
|
|
||||||
Shishir Tandale
|
Shishir Tandale
|
||||||
SKison
|
|
||||||
Song Junwoo
|
Song Junwoo
|
||||||
spacechase0
|
spacechase0
|
||||||
SpicyCactuar
|
|
||||||
Steven Landow
|
|
||||||
Stoned Xander
|
|
||||||
sus
|
sus
|
||||||
Talii
|
Talii
|
||||||
Teslatech
|
|
||||||
Thomas Bjarnelöf
|
|
||||||
Thomas Kurz
|
Thomas Kurz
|
||||||
Tim Nedvyga
|
|
||||||
Tobias Bocanegra
|
Tobias Bocanegra
|
||||||
Tobias Raggl
|
Tobias Raggl
|
||||||
Torbulous
|
Torbulous
|
||||||
toto bibi
|
toto bibi
|
||||||
Troy Kinsella
|
|
||||||
Turntsnaco
|
|
||||||
UltyX
|
|
||||||
Valryia
|
Valryia
|
||||||
VeryProfessionalDodo
|
|
||||||
VoidPointer
|
VoidPointer
|
||||||
whatever
|
whatever
|
||||||
Winston
|
|
||||||
Yifan Lai
|
Yifan Lai
|
||||||
Yuancheng Zhang
|
|
||||||
zkip lan
|
zkip lan
|
||||||
|
|
||||||
## Silver donors
|
|
||||||
|
|
||||||
Aaron Adriano
|
|
||||||
Aaron Mayfield
|
Aaron Mayfield
|
||||||
Aaron Oldenburg
|
|
||||||
Adam Brunnmeier
|
|
||||||
Adam Carr
|
Adam Carr
|
||||||
Adam N Webber
|
|
||||||
Adam Smeltzer
|
Adam Smeltzer
|
||||||
Adinimys
|
|
||||||
Adisibio
|
Adisibio
|
||||||
Adriano Orioli
|
|
||||||
Adrien de Pierres
|
Adrien de Pierres
|
||||||
Agustinus Arya
|
Agustinus Arya
|
||||||
|
Aidan Marwick
|
||||||
Aidan O'Flannagain
|
Aidan O'Flannagain
|
||||||
|
aiekick
|
||||||
Aiguo Wang
|
Aiguo Wang
|
||||||
ajaxcc
|
AJWolbers
|
||||||
Aki Mimoto
|
Aki Mimoto
|
||||||
Alan Beauchamp
|
Alan Beauchamp
|
||||||
Alberto Salazar Muñoz
|
|
||||||
Alberto Vilches
|
|
||||||
Alder Stefano
|
Alder Stefano
|
||||||
Alejandro Saucedo
|
Alejandro Saucedo
|
||||||
AleMax
|
AleMax
|
||||||
Alex Clavelle
|
Alex Clavelle
|
||||||
Alex de la Mare
|
Alex de la Mare
|
||||||
alex raeside
|
alex raeside
|
||||||
Allan Davis
|
|
||||||
Andre Altmueller
|
Andre Altmueller
|
||||||
|
Andreas Østergaard Nielsen
|
||||||
Andrei Pufu
|
Andrei Pufu
|
||||||
Andre Stackhouse
|
Andre Stackhouse
|
||||||
Andrew
|
Andrew
|
||||||
Andrew Groot
|
Andrew Groot
|
||||||
andrew james morris
|
andrew james morris
|
||||||
Andy Baird
|
|
||||||
Ano Nim
|
Ano Nim
|
||||||
Anthony Avina
|
|
||||||
Anton Bouwer
|
|
||||||
Arch Toasty
|
Arch Toasty
|
||||||
Arda Erol
|
Arda Erol
|
||||||
Arthur Brainville
|
Arthur Brainville
|
||||||
Arturo Rosales
|
Arturo Rosales
|
||||||
Ash K
|
Ash K
|
||||||
Aubrey Falconer
|
Aubrey Falconer
|
||||||
aurelien condomines
|
|
||||||
Austin Miller
|
Austin Miller
|
||||||
Azar Gurbanov
|
Azar Gurbanov
|
||||||
AzulCrescent
|
AzulCrescent
|
||||||
Balázs Batári
|
Balázs Batári
|
||||||
Beau Seymour
|
Beau Seymour
|
||||||
Benedikt
|
Benedikt
|
||||||
Ben Vercammen
|
|
||||||
Ben Visness
|
Ben Visness
|
||||||
Bill Thibault
|
Bill Thibault
|
||||||
bitbrain
|
|
||||||
Bjarne Voigtländer
|
Bjarne Voigtländer
|
||||||
Brady Goldsworthy
|
Bread
|
||||||
Bram
|
|
||||||
Brian
|
|
||||||
Brian Ford
|
Brian Ford
|
||||||
Brigham Keys
|
|
||||||
Burney Waring
|
|
||||||
Caleb Makela
|
Caleb Makela
|
||||||
Caliburn
|
Caliburn
|
||||||
Cameron Meyer
|
Cameron Meyer
|
||||||
Carlos Rios
|
Carlos Rios
|
||||||
Carl van der Geest
|
Carl van der Geest
|
||||||
Cesar Ruiz
|
Cerno_b
|
||||||
Chad Steadman
|
|
||||||
Checkpoint Charlie
|
Checkpoint Charlie
|
||||||
chendrak
|
chendrak
|
||||||
Chris Cavalluzzi
|
Chris Cavalluzzi
|
||||||
Chris Jagusch
|
Chris Jagusch
|
||||||
Chris Langford
|
Chris Lee
|
||||||
Chris Ridenour
|
|
||||||
Christer Stenbrenden
|
|
||||||
Christian Alexander Bjørklund Bøhler
|
|
||||||
Christian Kaltenecker
|
|
||||||
Christian Mauduit
|
Christian Mauduit
|
||||||
Christian Winter
|
|
||||||
Christoph Czurda
|
Christoph Czurda
|
||||||
Christophe Gagnier
|
Christophe Gagnier
|
||||||
Ciyvius
|
Ciyvius
|
||||||
Codex404
|
|
||||||
Cody Parker
|
Cody Parker
|
||||||
Conall O
|
Conall O
|
||||||
Corchari
|
Corchari
|
||||||
Corey W
|
Corey W
|
||||||
Craig Post
|
|
||||||
CrispyPin
|
|
||||||
cynwav
|
cynwav
|
||||||
Dakota Watkins
|
Dakota Watkins
|
||||||
|
Daniele Tolomelli
|
||||||
Daniel Hoffmann
|
Daniel Hoffmann
|
||||||
Danielle
|
|
||||||
Daniel Ramos
|
Daniel Ramos
|
||||||
Dare Looks
|
|
||||||
Daren Scot Wilson
|
Daren Scot Wilson
|
||||||
Dave Jansen
|
Dave Jansen
|
||||||
Davesnothere
|
Davesnothere
|
||||||
|
@ -377,63 +363,45 @@ generous deed immortalized in the next stable release of Godot Engine.
|
||||||
Devin Carraway
|
Devin Carraway
|
||||||
Devin R
|
Devin R
|
||||||
Dimitri Roche
|
Dimitri Roche
|
||||||
Dominik Wetzel
|
|
||||||
Donovan Hutcheon
|
Donovan Hutcheon
|
||||||
Doug Walker
|
|
||||||
Dragontrapper
|
|
||||||
dragoon
|
dragoon
|
||||||
Dr Ewan Murray
|
|
||||||
Ducky
|
Ducky
|
||||||
Duobix
|
|
||||||
Duodecimal
|
Duodecimal
|
||||||
Eduardo Teixeira
|
|
||||||
Edward Swartz
|
Edward Swartz
|
||||||
Egon Elbre
|
Egon Elbre
|
||||||
Elgenzay
|
|
||||||
Elijah Anderson
|
Elijah Anderson
|
||||||
Emerson MX
|
Emerson MX
|
||||||
Ends
|
|
||||||
Ephemeral
|
Ephemeral
|
||||||
|
Eric Persson
|
||||||
Eric Stokes
|
Eric Stokes
|
||||||
Eric Williams
|
Eric Williams
|
||||||
Erkki Seppälä
|
Erkki Seppälä
|
||||||
Ewan Holmes
|
Ewan Holmes
|
||||||
Faisal Alkubaisi
|
|
||||||
fby
|
|
||||||
Felix Adam
|
Felix Adam
|
||||||
Fer DC
|
Fer DC
|
||||||
Filip Lundby
|
|
||||||
Frank
|
Frank
|
||||||
Frank Kurka
|
|
||||||
Frying☆Pan
|
Frying☆Pan
|
||||||
Game Endeavor
|
Game Endeavor
|
||||||
Garrett Steffen
|
Garrett Steffen
|
||||||
Gary Thomas
|
Gary Thomas
|
||||||
gebba
|
gebba
|
||||||
George Marques
|
|
||||||
Green Fox
|
Green Fox
|
||||||
Greg Burkland
|
Greg Burkland
|
||||||
Gregory Campbell
|
|
||||||
Greyson Richey
|
Greyson Richey
|
||||||
Grid
|
|
||||||
Grominet
|
Grominet
|
||||||
Guldoman
|
Guldoman
|
||||||
Guo Hongci
|
Guo Hongci
|
||||||
Hans Jorgensen
|
Hans Jorgensen
|
||||||
Haplo
|
Haplo
|
||||||
Helge Maus
|
Helge Maus
|
||||||
Helianthus Games
|
|
||||||
Heribert Hirth
|
Heribert Hirth
|
||||||
Ian Richard Kunert
|
Ian Richard Kunert
|
||||||
Ian Williams
|
Ian Williams
|
||||||
Interstice
|
|
||||||
itsybitesyspider
|
itsybitesyspider
|
||||||
iveks
|
iveks
|
||||||
Jacob D
|
Jacob Wallace
|
||||||
Jaguar
|
|
||||||
Jako Danar
|
Jako Danar
|
||||||
James Gary
|
James Gary
|
||||||
James Thomas
|
|
||||||
Jamie Massey
|
Jamie Massey
|
||||||
JARKKO PARVIAINEN
|
JARKKO PARVIAINEN
|
||||||
Jason Evans
|
Jason Evans
|
||||||
|
@ -441,115 +409,78 @@ generous deed immortalized in the next stable release of Godot Engine.
|
||||||
Jeff Hungerford
|
Jeff Hungerford
|
||||||
Jeffrey Berube
|
Jeffrey Berube
|
||||||
Jennifer Graves
|
Jennifer Graves
|
||||||
Jesse Dubay
|
Joakim Askenbäck
|
||||||
João Pedro Braz
|
João Pedro Braz
|
||||||
John Barlex
|
|
||||||
John Bruce
|
John Bruce
|
||||||
John Palgut
|
|
||||||
Jonas
|
Jonas
|
||||||
Jonas Arndt
|
Jonas Arndt
|
||||||
Jonas Bernemann
|
|
||||||
Jonas LHOSTE
|
|
||||||
Jonas Rudlang
|
|
||||||
Jonas Yamazaki
|
Jonas Yamazaki
|
||||||
Jonathan Bieber
|
Jonathan Bieber
|
||||||
Jonathan Ellis
|
Jonathan Ellis
|
||||||
Jonathan G
|
|
||||||
Jon Sully
|
Jon Sully
|
||||||
Jordy Goodridge
|
|
||||||
Joseph Catrambone
|
Joseph Catrambone
|
||||||
Josh Segall
|
|
||||||
Josh Taylor
|
Josh Taylor
|
||||||
Joshua Heidrich
|
Joshua Heidrich
|
||||||
Jozef Krcho
|
|
||||||
Juanfran
|
Juanfran
|
||||||
Juan Maggi
|
Juan Maggi
|
||||||
Juan Uys
|
Juan Uys
|
||||||
Jueast
|
Jueast
|
||||||
Julian le Roux
|
Julian le Roux
|
||||||
Julien Kaspar
|
Justin
|
||||||
Justin Hamilton
|
|
||||||
Justin Spedding
|
Justin Spedding
|
||||||
J Vetulani
|
|
||||||
Kalydi Balázs
|
Kalydi Balázs
|
||||||
Katsuomi Kobayashi
|
Katsuomi Kobayashi
|
||||||
Keedong Park
|
Keedong Park
|
||||||
Keegan Scott
|
Keegan Scott
|
||||||
Keith Bradner
|
Keith Bradner
|
||||||
Ken Minardo
|
|
||||||
Kent Jofur
|
Kent Jofur
|
||||||
killaQueen
|
|
||||||
kindzadza
|
kindzadza
|
||||||
Kodera Software
|
Kodera Software
|
||||||
Kostas Mouratidis
|
|
||||||
Krishna Nadoor
|
|
||||||
KsyTek Games
|
KsyTek Games
|
||||||
kycho
|
|
||||||
Kyle Burnett
|
Kyle Burnett
|
||||||
Kyle Jacobs
|
Kyle Jacobs
|
||||||
Lasse le Dous
|
Lasse le Dous
|
||||||
Laurent Dethoor
|
|
||||||
Laxman Pradhan
|
|
||||||
Lech Rozanski
|
|
||||||
Leland Vakarian
|
Leland Vakarian
|
||||||
Leonardo Baumle
|
|
||||||
Levi Berciu
|
Levi Berciu
|
||||||
Levi Lindsey
|
|
||||||
Linus Lind Lundgren
|
Linus Lind Lundgren
|
||||||
Logan Apple
|
|
||||||
Logan Bratton
|
|
||||||
Lonnie Cox
|
|
||||||
Ludovic DELVAL
|
Ludovic DELVAL
|
||||||
Luigi Renna
|
Luigi Renna
|
||||||
Luis Ernesto Del Toro Peña
|
|
||||||
Luis Gaemperle
|
|
||||||
Luis Morao
|
Luis Morao
|
||||||
Lukas Komischke
|
Lukas Komischke
|
||||||
Luke Diasio
|
Luke Diasio
|
||||||
Luke Kasz
|
|
||||||
Major Haul
|
Major Haul
|
||||||
Malcolm
|
Malcolm
|
||||||
|
Manuele Finocchiaro
|
||||||
Mara Huldra
|
Mara Huldra
|
||||||
Marcell Simon
|
|
||||||
Marcos Heitor Carvalho
|
Marcos Heitor Carvalho
|
||||||
Markie Music
|
Markie Music
|
||||||
Mark Tyler
|
|
||||||
Markus Martin
|
|
||||||
Markus Michael Egger
|
Markus Michael Egger
|
||||||
Markus Strompen
|
Markus Strompen
|
||||||
Martin Fitzke
|
|
||||||
Martin Holas
|
Martin Holas
|
||||||
Martin Linklater
|
|
||||||
Martin Liška
|
Martin Liška
|
||||||
Martin Trbola
|
Martin Trbola
|
||||||
Martin Zabinski
|
|
||||||
Matěj Drábek
|
Matěj Drábek
|
||||||
|
Mateo Navarrete
|
||||||
|
Mathieu
|
||||||
Matt Edwards
|
Matt Edwards
|
||||||
Matthew
|
|
||||||
Matthew Booe
|
|
||||||
Maverick
|
Maverick
|
||||||
Maxime Blade
|
Maxime Blade
|
||||||
Maxwell
|
Maxwell
|
||||||
McStuffings
|
McStuffings
|
||||||
Melissa Mears
|
Melissa Mears
|
||||||
Metal Demon 2000
|
Metal Demon 2000
|
||||||
Michael
|
|
||||||
Michael Morrison
|
Michael Morrison
|
||||||
Michal Skwarek
|
Michal Skwarek
|
||||||
Mikael Nordenberg
|
Mikael Nordenberg
|
||||||
Mikail Freitas
|
|
||||||
Mikayla
|
Mikayla
|
||||||
Mike Copley
|
Mike Copley
|
||||||
Mike McRoberts
|
|
||||||
Mitchell J. Wagner
|
Mitchell J. Wagner
|
||||||
MJacred
|
|
||||||
ModularMind
|
|
||||||
Molinghu
|
|
||||||
Molly Jameson
|
Molly Jameson
|
||||||
MoltenGears
|
MoltenGears
|
||||||
Moritz Weissenberger
|
Moritz Weissenberger
|
||||||
MrAZIE
|
MrAZIE
|
||||||
Mrjemandem
|
Mrjemandem
|
||||||
|
naonya3
|
||||||
Nathaniel
|
Nathaniel
|
||||||
neguse
|
neguse
|
||||||
neighty
|
neighty
|
||||||
|
@ -557,74 +488,49 @@ generous deed immortalized in the next stable release of Godot Engine.
|
||||||
Neofytos Chimonas
|
Neofytos Chimonas
|
||||||
Nerdforge
|
Nerdforge
|
||||||
Nerdyninja
|
Nerdyninja
|
||||||
Nicholas La Roux
|
|
||||||
Nick Eldrenkamp
|
Nick Eldrenkamp
|
||||||
Nicolas Rosset
|
Nicolas Rosset
|
||||||
Nicolò Brigadoi Calamari
|
Nik Rudenko
|
||||||
Nils Nordmark
|
|
||||||
Noel Billig
|
Noel Billig
|
||||||
Noesis
|
|
||||||
obscuresteel
|
|
||||||
Okatima
|
|
||||||
Oleg Reva
|
|
||||||
Olexa Tourko
|
Olexa Tourko
|
||||||
Oliver Ambrose
|
|
||||||
oscar1000108
|
oscar1000108
|
||||||
Oscar Domingo
|
Oscar Domingo
|
||||||
|
ozrk
|
||||||
Parth Patel
|
Parth Patel
|
||||||
|
Patrick Horn
|
||||||
Patrick Indermühle
|
Patrick Indermühle
|
||||||
Patrickm
|
Patrickm
|
||||||
Patrick Nafarrete
|
Patrick Nafarrete
|
||||||
Paul Black
|
Paul Black
|
||||||
Paul Gieske
|
Paul Gieske
|
||||||
Paul Hankins
|
|
||||||
Paul Mozet
|
Paul Mozet
|
||||||
Paweł Kowal
|
|
||||||
Paweł Łyczkowski
|
Paweł Łyczkowski
|
||||||
Pedro Henrique Martins Garcia
|
Pete
|
||||||
Philip Ludington (MrPhil)
|
Philip Ludington (MrPhil)
|
||||||
Phoenix Jauregui
|
Phoenix Jauregui
|
||||||
Pierre Caye
|
Pierre Caye
|
||||||
Pixel Archipel
|
Pixel Archipel
|
||||||
pj
|
|
||||||
Point08
|
Point08
|
||||||
Portponky
|
Portponky
|
||||||
Preethi Vaidyanathan
|
|
||||||
PsycHead
|
PsycHead
|
||||||
PsyCrab
|
|
||||||
Puntigames
|
Puntigames
|
||||||
pwab
|
|
||||||
Quincy Quincy
|
Quincy Quincy
|
||||||
Quinn Morrison
|
Quinn Morrison
|
||||||
Rafa Laguna
|
Raghava Kovvali
|
||||||
RagingRoosevelt
|
RagingRoosevelt
|
||||||
Ragnar Pettersson
|
Ragnar Pettersson
|
||||||
Rainer Amler
|
|
||||||
Rammeow
|
Rammeow
|
||||||
Rebecca H
|
Rebecca H
|
||||||
Relintai
|
|
||||||
Remi Rampin
|
|
||||||
Reneator
|
|
||||||
Richard Hayes
|
Richard Hayes
|
||||||
Richard Ivánek
|
|
||||||
Riley
|
Riley
|
||||||
Robin Ward
|
|
||||||
RobotCritter
|
RobotCritter
|
||||||
Rob Ruana
|
Rob Ruana
|
||||||
Rodrigo Loli
|
Rodrigo Loli
|
||||||
Roger Smith
|
|
||||||
Roglozor
|
|
||||||
Roka
|
Roka
|
||||||
Roland Rząsa
|
Roland Rząsa
|
||||||
Roman Papush
|
|
||||||
Roy Scayged
|
|
||||||
Russ
|
Russ
|
||||||
Russell Matney
|
|
||||||
Ryan Groom
|
Ryan Groom
|
||||||
Sacha Waked (Shaidak)
|
|
||||||
Sammy Fischer
|
Sammy Fischer
|
||||||
Sangeeth Pavithran
|
|
||||||
Sasha Schwartz
|
|
||||||
Sebastian Michailidis
|
Sebastian Michailidis
|
||||||
Sekuta
|
Sekuta
|
||||||
SeongWan Kim
|
SeongWan Kim
|
||||||
|
@ -640,77 +546,52 @@ generous deed immortalized in the next stable release of Godot Engine.
|
||||||
sirn
|
sirn
|
||||||
Skalli
|
Skalli
|
||||||
slavfox
|
slavfox
|
||||||
SleepDepJoel1
|
|
||||||
smbe19
|
smbe19
|
||||||
smo1704
|
smo1704
|
||||||
Solene Waked
|
SpicyCactuar
|
||||||
Sophie Winter
|
|
||||||
Squidgy
|
Squidgy
|
||||||
Squirrel
|
Squirrel
|
||||||
SSebigo
|
|
||||||
Stephen Rice
|
Stephen Rice
|
||||||
Stephen Schlie
|
Stephen Schlie
|
||||||
summerblind
|
|
||||||
Sung soo Choi
|
Sung soo Choi
|
||||||
SxP
|
SxP
|
||||||
tadashi endo
|
tadashi endo
|
||||||
Tarch
|
Tarch
|
||||||
Terry
|
|
||||||
TheVoiceInMyHead
|
TheVoiceInMyHead
|
||||||
Thibaut DECROMBECQUE
|
Thibaut DECROMBECQUE
|
||||||
thomas
|
thomas
|
||||||
Thomas Bechtold
|
Thomas Bechtold
|
||||||
Thomas Detoy
|
|
||||||
Thomas Pickett
|
Thomas Pickett
|
||||||
thommy
|
|
||||||
Till1805
|
|
||||||
Tim Drumheller
|
Tim Drumheller
|
||||||
Tim Erskine
|
|
||||||
Tim Gleason
|
Tim Gleason
|
||||||
Tim Klein
|
Tim Klein
|
||||||
Timothy B. MacDonald
|
Timothy B. MacDonald
|
||||||
Tim Raveling
|
Tim Raveling
|
||||||
Tim Riley
|
Tim Riley
|
||||||
Toadile
|
|
||||||
Tom Coxon
|
|
||||||
Tom Webster
|
Tom Webster
|
||||||
Torsten Crass
|
|
||||||
Trent Skinner
|
|
||||||
tril zerobyte
|
|
||||||
Tryggve Sollid
|
|
||||||
Turgut Temucin
|
Turgut Temucin
|
||||||
Tycho
|
|
||||||
Tyler Stafos
|
Tyler Stafos
|
||||||
Tyler Stepke
|
Tyler Stepke
|
||||||
Ukko K.
|
Ukko K.
|
||||||
Uther
|
Uther
|
||||||
v01tech
|
|
||||||
Vaida
|
|
||||||
Vaughan Ling
|
Vaughan Ling
|
||||||
Vavin.X
|
vgmoose
|
||||||
Vincent Barkmann
|
Vincent Barkmann
|
||||||
Vincent Cloutier
|
|
||||||
Vincent Foulon
|
|
||||||
Vulinux
|
Vulinux
|
||||||
Wapiti .
|
Wapiti .
|
||||||
|
wasitworthitdev
|
||||||
Wiley Thompson
|
Wiley Thompson
|
||||||
William Bodin
|
William Bodin
|
||||||
William Edwards
|
William Edwards
|
||||||
William F Siqueira
|
Xatonym
|
||||||
Wolfram
|
|
||||||
Woonki Moon
|
|
||||||
Xananax
|
|
||||||
Yan Shi
|
Yan Shi
|
||||||
yin
|
|
||||||
Zekim
|
Zekim
|
||||||
Zher Huei Lee
|
|
||||||
Zoee Silcock
|
|
||||||
Zyphery
|
|
||||||
ケルベロス
|
ケルベロス
|
||||||
貴宏 小松
|
貴宏 小松
|
||||||
郝晨煜
|
|
||||||
|
|
||||||
## Bronze donors
|
And 194 anonymous donors
|
||||||
|
|
||||||
|
## Silver and bronze donors
|
||||||
|
|
||||||
There are even more donors that support the project with a small monthly donation.
|
There are even more donors that support the project with a small monthly donation.
|
||||||
Every bit counts and we thank every one of them for their amazing support!
|
Every bit counts and we thank every one of them for their amazing support!
|
||||||
|
|
|
@ -73,7 +73,6 @@ if env["builtin_zlib"]:
|
||||||
"compress.c",
|
"compress.c",
|
||||||
"crc32.c",
|
"crc32.c",
|
||||||
"deflate.c",
|
"deflate.c",
|
||||||
"infback.c",
|
|
||||||
"inffast.c",
|
"inffast.c",
|
||||||
"inflate.c",
|
"inflate.c",
|
||||||
"inftrees.c",
|
"inftrees.c",
|
||||||
|
|
|
@ -87,24 +87,24 @@ def make_authors_header(target, source, env):
|
||||||
|
|
||||||
def make_donors_header(target, source, env):
|
def make_donors_header(target, source, env):
|
||||||
sections = [
|
sections = [
|
||||||
|
"Patrons",
|
||||||
"Platinum sponsors",
|
"Platinum sponsors",
|
||||||
"Gold sponsors",
|
"Gold sponsors",
|
||||||
"Silver sponsors",
|
"Silver sponsors",
|
||||||
"Bronze sponsors",
|
"Diamond members",
|
||||||
"Mini sponsors",
|
"Titanium members",
|
||||||
"Gold donors",
|
"Platinum members",
|
||||||
"Silver donors",
|
"Gold members",
|
||||||
"Bronze donors",
|
|
||||||
]
|
]
|
||||||
sections_id = [
|
sections_id = [
|
||||||
"DONORS_SPONSOR_PLATINUM",
|
"DONORS_PATRONS",
|
||||||
"DONORS_SPONSOR_GOLD",
|
"DONORS_SPONSORS_PLATINUM",
|
||||||
"DONORS_SPONSOR_SILVER",
|
"DONORS_SPONSORS_GOLD",
|
||||||
"DONORS_SPONSOR_BRONZE",
|
"DONORS_SPONSORS_SILVER",
|
||||||
"DONORS_SPONSOR_MINI",
|
"DONORS_MEMBERS_DIAMOND",
|
||||||
"DONORS_GOLD",
|
"DONORS_MEMBERS_TITANIUM",
|
||||||
"DONORS_SILVER",
|
"DONORS_MEMBERS_PLATINUM",
|
||||||
"DONORS_BRONZE",
|
"DONORS_MEMBERS_GOLD",
|
||||||
]
|
]
|
||||||
|
|
||||||
src = source[0]
|
src = source[0]
|
||||||
|
|
|
@ -160,14 +160,14 @@ Array Engine::get_copyright_info() const {
|
||||||
|
|
||||||
Dictionary Engine::get_donor_info() const {
|
Dictionary Engine::get_donor_info() const {
|
||||||
Dictionary donors;
|
Dictionary donors;
|
||||||
donors["platinum_sponsors"] = array_from_info(DONORS_SPONSOR_PLATINUM);
|
donors["patrons"] = array_from_info(DONORS_PATRONS);
|
||||||
donors["gold_sponsors"] = array_from_info(DONORS_SPONSOR_GOLD);
|
donors["platinum_sponsors"] = array_from_info(DONORS_SPONSORS_PLATINUM);
|
||||||
donors["silver_sponsors"] = array_from_info(DONORS_SPONSOR_SILVER);
|
donors["gold_sponsors"] = array_from_info(DONORS_SPONSORS_GOLD);
|
||||||
donors["bronze_sponsors"] = array_from_info(DONORS_SPONSOR_BRONZE);
|
donors["silver_sponsors"] = array_from_info(DONORS_SPONSORS_SILVER);
|
||||||
donors["mini_sponsors"] = array_from_info(DONORS_SPONSOR_MINI);
|
donors["diamond_members"] = array_from_info(DONORS_MEMBERS_DIAMOND);
|
||||||
donors["gold_donors"] = array_from_info(DONORS_GOLD);
|
donors["titanium_members"] = array_from_info(DONORS_MEMBERS_TITANIUM);
|
||||||
donors["silver_donors"] = array_from_info(DONORS_SILVER);
|
donors["platinum_members"] = array_from_info(DONORS_MEMBERS_PLATINUM);
|
||||||
donors["bronze_donors"] = array_from_info(DONORS_BRONZE);
|
donors["gold_members"] = array_from_info(DONORS_MEMBERS_GOLD);
|
||||||
return donors;
|
return donors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -515,7 +515,7 @@ void OS::swap_buffers() {
|
||||||
}
|
}
|
||||||
|
|
||||||
String OS::get_unique_id() const {
|
String OS::get_unique_id() const {
|
||||||
ERR_FAIL_V("");
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
int OS::get_processor_count() const {
|
int OS::get_processor_count() const {
|
||||||
|
|
|
@ -550,7 +550,7 @@
|
||||||
<description>
|
<description>
|
||||||
Returns a string that is unique to the device.
|
Returns a string that is unique to the device.
|
||||||
[b]Note:[/b] This string may change without notice if the user reinstalls/upgrades their operating system or changes their hardware. This means it should generally not be used to encrypt persistent data as the data saved before an unexpected ID change would become inaccessible. The returned string may also be falsified using external programs, so do not rely on the string returned by [method get_unique_id] for security purposes.
|
[b]Note:[/b] This string may change without notice if the user reinstalls/upgrades their operating system or changes their hardware. This means it should generally not be used to encrypt persistent data as the data saved before an unexpected ID change would become inaccessible. The returned string may also be falsified using external programs, so do not rely on the string returned by [method get_unique_id] for security purposes.
|
||||||
[b]Note:[/b] Returns an empty string on HTML5, as this method isn't implemented on this platform yet.
|
[b]Note:[/b] Returns an empty string and prints an error on HTML5, as this method cannot be implemented on this platform.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_unix_time" qualifiers="const">
|
<method name="get_unix_time" qualifiers="const">
|
||||||
|
|
|
@ -147,7 +147,8 @@ EditorAbout::EditorAbout() {
|
||||||
|
|
||||||
Label *about_text = memnew(Label);
|
Label *about_text = memnew(Label);
|
||||||
about_text->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
|
about_text->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
|
||||||
about_text->set_text(String::utf8("\xc2\xa9 2014-present ") + TTR("Godot Engine contributors") + "." +
|
about_text->set_text(
|
||||||
|
String::utf8("\xc2\xa9 2014-present ") + TTR("Godot Engine contributors") + "." +
|
||||||
String::utf8("\n\xc2\xa9 2007-2014 Juan Linietsky, Ariel Manzur.\n"));
|
String::utf8("\n\xc2\xa9 2007-2014 Juan Linietsky, Ariel Manzur.\n"));
|
||||||
version_info_vbc->add_child(about_text);
|
version_info_vbc->add_child(about_text);
|
||||||
|
|
||||||
|
@ -166,24 +167,35 @@ EditorAbout::EditorAbout() {
|
||||||
// TRANSLATORS: This refers to a job title.
|
// TRANSLATORS: This refers to a job title.
|
||||||
dev_sections.push_back(TTR("Project Manager", "Job Title"));
|
dev_sections.push_back(TTR("Project Manager", "Job Title"));
|
||||||
dev_sections.push_back(TTR("Developers"));
|
dev_sections.push_back(TTR("Developers"));
|
||||||
const char *const *dev_src[] = { AUTHORS_FOUNDERS, AUTHORS_LEAD_DEVELOPERS,
|
const char *const *dev_src[] = {
|
||||||
AUTHORS_PROJECT_MANAGERS, AUTHORS_DEVELOPERS };
|
AUTHORS_FOUNDERS,
|
||||||
|
AUTHORS_LEAD_DEVELOPERS,
|
||||||
|
AUTHORS_PROJECT_MANAGERS,
|
||||||
|
AUTHORS_DEVELOPERS,
|
||||||
|
};
|
||||||
tc->add_child(_populate_list(TTR("Authors"), dev_sections, dev_src, 1));
|
tc->add_child(_populate_list(TTR("Authors"), dev_sections, dev_src, 1));
|
||||||
|
|
||||||
// Donors
|
// Donors
|
||||||
|
|
||||||
List<String> donor_sections;
|
List<String> donor_sections;
|
||||||
|
donor_sections.push_back(TTR("Patrons"));
|
||||||
donor_sections.push_back(TTR("Platinum Sponsors"));
|
donor_sections.push_back(TTR("Platinum Sponsors"));
|
||||||
donor_sections.push_back(TTR("Gold Sponsors"));
|
donor_sections.push_back(TTR("Gold Sponsors"));
|
||||||
donor_sections.push_back(TTR("Silver Sponsors"));
|
donor_sections.push_back(TTR("Silver Sponsors"));
|
||||||
donor_sections.push_back(TTR("Bronze Sponsors"));
|
donor_sections.push_back(TTR("Diamond Members"));
|
||||||
donor_sections.push_back(TTR("Mini Sponsors"));
|
donor_sections.push_back(TTR("Titanium Members"));
|
||||||
donor_sections.push_back(TTR("Gold Donors"));
|
donor_sections.push_back(TTR("Platinum Members"));
|
||||||
donor_sections.push_back(TTR("Silver Donors"));
|
donor_sections.push_back(TTR("Gold Members"));
|
||||||
donor_sections.push_back(TTR("Bronze Donors"));
|
const char *const *donor_src[] = {
|
||||||
const char *const *donor_src[] = { DONORS_SPONSOR_PLATINUM, DONORS_SPONSOR_GOLD,
|
DONORS_PATRONS,
|
||||||
DONORS_SPONSOR_SILVER, DONORS_SPONSOR_BRONZE, DONORS_SPONSOR_MINI,
|
DONORS_SPONSORS_PLATINUM,
|
||||||
DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE };
|
DONORS_SPONSORS_GOLD,
|
||||||
|
DONORS_SPONSORS_SILVER,
|
||||||
|
DONORS_MEMBERS_DIAMOND,
|
||||||
|
DONORS_MEMBERS_TITANIUM,
|
||||||
|
DONORS_MEMBERS_PLATINUM,
|
||||||
|
DONORS_MEMBERS_GOLD,
|
||||||
|
};
|
||||||
tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3));
|
tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3));
|
||||||
|
|
||||||
// License
|
// License
|
||||||
|
|
19
methods.py
19
methods.py
|
@ -776,25 +776,28 @@ def detect_visual_c_compiler_version(tools_env):
|
||||||
|
|
||||||
|
|
||||||
def find_visual_c_batch_file(env):
|
def find_visual_c_batch_file(env):
|
||||||
from SCons.Tool.MSCommon.vc import (
|
from SCons.Tool.MSCommon.vc import get_default_version, get_host_target, find_batch_file, find_vc_pdir
|
||||||
get_default_version,
|
|
||||||
get_host_target,
|
|
||||||
find_batch_file,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Syntax changed in SCons 4.4.0.
|
# Syntax changed in SCons 4.4.0.
|
||||||
from SCons import __version__ as scons_raw_version
|
from SCons import __version__ as scons_raw_version
|
||||||
|
|
||||||
scons_ver = env._get_major_minor_revision(scons_raw_version)
|
scons_ver = env._get_major_minor_revision(scons_raw_version)
|
||||||
|
|
||||||
version = get_default_version(env)
|
msvc_version = get_default_version(env)
|
||||||
|
|
||||||
if scons_ver >= (4, 4, 0):
|
if scons_ver >= (4, 4, 0):
|
||||||
(host_platform, target_platform, _) = get_host_target(env, version)
|
(host_platform, target_platform, _) = get_host_target(env, msvc_version)
|
||||||
else:
|
else:
|
||||||
(host_platform, target_platform, _) = get_host_target(env)
|
(host_platform, target_platform, _) = get_host_target(env)
|
||||||
|
|
||||||
return find_batch_file(env, version, host_platform, target_platform)[0]
|
if scons_ver < (4, 6, 0):
|
||||||
|
return find_batch_file(env, msvc_version, host_platform, target_platform)[0]
|
||||||
|
|
||||||
|
# Scons 4.6.0+ removed passing env, so we need to get the product_dir ourselves first,
|
||||||
|
# then pass that as the last param instead of env as the first param as before.
|
||||||
|
# We should investigate if we can avoid relying on SCons internals here.
|
||||||
|
product_dir = find_vc_pdir(env, msvc_version)
|
||||||
|
return find_batch_file(msvc_version, host_platform, target_platform, product_dir)[0]
|
||||||
|
|
||||||
|
|
||||||
def generate_cpp_hint_file(filename):
|
def generate_cpp_hint_file(filename):
|
||||||
|
|
|
@ -30,6 +30,9 @@ def get_opts():
|
||||||
|
|
||||||
return [
|
return [
|
||||||
("initial_memory", "Initial WASM memory (in MiB)", 32),
|
("initial_memory", "Initial WASM memory (in MiB)", 32),
|
||||||
|
# Matches default values from before Emscripten 3.1.27. New defaults are too low for Godot.
|
||||||
|
("stack_size", "WASM stack size (in KiB)", 5120),
|
||||||
|
("default_pthread_stack_size", "WASM pthread default stack size (in KiB)", 2048),
|
||||||
BoolVariable("use_assertions", "Use Emscripten runtime assertions", False),
|
BoolVariable("use_assertions", "Use Emscripten runtime assertions", False),
|
||||||
BoolVariable("use_ubsan", "Use Emscripten undefined behavior sanitizer (UBSAN)", False),
|
BoolVariable("use_ubsan", "Use Emscripten undefined behavior sanitizer (UBSAN)", False),
|
||||||
BoolVariable("use_asan", "Use Emscripten address sanitizer (ASAN)", False),
|
BoolVariable("use_asan", "Use Emscripten address sanitizer (ASAN)", False),
|
||||||
|
@ -172,26 +175,33 @@ def configure(env):
|
||||||
env["LIBPREFIXES"] = ["$LIBPREFIX"]
|
env["LIBPREFIXES"] = ["$LIBPREFIX"]
|
||||||
env["LIBSUFFIXES"] = ["$LIBSUFFIX"]
|
env["LIBSUFFIXES"] = ["$LIBSUFFIX"]
|
||||||
|
|
||||||
|
# Get version info for checks below.
|
||||||
|
cc_semver = tuple(get_compiler_version(env))
|
||||||
|
|
||||||
env.Prepend(CPPPATH=["#platform/javascript"])
|
env.Prepend(CPPPATH=["#platform/javascript"])
|
||||||
env.Append(CPPDEFINES=["JAVASCRIPT_ENABLED", "UNIX_ENABLED"])
|
env.Append(CPPDEFINES=["JAVASCRIPT_ENABLED", "UNIX_ENABLED"])
|
||||||
|
|
||||||
if env["javascript_eval"]:
|
if env["javascript_eval"]:
|
||||||
env.Append(CPPDEFINES=["JAVASCRIPT_EVAL_ENABLED"])
|
env.Append(CPPDEFINES=["JAVASCRIPT_EVAL_ENABLED"])
|
||||||
|
|
||||||
|
stack_size_opt = "STACK_SIZE" if cc_semver >= (3, 1, 25) else "TOTAL_STACK"
|
||||||
|
env.Append(LINKFLAGS=["-s", "%s=%sKB" % (stack_size_opt, env["stack_size"])])
|
||||||
|
|
||||||
# Thread support (via SharedArrayBuffer).
|
# Thread support (via SharedArrayBuffer).
|
||||||
if env["threads_enabled"]:
|
if env["threads_enabled"]:
|
||||||
|
stack_size_opt = "STACK_SIZE" if cc_semver >= (3, 1, 25) else "TOTAL_STACK"
|
||||||
|
env.Append(LINKFLAGS=["-s", "%s=%sKB" % (stack_size_opt, env["stack_size"])])
|
||||||
|
|
||||||
env.Append(CPPDEFINES=["PTHREAD_NO_RENAME"])
|
env.Append(CPPDEFINES=["PTHREAD_NO_RENAME"])
|
||||||
env.Append(CCFLAGS=["-s", "USE_PTHREADS=1"])
|
env.Append(CCFLAGS=["-s", "USE_PTHREADS=1"])
|
||||||
env.Append(LINKFLAGS=["-s", "USE_PTHREADS=1"])
|
env.Append(LINKFLAGS=["-s", "USE_PTHREADS=1"])
|
||||||
|
env.Append(LINKFLAGS=["-s", "DEFAULT_PTHREAD_STACK_SIZE=%sKB" % env["default_pthread_stack_size"]])
|
||||||
env.Append(LINKFLAGS=["-s", "PTHREAD_POOL_SIZE=8"])
|
env.Append(LINKFLAGS=["-s", "PTHREAD_POOL_SIZE=8"])
|
||||||
env.Append(LINKFLAGS=["-s", "WASM_MEM_MAX=2048MB"])
|
env.Append(LINKFLAGS=["-s", "WASM_MEM_MAX=2048MB"])
|
||||||
env.extra_suffix = ".threads" + env.extra_suffix
|
env.extra_suffix = ".threads" + env.extra_suffix
|
||||||
else:
|
else:
|
||||||
env.Append(CPPDEFINES=["NO_THREADS"])
|
env.Append(CPPDEFINES=["NO_THREADS"])
|
||||||
|
|
||||||
# Get version info for checks below.
|
|
||||||
cc_semver = tuple(get_compiler_version(env))
|
|
||||||
|
|
||||||
if env["lto"] != "none":
|
if env["lto"] != "none":
|
||||||
# Workaround https://github.com/emscripten-core/emscripten/issues/19781.
|
# Workaround https://github.com/emscripten-core/emscripten/issues/19781.
|
||||||
if cc_semver >= (3, 1, 42) and cc_semver < (3, 1, 46):
|
if cc_semver >= (3, 1, 42) and cc_semver < (3, 1, 46):
|
||||||
|
|
|
@ -1005,6 +1005,10 @@ int OS_JavaScript::get_processor_count() const {
|
||||||
return godot_js_os_hw_concurrency_get();
|
return godot_js_os_hw_concurrency_get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String OS_JavaScript::get_unique_id() const {
|
||||||
|
ERR_FAIL_V_MSG("", "OS::get_unique_id() is not available on the HTML5 platform.");
|
||||||
|
}
|
||||||
|
|
||||||
bool OS_JavaScript::_check_internal_feature_support(const String &p_feature) {
|
bool OS_JavaScript::_check_internal_feature_support(const String &p_feature) {
|
||||||
if (p_feature == "HTML5" || p_feature == "web") {
|
if (p_feature == "HTML5" || p_feature == "web") {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -194,6 +194,7 @@ public:
|
||||||
virtual int get_process_id() const;
|
virtual int get_process_id() const;
|
||||||
bool is_process_running(const ProcessID &p_pid) const;
|
bool is_process_running(const ProcessID &p_pid) const;
|
||||||
int get_processor_count() const;
|
int get_processor_count() const;
|
||||||
|
String get_unique_id() const;
|
||||||
|
|
||||||
virtual void alert(const String &p_alert, const String &p_title = "ALERT!");
|
virtual void alert(const String &p_alert, const String &p_title = "ALERT!");
|
||||||
virtual void set_window_title(const String &p_title);
|
virtual void set_window_title(const String &p_title);
|
||||||
|
|
|
@ -107,6 +107,7 @@ bool JoypadWindows::is_xinput_device(const GUID *p_guid) {
|
||||||
static GUID IID_XOneSWirelessGamepad = { MAKELONG(0x045E, 0x02EA), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
static GUID IID_XOneSWirelessGamepad = { MAKELONG(0x045E, 0x02EA), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
||||||
static GUID IID_XOneSBluetoothGamepad = { MAKELONG(0x045E, 0x02E0), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
static GUID IID_XOneSBluetoothGamepad = { MAKELONG(0x045E, 0x02E0), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
||||||
static GUID IID_XOneEliteWirelessGamepad = { MAKELONG(0x045E, 0x02E3), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
static GUID IID_XOneEliteWirelessGamepad = { MAKELONG(0x045E, 0x02E3), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
||||||
|
static GUID IID_XOneElite2WirelessGamepad = { MAKELONG(0x045E, 0x0B22), 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };
|
||||||
|
|
||||||
if (memcmp(p_guid, &IID_ValveStreamingGamepad, sizeof(*p_guid)) == 0 ||
|
if (memcmp(p_guid, &IID_ValveStreamingGamepad, sizeof(*p_guid)) == 0 ||
|
||||||
memcmp(p_guid, &IID_X360WiredGamepad, sizeof(*p_guid)) == 0 ||
|
memcmp(p_guid, &IID_X360WiredGamepad, sizeof(*p_guid)) == 0 ||
|
||||||
|
@ -118,7 +119,8 @@ bool JoypadWindows::is_xinput_device(const GUID *p_guid) {
|
||||||
memcmp(p_guid, &IID_XOneNewWirelessGamepad, sizeof(*p_guid)) == 0 ||
|
memcmp(p_guid, &IID_XOneNewWirelessGamepad, sizeof(*p_guid)) == 0 ||
|
||||||
memcmp(p_guid, &IID_XOneSWirelessGamepad, sizeof(*p_guid)) == 0 ||
|
memcmp(p_guid, &IID_XOneSWirelessGamepad, sizeof(*p_guid)) == 0 ||
|
||||||
memcmp(p_guid, &IID_XOneSBluetoothGamepad, sizeof(*p_guid)) == 0 ||
|
memcmp(p_guid, &IID_XOneSBluetoothGamepad, sizeof(*p_guid)) == 0 ||
|
||||||
memcmp(p_guid, &IID_XOneEliteWirelessGamepad, sizeof(*p_guid)) == 0)
|
memcmp(p_guid, &IID_XOneEliteWirelessGamepad, sizeof(*p_guid)) == 0 ||
|
||||||
|
memcmp(p_guid, &IID_XOneElite2WirelessGamepad, sizeof(*p_guid)) == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
PRAWINPUTDEVICELIST dev_list = NULL;
|
PRAWINPUTDEVICELIST dev_list = NULL;
|
||||||
|
|
10
thirdparty/README.md
vendored
10
thirdparty/README.md
vendored
|
@ -8,7 +8,7 @@ readability.
|
||||||
## brotli
|
## brotli
|
||||||
|
|
||||||
- Upstream: https://github.com/google/brotli
|
- Upstream: https://github.com/google/brotli
|
||||||
- Version: git (ed1995b6bda19244070ab5d331111f16f67c8054, 2023)
|
- Version: 1.1.0 (ed738e842d2fbdf2d6459e39267a633c4a9b2f5d, 2023)
|
||||||
- License: MIT
|
- License: MIT
|
||||||
|
|
||||||
Files extracted from upstream source:
|
Files extracted from upstream source:
|
||||||
|
@ -328,7 +328,7 @@ that file when upgrading.
|
||||||
## minizip
|
## minizip
|
||||||
|
|
||||||
- Upstream: https://www.zlib.net
|
- Upstream: https://www.zlib.net
|
||||||
- Version: 1.2.13 (zlib contrib, 2022)
|
- Version: 1.3 (zlib contrib, 2023)
|
||||||
- License: zlib
|
- License: zlib
|
||||||
|
|
||||||
Files extracted from the upstream source:
|
Files extracted from the upstream source:
|
||||||
|
@ -341,6 +341,8 @@ Important: Some files have Godot-made changes for use in core/io.
|
||||||
They are marked with `/* GODOT start */` and `/* GODOT end */`
|
They are marked with `/* GODOT start */` and `/* GODOT end */`
|
||||||
comments and a patch is provided in the `patches` folder.
|
comments and a patch is provided in the `patches` folder.
|
||||||
|
|
||||||
|
Another patch is included to fix CVE-2023-45853.
|
||||||
|
|
||||||
|
|
||||||
## misc
|
## misc
|
||||||
|
|
||||||
|
@ -598,12 +600,12 @@ Files extracted from upstream source:
|
||||||
## zlib
|
## zlib
|
||||||
|
|
||||||
- Upstream: https://www.zlib.net
|
- Upstream: https://www.zlib.net
|
||||||
- Version: 1.2.13 (2022)
|
- Version: 1.3 (2023)
|
||||||
- License: zlib
|
- License: zlib
|
||||||
|
|
||||||
Files extracted from upstream source:
|
Files extracted from upstream source:
|
||||||
|
|
||||||
- All `*.c` and `*.h` files
|
- All `*.c` and `*.h` files, minus `infback.c`
|
||||||
- `LICENSE`
|
- `LICENSE`
|
||||||
|
|
||||||
|
|
||||||
|
|
26
thirdparty/brotli/common/platform.h
vendored
26
thirdparty/brotli/common/platform.h
vendored
|
@ -14,10 +14,11 @@
|
||||||
* BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations
|
* BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations
|
||||||
* BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs
|
* BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs
|
||||||
* BROTLI_BUILD_NO_UNALIGNED_READ_FAST forces off the fast-unaligned-read
|
* BROTLI_BUILD_NO_UNALIGNED_READ_FAST forces off the fast-unaligned-read
|
||||||
optimizations (mainly for testing purposes).
|
optimizations (mainly for testing purposes)
|
||||||
* BROTLI_DEBUG dumps file name and line number when decoder detects stream
|
* BROTLI_DEBUG dumps file name and line number when decoder detects stream
|
||||||
or memory error
|
or memory error
|
||||||
* BROTLI_ENABLE_LOG enables asserts and dumps various state information
|
* BROTLI_ENABLE_LOG enables asserts and dumps various state information
|
||||||
|
* BROTLI_ENABLE_DUMP overrides default "dump" behaviour
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BROTLI_COMMON_PLATFORM_H_
|
#ifndef BROTLI_COMMON_PLATFORM_H_
|
||||||
|
@ -208,8 +209,13 @@ OR:
|
||||||
#define BROTLI_TARGET_RISCV64
|
#define BROTLI_TARGET_RISCV64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__loongarch_lp64)
|
||||||
|
#define BROTLI_TARGET_LOONGARCH64
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \
|
#if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \
|
||||||
defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64)
|
defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) || \
|
||||||
|
defined(BROTLI_TARGET_LOONGARCH64)
|
||||||
#define BROTLI_TARGET_64_BITS 1
|
#define BROTLI_TARGET_64_BITS 1
|
||||||
#else
|
#else
|
||||||
#define BROTLI_TARGET_64_BITS 0
|
#define BROTLI_TARGET_64_BITS 0
|
||||||
|
@ -268,7 +274,7 @@ OR:
|
||||||
#define BROTLI_UNALIGNED_READ_FAST (!!0)
|
#define BROTLI_UNALIGNED_READ_FAST (!!0)
|
||||||
#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
|
#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
|
||||||
defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) || \
|
defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) || \
|
||||||
defined(BROTLI_TARGET_RISCV64)
|
defined(BROTLI_TARGET_RISCV64) || defined(BROTLI_TARGET_LOONGARCH64)
|
||||||
/* These targets are known to generate efficient code for unaligned reads
|
/* These targets are known to generate efficient code for unaligned reads
|
||||||
* (e.g. a single instruction, not multiple 1-byte loads, shifted and or'd
|
* (e.g. a single instruction, not multiple 1-byte loads, shifted and or'd
|
||||||
* together). */
|
* together). */
|
||||||
|
@ -402,14 +408,24 @@ static BROTLI_INLINE void BROTLI_UNALIGNED_STORE_PTR(void* p, const void* v) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
|
#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
|
||||||
|
#define BROTLI_ENABLE_DUMP_DEFAULT 1
|
||||||
#define BROTLI_DCHECK(x) assert(x)
|
#define BROTLI_DCHECK(x) assert(x)
|
||||||
|
#else
|
||||||
|
#define BROTLI_ENABLE_DUMP_DEFAULT 0
|
||||||
|
#define BROTLI_DCHECK(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(BROTLI_ENABLE_DUMP)
|
||||||
|
#define BROTLI_ENABLE_DUMP BROTLI_ENABLE_DUMP_DEFAULT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BROTLI_ENABLE_DUMP
|
||||||
static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) {
|
static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) {
|
||||||
fprintf(stderr, "%s:%d (%s)\n", f, l, fn);
|
fprintf(stderr, "%s:%d (%s)\n", f, l, fn);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
#define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__)
|
#define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__)
|
||||||
#else
|
#else
|
||||||
#define BROTLI_DCHECK(x)
|
|
||||||
#define BROTLI_DUMP() (void)(0)
|
#define BROTLI_DUMP() (void)(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -517,7 +533,7 @@ BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) {
|
||||||
BROTLI_UNUSED(&brotli_max_uint8_t);
|
BROTLI_UNUSED(&brotli_max_uint8_t);
|
||||||
BROTLI_UNUSED(&BrotliDefaultAllocFunc);
|
BROTLI_UNUSED(&BrotliDefaultAllocFunc);
|
||||||
BROTLI_UNUSED(&BrotliDefaultFreeFunc);
|
BROTLI_UNUSED(&BrotliDefaultFreeFunc);
|
||||||
#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
|
#if BROTLI_ENABLE_DUMP
|
||||||
BROTLI_UNUSED(&BrotliDump);
|
BROTLI_UNUSED(&BrotliDump);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
12
thirdparty/brotli/common/shared_dictionary.c
vendored
12
thirdparty/brotli/common/shared_dictionary.c
vendored
|
@ -20,6 +20,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(BROTLI_EXPERIMENTAL)
|
||||||
|
|
||||||
#define BROTLI_NUM_ENCODED_LENGTHS (SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH \
|
#define BROTLI_NUM_ENCODED_LENGTHS (SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH \
|
||||||
- SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH + 1)
|
- SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH + 1)
|
||||||
|
|
||||||
|
@ -442,6 +444,8 @@ static BROTLI_BOOL DecodeSharedDictionary(
|
||||||
return ParseDictionary(encoded, size, dict);
|
return ParseDictionary(encoded, size, dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* BROTLI_EXPERIMENTAL */
|
||||||
|
|
||||||
void BrotliSharedDictionaryDestroyInstance(
|
void BrotliSharedDictionaryDestroyInstance(
|
||||||
BrotliSharedDictionary* dict) {
|
BrotliSharedDictionary* dict) {
|
||||||
if (!dict) {
|
if (!dict) {
|
||||||
|
@ -464,9 +468,12 @@ BROTLI_BOOL BrotliSharedDictionaryAttach(
|
||||||
if (!dict) {
|
if (!dict) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
|
#if defined(BROTLI_EXPERIMENTAL)
|
||||||
if (type == BROTLI_SHARED_DICTIONARY_SERIALIZED) {
|
if (type == BROTLI_SHARED_DICTIONARY_SERIALIZED) {
|
||||||
return DecodeSharedDictionary(data, data_size, dict);
|
return DecodeSharedDictionary(data, data_size, dict);
|
||||||
} else if (type == BROTLI_SHARED_DICTIONARY_RAW) {
|
}
|
||||||
|
#endif /* BROTLI_EXPERIMENTAL */
|
||||||
|
if (type == BROTLI_SHARED_DICTIONARY_RAW) {
|
||||||
if (dict->num_prefix >= SHARED_BROTLI_MAX_COMPOUND_DICTS) {
|
if (dict->num_prefix >= SHARED_BROTLI_MAX_COMPOUND_DICTS) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -474,9 +481,8 @@ BROTLI_BOOL BrotliSharedDictionaryAttach(
|
||||||
dict->prefix[dict->num_prefix] = data;
|
dict->prefix[dict->num_prefix] = data;
|
||||||
dict->num_prefix++;
|
dict->num_prefix++;
|
||||||
return BROTLI_TRUE;
|
return BROTLI_TRUE;
|
||||||
} else {
|
|
||||||
return BROTLI_FALSE;
|
|
||||||
}
|
}
|
||||||
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BrotliSharedDictionary* BrotliSharedDictionaryCreateInstance(
|
BrotliSharedDictionary* BrotliSharedDictionaryCreateInstance(
|
||||||
|
|
37
thirdparty/brotli/common/version.h
vendored
37
thirdparty/brotli/common/version.h
vendored
|
@ -9,18 +9,43 @@
|
||||||
#ifndef BROTLI_COMMON_VERSION_H_
|
#ifndef BROTLI_COMMON_VERSION_H_
|
||||||
#define BROTLI_COMMON_VERSION_H_
|
#define BROTLI_COMMON_VERSION_H_
|
||||||
|
|
||||||
/* This macro should only be used when library is compiled together with client.
|
/* Compose 3 components into a single number. In a hexadecimal representation
|
||||||
If library is dynamically linked, use BrotliDecoderVersion and
|
B and C components occupy exactly 3 digits. */
|
||||||
|
#define BROTLI_MAKE_HEX_VERSION(A, B, C) ((A << 24) | (B << 12) | C)
|
||||||
|
|
||||||
|
/* Those macros should only be used when library is compiled together with
|
||||||
|
the client. If library is dynamically linked, use BrotliDecoderVersion and
|
||||||
BrotliEncoderVersion methods. */
|
BrotliEncoderVersion methods. */
|
||||||
|
|
||||||
/* Semantic version, calculated as (MAJOR << 24) | (MINOR << 12) | PATCH */
|
#define BROTLI_VERSION_MAJOR 1
|
||||||
#define BROTLI_VERSION 0x1000009
|
#define BROTLI_VERSION_MINOR 1
|
||||||
|
#define BROTLI_VERSION_PATCH 0
|
||||||
|
|
||||||
|
#define BROTLI_VERSION BROTLI_MAKE_HEX_VERSION( \
|
||||||
|
BROTLI_VERSION_MAJOR, BROTLI_VERSION_MINOR, BROTLI_VERSION_PATCH)
|
||||||
|
|
||||||
/* This macro is used by build system to produce Libtool-friendly soname. See
|
/* This macro is used by build system to produce Libtool-friendly soname. See
|
||||||
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
|
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
|
||||||
|
Version evolution rules:
|
||||||
|
- interfaces added (or change is compatible) -> current+1:0:age+1
|
||||||
|
- interfaces removed (or changed is incompatible) -> current+1:0:0
|
||||||
|
- interfaces not changed -> current:revision+1:age
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ABI version, calculated as (CURRENT << 24) | (REVISION << 12) | AGE */
|
#define BROTLI_ABI_CURRENT 2
|
||||||
#define BROTLI_ABI_VERSION 0x1009000
|
#define BROTLI_ABI_REVISION 0
|
||||||
|
#define BROTLI_ABI_AGE 1
|
||||||
|
|
||||||
|
#if BROTLI_VERSION_MAJOR != (BROTLI_ABI_CURRENT - BROTLI_ABI_AGE)
|
||||||
|
#error ABI/API version inconsistency
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BROTLI_VERSION_MINOR != BROTLI_ABI_AGE
|
||||||
|
#error ABI/API version inconsistency
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if BROTLI_VERSION_PATCH != BROTLI_ABI_REVISION
|
||||||
|
#error ABI/API version inconsistency
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* BROTLI_COMMON_VERSION_H_ */
|
#endif /* BROTLI_COMMON_VERSION_H_ */
|
||||||
|
|
11
thirdparty/brotli/dec/bit_reader.c
vendored
11
thirdparty/brotli/dec/bit_reader.c
vendored
|
@ -16,7 +16,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const uint32_t kBrotliBitMask[33] = { 0x00000000,
|
const brotli_reg_t kBrotliBitMask[33] = { 0x00000000,
|
||||||
0x00000001, 0x00000003, 0x00000007, 0x0000000F,
|
0x00000001, 0x00000003, 0x00000007, 0x0000000F,
|
||||||
0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
|
0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
|
||||||
0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
|
0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
|
||||||
|
@ -29,7 +29,7 @@ const uint32_t kBrotliBitMask[33] = { 0x00000000,
|
||||||
|
|
||||||
void BrotliInitBitReader(BrotliBitReader* const br) {
|
void BrotliInitBitReader(BrotliBitReader* const br) {
|
||||||
br->val_ = 0;
|
br->val_ = 0;
|
||||||
br->bit_pos_ = sizeof(br->val_) << 3;
|
br->bit_pos_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
|
BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
|
||||||
|
@ -41,6 +41,7 @@ BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
|
||||||
aligned_read_mask = 0;
|
aligned_read_mask = 0;
|
||||||
}
|
}
|
||||||
if (BrotliGetAvailableBits(br) == 0) {
|
if (BrotliGetAvailableBits(br) == 0) {
|
||||||
|
br->val_ = 0;
|
||||||
if (!BrotliPullByte(br)) {
|
if (!BrotliPullByte(br)) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -56,9 +57,9 @@ BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br) {
|
||||||
}
|
}
|
||||||
|
|
||||||
BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br,
|
BROTLI_BOOL BrotliSafeReadBits32Slow(BrotliBitReader* const br,
|
||||||
uint32_t n_bits, uint32_t* val) {
|
brotli_reg_t n_bits, brotli_reg_t* val) {
|
||||||
uint32_t low_val;
|
brotli_reg_t low_val;
|
||||||
uint32_t high_val;
|
brotli_reg_t high_val;
|
||||||
BrotliBitReaderState memento;
|
BrotliBitReaderState memento;
|
||||||
BROTLI_DCHECK(n_bits <= 32);
|
BROTLI_DCHECK(n_bits <= 32);
|
||||||
BROTLI_DCHECK(n_bits > 24);
|
BROTLI_DCHECK(n_bits > 24);
|
||||||
|
|
255
thirdparty/brotli/dec/bit_reader.h
vendored
255
thirdparty/brotli/dec/bit_reader.h
vendored
|
@ -22,13 +22,16 @@ extern "C" {
|
||||||
|
|
||||||
#define BROTLI_SHORT_FILL_BIT_WINDOW_READ (sizeof(brotli_reg_t) >> 1)
|
#define BROTLI_SHORT_FILL_BIT_WINDOW_READ (sizeof(brotli_reg_t) >> 1)
|
||||||
|
|
||||||
BROTLI_INTERNAL extern const uint32_t kBrotliBitMask[33];
|
/* 162 bits + 7 bytes */
|
||||||
|
#define BROTLI_FAST_INPUT_SLACK 28
|
||||||
|
|
||||||
static BROTLI_INLINE uint32_t BitMask(uint32_t n) {
|
BROTLI_INTERNAL extern const brotli_reg_t kBrotliBitMask[33];
|
||||||
|
|
||||||
|
static BROTLI_INLINE brotli_reg_t BitMask(brotli_reg_t n) {
|
||||||
if (BROTLI_IS_CONSTANT(n) || BROTLI_HAS_UBFX) {
|
if (BROTLI_IS_CONSTANT(n) || BROTLI_HAS_UBFX) {
|
||||||
/* Masking with this expression turns to a single
|
/* Masking with this expression turns to a single
|
||||||
"Unsigned Bit Field Extract" UBFX instruction on ARM. */
|
"Unsigned Bit Field Extract" UBFX instruction on ARM. */
|
||||||
return ~((0xFFFFFFFFu) << n);
|
return ~(~((brotli_reg_t)0) << n);
|
||||||
} else {
|
} else {
|
||||||
return kBrotliBitMask[n];
|
return kBrotliBitMask[n];
|
||||||
}
|
}
|
||||||
|
@ -36,40 +39,57 @@ static BROTLI_INLINE uint32_t BitMask(uint32_t n) {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
brotli_reg_t val_; /* pre-fetched bits */
|
brotli_reg_t val_; /* pre-fetched bits */
|
||||||
uint32_t bit_pos_; /* current bit-reading position in val_ */
|
brotli_reg_t bit_pos_; /* current bit-reading position in val_ */
|
||||||
const uint8_t* next_in; /* the byte we're reading from */
|
const uint8_t* next_in; /* the byte we're reading from */
|
||||||
size_t avail_in;
|
const uint8_t* guard_in; /* position from which "fast-path" is prohibited */
|
||||||
|
const uint8_t* last_in; /* == next_in + avail_in */
|
||||||
} BrotliBitReader;
|
} BrotliBitReader;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
brotli_reg_t val_;
|
brotli_reg_t val_;
|
||||||
uint32_t bit_pos_;
|
brotli_reg_t bit_pos_;
|
||||||
const uint8_t* next_in;
|
const uint8_t* next_in;
|
||||||
size_t avail_in;
|
size_t avail_in;
|
||||||
} BrotliBitReaderState;
|
} BrotliBitReaderState;
|
||||||
|
|
||||||
/* Initializes the BrotliBitReader fields. */
|
/* Initializes the BrotliBitReader fields. */
|
||||||
BROTLI_INTERNAL void BrotliInitBitReader(BrotliBitReader* const br);
|
BROTLI_INTERNAL void BrotliInitBitReader(BrotliBitReader* br);
|
||||||
|
|
||||||
/* Ensures that accumulator is not empty.
|
/* Ensures that accumulator is not empty.
|
||||||
May consume up to sizeof(brotli_reg_t) - 1 bytes of input.
|
May consume up to sizeof(brotli_reg_t) - 1 bytes of input.
|
||||||
Returns BROTLI_FALSE if data is required but there is no input available.
|
Returns BROTLI_FALSE if data is required but there is no input available.
|
||||||
For !BROTLI_UNALIGNED_READ_FAST this function also prepares bit reader for
|
For !BROTLI_UNALIGNED_READ_FAST this function also prepares bit reader for
|
||||||
aligned reading. */
|
aligned reading. */
|
||||||
BROTLI_INTERNAL BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br);
|
BROTLI_INTERNAL BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* br);
|
||||||
|
|
||||||
/* Fallback for BrotliSafeReadBits32. Extracted as noninlined method to unburden
|
/* Fallback for BrotliSafeReadBits32. Extracted as noninlined method to unburden
|
||||||
the main code-path. Never called for RFC brotli streams, required only for
|
the main code-path. Never called for RFC brotli streams, required only for
|
||||||
"large-window" mode and other extensions. */
|
"large-window" mode and other extensions. */
|
||||||
BROTLI_INTERNAL BROTLI_NOINLINE BROTLI_BOOL BrotliSafeReadBits32Slow(
|
BROTLI_INTERNAL BROTLI_NOINLINE BROTLI_BOOL BrotliSafeReadBits32Slow(
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val);
|
BrotliBitReader* br, brotli_reg_t n_bits, brotli_reg_t* val);
|
||||||
|
|
||||||
|
static BROTLI_INLINE size_t
|
||||||
|
BrotliBitReaderGetAvailIn(BrotliBitReader* const br) {
|
||||||
|
return (size_t)(br->last_in - br->next_in);
|
||||||
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE void BrotliBitReaderSaveState(
|
static BROTLI_INLINE void BrotliBitReaderSaveState(
|
||||||
BrotliBitReader* const from, BrotliBitReaderState* to) {
|
BrotliBitReader* const from, BrotliBitReaderState* to) {
|
||||||
to->val_ = from->val_;
|
to->val_ = from->val_;
|
||||||
to->bit_pos_ = from->bit_pos_;
|
to->bit_pos_ = from->bit_pos_;
|
||||||
to->next_in = from->next_in;
|
to->next_in = from->next_in;
|
||||||
to->avail_in = from->avail_in;
|
to->avail_in = BrotliBitReaderGetAvailIn(from);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BROTLI_INLINE void BrotliBitReaderSetInput(
|
||||||
|
BrotliBitReader* const br, const uint8_t* next_in, size_t avail_in) {
|
||||||
|
br->next_in = next_in;
|
||||||
|
br->last_in = (avail_in == 0) ? next_in : (next_in + avail_in);
|
||||||
|
if (avail_in + 1 > BROTLI_FAST_INPUT_SLACK) {
|
||||||
|
br->guard_in = next_in + (avail_in + 1 - BROTLI_FAST_INPUT_SLACK);
|
||||||
|
} else {
|
||||||
|
br->guard_in = next_in;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE void BrotliBitReaderRestoreState(
|
static BROTLI_INLINE void BrotliBitReaderRestoreState(
|
||||||
|
@ -77,12 +97,12 @@ static BROTLI_INLINE void BrotliBitReaderRestoreState(
|
||||||
to->val_ = from->val_;
|
to->val_ = from->val_;
|
||||||
to->bit_pos_ = from->bit_pos_;
|
to->bit_pos_ = from->bit_pos_;
|
||||||
to->next_in = from->next_in;
|
to->next_in = from->next_in;
|
||||||
to->avail_in = from->avail_in;
|
BrotliBitReaderSetInput(to, from->next_in, from->avail_in);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE uint32_t BrotliGetAvailableBits(
|
static BROTLI_INLINE brotli_reg_t BrotliGetAvailableBits(
|
||||||
const BrotliBitReader* br) {
|
const BrotliBitReader* br) {
|
||||||
return (BROTLI_64_BITS ? 64 : 32) - br->bit_pos_;
|
return br->bit_pos_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns amount of unread bytes the bit reader still has buffered from the
|
/* Returns amount of unread bytes the bit reader still has buffered from the
|
||||||
|
@ -90,15 +110,27 @@ static BROTLI_INLINE uint32_t BrotliGetAvailableBits(
|
||||||
maximal ring-buffer size (larger number won't be utilized anyway). */
|
maximal ring-buffer size (larger number won't be utilized anyway). */
|
||||||
static BROTLI_INLINE size_t BrotliGetRemainingBytes(BrotliBitReader* br) {
|
static BROTLI_INLINE size_t BrotliGetRemainingBytes(BrotliBitReader* br) {
|
||||||
static const size_t kCap = (size_t)1 << BROTLI_LARGE_MAX_WBITS;
|
static const size_t kCap = (size_t)1 << BROTLI_LARGE_MAX_WBITS;
|
||||||
if (br->avail_in > kCap) return kCap;
|
size_t avail_in = BrotliBitReaderGetAvailIn(br);
|
||||||
return br->avail_in + (BrotliGetAvailableBits(br) >> 3);
|
if (avail_in > kCap) return kCap;
|
||||||
|
return avail_in + (BrotliGetAvailableBits(br) >> 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks if there is at least |num| bytes left in the input ring-buffer
|
/* Checks if there is at least |num| bytes left in the input ring-buffer
|
||||||
(excluding the bits remaining in br->val_). */
|
(excluding the bits remaining in br->val_). */
|
||||||
static BROTLI_INLINE BROTLI_BOOL BrotliCheckInputAmount(
|
static BROTLI_INLINE BROTLI_BOOL BrotliCheckInputAmount(
|
||||||
BrotliBitReader* const br, size_t num) {
|
BrotliBitReader* const br) {
|
||||||
return TO_BROTLI_BOOL(br->avail_in >= num);
|
return TO_BROTLI_BOOL(br->next_in < br->guard_in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load more bits into accumulator. */
|
||||||
|
static BROTLI_INLINE brotli_reg_t BrotliBitReaderLoadBits(brotli_reg_t val,
|
||||||
|
brotli_reg_t new_bits,
|
||||||
|
brotli_reg_t count,
|
||||||
|
brotli_reg_t offset) {
|
||||||
|
BROTLI_DCHECK(
|
||||||
|
!((val >> offset) & ~new_bits & ~(~((brotli_reg_t)0) << count)));
|
||||||
|
(void)count;
|
||||||
|
return val | (new_bits << offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Guarantees that there are at least |n_bits| + 1 bits in accumulator.
|
/* Guarantees that there are at least |n_bits| + 1 bits in accumulator.
|
||||||
|
@ -106,61 +138,51 @@ static BROTLI_INLINE BROTLI_BOOL BrotliCheckInputAmount(
|
||||||
|n_bits| should be in the range [1..24] for regular build. For portable
|
|n_bits| should be in the range [1..24] for regular build. For portable
|
||||||
non-64-bit little-endian build only 16 bits are safe to request. */
|
non-64-bit little-endian build only 16 bits are safe to request. */
|
||||||
static BROTLI_INLINE void BrotliFillBitWindow(
|
static BROTLI_INLINE void BrotliFillBitWindow(
|
||||||
BrotliBitReader* const br, uint32_t n_bits) {
|
BrotliBitReader* const br, brotli_reg_t n_bits) {
|
||||||
#if (BROTLI_64_BITS)
|
#if (BROTLI_64_BITS)
|
||||||
if (BROTLI_UNALIGNED_READ_FAST && BROTLI_IS_CONSTANT(n_bits) &&
|
if (BROTLI_UNALIGNED_READ_FAST && BROTLI_IS_CONSTANT(n_bits) &&
|
||||||
(n_bits <= 8)) {
|
(n_bits <= 8)) {
|
||||||
uint32_t bit_pos = br->bit_pos_;
|
brotli_reg_t bit_pos = br->bit_pos_;
|
||||||
if (bit_pos >= 56) {
|
if (bit_pos <= 8) {
|
||||||
br->val_ =
|
br->val_ = BrotliBitReaderLoadBits(br->val_,
|
||||||
(br->val_ >> 56) | (BROTLI_UNALIGNED_LOAD64LE(br->next_in) << 8);
|
BROTLI_UNALIGNED_LOAD64LE(br->next_in), 56, bit_pos);
|
||||||
br->bit_pos_ =
|
br->bit_pos_ = bit_pos + 56;
|
||||||
bit_pos ^ 56; /* here same as -= 56 because of the if condition */
|
|
||||||
br->avail_in -= 7;
|
|
||||||
br->next_in += 7;
|
br->next_in += 7;
|
||||||
}
|
}
|
||||||
} else if (BROTLI_UNALIGNED_READ_FAST && BROTLI_IS_CONSTANT(n_bits) &&
|
} else if (BROTLI_UNALIGNED_READ_FAST && BROTLI_IS_CONSTANT(n_bits) &&
|
||||||
(n_bits <= 16)) {
|
(n_bits <= 16)) {
|
||||||
uint32_t bit_pos = br->bit_pos_;
|
brotli_reg_t bit_pos = br->bit_pos_;
|
||||||
if (bit_pos >= 48) {
|
if (bit_pos <= 16) {
|
||||||
br->val_ =
|
br->val_ = BrotliBitReaderLoadBits(br->val_,
|
||||||
(br->val_ >> 48) | (BROTLI_UNALIGNED_LOAD64LE(br->next_in) << 16);
|
BROTLI_UNALIGNED_LOAD64LE(br->next_in), 48, bit_pos);
|
||||||
br->bit_pos_ =
|
br->bit_pos_ = bit_pos + 48;
|
||||||
bit_pos ^ 48; /* here same as -= 48 because of the if condition */
|
|
||||||
br->avail_in -= 6;
|
|
||||||
br->next_in += 6;
|
br->next_in += 6;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint32_t bit_pos = br->bit_pos_;
|
brotli_reg_t bit_pos = br->bit_pos_;
|
||||||
if (bit_pos >= 32) {
|
if (bit_pos <= 32) {
|
||||||
br->val_ = (br->val_ >> 32) |
|
br->val_ = BrotliBitReaderLoadBits(br->val_,
|
||||||
(((uint64_t)BROTLI_UNALIGNED_LOAD32LE(br->next_in)) << 32);
|
(uint64_t)BROTLI_UNALIGNED_LOAD32LE(br->next_in), 32, bit_pos);
|
||||||
br->bit_pos_ =
|
br->bit_pos_ = bit_pos + 32;
|
||||||
bit_pos ^ 32; /* here same as -= 32 because of the if condition */
|
|
||||||
br->avail_in -= BROTLI_SHORT_FILL_BIT_WINDOW_READ;
|
|
||||||
br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
|
br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (BROTLI_UNALIGNED_READ_FAST && BROTLI_IS_CONSTANT(n_bits) &&
|
if (BROTLI_UNALIGNED_READ_FAST && BROTLI_IS_CONSTANT(n_bits) &&
|
||||||
(n_bits <= 8)) {
|
(n_bits <= 8)) {
|
||||||
uint32_t bit_pos = br->bit_pos_;
|
brotli_reg_t bit_pos = br->bit_pos_;
|
||||||
if (bit_pos >= 24) {
|
if (bit_pos <= 8) {
|
||||||
br->val_ =
|
br->val_ = BrotliBitReaderLoadBits(br->val_,
|
||||||
(br->val_ >> 24) | (BROTLI_UNALIGNED_LOAD32LE(br->next_in) << 8);
|
BROTLI_UNALIGNED_LOAD32LE(br->next_in), 24, bit_pos);
|
||||||
br->bit_pos_ =
|
br->bit_pos_ = bit_pos + 24;
|
||||||
bit_pos ^ 24; /* here same as -= 24 because of the if condition */
|
|
||||||
br->avail_in -= 3;
|
|
||||||
br->next_in += 3;
|
br->next_in += 3;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint32_t bit_pos = br->bit_pos_;
|
brotli_reg_t bit_pos = br->bit_pos_;
|
||||||
if (bit_pos >= 16) {
|
if (bit_pos <= 16) {
|
||||||
br->val_ = (br->val_ >> 16) |
|
br->val_ = BrotliBitReaderLoadBits(br->val_,
|
||||||
(((uint32_t)BROTLI_UNALIGNED_LOAD16LE(br->next_in)) << 16);
|
(uint32_t)BROTLI_UNALIGNED_LOAD16LE(br->next_in), 16, bit_pos);
|
||||||
br->bit_pos_ =
|
br->bit_pos_ = bit_pos + 16;
|
||||||
bit_pos ^ 16; /* here same as -= 16 because of the if condition */
|
|
||||||
br->avail_in -= BROTLI_SHORT_FILL_BIT_WINDOW_READ;
|
|
||||||
br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
|
br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,17 +198,12 @@ static BROTLI_INLINE void BrotliFillBitWindow16(BrotliBitReader* const br) {
|
||||||
/* Tries to pull one byte of input to accumulator.
|
/* Tries to pull one byte of input to accumulator.
|
||||||
Returns BROTLI_FALSE if there is no input available. */
|
Returns BROTLI_FALSE if there is no input available. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL BrotliPullByte(BrotliBitReader* const br) {
|
static BROTLI_INLINE BROTLI_BOOL BrotliPullByte(BrotliBitReader* const br) {
|
||||||
if (br->avail_in == 0) {
|
if (br->next_in == br->last_in) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
br->val_ >>= 8;
|
br->val_ = BrotliBitReaderLoadBits(br->val_,
|
||||||
#if (BROTLI_64_BITS)
|
(brotli_reg_t)*br->next_in, 8, br->bit_pos_);
|
||||||
br->val_ |= ((uint64_t)*br->next_in) << 56;
|
br->bit_pos_ += 8;
|
||||||
#else
|
|
||||||
br->val_ |= ((uint32_t)*br->next_in) << 24;
|
|
||||||
#endif
|
|
||||||
br->bit_pos_ -= 8;
|
|
||||||
--br->avail_in;
|
|
||||||
++br->next_in;
|
++br->next_in;
|
||||||
return BROTLI_TRUE;
|
return BROTLI_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -195,81 +212,90 @@ static BROTLI_INLINE BROTLI_BOOL BrotliPullByte(BrotliBitReader* const br) {
|
||||||
The number of valid bits could be calculated by BrotliGetAvailableBits. */
|
The number of valid bits could be calculated by BrotliGetAvailableBits. */
|
||||||
static BROTLI_INLINE brotli_reg_t BrotliGetBitsUnmasked(
|
static BROTLI_INLINE brotli_reg_t BrotliGetBitsUnmasked(
|
||||||
BrotliBitReader* const br) {
|
BrotliBitReader* const br) {
|
||||||
return br->val_ >> br->bit_pos_;
|
return br->val_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like BrotliGetBits, but does not mask the result.
|
/* Like BrotliGetBits, but does not mask the result.
|
||||||
The result contains at least 16 valid bits. */
|
The result contains at least 16 valid bits. */
|
||||||
static BROTLI_INLINE uint32_t BrotliGet16BitsUnmasked(
|
static BROTLI_INLINE brotli_reg_t BrotliGet16BitsUnmasked(
|
||||||
BrotliBitReader* const br) {
|
BrotliBitReader* const br) {
|
||||||
BrotliFillBitWindow(br, 16);
|
BrotliFillBitWindow(br, 16);
|
||||||
return (uint32_t)BrotliGetBitsUnmasked(br);
|
return (brotli_reg_t)BrotliGetBitsUnmasked(br);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the specified number of bits from |br| without advancing bit
|
/* Returns the specified number of bits from |br| without advancing bit
|
||||||
position. */
|
position. */
|
||||||
static BROTLI_INLINE uint32_t BrotliGetBits(
|
static BROTLI_INLINE brotli_reg_t BrotliGetBits(
|
||||||
BrotliBitReader* const br, uint32_t n_bits) {
|
BrotliBitReader* const br, brotli_reg_t n_bits) {
|
||||||
BrotliFillBitWindow(br, n_bits);
|
BrotliFillBitWindow(br, n_bits);
|
||||||
return (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
|
return BrotliGetBitsUnmasked(br) & BitMask(n_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tries to peek the specified amount of bits. Returns BROTLI_FALSE, if there
|
/* Tries to peek the specified amount of bits. Returns BROTLI_FALSE, if there
|
||||||
is not enough input. */
|
is not enough input. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL BrotliSafeGetBits(
|
static BROTLI_INLINE BROTLI_BOOL BrotliSafeGetBits(
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
|
BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
|
||||||
while (BrotliGetAvailableBits(br) < n_bits) {
|
while (BrotliGetAvailableBits(br) < n_bits) {
|
||||||
if (!BrotliPullByte(br)) {
|
if (!BrotliPullByte(br)) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
|
*val = BrotliGetBitsUnmasked(br) & BitMask(n_bits);
|
||||||
return BROTLI_TRUE;
|
return BROTLI_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advances the bit pos by |n_bits|. */
|
/* Advances the bit pos by |n_bits|. */
|
||||||
static BROTLI_INLINE void BrotliDropBits(
|
static BROTLI_INLINE void BrotliDropBits(
|
||||||
BrotliBitReader* const br, uint32_t n_bits) {
|
BrotliBitReader* const br, brotli_reg_t n_bits) {
|
||||||
br->bit_pos_ += n_bits;
|
br->bit_pos_ -= n_bits;
|
||||||
|
br->val_ >>= n_bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure that there are no spectre bits in accumulator.
|
||||||
|
This is important for the cases when some bytes are skipped
|
||||||
|
(i.e. never placed into accumulator). */
|
||||||
|
static BROTLI_INLINE void BrotliBitReaderNormalize(BrotliBitReader* br) {
|
||||||
|
/* Actually, it is enough to normalize when br->bit_pos_ == 0 */
|
||||||
|
if (br->bit_pos_ < (sizeof(brotli_reg_t) << 3u)) {
|
||||||
|
br->val_ &= (((brotli_reg_t)1) << br->bit_pos_) - 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE void BrotliBitReaderUnload(BrotliBitReader* br) {
|
static BROTLI_INLINE void BrotliBitReaderUnload(BrotliBitReader* br) {
|
||||||
uint32_t unused_bytes = BrotliGetAvailableBits(br) >> 3;
|
brotli_reg_t unused_bytes = BrotliGetAvailableBits(br) >> 3;
|
||||||
uint32_t unused_bits = unused_bytes << 3;
|
brotli_reg_t unused_bits = unused_bytes << 3;
|
||||||
br->avail_in += unused_bytes;
|
br->next_in =
|
||||||
br->next_in -= unused_bytes;
|
(unused_bytes == 0) ? br->next_in : (br->next_in - unused_bytes);
|
||||||
if (unused_bits == sizeof(br->val_) << 3) {
|
br->bit_pos_ -= unused_bits;
|
||||||
br->val_ = 0;
|
BrotliBitReaderNormalize(br);
|
||||||
} else {
|
|
||||||
br->val_ <<= unused_bits;
|
|
||||||
}
|
|
||||||
br->bit_pos_ += unused_bits;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reads the specified number of bits from |br| and advances the bit pos.
|
/* Reads the specified number of bits from |br| and advances the bit pos.
|
||||||
Precondition: accumulator MUST contain at least |n_bits|. */
|
Precondition: accumulator MUST contain at least |n_bits|. */
|
||||||
static BROTLI_INLINE void BrotliTakeBits(
|
static BROTLI_INLINE void BrotliTakeBits(BrotliBitReader* const br,
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
|
brotli_reg_t n_bits,
|
||||||
*val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
|
brotli_reg_t* val) {
|
||||||
|
*val = BrotliGetBitsUnmasked(br) & BitMask(n_bits);
|
||||||
BROTLI_LOG(("[BrotliTakeBits] %d %d %d val: %6x\n",
|
BROTLI_LOG(("[BrotliTakeBits] %d %d %d val: %6x\n",
|
||||||
(int)br->avail_in, (int)br->bit_pos_, (int)n_bits, (int)*val));
|
(int)BrotliBitReaderGetAvailIn(br), (int)br->bit_pos_,
|
||||||
|
(int)n_bits, (int)*val));
|
||||||
BrotliDropBits(br, n_bits);
|
BrotliDropBits(br, n_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reads the specified number of bits from |br| and advances the bit pos.
|
/* Reads the specified number of bits from |br| and advances the bit pos.
|
||||||
Assumes that there is enough input to perform BrotliFillBitWindow.
|
Assumes that there is enough input to perform BrotliFillBitWindow.
|
||||||
Up to 24 bits are allowed to be requested from this method. */
|
Up to 24 bits are allowed to be requested from this method. */
|
||||||
static BROTLI_INLINE uint32_t BrotliReadBits24(
|
static BROTLI_INLINE brotli_reg_t BrotliReadBits24(
|
||||||
BrotliBitReader* const br, uint32_t n_bits) {
|
BrotliBitReader* const br, brotli_reg_t n_bits) {
|
||||||
BROTLI_DCHECK(n_bits <= 24);
|
BROTLI_DCHECK(n_bits <= 24);
|
||||||
if (BROTLI_64_BITS || (n_bits <= 16)) {
|
if (BROTLI_64_BITS || (n_bits <= 16)) {
|
||||||
uint32_t val;
|
brotli_reg_t val;
|
||||||
BrotliFillBitWindow(br, n_bits);
|
BrotliFillBitWindow(br, n_bits);
|
||||||
BrotliTakeBits(br, n_bits, &val);
|
BrotliTakeBits(br, n_bits, &val);
|
||||||
return val;
|
return val;
|
||||||
} else {
|
} else {
|
||||||
uint32_t low_val;
|
brotli_reg_t low_val;
|
||||||
uint32_t high_val;
|
brotli_reg_t high_val;
|
||||||
BrotliFillBitWindow(br, 16);
|
BrotliFillBitWindow(br, 16);
|
||||||
BrotliTakeBits(br, 16, &low_val);
|
BrotliTakeBits(br, 16, &low_val);
|
||||||
BrotliFillBitWindow(br, 8);
|
BrotliFillBitWindow(br, 8);
|
||||||
|
@ -279,17 +305,17 @@ static BROTLI_INLINE uint32_t BrotliReadBits24(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same as BrotliReadBits24, but allows reading up to 32 bits. */
|
/* Same as BrotliReadBits24, but allows reading up to 32 bits. */
|
||||||
static BROTLI_INLINE uint32_t BrotliReadBits32(
|
static BROTLI_INLINE brotli_reg_t BrotliReadBits32(
|
||||||
BrotliBitReader* const br, uint32_t n_bits) {
|
BrotliBitReader* const br, brotli_reg_t n_bits) {
|
||||||
BROTLI_DCHECK(n_bits <= 32);
|
BROTLI_DCHECK(n_bits <= 32);
|
||||||
if (BROTLI_64_BITS || (n_bits <= 16)) {
|
if (BROTLI_64_BITS || (n_bits <= 16)) {
|
||||||
uint32_t val;
|
brotli_reg_t val;
|
||||||
BrotliFillBitWindow(br, n_bits);
|
BrotliFillBitWindow(br, n_bits);
|
||||||
BrotliTakeBits(br, n_bits, &val);
|
BrotliTakeBits(br, n_bits, &val);
|
||||||
return val;
|
return val;
|
||||||
} else {
|
} else {
|
||||||
uint32_t low_val;
|
brotli_reg_t low_val;
|
||||||
uint32_t high_val;
|
brotli_reg_t high_val;
|
||||||
BrotliFillBitWindow(br, 16);
|
BrotliFillBitWindow(br, 16);
|
||||||
BrotliTakeBits(br, 16, &low_val);
|
BrotliTakeBits(br, 16, &low_val);
|
||||||
BrotliFillBitWindow(br, 16);
|
BrotliFillBitWindow(br, 16);
|
||||||
|
@ -302,7 +328,7 @@ static BROTLI_INLINE uint32_t BrotliReadBits32(
|
||||||
is not enough input. |n_bits| MUST be positive.
|
is not enough input. |n_bits| MUST be positive.
|
||||||
Up to 24 bits are allowed to be requested from this method. */
|
Up to 24 bits are allowed to be requested from this method. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits(
|
static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits(
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
|
BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
|
||||||
BROTLI_DCHECK(n_bits <= 24);
|
BROTLI_DCHECK(n_bits <= 24);
|
||||||
while (BrotliGetAvailableBits(br) < n_bits) {
|
while (BrotliGetAvailableBits(br) < n_bits) {
|
||||||
if (!BrotliPullByte(br)) {
|
if (!BrotliPullByte(br)) {
|
||||||
|
@ -315,7 +341,7 @@ static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits(
|
||||||
|
|
||||||
/* Same as BrotliSafeReadBits, but allows reading up to 32 bits. */
|
/* Same as BrotliSafeReadBits, but allows reading up to 32 bits. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits32(
|
static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits32(
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
|
BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
|
||||||
BROTLI_DCHECK(n_bits <= 32);
|
BROTLI_DCHECK(n_bits <= 32);
|
||||||
if (BROTLI_64_BITS || (n_bits <= 24)) {
|
if (BROTLI_64_BITS || (n_bits <= 24)) {
|
||||||
while (BrotliGetAvailableBits(br) < n_bits) {
|
while (BrotliGetAvailableBits(br) < n_bits) {
|
||||||
|
@ -333,16 +359,19 @@ static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits32(
|
||||||
/* Advances the bit reader position to the next byte boundary and verifies
|
/* Advances the bit reader position to the next byte boundary and verifies
|
||||||
that any skipped bits are set to zero. */
|
that any skipped bits are set to zero. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL BrotliJumpToByteBoundary(BrotliBitReader* br) {
|
static BROTLI_INLINE BROTLI_BOOL BrotliJumpToByteBoundary(BrotliBitReader* br) {
|
||||||
uint32_t pad_bits_count = BrotliGetAvailableBits(br) & 0x7;
|
brotli_reg_t pad_bits_count = BrotliGetAvailableBits(br) & 0x7;
|
||||||
uint32_t pad_bits = 0;
|
brotli_reg_t pad_bits = 0;
|
||||||
if (pad_bits_count != 0) {
|
if (pad_bits_count != 0) {
|
||||||
BrotliTakeBits(br, pad_bits_count, &pad_bits);
|
BrotliTakeBits(br, pad_bits_count, &pad_bits);
|
||||||
}
|
}
|
||||||
|
BrotliBitReaderNormalize(br);
|
||||||
return TO_BROTLI_BOOL(pad_bits == 0);
|
return TO_BROTLI_BOOL(pad_bits == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE void BrotliDropBytes(BrotliBitReader* br, size_t num) {
|
static BROTLI_INLINE void BrotliDropBytes(BrotliBitReader* br, size_t num) {
|
||||||
br->avail_in -= num;
|
/* Check detour is legal: accumulator must to be empty. */
|
||||||
|
BROTLI_DCHECK(br->bit_pos_ == 0);
|
||||||
|
BROTLI_DCHECK(br->val_ == 0);
|
||||||
br->next_in += num;
|
br->next_in += num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,12 +386,36 @@ static BROTLI_INLINE void BrotliCopyBytes(uint8_t* dest,
|
||||||
++dest;
|
++dest;
|
||||||
--num;
|
--num;
|
||||||
}
|
}
|
||||||
|
BrotliBitReaderNormalize(br);
|
||||||
if (num > 0) {
|
if (num > 0) {
|
||||||
memcpy(dest, br->next_in, num);
|
memcpy(dest, br->next_in, num);
|
||||||
BrotliDropBytes(br, num);
|
BrotliDropBytes(br, num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BROTLI_UNUSED_FUNCTION void BrotliBitReaderSuppressUnusedFunctions(void) {
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderSuppressUnusedFunctions);
|
||||||
|
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderGetAvailIn);
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderLoadBits);
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderRestoreState);
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderSaveState);
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderSetInput);
|
||||||
|
BROTLI_UNUSED(&BrotliBitReaderUnload);
|
||||||
|
BROTLI_UNUSED(&BrotliCheckInputAmount);
|
||||||
|
BROTLI_UNUSED(&BrotliCopyBytes);
|
||||||
|
BROTLI_UNUSED(&BrotliFillBitWindow16);
|
||||||
|
BROTLI_UNUSED(&BrotliGet16BitsUnmasked);
|
||||||
|
BROTLI_UNUSED(&BrotliGetBits);
|
||||||
|
BROTLI_UNUSED(&BrotliGetRemainingBytes);
|
||||||
|
BROTLI_UNUSED(&BrotliJumpToByteBoundary);
|
||||||
|
BROTLI_UNUSED(&BrotliReadBits24);
|
||||||
|
BROTLI_UNUSED(&BrotliReadBits32);
|
||||||
|
BROTLI_UNUSED(&BrotliSafeGetBits);
|
||||||
|
BROTLI_UNUSED(&BrotliSafeReadBits);
|
||||||
|
BROTLI_UNUSED(&BrotliSafeReadBits32);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__cplusplus) || defined(c_plusplus)
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
342
thirdparty/brotli/dec/decode.c
vendored
342
thirdparty/brotli/dec/decode.c
vendored
|
@ -44,7 +44,7 @@ extern "C" {
|
||||||
- doing up to two 16-byte copies for fast backward copying
|
- doing up to two 16-byte copies for fast backward copying
|
||||||
- inserting transformed dictionary word:
|
- inserting transformed dictionary word:
|
||||||
255 prefix + 32 base + 255 suffix */
|
255 prefix + 32 base + 255 suffix */
|
||||||
static const uint32_t kRingBufferWriteAheadSlack = 542;
|
static const brotli_reg_t kRingBufferWriteAheadSlack = 542;
|
||||||
|
|
||||||
static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = {
|
static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = {
|
||||||
1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||||
|
@ -116,6 +116,10 @@ static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
|
||||||
BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
|
BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
|
||||||
s->error_code = (int)e;
|
s->error_code = (int)e;
|
||||||
s->used_input += consumed_input;
|
s->used_input += consumed_input;
|
||||||
|
if ((s->buffer_length != 0) && (s->br.next_in == s->br.last_in)) {
|
||||||
|
/* If internal buffer is depleted at last, reset it. */
|
||||||
|
s->buffer_length = 0;
|
||||||
|
}
|
||||||
switch (e) {
|
switch (e) {
|
||||||
case BROTLI_DECODER_SUCCESS:
|
case BROTLI_DECODER_SUCCESS:
|
||||||
return BROTLI_DECODER_RESULT_SUCCESS;
|
return BROTLI_DECODER_RESULT_SUCCESS;
|
||||||
|
@ -135,7 +139,7 @@ static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
|
||||||
Precondition: bit-reader accumulator has at least 8 bits. */
|
Precondition: bit-reader accumulator has at least 8 bits. */
|
||||||
static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
|
static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
|
||||||
BrotliBitReader* br) {
|
BrotliBitReader* br) {
|
||||||
uint32_t n;
|
brotli_reg_t n;
|
||||||
BROTLI_BOOL large_window = s->large_window;
|
BROTLI_BOOL large_window = s->large_window;
|
||||||
s->large_window = BROTLI_FALSE;
|
s->large_window = BROTLI_FALSE;
|
||||||
BrotliTakeBits(br, 1, &n);
|
BrotliTakeBits(br, 1, &n);
|
||||||
|
@ -145,7 +149,7 @@ static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
|
||||||
}
|
}
|
||||||
BrotliTakeBits(br, 3, &n);
|
BrotliTakeBits(br, 3, &n);
|
||||||
if (n != 0) {
|
if (n != 0) {
|
||||||
s->window_bits = 17 + n;
|
s->window_bits = (17u + n) & 63u;
|
||||||
return BROTLI_DECODER_SUCCESS;
|
return BROTLI_DECODER_SUCCESS;
|
||||||
}
|
}
|
||||||
BrotliTakeBits(br, 3, &n);
|
BrotliTakeBits(br, 3, &n);
|
||||||
|
@ -162,7 +166,7 @@ static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (n != 0) {
|
if (n != 0) {
|
||||||
s->window_bits = 8 + n;
|
s->window_bits = (8u + n) & 63u;
|
||||||
return BROTLI_DECODER_SUCCESS;
|
return BROTLI_DECODER_SUCCESS;
|
||||||
}
|
}
|
||||||
s->window_bits = 17;
|
s->window_bits = 17;
|
||||||
|
@ -181,8 +185,8 @@ static BROTLI_INLINE void memmove16(uint8_t* dst, uint8_t* src) {
|
||||||
|
|
||||||
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
|
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
|
||||||
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
|
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
|
||||||
BrotliDecoderState* s, BrotliBitReader* br, uint32_t* value) {
|
BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
switch (s->substate_decode_uint8) {
|
switch (s->substate_decode_uint8) {
|
||||||
case BROTLI_STATE_DECODE_UINT8_NONE:
|
case BROTLI_STATE_DECODE_UINT8_NONE:
|
||||||
if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
|
if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
|
||||||
|
@ -226,7 +230,7 @@ static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
|
||||||
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
|
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
|
||||||
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
|
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
|
||||||
BrotliDecoderState* s, BrotliBitReader* br) {
|
BrotliDecoderState* s, BrotliBitReader* br) {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
int i;
|
int i;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (s->substate_metablock_header) {
|
switch (s->substate_metablock_header) {
|
||||||
|
@ -349,13 +353,13 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
|
||||||
This method doesn't read data from the bit reader, BUT drops the amount of
|
This method doesn't read data from the bit reader, BUT drops the amount of
|
||||||
bits that correspond to the decoded symbol.
|
bits that correspond to the decoded symbol.
|
||||||
bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
|
bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
|
||||||
static BROTLI_INLINE uint32_t DecodeSymbol(uint32_t bits,
|
static BROTLI_INLINE brotli_reg_t DecodeSymbol(brotli_reg_t bits,
|
||||||
const HuffmanCode* table,
|
const HuffmanCode* table,
|
||||||
BrotliBitReader* br) {
|
BrotliBitReader* br) {
|
||||||
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
|
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
|
||||||
BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
|
BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
|
||||||
if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
|
if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
|
||||||
uint32_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
|
brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
|
||||||
BrotliDropBits(br, HUFFMAN_TABLE_BITS);
|
BrotliDropBits(br, HUFFMAN_TABLE_BITS);
|
||||||
BROTLI_HC_ADJUST_TABLE_INDEX(table,
|
BROTLI_HC_ADJUST_TABLE_INDEX(table,
|
||||||
BROTLI_HC_FAST_LOAD_VALUE(table) +
|
BROTLI_HC_FAST_LOAD_VALUE(table) +
|
||||||
|
@ -367,17 +371,17 @@ static BROTLI_INLINE uint32_t DecodeSymbol(uint32_t bits,
|
||||||
|
|
||||||
/* Reads and decodes the next Huffman code from bit-stream.
|
/* Reads and decodes the next Huffman code from bit-stream.
|
||||||
This method peeks 16 bits of input and drops 0 - 15 of them. */
|
This method peeks 16 bits of input and drops 0 - 15 of them. */
|
||||||
static BROTLI_INLINE uint32_t ReadSymbol(const HuffmanCode* table,
|
static BROTLI_INLINE brotli_reg_t ReadSymbol(const HuffmanCode* table,
|
||||||
BrotliBitReader* br) {
|
BrotliBitReader* br) {
|
||||||
return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
|
return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
|
/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
|
||||||
input are currently available. */
|
input are currently available. */
|
||||||
static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
|
static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
|
||||||
const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
|
const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
|
||||||
uint32_t val;
|
brotli_reg_t val;
|
||||||
uint32_t available_bits = BrotliGetAvailableBits(br);
|
brotli_reg_t available_bits = BrotliGetAvailableBits(br);
|
||||||
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
|
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
|
||||||
if (available_bits == 0) {
|
if (available_bits == 0) {
|
||||||
if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
|
if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
|
||||||
|
@ -386,7 +390,7 @@ static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
|
||||||
}
|
}
|
||||||
return BROTLI_FALSE; /* No valid bits at all. */
|
return BROTLI_FALSE; /* No valid bits at all. */
|
||||||
}
|
}
|
||||||
val = (uint32_t)BrotliGetBitsUnmasked(br);
|
val = BrotliGetBitsUnmasked(br);
|
||||||
BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
|
BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
|
||||||
if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
|
if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
|
||||||
if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
|
if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
|
||||||
|
@ -415,8 +419,8 @@ static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
|
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
|
||||||
const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
|
const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
|
||||||
uint32_t val;
|
brotli_reg_t val;
|
||||||
if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
|
if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
|
||||||
*result = DecodeSymbol(val, table, br);
|
*result = DecodeSymbol(val, table, br);
|
||||||
return BROTLI_TRUE;
|
return BROTLI_TRUE;
|
||||||
|
@ -428,8 +432,8 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
|
||||||
static BROTLI_INLINE void PreloadSymbol(int safe,
|
static BROTLI_INLINE void PreloadSymbol(int safe,
|
||||||
const HuffmanCode* table,
|
const HuffmanCode* table,
|
||||||
BrotliBitReader* br,
|
BrotliBitReader* br,
|
||||||
uint32_t* bits,
|
brotli_reg_t* bits,
|
||||||
uint32_t* value) {
|
brotli_reg_t* value) {
|
||||||
if (safe) {
|
if (safe) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -441,15 +445,15 @@ static BROTLI_INLINE void PreloadSymbol(int safe,
|
||||||
|
|
||||||
/* Decodes the next Huffman code using data prepared by PreloadSymbol.
|
/* Decodes the next Huffman code using data prepared by PreloadSymbol.
|
||||||
Reads 0 - 15 bits. Also peeks 8 following bits. */
|
Reads 0 - 15 bits. Also peeks 8 following bits. */
|
||||||
static BROTLI_INLINE uint32_t ReadPreloadedSymbol(const HuffmanCode* table,
|
static BROTLI_INLINE brotli_reg_t ReadPreloadedSymbol(const HuffmanCode* table,
|
||||||
BrotliBitReader* br,
|
BrotliBitReader* br,
|
||||||
uint32_t* bits,
|
brotli_reg_t* bits,
|
||||||
uint32_t* value) {
|
brotli_reg_t* value) {
|
||||||
uint32_t result = *value;
|
brotli_reg_t result = *value;
|
||||||
if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
|
if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
|
||||||
uint32_t val = BrotliGet16BitsUnmasked(br);
|
brotli_reg_t val = BrotliGet16BitsUnmasked(br);
|
||||||
const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
|
const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
|
||||||
uint32_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
|
brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
|
||||||
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
|
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
|
||||||
BrotliDropBits(br, HUFFMAN_TABLE_BITS);
|
BrotliDropBits(br, HUFFMAN_TABLE_BITS);
|
||||||
BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
|
BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
|
||||||
|
@ -462,8 +466,8 @@ static BROTLI_INLINE uint32_t ReadPreloadedSymbol(const HuffmanCode* table,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
|
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
|
||||||
uint32_t result = 0;
|
brotli_reg_t result = 0;
|
||||||
while (x) {
|
while (x) {
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
++result;
|
++result;
|
||||||
|
@ -475,16 +479,16 @@ static BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
|
||||||
Totally 1..4 symbols are read, 1..11 bits each.
|
Totally 1..4 symbols are read, 1..11 bits each.
|
||||||
The list of symbols MUST NOT contain duplicates. */
|
The list of symbols MUST NOT contain duplicates. */
|
||||||
static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
|
static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
|
||||||
uint32_t alphabet_size_max, uint32_t alphabet_size_limit,
|
brotli_reg_t alphabet_size_max, brotli_reg_t alphabet_size_limit,
|
||||||
BrotliDecoderState* s) {
|
BrotliDecoderState* s) {
|
||||||
/* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
|
/* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
BrotliMetablockHeaderArena* h = &s->arena.header;
|
BrotliMetablockHeaderArena* h = &s->arena.header;
|
||||||
uint32_t max_bits = Log2Floor(alphabet_size_max - 1);
|
brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
|
||||||
uint32_t i = h->sub_loop_counter;
|
brotli_reg_t i = h->sub_loop_counter;
|
||||||
uint32_t num_symbols = h->symbol;
|
brotli_reg_t num_symbols = h->symbol;
|
||||||
while (i <= num_symbols) {
|
while (i <= num_symbols) {
|
||||||
uint32_t v;
|
brotli_reg_t v;
|
||||||
if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
|
if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
|
||||||
h->sub_loop_counter = i;
|
h->sub_loop_counter = i;
|
||||||
h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
|
h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
|
||||||
|
@ -500,7 +504,7 @@ static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_symbols; ++i) {
|
for (i = 0; i < num_symbols; ++i) {
|
||||||
uint32_t k = i + 1;
|
brotli_reg_t k = i + 1;
|
||||||
for (; k <= num_symbols; ++k) {
|
for (; k <= num_symbols; ++k) {
|
||||||
if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
|
if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
|
||||||
return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
|
return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
|
||||||
|
@ -517,9 +521,9 @@ static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
|
||||||
C) extend corresponding index-chain
|
C) extend corresponding index-chain
|
||||||
D) reduce the Huffman space
|
D) reduce the Huffman space
|
||||||
E) update the histogram */
|
E) update the histogram */
|
||||||
static BROTLI_INLINE void ProcessSingleCodeLength(uint32_t code_len,
|
static BROTLI_INLINE void ProcessSingleCodeLength(brotli_reg_t code_len,
|
||||||
uint32_t* symbol, uint32_t* repeat, uint32_t* space,
|
brotli_reg_t* symbol, brotli_reg_t* repeat, brotli_reg_t* space,
|
||||||
uint32_t* prev_code_len, uint16_t* symbol_lists,
|
brotli_reg_t* prev_code_len, uint16_t* symbol_lists,
|
||||||
uint16_t* code_length_histo, int* next_symbol) {
|
uint16_t* code_length_histo, int* next_symbol) {
|
||||||
*repeat = 0;
|
*repeat = 0;
|
||||||
if (code_len != 0) { /* code_len == 1..15 */
|
if (code_len != 0) { /* code_len == 1..15 */
|
||||||
|
@ -544,14 +548,14 @@ static BROTLI_INLINE void ProcessSingleCodeLength(uint32_t code_len,
|
||||||
|
|
||||||
PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
|
PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
|
||||||
code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
|
code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
|
||||||
static BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
|
static BROTLI_INLINE void ProcessRepeatedCodeLength(brotli_reg_t code_len,
|
||||||
uint32_t repeat_delta, uint32_t alphabet_size, uint32_t* symbol,
|
brotli_reg_t repeat_delta, brotli_reg_t alphabet_size, brotli_reg_t* symbol,
|
||||||
uint32_t* repeat, uint32_t* space, uint32_t* prev_code_len,
|
brotli_reg_t* repeat, brotli_reg_t* space, brotli_reg_t* prev_code_len,
|
||||||
uint32_t* repeat_code_len, uint16_t* symbol_lists,
|
brotli_reg_t* repeat_code_len, uint16_t* symbol_lists,
|
||||||
uint16_t* code_length_histo, int* next_symbol) {
|
uint16_t* code_length_histo, int* next_symbol) {
|
||||||
uint32_t old_repeat;
|
brotli_reg_t old_repeat;
|
||||||
uint32_t extra_bits = 3; /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
|
brotli_reg_t extra_bits = 3; /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
|
||||||
uint32_t new_len = 0; /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
|
brotli_reg_t new_len = 0; /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
|
||||||
if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
|
if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
|
||||||
new_len = *prev_code_len;
|
new_len = *prev_code_len;
|
||||||
extra_bits = 2;
|
extra_bits = 2;
|
||||||
|
@ -576,7 +580,7 @@ static BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
|
||||||
BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
|
BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
|
||||||
(int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
|
(int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
|
||||||
if (*repeat_code_len != 0) {
|
if (*repeat_code_len != 0) {
|
||||||
unsigned last = *symbol + repeat_delta;
|
brotli_reg_t last = *symbol + repeat_delta;
|
||||||
int next = next_symbol[*repeat_code_len];
|
int next = next_symbol[*repeat_code_len];
|
||||||
do {
|
do {
|
||||||
symbol_lists[next] = (uint16_t)*symbol;
|
symbol_lists[next] = (uint16_t)*symbol;
|
||||||
|
@ -593,14 +597,14 @@ static BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
|
||||||
|
|
||||||
/* Reads and decodes symbol codelengths. */
|
/* Reads and decodes symbol codelengths. */
|
||||||
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
|
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
|
||||||
uint32_t alphabet_size, BrotliDecoderState* s) {
|
brotli_reg_t alphabet_size, BrotliDecoderState* s) {
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
BrotliMetablockHeaderArena* h = &s->arena.header;
|
BrotliMetablockHeaderArena* h = &s->arena.header;
|
||||||
uint32_t symbol = h->symbol;
|
brotli_reg_t symbol = h->symbol;
|
||||||
uint32_t repeat = h->repeat;
|
brotli_reg_t repeat = h->repeat;
|
||||||
uint32_t space = h->space;
|
brotli_reg_t space = h->space;
|
||||||
uint32_t prev_code_len = h->prev_code_len;
|
brotli_reg_t prev_code_len = h->prev_code_len;
|
||||||
uint32_t repeat_code_len = h->repeat_code_len;
|
brotli_reg_t repeat_code_len = h->repeat_code_len;
|
||||||
uint16_t* symbol_lists = h->symbol_lists;
|
uint16_t* symbol_lists = h->symbol_lists;
|
||||||
uint16_t* code_length_histo = h->code_length_histo;
|
uint16_t* code_length_histo = h->code_length_histo;
|
||||||
int* next_symbol = h->next_symbol;
|
int* next_symbol = h->next_symbol;
|
||||||
|
@ -609,9 +613,9 @@ static BrotliDecoderErrorCode ReadSymbolCodeLengths(
|
||||||
}
|
}
|
||||||
while (symbol < alphabet_size && space > 0) {
|
while (symbol < alphabet_size && space > 0) {
|
||||||
const HuffmanCode* p = h->table;
|
const HuffmanCode* p = h->table;
|
||||||
uint32_t code_len;
|
brotli_reg_t code_len;
|
||||||
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
|
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
|
||||||
if (!BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ)) {
|
if (!BrotliCheckInputAmount(br)) {
|
||||||
h->symbol = symbol;
|
h->symbol = symbol;
|
||||||
h->repeat = repeat;
|
h->repeat = repeat;
|
||||||
h->prev_code_len = prev_code_len;
|
h->prev_code_len = prev_code_len;
|
||||||
|
@ -628,10 +632,10 @@ static BrotliDecoderErrorCode ReadSymbolCodeLengths(
|
||||||
ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
|
ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
|
||||||
&prev_code_len, symbol_lists, code_length_histo, next_symbol);
|
&prev_code_len, symbol_lists, code_length_histo, next_symbol);
|
||||||
} else { /* code_len == 16..17, extra_bits == 2..3 */
|
} else { /* code_len == 16..17, extra_bits == 2..3 */
|
||||||
uint32_t extra_bits =
|
brotli_reg_t extra_bits =
|
||||||
(code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
|
(code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
|
||||||
uint32_t repeat_delta =
|
brotli_reg_t repeat_delta =
|
||||||
(uint32_t)BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
|
BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
|
||||||
BrotliDropBits(br, extra_bits);
|
BrotliDropBits(br, extra_bits);
|
||||||
ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
|
ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
|
||||||
&symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
|
&symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
|
||||||
|
@ -643,15 +647,15 @@ static BrotliDecoderErrorCode ReadSymbolCodeLengths(
|
||||||
}
|
}
|
||||||
|
|
||||||
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
|
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
|
||||||
uint32_t alphabet_size, BrotliDecoderState* s) {
|
brotli_reg_t alphabet_size, BrotliDecoderState* s) {
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
BrotliMetablockHeaderArena* h = &s->arena.header;
|
BrotliMetablockHeaderArena* h = &s->arena.header;
|
||||||
BROTLI_BOOL get_byte = BROTLI_FALSE;
|
BROTLI_BOOL get_byte = BROTLI_FALSE;
|
||||||
while (h->symbol < alphabet_size && h->space > 0) {
|
while (h->symbol < alphabet_size && h->space > 0) {
|
||||||
const HuffmanCode* p = h->table;
|
const HuffmanCode* p = h->table;
|
||||||
uint32_t code_len;
|
brotli_reg_t code_len;
|
||||||
uint32_t available_bits;
|
brotli_reg_t available_bits;
|
||||||
uint32_t bits = 0;
|
brotli_reg_t bits = 0;
|
||||||
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
|
BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
|
||||||
if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
get_byte = BROTLI_FALSE;
|
get_byte = BROTLI_FALSE;
|
||||||
|
@ -672,8 +676,8 @@ static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
|
||||||
&h->prev_code_len, h->symbol_lists, h->code_length_histo,
|
&h->prev_code_len, h->symbol_lists, h->code_length_histo,
|
||||||
h->next_symbol);
|
h->next_symbol);
|
||||||
} else { /* code_len == 16..17, extra_bits == 2..3 */
|
} else { /* code_len == 16..17, extra_bits == 2..3 */
|
||||||
uint32_t extra_bits = code_len - 14U;
|
brotli_reg_t extra_bits = code_len - 14U;
|
||||||
uint32_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
|
brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
|
||||||
BitMask(extra_bits);
|
BitMask(extra_bits);
|
||||||
if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
|
if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
|
||||||
get_byte = BROTLI_TRUE;
|
get_byte = BROTLI_TRUE;
|
||||||
|
@ -694,15 +698,15 @@ static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
|
||||||
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
|
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
BrotliMetablockHeaderArena* h = &s->arena.header;
|
BrotliMetablockHeaderArena* h = &s->arena.header;
|
||||||
uint32_t num_codes = h->repeat;
|
brotli_reg_t num_codes = h->repeat;
|
||||||
unsigned space = h->space;
|
brotli_reg_t space = h->space;
|
||||||
uint32_t i = h->sub_loop_counter;
|
brotli_reg_t i = h->sub_loop_counter;
|
||||||
for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
|
for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
|
||||||
const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
|
const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
|
||||||
uint32_t ix;
|
brotli_reg_t ix;
|
||||||
uint32_t v;
|
brotli_reg_t v;
|
||||||
if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
|
if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
|
||||||
uint32_t available_bits = BrotliGetAvailableBits(br);
|
brotli_reg_t available_bits = BrotliGetAvailableBits(br);
|
||||||
if (available_bits != 0) {
|
if (available_bits != 0) {
|
||||||
ix = BrotliGetBitsUnmasked(br) & 0xF;
|
ix = BrotliGetBitsUnmasked(br) & 0xF;
|
||||||
} else {
|
} else {
|
||||||
|
@ -747,10 +751,10 @@ static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
|
||||||
encoded with predefined entropy code. 32 - 74 bits are used.
|
encoded with predefined entropy code. 32 - 74 bits are used.
|
||||||
B.2) Decoded table is used to decode code lengths of symbols in resulting
|
B.2) Decoded table is used to decode code lengths of symbols in resulting
|
||||||
Huffman table. In worst case 3520 bits are read. */
|
Huffman table. In worst case 3520 bits are read. */
|
||||||
static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
|
static BrotliDecoderErrorCode ReadHuffmanCode(brotli_reg_t alphabet_size_max,
|
||||||
uint32_t alphabet_size_limit,
|
brotli_reg_t alphabet_size_limit,
|
||||||
HuffmanCode* table,
|
HuffmanCode* table,
|
||||||
uint32_t* opt_table_size,
|
brotli_reg_t* opt_table_size,
|
||||||
BrotliDecoderState* s) {
|
BrotliDecoderState* s) {
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
BrotliMetablockHeaderArena* h = &s->arena.header;
|
BrotliMetablockHeaderArena* h = &s->arena.header;
|
||||||
|
@ -796,9 +800,9 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
|
case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
|
||||||
uint32_t table_size;
|
brotli_reg_t table_size;
|
||||||
if (h->symbol == 3) {
|
if (h->symbol == 3) {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
if (!BrotliSafeReadBits(br, 1, &bits)) {
|
if (!BrotliSafeReadBits(br, 1, &bits)) {
|
||||||
h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
|
h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
|
@ -806,8 +810,9 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
|
||||||
h->symbol += bits;
|
h->symbol += bits;
|
||||||
}
|
}
|
||||||
BROTLI_LOG_UINT(h->symbol);
|
BROTLI_LOG_UINT(h->symbol);
|
||||||
table_size = BrotliBuildSimpleHuffmanTable(
|
table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
|
||||||
table, HUFFMAN_TABLE_BITS, h->symbols_lists_array, h->symbol);
|
h->symbols_lists_array,
|
||||||
|
(uint32_t)h->symbol);
|
||||||
if (opt_table_size) {
|
if (opt_table_size) {
|
||||||
*opt_table_size = table_size;
|
*opt_table_size = table_size;
|
||||||
}
|
}
|
||||||
|
@ -817,7 +822,7 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
|
||||||
|
|
||||||
/* Decode Huffman-coded code lengths. */
|
/* Decode Huffman-coded code lengths. */
|
||||||
case BROTLI_STATE_HUFFMAN_COMPLEX: {
|
case BROTLI_STATE_HUFFMAN_COMPLEX: {
|
||||||
uint32_t i;
|
brotli_reg_t i;
|
||||||
BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
|
BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
|
||||||
if (result != BROTLI_DECODER_SUCCESS) {
|
if (result != BROTLI_DECODER_SUCCESS) {
|
||||||
return result;
|
return result;
|
||||||
|
@ -841,7 +846,7 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
|
case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
|
||||||
uint32_t table_size;
|
brotli_reg_t table_size;
|
||||||
BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
|
BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
|
||||||
alphabet_size_limit, s);
|
alphabet_size_limit, s);
|
||||||
if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
|
if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
|
||||||
|
@ -872,10 +877,10 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decodes a block length by reading 3..39 bits. */
|
/* Decodes a block length by reading 3..39 bits. */
|
||||||
static BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
|
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
|
||||||
BrotliBitReader* br) {
|
BrotliBitReader* br) {
|
||||||
uint32_t code;
|
brotli_reg_t code;
|
||||||
uint32_t nbits;
|
brotli_reg_t nbits;
|
||||||
code = ReadSymbol(table, br);
|
code = ReadSymbol(table, br);
|
||||||
nbits = _kBrotliPrefixCodeRanges[code].nbits; /* nbits == 2..24 */
|
nbits = _kBrotliPrefixCodeRanges[code].nbits; /* nbits == 2..24 */
|
||||||
return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
|
return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
|
||||||
|
@ -884,9 +889,9 @@ static BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
|
||||||
/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
|
/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
|
||||||
reading can't be continued with ReadBlockLength. */
|
reading can't be continued with ReadBlockLength. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
|
static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
|
||||||
BrotliDecoderState* s, uint32_t* result, const HuffmanCode* table,
|
BrotliDecoderState* s, brotli_reg_t* result, const HuffmanCode* table,
|
||||||
BrotliBitReader* br) {
|
BrotliBitReader* br) {
|
||||||
uint32_t index;
|
brotli_reg_t index;
|
||||||
if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
|
if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
|
||||||
if (!SafeReadSymbol(table, br, &index)) {
|
if (!SafeReadSymbol(table, br, &index)) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
|
@ -895,9 +900,9 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
|
||||||
index = s->block_length_index;
|
index = s->block_length_index;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
uint32_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
|
brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
|
||||||
uint32_t offset = _kBrotliPrefixCodeRanges[index].offset;
|
brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
|
||||||
if (!BrotliSafeReadBits(br, nbits, &bits)) {
|
if (!BrotliSafeReadBits(br, nbits, &bits)) {
|
||||||
s->block_length_index = index;
|
s->block_length_index = index;
|
||||||
s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
|
s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
|
||||||
|
@ -924,10 +929,10 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
|
||||||
Most of input values are 0 and 1. To reduce number of branches, we replace
|
Most of input values are 0 and 1. To reduce number of branches, we replace
|
||||||
inner for loop with do-while. */
|
inner for loop with do-while. */
|
||||||
static BROTLI_NOINLINE void InverseMoveToFrontTransform(
|
static BROTLI_NOINLINE void InverseMoveToFrontTransform(
|
||||||
uint8_t* v, uint32_t v_len, BrotliDecoderState* state) {
|
uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
|
||||||
/* Reinitialize elements that could have been changed. */
|
/* Reinitialize elements that could have been changed. */
|
||||||
uint32_t i = 1;
|
brotli_reg_t i = 1;
|
||||||
uint32_t upper_bound = state->mtf_upper_bound;
|
brotli_reg_t upper_bound = state->mtf_upper_bound;
|
||||||
uint32_t* mtf = &state->mtf[1]; /* Make mtf[-1] addressable. */
|
uint32_t* mtf = &state->mtf[1]; /* Make mtf[-1] addressable. */
|
||||||
uint8_t* mtf_u8 = (uint8_t*)mtf;
|
uint8_t* mtf_u8 = (uint8_t*)mtf;
|
||||||
/* Load endian-aware constant. */
|
/* Load endian-aware constant. */
|
||||||
|
@ -970,7 +975,7 @@ static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
|
||||||
h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
|
h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
|
||||||
}
|
}
|
||||||
while (h->htree_index < group->num_htrees) {
|
while (h->htree_index < group->num_htrees) {
|
||||||
uint32_t table_size;
|
brotli_reg_t table_size;
|
||||||
BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
|
BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
|
||||||
group->alphabet_size_limit, h->next, &table_size, s);
|
group->alphabet_size_limit, h->next, &table_size, s);
|
||||||
if (result != BROTLI_DECODER_SUCCESS) return result;
|
if (result != BROTLI_DECODER_SUCCESS) return result;
|
||||||
|
@ -990,8 +995,8 @@ static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
|
||||||
This table will be used for reading context map items.
|
This table will be used for reading context map items.
|
||||||
3) Read context map items; "0" values could be run-length encoded.
|
3) Read context map items; "0" values could be run-length encoded.
|
||||||
4) Optionally, apply InverseMoveToFront transform to the resulting map. */
|
4) Optionally, apply InverseMoveToFront transform to the resulting map. */
|
||||||
static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
static BrotliDecoderErrorCode DecodeContextMap(brotli_reg_t context_map_size,
|
||||||
uint32_t* num_htrees,
|
brotli_reg_t* num_htrees,
|
||||||
uint8_t** context_map_arg,
|
uint8_t** context_map_arg,
|
||||||
BrotliDecoderState* s) {
|
BrotliDecoderState* s) {
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
|
@ -1021,7 +1026,7 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
|
case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
/* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
|
/* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
|
||||||
to peek 4 bits ahead. */
|
to peek 4 bits ahead. */
|
||||||
if (!BrotliSafeGetBits(br, 5, &bits)) {
|
if (!BrotliSafeGetBits(br, 5, &bits)) {
|
||||||
|
@ -1040,7 +1045,7 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
|
case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
|
||||||
uint32_t alphabet_size = *num_htrees + h->max_run_length_prefix;
|
brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
|
||||||
result = ReadHuffmanCode(alphabet_size, alphabet_size,
|
result = ReadHuffmanCode(alphabet_size, alphabet_size,
|
||||||
h->context_map_table, NULL, s);
|
h->context_map_table, NULL, s);
|
||||||
if (result != BROTLI_DECODER_SUCCESS) return result;
|
if (result != BROTLI_DECODER_SUCCESS) return result;
|
||||||
|
@ -1050,10 +1055,10 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_CONTEXT_MAP_DECODE: {
|
case BROTLI_STATE_CONTEXT_MAP_DECODE: {
|
||||||
uint32_t context_index = h->context_index;
|
brotli_reg_t context_index = h->context_index;
|
||||||
uint32_t max_run_length_prefix = h->max_run_length_prefix;
|
brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
|
||||||
uint8_t* context_map = *context_map_arg;
|
uint8_t* context_map = *context_map_arg;
|
||||||
uint32_t code = h->code;
|
brotli_reg_t code = h->code;
|
||||||
BROTLI_BOOL skip_preamble = (code != 0xFFFF);
|
BROTLI_BOOL skip_preamble = (code != 0xFFFF);
|
||||||
while (context_index < context_map_size || skip_preamble) {
|
while (context_index < context_map_size || skip_preamble) {
|
||||||
if (!skip_preamble) {
|
if (!skip_preamble) {
|
||||||
|
@ -1078,7 +1083,7 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
||||||
}
|
}
|
||||||
/* RLE sub-stage. */
|
/* RLE sub-stage. */
|
||||||
{
|
{
|
||||||
uint32_t reps;
|
brotli_reg_t reps;
|
||||||
if (!BrotliSafeReadBits(br, code, &reps)) {
|
if (!BrotliSafeReadBits(br, code, &reps)) {
|
||||||
h->code = code;
|
h->code = code;
|
||||||
h->context_index = context_index;
|
h->context_index = context_index;
|
||||||
|
@ -1099,7 +1104,7 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
|
case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
if (!BrotliSafeReadBits(br, 1, &bits)) {
|
if (!BrotliSafeReadBits(br, 1, &bits)) {
|
||||||
h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
|
h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
|
@ -1121,14 +1126,14 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
|
||||||
Reads 3..54 bits. */
|
Reads 3..54 bits. */
|
||||||
static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
|
static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
|
||||||
int safe, BrotliDecoderState* s, int tree_type) {
|
int safe, BrotliDecoderState* s, int tree_type) {
|
||||||
uint32_t max_block_type = s->num_block_types[tree_type];
|
brotli_reg_t max_block_type = s->num_block_types[tree_type];
|
||||||
const HuffmanCode* type_tree = &s->block_type_trees[
|
const HuffmanCode* type_tree = &s->block_type_trees[
|
||||||
tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
|
tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
|
||||||
const HuffmanCode* len_tree = &s->block_len_trees[
|
const HuffmanCode* len_tree = &s->block_len_trees[
|
||||||
tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
|
tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2];
|
brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
|
||||||
uint32_t block_type;
|
brotli_reg_t block_type;
|
||||||
if (max_block_type <= 1) {
|
if (max_block_type <= 1) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1173,6 +1178,7 @@ static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
|
||||||
size_t sample = s->context_map[offset];
|
size_t sample = s->context_map[offset];
|
||||||
size_t j;
|
size_t j;
|
||||||
for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
|
for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
|
||||||
|
/* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
|
||||||
BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
|
BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
|
||||||
}
|
}
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
|
@ -1184,8 +1190,8 @@ static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
|
||||||
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
|
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
|
||||||
uint8_t context_mode;
|
uint8_t context_mode;
|
||||||
size_t trivial;
|
size_t trivial;
|
||||||
uint32_t block_type = s->block_type_rb[1];
|
brotli_reg_t block_type = s->block_type_rb[1];
|
||||||
uint32_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
|
brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
|
||||||
s->context_map_slice = s->context_map + context_offset;
|
s->context_map_slice = s->context_map + context_offset;
|
||||||
trivial = s->trivial_literal_contexts[block_type >> 5];
|
trivial = s->trivial_literal_contexts[block_type >> 5];
|
||||||
s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
|
s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
|
||||||
|
@ -1549,8 +1555,8 @@ static int CopyFromCompoundDictionary(BrotliDecoderState* s, int pos) {
|
||||||
BROTLI_BOOL BrotliDecoderAttachDictionary(
|
BROTLI_BOOL BrotliDecoderAttachDictionary(
|
||||||
BrotliDecoderState* state, BrotliSharedDictionaryType type,
|
BrotliDecoderState* state, BrotliSharedDictionaryType type,
|
||||||
size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]) {
|
size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]) {
|
||||||
uint32_t i;
|
brotli_reg_t i;
|
||||||
uint32_t num_prefix_before = state->dictionary->num_prefix;
|
brotli_reg_t num_prefix_before = state->dictionary->num_prefix;
|
||||||
if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
|
if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
|
||||||
if (!BrotliSharedDictionaryAttach(state->dictionary, type, data_size, data)) {
|
if (!BrotliSharedDictionaryAttach(state->dictionary, type, data_size, data)) {
|
||||||
return BROTLI_FALSE;
|
return BROTLI_FALSE;
|
||||||
|
@ -1616,7 +1622,7 @@ static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
|
||||||
int i = s->loop_counter;
|
int i = s->loop_counter;
|
||||||
|
|
||||||
while (i < (int)s->num_block_types[0]) {
|
while (i < (int)s->num_block_types[0]) {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
if (!BrotliSafeReadBits(br, 2, &bits)) {
|
if (!BrotliSafeReadBits(br, 2, &bits)) {
|
||||||
s->loop_counter = i;
|
s->loop_counter = i;
|
||||||
return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
return BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
|
@ -1656,7 +1662,7 @@ static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
|
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
|
BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
|
||||||
if (n_bits != 0) {
|
if (n_bits != 0) {
|
||||||
return BrotliSafeReadBits(br, n_bits, val);
|
return BrotliSafeReadBits(br, n_bits, val);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1666,7 +1672,7 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
|
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
|
||||||
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
|
BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
|
||||||
if (n_bits != 0) {
|
if (n_bits != 0) {
|
||||||
return BrotliSafeReadBits32(br, n_bits, val);
|
return BrotliSafeReadBits32(br, n_bits, val);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1744,16 +1750,16 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
|
||||||
NB: it is possible to have all 64 tables precalculated. */
|
NB: it is possible to have all 64 tables precalculated. */
|
||||||
static void CalculateDistanceLut(BrotliDecoderState* s) {
|
static void CalculateDistanceLut(BrotliDecoderState* s) {
|
||||||
BrotliMetablockBodyArena* b = &s->arena.body;
|
BrotliMetablockBodyArena* b = &s->arena.body;
|
||||||
uint32_t npostfix = s->distance_postfix_bits;
|
brotli_reg_t npostfix = s->distance_postfix_bits;
|
||||||
uint32_t ndirect = s->num_direct_distance_codes;
|
brotli_reg_t ndirect = s->num_direct_distance_codes;
|
||||||
uint32_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
|
brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
|
||||||
uint32_t postfix = 1u << npostfix;
|
brotli_reg_t postfix = 1u << npostfix;
|
||||||
uint32_t j;
|
brotli_reg_t j;
|
||||||
uint32_t bits = 1;
|
brotli_reg_t bits = 1;
|
||||||
uint32_t half = 0;
|
brotli_reg_t half = 0;
|
||||||
|
|
||||||
/* Skip short codes. */
|
/* Skip short codes. */
|
||||||
uint32_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
|
brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
|
||||||
|
|
||||||
/* Fill direct codes. */
|
/* Fill direct codes. */
|
||||||
for (j = 0; j < ndirect; ++j) {
|
for (j = 0; j < ndirect; ++j) {
|
||||||
|
@ -1764,7 +1770,7 @@ static void CalculateDistanceLut(BrotliDecoderState* s) {
|
||||||
|
|
||||||
/* Fill regular distance codes. */
|
/* Fill regular distance codes. */
|
||||||
while (i < alphabet_size_limit) {
|
while (i < alphabet_size_limit) {
|
||||||
uint32_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
|
brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
|
||||||
/* Always fill the complete group. */
|
/* Always fill the complete group. */
|
||||||
for (j = 0; j < postfix; ++j) {
|
for (j = 0; j < postfix; ++j) {
|
||||||
b->dist_extra_bits[i] = (uint8_t)bits;
|
b->dist_extra_bits[i] = (uint8_t)bits;
|
||||||
|
@ -1780,8 +1786,8 @@ static void CalculateDistanceLut(BrotliDecoderState* s) {
|
||||||
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
|
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
|
||||||
int safe, BrotliDecoderState* s, BrotliBitReader* br) {
|
int safe, BrotliDecoderState* s, BrotliBitReader* br) {
|
||||||
BrotliMetablockBodyArena* b = &s->arena.body;
|
BrotliMetablockBodyArena* b = &s->arena.body;
|
||||||
uint32_t code;
|
brotli_reg_t code;
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
BrotliBitReaderState memento;
|
BrotliBitReaderState memento;
|
||||||
HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
|
HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
|
||||||
if (!safe) {
|
if (!safe) {
|
||||||
|
@ -1827,9 +1833,9 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
|
||||||
|
|
||||||
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
|
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
|
||||||
int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
|
int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
|
||||||
uint32_t cmd_code;
|
brotli_reg_t cmd_code;
|
||||||
uint32_t insert_len_extra = 0;
|
brotli_reg_t insert_len_extra = 0;
|
||||||
uint32_t copy_length;
|
brotli_reg_t copy_length;
|
||||||
CmdLutElement v;
|
CmdLutElement v;
|
||||||
BrotliBitReaderState memento;
|
BrotliBitReaderState memento;
|
||||||
if (!safe) {
|
if (!safe) {
|
||||||
|
@ -1874,11 +1880,11 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
|
||||||
}
|
}
|
||||||
|
|
||||||
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
|
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
|
||||||
int safe, BrotliBitReader* const br, size_t num) {
|
int safe, BrotliBitReader* const br) {
|
||||||
if (safe) {
|
if (safe) {
|
||||||
return BROTLI_TRUE;
|
return BROTLI_TRUE;
|
||||||
}
|
}
|
||||||
return BrotliCheckInputAmount(br, num);
|
return BrotliCheckInputAmount(br);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BROTLI_SAFE(METHOD) \
|
#define BROTLI_SAFE(METHOD) \
|
||||||
|
@ -1901,7 +1907,7 @@ static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
|
||||||
BrotliBitReader* br = &s->br;
|
BrotliBitReader* br = &s->br;
|
||||||
int compound_dictionary_size = GetCompoundDictionarySize(s);
|
int compound_dictionary_size = GetCompoundDictionarySize(s);
|
||||||
|
|
||||||
if (!CheckInputAmount(safe, br, 28)) {
|
if (!CheckInputAmount(safe, br)) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
goto saveStateAndReturn;
|
goto saveStateAndReturn;
|
||||||
}
|
}
|
||||||
|
@ -1926,7 +1932,7 @@ CommandBegin:
|
||||||
if (safe) {
|
if (safe) {
|
||||||
s->state = BROTLI_STATE_COMMAND_BEGIN;
|
s->state = BROTLI_STATE_COMMAND_BEGIN;
|
||||||
}
|
}
|
||||||
if (!CheckInputAmount(safe, br, 28)) { /* 156 bits + 7 bytes */
|
if (!CheckInputAmount(safe, br)) {
|
||||||
s->state = BROTLI_STATE_COMMAND_BEGIN;
|
s->state = BROTLI_STATE_COMMAND_BEGIN;
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
goto saveStateAndReturn;
|
goto saveStateAndReturn;
|
||||||
|
@ -1950,25 +1956,23 @@ CommandInner:
|
||||||
}
|
}
|
||||||
/* Read the literals in the command. */
|
/* Read the literals in the command. */
|
||||||
if (s->trivial_literal_context) {
|
if (s->trivial_literal_context) {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
uint32_t value;
|
brotli_reg_t value;
|
||||||
PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
|
PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
|
||||||
do {
|
do {
|
||||||
if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
|
if (!CheckInputAmount(safe, br)) {
|
||||||
s->state = BROTLI_STATE_COMMAND_INNER;
|
s->state = BROTLI_STATE_COMMAND_INNER;
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
goto saveStateAndReturn;
|
goto saveStateAndReturn;
|
||||||
}
|
}
|
||||||
if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
|
if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
|
||||||
BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
|
goto NextLiteralBlock;
|
||||||
PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
|
|
||||||
if (!s->trivial_literal_context) goto CommandInner;
|
|
||||||
}
|
}
|
||||||
if (!safe) {
|
if (!safe) {
|
||||||
s->ringbuffer[pos] =
|
s->ringbuffer[pos] =
|
||||||
(uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
|
(uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
|
||||||
} else {
|
} else {
|
||||||
uint32_t literal;
|
brotli_reg_t literal;
|
||||||
if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
|
if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
goto saveStateAndReturn;
|
goto saveStateAndReturn;
|
||||||
|
@ -1990,14 +1994,13 @@ CommandInner:
|
||||||
do {
|
do {
|
||||||
const HuffmanCode* hc;
|
const HuffmanCode* hc;
|
||||||
uint8_t context;
|
uint8_t context;
|
||||||
if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
|
if (!CheckInputAmount(safe, br)) {
|
||||||
s->state = BROTLI_STATE_COMMAND_INNER;
|
s->state = BROTLI_STATE_COMMAND_INNER;
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
goto saveStateAndReturn;
|
goto saveStateAndReturn;
|
||||||
}
|
}
|
||||||
if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
|
if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
|
||||||
BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
|
goto NextLiteralBlock;
|
||||||
if (s->trivial_literal_context) goto CommandInner;
|
|
||||||
}
|
}
|
||||||
context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
|
context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
|
||||||
BROTLI_LOG_UINT(context);
|
BROTLI_LOG_UINT(context);
|
||||||
|
@ -2006,7 +2009,7 @@ CommandInner:
|
||||||
if (!safe) {
|
if (!safe) {
|
||||||
p1 = (uint8_t)ReadSymbol(hc, br);
|
p1 = (uint8_t)ReadSymbol(hc, br);
|
||||||
} else {
|
} else {
|
||||||
uint32_t literal;
|
brotli_reg_t literal;
|
||||||
if (!SafeReadSymbol(hc, br, &literal)) {
|
if (!SafeReadSymbol(hc, br, &literal)) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
goto saveStateAndReturn;
|
goto saveStateAndReturn;
|
||||||
|
@ -2087,7 +2090,7 @@ CommandPostDecodeLiterals:
|
||||||
const BrotliDictionary* words = s->dictionary->words[dict_id];
|
const BrotliDictionary* words = s->dictionary->words[dict_id];
|
||||||
const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
|
const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
|
||||||
int offset = (int)words->offsets_by_length[i];
|
int offset = (int)words->offsets_by_length[i];
|
||||||
uint32_t shift = words->size_bits_by_length[i];
|
brotli_reg_t shift = words->size_bits_by_length[i];
|
||||||
int address =
|
int address =
|
||||||
s->distance_code - s->max_distance - 1 - compound_dictionary_size;
|
s->distance_code - s->max_distance - 1 - compound_dictionary_size;
|
||||||
int mask = (int)BitMask(shift);
|
int mask = (int)BitMask(shift);
|
||||||
|
@ -2110,7 +2113,7 @@ CommandPostDecodeLiterals:
|
||||||
if (dict_id2 != dict_id && words2->size_bits_by_length[i] != 0) {
|
if (dict_id2 != dict_id && words2->size_bits_by_length[i] != 0) {
|
||||||
const BrotliTransforms* transforms2 =
|
const BrotliTransforms* transforms2 =
|
||||||
s->dictionary->transforms[dict_id2];
|
s->dictionary->transforms[dict_id2];
|
||||||
uint32_t shift2 = words2->size_bits_by_length[i];
|
brotli_reg_t shift2 = words2->size_bits_by_length[i];
|
||||||
int num = (int)((1u << shift2) & ~1u) *
|
int num = (int)((1u << shift2) & ~1u) *
|
||||||
(int)transforms2->num_transforms;
|
(int)transforms2->num_transforms;
|
||||||
if (dist_remaining < num) {
|
if (dist_remaining < num) {
|
||||||
|
@ -2236,6 +2239,10 @@ CommandPostWrapCopy:
|
||||||
goto CommandBegin;
|
goto CommandBegin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NextLiteralBlock:
|
||||||
|
BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
|
||||||
|
goto CommandInner;
|
||||||
|
|
||||||
saveStateAndReturn:
|
saveStateAndReturn:
|
||||||
s->pos = pos;
|
s->pos = pos;
|
||||||
s->loop_counter = i;
|
s->loop_counter = i;
|
||||||
|
@ -2312,14 +2319,13 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
}
|
}
|
||||||
if (!*available_out) next_out = 0;
|
if (!*available_out) next_out = 0;
|
||||||
if (s->buffer_length == 0) { /* Just connect bit reader to input stream. */
|
if (s->buffer_length == 0) { /* Just connect bit reader to input stream. */
|
||||||
br->avail_in = *available_in;
|
BrotliBitReaderSetInput(br, *next_in, *available_in);
|
||||||
br->next_in = *next_in;
|
|
||||||
} else {
|
} else {
|
||||||
/* At least one byte of input is required. More than one byte of input may
|
/* At least one byte of input is required. More than one byte of input may
|
||||||
be required to complete the transaction -> reading more data must be
|
be required to complete the transaction -> reading more data must be
|
||||||
done in a loop -> do it in a main loop. */
|
done in a loop -> do it in a main loop. */
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
br->next_in = &s->buffer.u8[0];
|
BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
|
||||||
}
|
}
|
||||||
/* State machine */
|
/* State machine */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -2336,23 +2342,23 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (s->buffer_length != 0) { /* Used with internal buffer. */
|
if (s->buffer_length != 0) { /* Used with internal buffer. */
|
||||||
if (br->avail_in == 0) {
|
if (br->next_in == br->last_in) {
|
||||||
/* Successfully finished read transaction.
|
/* Successfully finished read transaction.
|
||||||
Accumulator contains less than 8 bits, because internal buffer
|
Accumulator contains less than 8 bits, because internal buffer
|
||||||
is expanded byte-by-byte until it is enough to complete read. */
|
is expanded byte-by-byte until it is enough to complete read. */
|
||||||
s->buffer_length = 0;
|
s->buffer_length = 0;
|
||||||
/* Switch to input stream and restart. */
|
/* Switch to input stream and restart. */
|
||||||
result = BROTLI_DECODER_SUCCESS;
|
result = BROTLI_DECODER_SUCCESS;
|
||||||
br->avail_in = *available_in;
|
BrotliBitReaderSetInput(br, *next_in, *available_in);
|
||||||
br->next_in = *next_in;
|
|
||||||
continue;
|
continue;
|
||||||
} else if (*available_in != 0) {
|
} else if (*available_in != 0) {
|
||||||
/* Not enough data in buffer, but can take one more byte from
|
/* Not enough data in buffer, but can take one more byte from
|
||||||
input stream. */
|
input stream. */
|
||||||
result = BROTLI_DECODER_SUCCESS;
|
result = BROTLI_DECODER_SUCCESS;
|
||||||
|
BROTLI_DCHECK(s->buffer_length < 8);
|
||||||
s->buffer.u8[s->buffer_length] = **next_in;
|
s->buffer.u8[s->buffer_length] = **next_in;
|
||||||
s->buffer_length++;
|
s->buffer_length++;
|
||||||
br->avail_in = s->buffer_length;
|
BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
|
||||||
(*next_in)++;
|
(*next_in)++;
|
||||||
(*available_in)--;
|
(*available_in)--;
|
||||||
/* Retry with more data in buffer. */
|
/* Retry with more data in buffer. */
|
||||||
|
@ -2363,7 +2369,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
} else { /* Input stream doesn't contain enough input. */
|
} else { /* Input stream doesn't contain enough input. */
|
||||||
/* Copy tail to internal buffer and return. */
|
/* Copy tail to internal buffer and return. */
|
||||||
*next_in = br->next_in;
|
*next_in = br->next_in;
|
||||||
*available_in = br->avail_in;
|
*available_in = BrotliBitReaderGetAvailIn(br);
|
||||||
while (*available_in) {
|
while (*available_in) {
|
||||||
s->buffer.u8[s->buffer_length] = **next_in;
|
s->buffer.u8[s->buffer_length] = **next_in;
|
||||||
s->buffer_length++;
|
s->buffer_length++;
|
||||||
|
@ -2386,7 +2392,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
stream it has less than 8 bits in accumulator, so it is safe to
|
stream it has less than 8 bits in accumulator, so it is safe to
|
||||||
return unused accumulator bits there. */
|
return unused accumulator bits there. */
|
||||||
BrotliBitReaderUnload(br);
|
BrotliBitReaderUnload(br);
|
||||||
*available_in = br->avail_in;
|
*available_in = BrotliBitReaderGetAvailIn(br);
|
||||||
*next_in = br->next_in;
|
*next_in = br->next_in;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2410,17 +2416,20 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
s->state = BROTLI_STATE_INITIALIZE;
|
s->state = BROTLI_STATE_INITIALIZE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BROTLI_STATE_LARGE_WINDOW_BITS:
|
case BROTLI_STATE_LARGE_WINDOW_BITS: {
|
||||||
if (!BrotliSafeReadBits(br, 6, &s->window_bits)) {
|
brotli_reg_t bits;
|
||||||
|
if (!BrotliSafeReadBits(br, 6, &bits)) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
s->window_bits = bits & 63u;
|
||||||
if (s->window_bits < BROTLI_LARGE_MIN_WBITS ||
|
if (s->window_bits < BROTLI_LARGE_MIN_WBITS ||
|
||||||
s->window_bits > BROTLI_LARGE_MAX_WBITS) {
|
s->window_bits > BROTLI_LARGE_MAX_WBITS) {
|
||||||
result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
|
result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->state = BROTLI_STATE_INITIALIZE;
|
s->state = BROTLI_STATE_INITIALIZE;
|
||||||
|
}
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_INITIALIZE:
|
case BROTLI_STATE_INITIALIZE:
|
||||||
|
@ -2518,7 +2527,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_HUFFMAN_CODE_1: {
|
case BROTLI_STATE_HUFFMAN_CODE_1: {
|
||||||
uint32_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
|
brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
|
||||||
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
|
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
|
||||||
result = ReadHuffmanCode(alphabet_size, alphabet_size,
|
result = ReadHuffmanCode(alphabet_size, alphabet_size,
|
||||||
&s->block_type_trees[tree_offset], NULL, s);
|
&s->block_type_trees[tree_offset], NULL, s);
|
||||||
|
@ -2528,7 +2537,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_HUFFMAN_CODE_2: {
|
case BROTLI_STATE_HUFFMAN_CODE_2: {
|
||||||
uint32_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
|
brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
|
||||||
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
|
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
|
||||||
result = ReadHuffmanCode(alphabet_size, alphabet_size,
|
result = ReadHuffmanCode(alphabet_size, alphabet_size,
|
||||||
&s->block_len_trees[tree_offset], NULL, s);
|
&s->block_len_trees[tree_offset], NULL, s);
|
||||||
|
@ -2569,7 +2578,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BROTLI_STATE_METABLOCK_HEADER_2: {
|
case BROTLI_STATE_METABLOCK_HEADER_2: {
|
||||||
uint32_t bits;
|
brotli_reg_t bits;
|
||||||
if (!BrotliSafeReadBits(br, 6, &bits)) {
|
if (!BrotliSafeReadBits(br, 6, &bits)) {
|
||||||
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
|
||||||
break;
|
break;
|
||||||
|
@ -2610,15 +2619,16 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case BROTLI_STATE_CONTEXT_MAP_2: {
|
case BROTLI_STATE_CONTEXT_MAP_2: {
|
||||||
uint32_t npostfix = s->distance_postfix_bits;
|
brotli_reg_t npostfix = s->distance_postfix_bits;
|
||||||
uint32_t ndirect = s->num_direct_distance_codes;
|
brotli_reg_t ndirect = s->num_direct_distance_codes;
|
||||||
uint32_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
|
brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
|
||||||
npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
|
npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
|
||||||
uint32_t distance_alphabet_size_limit = distance_alphabet_size_max;
|
brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
|
||||||
BROTLI_BOOL allocation_success = BROTLI_TRUE;
|
BROTLI_BOOL allocation_success = BROTLI_TRUE;
|
||||||
if (s->large_window) {
|
if (s->large_window) {
|
||||||
BrotliDistanceCodeLimit limit = BrotliCalculateDistanceCodeLimit(
|
BrotliDistanceCodeLimit limit = BrotliCalculateDistanceCodeLimit(
|
||||||
BROTLI_MAX_ALLOWED_DISTANCE, npostfix, ndirect);
|
BROTLI_MAX_ALLOWED_DISTANCE, (uint32_t)npostfix,
|
||||||
|
(uint32_t)ndirect);
|
||||||
distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
|
distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
|
||||||
npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS);
|
npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS);
|
||||||
distance_alphabet_size_limit = limit.max_alphabet_size;
|
distance_alphabet_size_limit = limit.max_alphabet_size;
|
||||||
|
@ -2749,7 +2759,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
|
||||||
}
|
}
|
||||||
if (s->buffer_length == 0) {
|
if (s->buffer_length == 0) {
|
||||||
BrotliBitReaderUnload(br);
|
BrotliBitReaderUnload(br);
|
||||||
*available_in = br->avail_in;
|
*available_in = BrotliBitReaderGetAvailIn(br);
|
||||||
*next_in = br->next_in;
|
*next_in = br->next_in;
|
||||||
}
|
}
|
||||||
s->state = BROTLI_STATE_DONE;
|
s->state = BROTLI_STATE_DONE;
|
||||||
|
@ -2821,7 +2831,7 @@ BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
|
||||||
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
|
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
|
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
|
||||||
case BROTLI_DECODER ## PREFIX ## NAME: return #NAME;
|
case BROTLI_DECODER ## PREFIX ## NAME: return #PREFIX #NAME;
|
||||||
#define BROTLI_NOTHING_
|
#define BROTLI_NOTHING_
|
||||||
BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_CASE_, BROTLI_NOTHING_)
|
BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_CASE_, BROTLI_NOTHING_)
|
||||||
#undef BROTLI_ERROR_CODE_CASE_
|
#undef BROTLI_ERROR_CODE_CASE_
|
||||||
|
@ -2846,16 +2856,16 @@ void BrotliDecoderSetMetadataCallbacks(
|
||||||
/* Escalate internal functions visibility; for testing purposes only. */
|
/* Escalate internal functions visibility; for testing purposes only. */
|
||||||
#if defined(BROTLI_TEST)
|
#if defined(BROTLI_TEST)
|
||||||
BROTLI_BOOL SafeReadSymbolForTest(
|
BROTLI_BOOL SafeReadSymbolForTest(
|
||||||
const HuffmanCode*, BrotliBitReader*, uint32_t*);
|
const HuffmanCode*, BrotliBitReader*, brotli_reg_t*);
|
||||||
BROTLI_BOOL SafeReadSymbolForTest(
|
BROTLI_BOOL SafeReadSymbolForTest(
|
||||||
const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
|
const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
|
||||||
return SafeReadSymbol(table, br, result);
|
return SafeReadSymbol(table, br, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InverseMoveToFrontTransformForTest(
|
void InverseMoveToFrontTransformForTest(
|
||||||
uint8_t*, uint32_t, BrotliDecoderState*);
|
uint8_t*, brotli_reg_t, BrotliDecoderState*);
|
||||||
void InverseMoveToFrontTransformForTest(
|
void InverseMoveToFrontTransformForTest(
|
||||||
uint8_t* v, uint32_t l, BrotliDecoderState* s) {
|
uint8_t* v, brotli_reg_t l, BrotliDecoderState* s) {
|
||||||
InverseMoveToFrontTransform(v, l, s);
|
InverseMoveToFrontTransform(v, l, s);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
10
thirdparty/brotli/dec/state.c
vendored
10
thirdparty/brotli/dec/state.c
vendored
|
@ -98,9 +98,9 @@ BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
|
||||||
|
|
||||||
void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
|
void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
|
||||||
s->meta_block_remaining_len = 0;
|
s->meta_block_remaining_len = 0;
|
||||||
s->block_length[0] = 1U << 24;
|
s->block_length[0] = BROTLI_BLOCK_SIZE_CAP;
|
||||||
s->block_length[1] = 1U << 24;
|
s->block_length[1] = BROTLI_BLOCK_SIZE_CAP;
|
||||||
s->block_length[2] = 1U << 24;
|
s->block_length[2] = BROTLI_BLOCK_SIZE_CAP;
|
||||||
s->num_block_types[0] = 1;
|
s->num_block_types[0] = 1;
|
||||||
s->num_block_types[1] = 1;
|
s->num_block_types[1] = 1;
|
||||||
s->num_block_types[2] = 1;
|
s->num_block_types[2] = 1;
|
||||||
|
@ -158,8 +158,8 @@ void BrotliDecoderStateCleanup(BrotliDecoderState* s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s,
|
BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s,
|
||||||
HuffmanTreeGroup* group, uint32_t alphabet_size_max,
|
HuffmanTreeGroup* group, brotli_reg_t alphabet_size_max,
|
||||||
uint32_t alphabet_size_limit, uint32_t ntrees) {
|
brotli_reg_t alphabet_size_limit, brotli_reg_t ntrees) {
|
||||||
/* 376 = 256 (1-st level table) + 4 + 7 + 15 + 31 + 63 (2-nd level mix-tables)
|
/* 376 = 256 (1-st level table) + 4 + 7 + 15 + 31 + 63 (2-nd level mix-tables)
|
||||||
This number is discovered "unlimited" "enough" calculator; it is actually
|
This number is discovered "unlimited" "enough" calculator; it is actually
|
||||||
a wee bigger than required in several cases (especially for alphabets with
|
a wee bigger than required in several cases (especially for alphabets with
|
||||||
|
|
71
thirdparty/brotli/dec/state.h
vendored
71
thirdparty/brotli/dec/state.h
vendored
|
@ -211,15 +211,15 @@ typedef struct BrotliMetablockHeaderArena {
|
||||||
BrotliRunningContextMapState substate_context_map;
|
BrotliRunningContextMapState substate_context_map;
|
||||||
BrotliRunningHuffmanState substate_huffman;
|
BrotliRunningHuffmanState substate_huffman;
|
||||||
|
|
||||||
uint32_t sub_loop_counter;
|
brotli_reg_t sub_loop_counter;
|
||||||
|
|
||||||
uint32_t repeat_code_len;
|
brotli_reg_t repeat_code_len;
|
||||||
uint32_t prev_code_len;
|
brotli_reg_t prev_code_len;
|
||||||
|
|
||||||
/* For ReadHuffmanCode. */
|
/* For ReadHuffmanCode. */
|
||||||
uint32_t symbol;
|
brotli_reg_t symbol;
|
||||||
uint32_t repeat;
|
brotli_reg_t repeat;
|
||||||
uint32_t space;
|
brotli_reg_t space;
|
||||||
|
|
||||||
/* Huffman table for "histograms". */
|
/* Huffman table for "histograms". */
|
||||||
HuffmanCode table[32];
|
HuffmanCode table[32];
|
||||||
|
@ -233,21 +233,22 @@ typedef struct BrotliMetablockHeaderArena {
|
||||||
uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES];
|
uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES];
|
||||||
/* Population counts for the code lengths. */
|
/* Population counts for the code lengths. */
|
||||||
uint16_t code_length_histo[16];
|
uint16_t code_length_histo[16];
|
||||||
|
/* TODO(eustas): +2 bytes padding */
|
||||||
|
|
||||||
/* For HuffmanTreeGroupDecode. */
|
/* For HuffmanTreeGroupDecode. */
|
||||||
int htree_index;
|
int htree_index;
|
||||||
HuffmanCode* next;
|
HuffmanCode* next;
|
||||||
|
|
||||||
/* For DecodeContextMap. */
|
/* For DecodeContextMap. */
|
||||||
uint32_t context_index;
|
brotli_reg_t context_index;
|
||||||
uint32_t max_run_length_prefix;
|
brotli_reg_t max_run_length_prefix;
|
||||||
uint32_t code;
|
brotli_reg_t code;
|
||||||
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272];
|
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272];
|
||||||
} BrotliMetablockHeaderArena;
|
} BrotliMetablockHeaderArena;
|
||||||
|
|
||||||
typedef struct BrotliMetablockBodyArena {
|
typedef struct BrotliMetablockBodyArena {
|
||||||
uint8_t dist_extra_bits[544];
|
uint8_t dist_extra_bits[544];
|
||||||
uint32_t dist_offset[544];
|
brotli_reg_t dist_offset[544];
|
||||||
} BrotliMetablockBodyArena;
|
} BrotliMetablockBodyArena;
|
||||||
|
|
||||||
struct BrotliDecoderStateStruct {
|
struct BrotliDecoderStateStruct {
|
||||||
|
@ -268,7 +269,7 @@ struct BrotliDecoderStateStruct {
|
||||||
uint64_t u64;
|
uint64_t u64;
|
||||||
uint8_t u8[8];
|
uint8_t u8[8];
|
||||||
} buffer;
|
} buffer;
|
||||||
uint32_t buffer_length;
|
brotli_reg_t buffer_length;
|
||||||
|
|
||||||
int pos;
|
int pos;
|
||||||
int max_backward_distance;
|
int max_backward_distance;
|
||||||
|
@ -278,6 +279,8 @@ struct BrotliDecoderStateStruct {
|
||||||
int dist_rb_idx;
|
int dist_rb_idx;
|
||||||
int dist_rb[4];
|
int dist_rb[4];
|
||||||
int error_code;
|
int error_code;
|
||||||
|
int meta_block_remaining_len;
|
||||||
|
|
||||||
uint8_t* ringbuffer;
|
uint8_t* ringbuffer;
|
||||||
uint8_t* ringbuffer_end;
|
uint8_t* ringbuffer_end;
|
||||||
HuffmanCode* htree_command;
|
HuffmanCode* htree_command;
|
||||||
|
@ -298,29 +301,30 @@ struct BrotliDecoderStateStruct {
|
||||||
/* Distance context is actual after command is decoded and before distance is
|
/* Distance context is actual after command is decoded and before distance is
|
||||||
computed. After distance computation it is used as a temporary variable. */
|
computed. After distance computation it is used as a temporary variable. */
|
||||||
int distance_context;
|
int distance_context;
|
||||||
int meta_block_remaining_len;
|
brotli_reg_t block_length[3];
|
||||||
uint32_t block_length_index;
|
brotli_reg_t block_length_index;
|
||||||
uint32_t block_length[3];
|
brotli_reg_t num_block_types[3];
|
||||||
uint32_t num_block_types[3];
|
brotli_reg_t block_type_rb[6];
|
||||||
uint32_t block_type_rb[6];
|
brotli_reg_t distance_postfix_bits;
|
||||||
uint32_t distance_postfix_bits;
|
brotli_reg_t num_direct_distance_codes;
|
||||||
uint32_t num_direct_distance_codes;
|
brotli_reg_t num_dist_htrees;
|
||||||
uint32_t num_dist_htrees;
|
|
||||||
uint8_t* dist_context_map;
|
uint8_t* dist_context_map;
|
||||||
HuffmanCode* literal_htree;
|
HuffmanCode* literal_htree;
|
||||||
uint8_t dist_htree_index;
|
|
||||||
|
|
||||||
int copy_length;
|
|
||||||
int distance_code;
|
|
||||||
|
|
||||||
/* For partial write operations. */
|
/* For partial write operations. */
|
||||||
size_t rb_roundtrips; /* how many times we went around the ring-buffer */
|
size_t rb_roundtrips; /* how many times we went around the ring-buffer */
|
||||||
size_t partial_pos_out; /* how much output to the user in total */
|
size_t partial_pos_out; /* how much output to the user in total */
|
||||||
|
|
||||||
/* For InverseMoveToFrontTransform. */
|
/* For InverseMoveToFrontTransform. */
|
||||||
uint32_t mtf_upper_bound;
|
brotli_reg_t mtf_upper_bound;
|
||||||
uint32_t mtf[64 + 1];
|
uint32_t mtf[64 + 1];
|
||||||
|
|
||||||
|
int copy_length;
|
||||||
|
int distance_code;
|
||||||
|
|
||||||
|
uint8_t dist_htree_index;
|
||||||
|
/* TODO(eustas): +3 bytes padding */
|
||||||
|
|
||||||
/* Less used attributes are at the end of this struct. */
|
/* Less used attributes are at the end of this struct. */
|
||||||
|
|
||||||
brotli_decoder_metadata_start_func metadata_start_func;
|
brotli_decoder_metadata_start_func metadata_start_func;
|
||||||
|
@ -336,18 +340,20 @@ struct BrotliDecoderStateStruct {
|
||||||
BrotliRunningDecodeUint8State substate_decode_uint8;
|
BrotliRunningDecodeUint8State substate_decode_uint8;
|
||||||
BrotliRunningReadBlockLengthState substate_read_block_length;
|
BrotliRunningReadBlockLengthState substate_read_block_length;
|
||||||
|
|
||||||
|
int new_ringbuffer_size;
|
||||||
|
/* TODO(eustas): +4 bytes padding */
|
||||||
|
|
||||||
unsigned int is_last_metablock : 1;
|
unsigned int is_last_metablock : 1;
|
||||||
unsigned int is_uncompressed : 1;
|
unsigned int is_uncompressed : 1;
|
||||||
unsigned int is_metadata : 1;
|
unsigned int is_metadata : 1;
|
||||||
unsigned int should_wrap_ringbuffer : 1;
|
unsigned int should_wrap_ringbuffer : 1;
|
||||||
unsigned int canny_ringbuffer_allocation : 1;
|
unsigned int canny_ringbuffer_allocation : 1;
|
||||||
unsigned int large_window : 1;
|
unsigned int large_window : 1;
|
||||||
|
unsigned int window_bits : 6;
|
||||||
unsigned int size_nibbles : 8;
|
unsigned int size_nibbles : 8;
|
||||||
uint32_t window_bits;
|
/* TODO(eustas): +12 bits padding */
|
||||||
|
|
||||||
int new_ringbuffer_size;
|
brotli_reg_t num_literal_htrees;
|
||||||
|
|
||||||
uint32_t num_literal_htrees;
|
|
||||||
uint8_t* context_map;
|
uint8_t* context_map;
|
||||||
uint8_t* context_modes;
|
uint8_t* context_modes;
|
||||||
|
|
||||||
|
@ -372,8 +378,9 @@ BROTLI_INTERNAL void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s);
|
||||||
BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(
|
BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(
|
||||||
BrotliDecoderState* s);
|
BrotliDecoderState* s);
|
||||||
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
|
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
|
||||||
BrotliDecoderState* s, HuffmanTreeGroup* group, uint32_t alphabet_size_max,
|
BrotliDecoderState* s, HuffmanTreeGroup* group,
|
||||||
uint32_t alphabet_size_limit, uint32_t ntrees);
|
brotli_reg_t alphabet_size_max, brotli_reg_t alphabet_size_limit,
|
||||||
|
brotli_reg_t ntrees);
|
||||||
|
|
||||||
#define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
|
#define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
|
||||||
|
|
||||||
|
@ -382,6 +389,10 @@ BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
|
||||||
X = NULL; \
|
X = NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Literal/Command/Distance block size maximum; same as maximum metablock size;
|
||||||
|
used as block size when there is no block switching. */
|
||||||
|
#define BROTLI_BLOCK_SIZE_CAP (1U << 24)
|
||||||
|
|
||||||
#if defined(__cplusplus) || defined(c_plusplus)
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
2
thirdparty/brotli/include/brotli/decode.h
vendored
2
thirdparty/brotli/include/brotli/decode.h
vendored
|
@ -357,7 +357,7 @@ BROTLI_DEC_API const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c);
|
||||||
/**
|
/**
|
||||||
* Gets a decoder library version.
|
* Gets a decoder library version.
|
||||||
*
|
*
|
||||||
* Look at BROTLI_VERSION for more information.
|
* Look at BROTLI_MAKE_HEX_VERSION for more information.
|
||||||
*/
|
*/
|
||||||
BROTLI_DEC_API uint32_t BrotliDecoderVersion(void);
|
BROTLI_DEC_API uint32_t BrotliDecoderVersion(void);
|
||||||
|
|
||||||
|
|
2
thirdparty/brotli/include/brotli/encode.h
vendored
2
thirdparty/brotli/include/brotli/encode.h
vendored
|
@ -490,7 +490,7 @@ BROTLI_ENC_EXTRA_API size_t BrotliEncoderGetPreparedDictionarySize(
|
||||||
/**
|
/**
|
||||||
* Gets an encoder library version.
|
* Gets an encoder library version.
|
||||||
*
|
*
|
||||||
* Look at BROTLI_VERSION for more information.
|
* Look at BROTLI_MAKE_HEX_VERSION for more information.
|
||||||
*/
|
*/
|
||||||
BROTLI_ENC_API uint32_t BrotliEncoderVersion(void);
|
BROTLI_ENC_API uint32_t BrotliEncoderVersion(void);
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,10 @@ typedef struct BrotliSharedDictionaryStruct BrotliSharedDictionary;
|
||||||
typedef enum BrotliSharedDictionaryType {
|
typedef enum BrotliSharedDictionaryType {
|
||||||
/** Raw LZ77 prefix dictionary. */
|
/** Raw LZ77 prefix dictionary. */
|
||||||
BROTLI_SHARED_DICTIONARY_RAW = 0,
|
BROTLI_SHARED_DICTIONARY_RAW = 0,
|
||||||
/** Serialized shared dictionary. */
|
/** Serialized shared dictionary.
|
||||||
|
*
|
||||||
|
* DO NOT USE: methods accepting this value will fail.
|
||||||
|
*/
|
||||||
BROTLI_SHARED_DICTIONARY_SERIALIZED = 1
|
BROTLI_SHARED_DICTIONARY_SERIALIZED = 1
|
||||||
} BrotliSharedDictionaryType;
|
} BrotliSharedDictionaryType;
|
||||||
|
|
||||||
|
|
12
thirdparty/minizip/crypt.h
vendored
12
thirdparty/minizip/crypt.h
vendored
|
@ -32,8 +32,7 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Return the next byte in the pseudo-random sequence
|
* Return the next byte in the pseudo-random sequence
|
||||||
*/
|
*/
|
||||||
static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab)
|
static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) {
|
||||||
{
|
|
||||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||||
* unpredictable manner on 16-bit systems; not a problem
|
* unpredictable manner on 16-bit systems; not a problem
|
||||||
* with any known compiler so far, though */
|
* with any known compiler so far, though */
|
||||||
|
@ -46,8 +45,7 @@ static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab)
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Update the encryption keys with the next byte of plain text
|
* Update the encryption keys with the next byte of plain text
|
||||||
*/
|
*/
|
||||||
static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c)
|
static int update_keys(unsigned long* pkeys, const z_crc_t* pcrc_32_tab, int c) {
|
||||||
{
|
|
||||||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
||||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||||
|
@ -63,8 +61,7 @@ static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c)
|
||||||
* Initialize the encryption keys and the random header according to
|
* Initialize the encryption keys and the random header according to
|
||||||
* the given password.
|
* the given password.
|
||||||
*/
|
*/
|
||||||
static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab)
|
static void init_keys(const char* passwd, unsigned long* pkeys, const z_crc_t* pcrc_32_tab) {
|
||||||
{
|
|
||||||
*(pkeys+0) = 305419896L;
|
*(pkeys+0) = 305419896L;
|
||||||
*(pkeys+1) = 591751049L;
|
*(pkeys+1) = 591751049L;
|
||||||
*(pkeys+2) = 878082192L;
|
*(pkeys+2) = 878082192L;
|
||||||
|
@ -93,8 +90,7 @@ static unsigned crypthead(const char* passwd, /* password string */
|
||||||
int bufSize,
|
int bufSize,
|
||||||
unsigned long* pkeys,
|
unsigned long* pkeys,
|
||||||
const z_crc_t* pcrc_32_tab,
|
const z_crc_t* pcrc_32_tab,
|
||||||
unsigned long crcForCrypting)
|
unsigned long crcForCrypting) {
|
||||||
{
|
|
||||||
unsigned n; /* index in random header */
|
unsigned n; /* index in random header */
|
||||||
int t; /* temporary */
|
int t; /* temporary */
|
||||||
int c; /* random byte */
|
int c; /* random byte */
|
||||||
|
|
62
thirdparty/minizip/ioapi.c
vendored
62
thirdparty/minizip/ioapi.c
vendored
|
@ -14,7 +14,7 @@
|
||||||
#define _CRT_SECURE_NO_WARNINGS
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(IOAPI_NO_64)
|
#if defined(__APPLE__) || defined(IOAPI_NO_64) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64)
|
||||||
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
||||||
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
||||||
#define FTELLO_FUNC(stream) ftello(stream)
|
#define FTELLO_FUNC(stream) ftello(stream)
|
||||||
|
@ -28,8 +28,7 @@
|
||||||
|
|
||||||
#include "ioapi.h"
|
#include "ioapi.h"
|
||||||
|
|
||||||
voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
|
voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc, const void*filename, int mode) {
|
||||||
{
|
|
||||||
if (pfilefunc->zfile_func64.zopen64_file != NULL)
|
if (pfilefunc->zfile_func64.zopen64_file != NULL)
|
||||||
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
|
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
|
||||||
else
|
else
|
||||||
|
@ -38,8 +37,7 @@ voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
|
long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) {
|
||||||
{
|
|
||||||
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
||||||
return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
|
return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
|
||||||
else
|
else
|
||||||
|
@ -52,8 +50,7 @@ long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
|
ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc, voidpf filestream) {
|
||||||
{
|
|
||||||
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
||||||
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
|
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
|
||||||
else
|
else
|
||||||
|
@ -66,11 +63,9 @@ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
|
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32, const zlib_filefunc_def* p_filefunc32) {
|
||||||
{
|
|
||||||
p_filefunc64_32->zfile_func64.zopen64_file = NULL;
|
p_filefunc64_32->zfile_func64.zopen64_file = NULL;
|
||||||
p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
|
p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
|
||||||
p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
|
|
||||||
p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
|
p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
|
||||||
p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
|
p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
|
||||||
p_filefunc64_32->zfile_func64.ztell64_file = NULL;
|
p_filefunc64_32->zfile_func64.ztell64_file = NULL;
|
||||||
|
@ -91,16 +86,7 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef
|
||||||
// GODOT end
|
// GODOT end
|
||||||
|
|
||||||
|
|
||||||
static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
|
static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char* filename, int mode) {
|
||||||
static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
|
||||||
static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
|
|
||||||
static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
|
|
||||||
static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
|
|
||||||
static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
|
|
||||||
static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
|
|
||||||
|
|
||||||
static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
|
|
||||||
{
|
|
||||||
FILE* file = NULL;
|
FILE* file = NULL;
|
||||||
const char* mode_fopen = NULL;
|
const char* mode_fopen = NULL;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
|
@ -118,8 +104,7 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
|
static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void* filename, int mode) {
|
||||||
{
|
|
||||||
FILE* file = NULL;
|
FILE* file = NULL;
|
||||||
const char* mode_fopen = NULL;
|
const char* mode_fopen = NULL;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
|
@ -138,24 +123,21 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
|
static uLong ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uLong size) {
|
||||||
{
|
|
||||||
uLong ret;
|
uLong ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
|
static uLong ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) {
|
||||||
{
|
|
||||||
uLong ret;
|
uLong ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
|
static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream) {
|
||||||
{
|
|
||||||
long ret;
|
long ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
ret = ftell((FILE *)stream);
|
ret = ftell((FILE *)stream);
|
||||||
|
@ -163,16 +145,14 @@ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
|
static ZPOS64_T ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream) {
|
||||||
{
|
|
||||||
ZPOS64_T ret;
|
ZPOS64_T ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
|
ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
|
static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) {
|
||||||
{
|
|
||||||
int fseek_origin=0;
|
int fseek_origin=0;
|
||||||
long ret;
|
long ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
|
@ -195,8 +175,7 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
|
static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) {
|
||||||
{
|
|
||||||
int fseek_origin=0;
|
int fseek_origin=0;
|
||||||
long ret;
|
long ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
|
@ -215,32 +194,28 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
if(FSEEKO_FUNC((FILE *)stream, (z_off_t)offset, fseek_origin) != 0)
|
if(FSEEKO_FUNC((FILE *)stream, (z_off64_t)offset, fseek_origin) != 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
|
static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
ret = fclose((FILE *)stream);
|
ret = fclose((FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
|
static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
ret = ferror((FILE *)stream);
|
ret = ferror((FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_fopen_filefunc (pzlib_filefunc_def)
|
void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def) {
|
||||||
zlib_filefunc_def* pzlib_filefunc_def;
|
|
||||||
{
|
|
||||||
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
||||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||||
|
@ -251,8 +226,7 @@ void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||||
pzlib_filefunc_def->opaque = NULL;
|
pzlib_filefunc_def->opaque = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
|
void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def) {
|
||||||
{
|
|
||||||
pzlib_filefunc_def->zopen64_file = fopen64_file_func;
|
pzlib_filefunc_def->zopen64_file = fopen64_file_func;
|
||||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||||
|
|
52
thirdparty/minizip/ioapi.h
vendored
52
thirdparty/minizip/ioapi.h
vendored
|
@ -45,28 +45,12 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
/* GODOT start */
|
|
||||||
/* Mighty Gentoo saves the day by breaking the API of their zlib.h,
|
|
||||||
* removing this definition of OF(args) for no practical reason
|
|
||||||
* worth breaking compatibility with all projects that embed minizip
|
|
||||||
* while trying not to diverge too much from upstream zlib.
|
|
||||||
* Cf. https://github.com/godotengine/godot/issues/10539
|
|
||||||
*
|
|
||||||
* "By and large, this is good open source behaviour, and fits with
|
|
||||||
* the gentoo _don't fuck with upstream's releases_ philosophy"
|
|
||||||
* -- Gentoo philosopher
|
|
||||||
*/
|
|
||||||
#ifndef OF /* function prototypes */
|
|
||||||
#define OF(args) args
|
|
||||||
#endif
|
|
||||||
/* GODOT end */
|
|
||||||
|
|
||||||
#if defined(USE_FILE32API)
|
#if defined(USE_FILE32API)
|
||||||
#define fopen64 fopen
|
#define fopen64 fopen
|
||||||
#define ftello64 ftell
|
#define ftello64 ftell
|
||||||
#define fseeko64 fseek
|
#define fseeko64 fseek
|
||||||
#else
|
#else
|
||||||
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64)
|
||||||
#define fopen64 fopen
|
#define fopen64 fopen
|
||||||
#define ftello64 ftello
|
#define ftello64 ftello
|
||||||
#define fseeko64 fseeko
|
#define fseeko64 fseeko
|
||||||
|
@ -98,7 +82,7 @@
|
||||||
#include "mz64conf.h"
|
#include "mz64conf.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* a type choosen by DEFINE */
|
/* a type chosen by DEFINE */
|
||||||
#ifdef HAVE_64BIT_INT_CUSTOM
|
#ifdef HAVE_64BIT_INT_CUSTOM
|
||||||
typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
|
typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
|
||||||
#else
|
#else
|
||||||
|
@ -150,14 +134,14 @@ extern "C" {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
|
typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char* filename, int mode);
|
||||||
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
typedef uLong (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uLong size);
|
||||||
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
|
typedef uLong (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void* buf, uLong size);
|
||||||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
|
typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream);
|
||||||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
|
typedef int (ZCALLBACK *testerror_file_func) (voidpf opaque, voidpf stream);
|
||||||
|
|
||||||
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
|
typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream);
|
||||||
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
|
typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uLong offset, int origin);
|
||||||
|
|
||||||
|
|
||||||
/* here is the "old" 32 bits structure structure */
|
/* here is the "old" 32 bits structure structure */
|
||||||
|
@ -177,9 +161,9 @@ typedef struct zlib_filefunc_def_s
|
||||||
/* GODOT end */
|
/* GODOT end */
|
||||||
} zlib_filefunc_def;
|
} zlib_filefunc_def;
|
||||||
|
|
||||||
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream));
|
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream);
|
||||||
typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
|
typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin);
|
||||||
typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode));
|
typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void* filename, int mode);
|
||||||
|
|
||||||
typedef struct zlib_filefunc64_def_s
|
typedef struct zlib_filefunc64_def_s
|
||||||
{
|
{
|
||||||
|
@ -197,8 +181,8 @@ typedef struct zlib_filefunc64_def_s
|
||||||
/* GODOT end */
|
/* GODOT end */
|
||||||
} zlib_filefunc64_def;
|
} zlib_filefunc64_def;
|
||||||
|
|
||||||
void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
|
void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
|
void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def);
|
||||||
|
|
||||||
/* now internal definition, only for zip.c and unzip.h */
|
/* now internal definition, only for zip.c and unzip.h */
|
||||||
typedef struct zlib_filefunc64_32_def_s
|
typedef struct zlib_filefunc64_32_def_s
|
||||||
|
@ -217,11 +201,11 @@ typedef struct zlib_filefunc64_32_def_s
|
||||||
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
|
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||||
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
|
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||||
|
|
||||||
voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
|
voidpf call_zopen64(const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode);
|
||||||
long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
|
long call_zseek64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin);
|
||||||
ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));
|
ZPOS64_T call_ztell64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream);
|
||||||
|
|
||||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32);
|
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32);
|
||||||
|
|
||||||
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
|
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
|
||||||
#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream)))
|
#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream)))
|
||||||
|
|
36
thirdparty/minizip/patches/CVE-2023-45853.patch
vendored
Normal file
36
thirdparty/minizip/patches/CVE-2023-45853.patch
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
From 73331a6a0481067628f065ffe87bb1d8f787d10c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hans Wennborg <hans@chromium.org>
|
||||||
|
Date: Fri, 18 Aug 2023 11:05:33 +0200
|
||||||
|
Subject: [PATCH] Reject overflows of zip header fields in minizip.
|
||||||
|
|
||||||
|
This checks the lengths of the file name, extra field, and comment
|
||||||
|
that would be put in the zip headers, and rejects them if they are
|
||||||
|
too long. They are each limited to 65535 bytes in length by the zip
|
||||||
|
format. This also avoids possible buffer overflows if the provided
|
||||||
|
fields are too long.
|
||||||
|
---
|
||||||
|
contrib/minizip/zip.c | 11 +++++++++++
|
||||||
|
1 file changed, 11 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c
|
||||||
|
index 3d3d4cadd..0446109b2 100644
|
||||||
|
--- a/contrib/minizip/zip.c
|
||||||
|
+++ b/contrib/minizip/zip.c
|
||||||
|
@@ -1043,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c
|
||||||
|
return ZIP_PARAMERROR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ // The filename and comment length must fit in 16 bits.
|
||||||
|
+ if ((filename!=NULL) && (strlen(filename)>0xffff))
|
||||||
|
+ return ZIP_PARAMERROR;
|
||||||
|
+ if ((comment!=NULL) && (strlen(comment)>0xffff))
|
||||||
|
+ return ZIP_PARAMERROR;
|
||||||
|
+ // The extra field length must fit in 16 bits. If the member also requires
|
||||||
|
+ // a Zip64 extra block, that will also need to fit within that 16-bit
|
||||||
|
+ // length, but that will be checked for later.
|
||||||
|
+ if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff))
|
||||||
|
+ return ZIP_PARAMERROR;
|
||||||
|
+
|
||||||
|
zi = (zip64_internal*)file;
|
||||||
|
|
||||||
|
if (zi->in_opened_file_inzip == 1)
|
54
thirdparty/minizip/patches/godot-seek.patch
vendored
54
thirdparty/minizip/patches/godot-seek.patch
vendored
|
@ -1,8 +1,8 @@
|
||||||
diff --git a/thirdparty/minizip/ioapi.c b/thirdparty/minizip/ioapi.c
|
diff --git a/thirdparty/minizip/ioapi.c b/thirdparty/minizip/ioapi.c
|
||||||
index 814a6fd38c..b50db35ac1 100644
|
index 782d32469a..2e89f5f41a 100644
|
||||||
--- a/thirdparty/minizip/ioapi.c
|
--- a/thirdparty/minizip/ioapi.c
|
||||||
+++ b/thirdparty/minizip/ioapi.c
|
+++ b/thirdparty/minizip/ioapi.c
|
||||||
@@ -80,8 +80,15 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef
|
@@ -75,8 +75,15 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef
|
||||||
p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
|
p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
|
||||||
p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
|
p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
|
||||||
p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
|
p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
|
||||||
|
@ -17,8 +17,8 @@ index 814a6fd38c..b50db35ac1 100644
|
||||||
+// GODOT end
|
+// GODOT end
|
||||||
|
|
||||||
|
|
||||||
static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
|
static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char* filename, int mode) {
|
||||||
@@ -255,3 +262,6 @@ void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
|
@@ -229,3 +236,6 @@ void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def) {
|
||||||
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
||||||
pzlib_filefunc_def->opaque = NULL;
|
pzlib_filefunc_def->opaque = NULL;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ index 814a6fd38c..b50db35ac1 100644
|
||||||
+*/
|
+*/
|
||||||
+/* GODOT end */
|
+/* GODOT end */
|
||||||
diff --git a/thirdparty/minizip/ioapi.h b/thirdparty/minizip/ioapi.h
|
diff --git a/thirdparty/minizip/ioapi.h b/thirdparty/minizip/ioapi.h
|
||||||
index ae9ca7e833..6c73fc4ec3 100644
|
index c588a18d03..14266141c6 100644
|
||||||
--- a/thirdparty/minizip/ioapi.h
|
--- a/thirdparty/minizip/ioapi.h
|
||||||
+++ b/thirdparty/minizip/ioapi.h
|
+++ b/thirdparty/minizip/ioapi.h
|
||||||
@@ -155,6 +155,10 @@ typedef struct zlib_filefunc_def_s
|
@@ -155,6 +155,10 @@ typedef struct zlib_filefunc_def_s
|
||||||
|
@ -39,7 +39,7 @@ index ae9ca7e833..6c73fc4ec3 100644
|
||||||
+ /* GODOT end */
|
+ /* GODOT end */
|
||||||
} zlib_filefunc_def;
|
} zlib_filefunc_def;
|
||||||
|
|
||||||
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream));
|
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream);
|
||||||
@@ -171,6 +175,10 @@ typedef struct zlib_filefunc64_def_s
|
@@ -171,6 +175,10 @@ typedef struct zlib_filefunc64_def_s
|
||||||
close_file_func zclose_file;
|
close_file_func zclose_file;
|
||||||
testerror_file_func zerror_file;
|
testerror_file_func zerror_file;
|
||||||
|
@ -50,12 +50,12 @@ index ae9ca7e833..6c73fc4ec3 100644
|
||||||
+ /* GODOT end */
|
+ /* GODOT end */
|
||||||
} zlib_filefunc64_def;
|
} zlib_filefunc64_def;
|
||||||
|
|
||||||
void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
|
void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
diff --git a/thirdparty/minizip/unzip.c b/thirdparty/minizip/unzip.c
|
diff --git a/thirdparty/minizip/unzip.c b/thirdparty/minizip/unzip.c
|
||||||
index 3036b470b7..e83aff2773 100644
|
index ed763f89f1..2f8c5f3675 100644
|
||||||
--- a/thirdparty/minizip/unzip.c
|
--- a/thirdparty/minizip/unzip.c
|
||||||
+++ b/thirdparty/minizip/unzip.c
|
+++ b/thirdparty/minizip/unzip.c
|
||||||
@@ -157,6 +157,9 @@ typedef struct
|
@@ -152,6 +152,9 @@ typedef struct
|
||||||
uLong compression_method; /* compression method (0==store) */
|
uLong compression_method; /* compression method (0==store) */
|
||||||
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
||||||
int raw;
|
int raw;
|
||||||
|
@ -65,7 +65,7 @@ index 3036b470b7..e83aff2773 100644
|
||||||
} file_in_zip64_read_info_s;
|
} file_in_zip64_read_info_s;
|
||||||
|
|
||||||
|
|
||||||
@@ -606,9 +609,10 @@ local unzFile unzOpenInternal (const void *path,
|
@@ -513,9 +516,10 @@ local unzFile unzOpenInternal(const void *path,
|
||||||
us.z_filefunc.zseek32_file = NULL;
|
us.z_filefunc.zseek32_file = NULL;
|
||||||
us.z_filefunc.ztell32_file = NULL;
|
us.z_filefunc.ztell32_file = NULL;
|
||||||
if (pzlib_filefunc64_32_def==NULL)
|
if (pzlib_filefunc64_32_def==NULL)
|
||||||
|
@ -79,7 +79,7 @@ index 3036b470b7..e83aff2773 100644
|
||||||
us.is64bitOpenFunction = is64bitOpenFunction;
|
us.is64bitOpenFunction = is64bitOpenFunction;
|
||||||
|
|
||||||
|
|
||||||
@@ -800,6 +804,18 @@ extern unzFile ZEXPORT unzOpen64 (const void *path)
|
@@ -703,6 +707,18 @@ extern unzFile ZEXPORT unzOpen64(const void *path) {
|
||||||
return unzOpenInternal(path, NULL, 1);
|
return unzOpenInternal(path, NULL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ index 3036b470b7..e83aff2773 100644
|
||||||
/*
|
/*
|
||||||
Close a ZipFile opened with unzOpen.
|
Close a ZipFile opened with unzOpen.
|
||||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||||
@@ -1018,10 +1034,23 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
|
@@ -905,10 +921,23 @@ local int unz64local_GetCurrentFileInfoInternal(unzFile file,
|
||||||
|
|
||||||
if (lSeek!=0)
|
if (lSeek!=0)
|
||||||
{
|
{
|
||||||
|
@ -122,7 +122,7 @@ index 3036b470b7..e83aff2773 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
while(acc < file_info.size_file_extra)
|
while(acc < file_info.size_file_extra)
|
||||||
@@ -1576,8 +1605,10 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
@@ -1446,8 +1475,10 @@ extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method,
|
||||||
}
|
}
|
||||||
else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
|
else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
|
||||||
{
|
{
|
||||||
|
@ -135,7 +135,7 @@ index 3036b470b7..e83aff2773 100644
|
||||||
pfile_in_zip_read_info->stream.opaque = (voidpf)0;
|
pfile_in_zip_read_info->stream.opaque = (voidpf)0;
|
||||||
pfile_in_zip_read_info->stream.next_in = 0;
|
pfile_in_zip_read_info->stream.next_in = 0;
|
||||||
pfile_in_zip_read_info->stream.avail_in = 0;
|
pfile_in_zip_read_info->stream.avail_in = 0;
|
||||||
@@ -1610,6 +1641,9 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
@@ -1480,6 +1511,9 @@ extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method,
|
||||||
iSizeVar;
|
iSizeVar;
|
||||||
|
|
||||||
pfile_in_zip_read_info->stream.avail_in = (uInt)0;
|
pfile_in_zip_read_info->stream.avail_in = (uInt)0;
|
||||||
|
@ -145,7 +145,7 @@ index 3036b470b7..e83aff2773 100644
|
||||||
|
|
||||||
s->pfile_in_zip_read = pfile_in_zip_read_info;
|
s->pfile_in_zip_read = pfile_in_zip_read_info;
|
||||||
s->encrypted = 0;
|
s->encrypted = 0;
|
||||||
@@ -1640,6 +1674,85 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
@@ -1510,6 +1544,85 @@ extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method,
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,14 +228,14 @@ index 3036b470b7..e83aff2773 100644
|
||||||
+}
|
+}
|
||||||
+/* GODOT end */
|
+/* GODOT end */
|
||||||
+
|
+
|
||||||
extern int ZEXPORT unzOpenCurrentFile (unzFile file)
|
extern int ZEXPORT unzOpenCurrentFile(unzFile file) {
|
||||||
{
|
|
||||||
return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
|
return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
|
||||||
|
}
|
||||||
diff --git a/thirdparty/minizip/unzip.h b/thirdparty/minizip/unzip.h
|
diff --git a/thirdparty/minizip/unzip.h b/thirdparty/minizip/unzip.h
|
||||||
index 6f95e94d75..71a7d89692 100644
|
index 14105840f6..1a477ecb50 100644
|
||||||
--- a/thirdparty/minizip/unzip.h
|
--- a/thirdparty/minizip/unzip.h
|
||||||
+++ b/thirdparty/minizip/unzip.h
|
+++ b/thirdparty/minizip/unzip.h
|
||||||
@@ -202,6 +202,10 @@ extern int ZEXPORT unzClose OF((unzFile file));
|
@@ -202,6 +202,10 @@ extern int ZEXPORT unzClose(unzFile file);
|
||||||
these files MUST be closed with unzCloseCurrentFile before call unzClose.
|
these files MUST be closed with unzCloseCurrentFile before call unzClose.
|
||||||
return UNZ_OK if there is no problem. */
|
return UNZ_OK if there is no problem. */
|
||||||
|
|
||||||
|
@ -243,10 +243,10 @@ index 6f95e94d75..71a7d89692 100644
|
||||||
+extern void* unzGetOpaque(unzFile file);
|
+extern void* unzGetOpaque(unzFile file);
|
||||||
+/* GODOT end */
|
+/* GODOT end */
|
||||||
+
|
+
|
||||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalInfo(unzFile file,
|
||||||
unz_global_info *pglobal_info));
|
unz_global_info *pglobal_info);
|
||||||
|
|
||||||
@@ -390,6 +394,13 @@ extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
@@ -390,6 +394,13 @@ extern int ZEXPORT unzReadCurrentFile(unzFile file,
|
||||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -257,14 +257,14 @@ index 6f95e94d75..71a7d89692 100644
|
||||||
+*/
|
+*/
|
||||||
+/* GODOT end */
|
+/* GODOT end */
|
||||||
+
|
+
|
||||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
extern z_off_t ZEXPORT unztell(unzFile file);
|
||||||
|
|
||||||
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
|
extern ZPOS64_T ZEXPORT unztell64(unzFile file);
|
||||||
diff --git a/thirdparty/minizip/zip.c b/thirdparty/minizip/zip.c
|
diff --git a/thirdparty/minizip/zip.c b/thirdparty/minizip/zip.c
|
||||||
index 66d693f85a..ddcc14132b 100644
|
index 3d3d4cadde..e859f9e42f 100644
|
||||||
--- a/thirdparty/minizip/zip.c
|
--- a/thirdparty/minizip/zip.c
|
||||||
+++ b/thirdparty/minizip/zip.c
|
+++ b/thirdparty/minizip/zip.c
|
||||||
@@ -854,9 +854,11 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl
|
@@ -820,9 +820,11 @@ extern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* glo
|
||||||
|
|
||||||
ziinit.z_filefunc.zseek32_file = NULL;
|
ziinit.z_filefunc.zseek32_file = NULL;
|
||||||
ziinit.z_filefunc.ztell32_file = NULL;
|
ziinit.z_filefunc.ztell32_file = NULL;
|
||||||
|
@ -279,7 +279,7 @@ index 66d693f85a..ddcc14132b 100644
|
||||||
ziinit.z_filefunc = *pzlib_filefunc64_32_def;
|
ziinit.z_filefunc = *pzlib_filefunc64_32_def;
|
||||||
|
|
||||||
ziinit.filestream = ZOPEN64(ziinit.z_filefunc,
|
ziinit.filestream = ZOPEN64(ziinit.z_filefunc,
|
||||||
@@ -1211,8 +1213,10 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename,
|
@@ -1171,8 +1173,10 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c
|
||||||
{
|
{
|
||||||
if(zi->ci.method == Z_DEFLATED)
|
if(zi->ci.method == Z_DEFLATED)
|
||||||
{
|
{
|
||||||
|
|
27
thirdparty/minizip/patches/unbreak-gentoo.patch
vendored
27
thirdparty/minizip/patches/unbreak-gentoo.patch
vendored
|
@ -1,27 +0,0 @@
|
||||||
diff --git a/thirdparty/minizip/ioapi.h b/thirdparty/minizip/ioapi.h
|
|
||||||
index 6c73fc4ec3..083062ffe6 100644
|
|
||||||
--- a/thirdparty/minizip/ioapi.h
|
|
||||||
+++ b/thirdparty/minizip/ioapi.h
|
|
||||||
@@ -45,6 +45,22 @@
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
+/* GODOT start */
|
|
||||||
+/* Mighty Gentoo saves the day by breaking the API of their zlib.h,
|
|
||||||
+ * removing this definition of OF(args) for no practical reason
|
|
||||||
+ * worth breaking compatibility with all projects that embed minizip
|
|
||||||
+ * while trying not to diverge too much from upstream zlib.
|
|
||||||
+ * Cf. https://github.com/godotengine/godot/issues/10539
|
|
||||||
+ *
|
|
||||||
+ * "By and large, this is good open source behaviour, and fits with
|
|
||||||
+ * the gentoo _don't fuck with upstream's releases_ philosophy"
|
|
||||||
+ * -- Gentoo philosopher
|
|
||||||
+ */
|
|
||||||
+#ifndef OF /* function prototypes */
|
|
||||||
+ #define OF(args) args
|
|
||||||
+#endif
|
|
||||||
+/* GODOT end */
|
|
||||||
+
|
|
||||||
#if defined(USE_FILE32API)
|
|
||||||
#define fopen64 fopen
|
|
||||||
#define ftello64 ftell
|
|
519
thirdparty/minizip/unzip.c
vendored
519
thirdparty/minizip/unzip.c
vendored
|
@ -49,12 +49,12 @@
|
||||||
Copyright (C) 2007-2008 Even Rouault
|
Copyright (C) 2007-2008 Even Rouault
|
||||||
|
|
||||||
|
|
||||||
Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again).
|
Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again).
|
||||||
Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
|
Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
|
||||||
should only read the compressed/uncompressed size from the Zip64 format if
|
should only read the compressed/uncompressed size from the Zip64 format if
|
||||||
the size from normal header was 0xFFFFFFFF
|
the size from normal header was 0xFFFFFFFF
|
||||||
Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
|
Oct-2009 - Mathias Svensson - Applied some bug fixes from patches received from Gilles Vollant
|
||||||
Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
|
Oct-2009 - Mathias Svensson - Applied support to unzip files with compression method BZIP2 (bzip2 lib is required)
|
||||||
Patch created by Daniel Borca
|
Patch created by Daniel Borca
|
||||||
|
|
||||||
Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
|
Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
|
||||||
|
@ -77,8 +77,6 @@
|
||||||
|
|
||||||
#ifdef STDC
|
#ifdef STDC
|
||||||
# include <stddef.h>
|
# include <stddef.h>
|
||||||
# include <string.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef NO_ERRNO_H
|
#ifdef NO_ERRNO_H
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
@ -111,9 +109,6 @@
|
||||||
#ifndef ALLOC
|
#ifndef ALLOC
|
||||||
# define ALLOC(size) (malloc(size))
|
# define ALLOC(size) (malloc(size))
|
||||||
#endif
|
#endif
|
||||||
#ifndef TRYFREE
|
|
||||||
# define TRYFREE(p) { free(p);}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SIZECENTRALDIRITEM (0x2e)
|
#define SIZECENTRALDIRITEM (0x2e)
|
||||||
#define SIZEZIPLOCALHEADER (0x1e)
|
#define SIZEZIPLOCALHEADER (0x1e)
|
||||||
|
@ -153,7 +148,7 @@ typedef struct
|
||||||
ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
|
ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
|
||||||
ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
|
ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
|
||||||
zlib_filefunc64_32_def z_filefunc;
|
zlib_filefunc64_32_def z_filefunc;
|
||||||
voidpf filestream; /* io structore of the zipfile */
|
voidpf filestream; /* io structure of the zipfile */
|
||||||
uLong compression_method; /* compression method (0==store) */
|
uLong compression_method; /* compression method (0==store) */
|
||||||
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
||||||
int raw;
|
int raw;
|
||||||
|
@ -169,7 +164,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
zlib_filefunc64_32_def z_filefunc;
|
zlib_filefunc64_32_def z_filefunc;
|
||||||
int is64bitOpenFunction;
|
int is64bitOpenFunction;
|
||||||
voidpf filestream; /* io structore of the zipfile */
|
voidpf filestream; /* io structure of the zipfile */
|
||||||
unz_global_info64 gi; /* public global information */
|
unz_global_info64 gi; /* public global information */
|
||||||
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
||||||
ZPOS64_T num_file; /* number of the current file in the zipfile*/
|
ZPOS64_T num_file; /* number of the current file in the zipfile*/
|
||||||
|
@ -200,29 +195,44 @@ typedef struct
|
||||||
#include "crypt.h"
|
#include "crypt.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Read a byte from a gz_stream; update next_in and avail_in. Return EOF
|
Reads a long in LSB order from the given gz_stream. Sets
|
||||||
for end of file.
|
|
||||||
IN assertion: the stream s has been successfully opened for reading.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
local int unz64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
local int unz64local_getByte OF((
|
voidpf filestream,
|
||||||
const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
uLong *pX) {
|
||||||
voidpf filestream,
|
unsigned char c[2];
|
||||||
int *pi));
|
int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,2);
|
||||||
|
if (err==2)
|
||||||
local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
|
|
||||||
{
|
|
||||||
unsigned char c;
|
|
||||||
int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
|
|
||||||
if (err==1)
|
|
||||||
{
|
{
|
||||||
*pi = (int)c;
|
*pX = c[0] | ((uLong)c[1] << 8);
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
*pX = 0;
|
||||||
|
if (ZERROR64(*pzlib_filefunc_def,filestream))
|
||||||
|
return UNZ_ERRNO;
|
||||||
|
else
|
||||||
|
return UNZ_EOF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local int unz64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
|
voidpf filestream,
|
||||||
|
uLong *pX) {
|
||||||
|
unsigned char c[4];
|
||||||
|
int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,4);
|
||||||
|
if (err==4)
|
||||||
|
{
|
||||||
|
*pX = c[0] | ((uLong)c[1] << 8) | ((uLong)c[2] << 16) | ((uLong)c[3] << 24);
|
||||||
|
return UNZ_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*pX = 0;
|
||||||
if (ZERROR64(*pzlib_filefunc_def,filestream))
|
if (ZERROR64(*pzlib_filefunc_def,filestream))
|
||||||
return UNZ_ERRNO;
|
return UNZ_ERRNO;
|
||||||
else
|
else
|
||||||
|
@ -231,126 +241,29 @@ local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ===========================================================================
|
local int unz64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
Reads a long in LSB order from the given gz_stream. Sets
|
voidpf filestream,
|
||||||
*/
|
ZPOS64_T *pX) {
|
||||||
local int unz64local_getShort OF((
|
unsigned char c[8];
|
||||||
const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,8);
|
||||||
voidpf filestream,
|
if (err==8)
|
||||||
uLong *pX));
|
{
|
||||||
|
*pX = c[0] | ((ZPOS64_T)c[1] << 8) | ((ZPOS64_T)c[2] << 16) | ((ZPOS64_T)c[3] << 24)
|
||||||
local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
| ((ZPOS64_T)c[4] << 32) | ((ZPOS64_T)c[5] << 40) | ((ZPOS64_T)c[6] << 48) | ((ZPOS64_T)c[7] << 56);
|
||||||
voidpf filestream,
|
return UNZ_OK;
|
||||||
uLong *pX)
|
}
|
||||||
{
|
|
||||||
uLong x ;
|
|
||||||
int i = 0;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x = (uLong)i;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((uLong)i)<<8;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
*pX = x;
|
|
||||||
else
|
else
|
||||||
|
{
|
||||||
*pX = 0;
|
*pX = 0;
|
||||||
return err;
|
if (ZERROR64(*pzlib_filefunc_def,filestream))
|
||||||
}
|
return UNZ_ERRNO;
|
||||||
|
else
|
||||||
local int unz64local_getLong OF((
|
return UNZ_EOF;
|
||||||
const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
}
|
||||||
voidpf filestream,
|
|
||||||
uLong *pX));
|
|
||||||
|
|
||||||
local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
|
||||||
voidpf filestream,
|
|
||||||
uLong *pX)
|
|
||||||
{
|
|
||||||
uLong x ;
|
|
||||||
int i = 0;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x = (uLong)i;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((uLong)i)<<8;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((uLong)i)<<16;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x += ((uLong)i)<<24;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
*pX = x;
|
|
||||||
else
|
|
||||||
*pX = 0;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
local int unz64local_getLong64 OF((
|
|
||||||
const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
|
||||||
voidpf filestream,
|
|
||||||
ZPOS64_T *pX));
|
|
||||||
|
|
||||||
|
|
||||||
local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
|
||||||
voidpf filestream,
|
|
||||||
ZPOS64_T *pX)
|
|
||||||
{
|
|
||||||
ZPOS64_T x ;
|
|
||||||
int i = 0;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x = (ZPOS64_T)i;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<8;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<16;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<24;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<32;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<40;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<48;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
|
|
||||||
x |= ((ZPOS64_T)i)<<56;
|
|
||||||
|
|
||||||
if (err==UNZ_OK)
|
|
||||||
*pX = x;
|
|
||||||
else
|
|
||||||
*pX = 0;
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* My own strcmpi / strcasecmp */
|
/* My own strcmpi / strcasecmp */
|
||||||
local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
|
local int strcmpcasenosensitive_internal(const char* fileName1, const char* fileName2) {
|
||||||
{
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
char c1=*(fileName1++);
|
char c1=*(fileName1++);
|
||||||
|
@ -382,19 +295,17 @@ local int strcmpcasenosensitive_internal (const char* fileName1, const char* fil
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compare two filename (fileName1,fileName2).
|
Compare two filenames (fileName1,fileName2).
|
||||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
If iCaseSensitivity = 1, comparison is case sensitive (like strcmp)
|
||||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi
|
||||||
or strcasecmp)
|
or strcasecmp)
|
||||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
If iCaseSensitivity = 0, case sensitivity is default of your operating system
|
||||||
(like 1 on Unix, 2 on Windows)
|
(like 1 on Unix, 2 on Windows)
|
||||||
|
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
|
extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
|
||||||
const char* fileName2,
|
const char* fileName2,
|
||||||
int iCaseSensitivity)
|
int iCaseSensitivity) {
|
||||||
|
|
||||||
{
|
|
||||||
if (iCaseSensitivity==0)
|
if (iCaseSensitivity==0)
|
||||||
iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
|
iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
|
||||||
|
|
||||||
|
@ -408,21 +319,23 @@ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
|
||||||
#define BUFREADCOMMENT (0x400)
|
#define BUFREADCOMMENT (0x400)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CENTRALDIRINVALID
|
||||||
|
#define CENTRALDIRINVALID ((ZPOS64_T)(-1))
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Locate the Central directory of a zipfile (at the end, just before
|
Locate the Central directory of a zipfile (at the end, just before
|
||||||
the global comment)
|
the global comment)
|
||||||
*/
|
*/
|
||||||
local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
|
local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) {
|
||||||
local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
|
|
||||||
{
|
|
||||||
unsigned char* buf;
|
unsigned char* buf;
|
||||||
ZPOS64_T uSizeFile;
|
ZPOS64_T uSizeFile;
|
||||||
ZPOS64_T uBackRead;
|
ZPOS64_T uBackRead;
|
||||||
ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
|
ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
|
||||||
ZPOS64_T uPosFound=0;
|
ZPOS64_T uPosFound=CENTRALDIRINVALID;
|
||||||
|
|
||||||
if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
|
if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
|
|
||||||
uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
|
uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
|
||||||
|
@ -432,7 +345,7 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
|
||||||
|
|
||||||
buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
|
buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
|
||||||
if (buf==NULL)
|
if (buf==NULL)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
uBackRead = 4;
|
uBackRead = 4;
|
||||||
while (uBackRead<uMaxBack)
|
while (uBackRead<uMaxBack)
|
||||||
|
@ -462,10 +375,10 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uPosFound!=0)
|
if (uPosFound!=CENTRALDIRINVALID)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
TRYFREE(buf);
|
free(buf);
|
||||||
return uPosFound;
|
return uPosFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,23 +387,18 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
|
||||||
Locate the Central directory 64 of a zipfile (at the end, just before
|
Locate the Central directory 64 of a zipfile (at the end, just before
|
||||||
the global comment)
|
the global comment)
|
||||||
*/
|
*/
|
||||||
local ZPOS64_T unz64local_SearchCentralDir64 OF((
|
|
||||||
const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
|
||||||
voidpf filestream));
|
|
||||||
|
|
||||||
local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
voidpf filestream)
|
voidpf filestream) {
|
||||||
{
|
|
||||||
unsigned char* buf;
|
unsigned char* buf;
|
||||||
ZPOS64_T uSizeFile;
|
ZPOS64_T uSizeFile;
|
||||||
ZPOS64_T uBackRead;
|
ZPOS64_T uBackRead;
|
||||||
ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
|
ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
|
||||||
ZPOS64_T uPosFound=0;
|
ZPOS64_T uPosFound=CENTRALDIRINVALID;
|
||||||
uLong uL;
|
uLong uL;
|
||||||
ZPOS64_T relativeOffset;
|
ZPOS64_T relativeOffset;
|
||||||
|
|
||||||
if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
|
if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
|
|
||||||
uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
|
uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
|
||||||
|
@ -500,7 +408,7 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
|
||||||
|
|
||||||
buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
|
buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
|
||||||
if (buf==NULL)
|
if (buf==NULL)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
uBackRead = 4;
|
uBackRead = 4;
|
||||||
while (uBackRead<uMaxBack)
|
while (uBackRead<uMaxBack)
|
||||||
|
@ -530,47 +438,47 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uPosFound!=0)
|
if (uPosFound!=CENTRALDIRINVALID)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
TRYFREE(buf);
|
free(buf);
|
||||||
if (uPosFound == 0)
|
if (uPosFound == CENTRALDIRINVALID)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* Zip64 end of central directory locator */
|
/* Zip64 end of central directory locator */
|
||||||
if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
|
if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* the signature, already checked */
|
/* the signature, already checked */
|
||||||
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* number of the disk with the start of the zip64 end of central directory */
|
/* number of the disk with the start of the zip64 end of central directory */
|
||||||
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
if (uL != 0)
|
if (uL != 0)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* relative offset of the zip64 end of central directory record */
|
/* relative offset of the zip64 end of central directory record */
|
||||||
if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
|
if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* total number of disks */
|
/* total number of disks */
|
||||||
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
if (uL != 1)
|
if (uL != 1)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* Goto end of central directory record */
|
/* Goto end of central directory record */
|
||||||
if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
|
if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
/* the signature */
|
/* the signature */
|
||||||
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
if (uL != 0x06064b50)
|
if (uL != 0x06064b50)
|
||||||
return 0;
|
return CENTRALDIRINVALID;
|
||||||
|
|
||||||
return relativeOffset;
|
return relativeOffset;
|
||||||
}
|
}
|
||||||
|
@ -584,19 +492,18 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
|
||||||
Else, the return value is a unzFile Handle, usable with other function
|
Else, the return value is a unzFile Handle, usable with other function
|
||||||
of this unzip package.
|
of this unzip package.
|
||||||
*/
|
*/
|
||||||
local unzFile unzOpenInternal (const void *path,
|
local unzFile unzOpenInternal(const void *path,
|
||||||
zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
|
zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
|
||||||
int is64bitOpenFunction)
|
int is64bitOpenFunction) {
|
||||||
{
|
|
||||||
unz64_s us;
|
unz64_s us;
|
||||||
unz64_s *s;
|
unz64_s *s;
|
||||||
ZPOS64_T central_pos;
|
ZPOS64_T central_pos;
|
||||||
uLong uL;
|
uLong uL;
|
||||||
|
|
||||||
uLong number_disk; /* number of the current dist, used for
|
uLong number_disk; /* number of the current dist, used for
|
||||||
spaning ZIP, unsupported, always 0*/
|
spanning ZIP, unsupported, always 0*/
|
||||||
uLong number_disk_with_CD; /* number the the disk with central dir, used
|
uLong number_disk_with_CD; /* number the the disk with central dir, used
|
||||||
for spaning ZIP, unsupported, always 0*/
|
for spanning ZIP, unsupported, always 0*/
|
||||||
ZPOS64_T number_entry_CD; /* total number of entries in
|
ZPOS64_T number_entry_CD; /* total number of entries in
|
||||||
the central dir
|
the central dir
|
||||||
(same than number_entry on nospan) */
|
(same than number_entry on nospan) */
|
||||||
|
@ -625,7 +532,7 @@ local unzFile unzOpenInternal (const void *path,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
|
central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
|
||||||
if (central_pos)
|
if (central_pos!=CENTRALDIRINVALID)
|
||||||
{
|
{
|
||||||
uLong uS;
|
uLong uS;
|
||||||
ZPOS64_T uL64;
|
ZPOS64_T uL64;
|
||||||
|
@ -687,7 +594,7 @@ local unzFile unzOpenInternal (const void *path,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
|
central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
|
||||||
if (central_pos==0)
|
if (central_pos==CENTRALDIRINVALID)
|
||||||
err=UNZ_ERRNO;
|
err=UNZ_ERRNO;
|
||||||
|
|
||||||
us.isZip64 = 0;
|
us.isZip64 = 0;
|
||||||
|
@ -766,9 +673,8 @@ local unzFile unzOpenInternal (const void *path,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen2 (const char *path,
|
extern unzFile ZEXPORT unzOpen2(const char *path,
|
||||||
zlib_filefunc_def* pzlib_filefunc32_def)
|
zlib_filefunc_def* pzlib_filefunc32_def) {
|
||||||
{
|
|
||||||
if (pzlib_filefunc32_def != NULL)
|
if (pzlib_filefunc32_def != NULL)
|
||||||
{
|
{
|
||||||
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
||||||
|
@ -779,9 +685,8 @@ extern unzFile ZEXPORT unzOpen2 (const char *path,
|
||||||
return unzOpenInternal(path, NULL, 0);
|
return unzOpenInternal(path, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen2_64 (const void *path,
|
extern unzFile ZEXPORT unzOpen2_64(const void *path,
|
||||||
zlib_filefunc64_def* pzlib_filefunc_def)
|
zlib_filefunc64_def* pzlib_filefunc_def) {
|
||||||
{
|
|
||||||
if (pzlib_filefunc_def != NULL)
|
if (pzlib_filefunc_def != NULL)
|
||||||
{
|
{
|
||||||
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
||||||
|
@ -794,13 +699,11 @@ extern unzFile ZEXPORT unzOpen2_64 (const void *path,
|
||||||
return unzOpenInternal(path, NULL, 1);
|
return unzOpenInternal(path, NULL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen (const char *path)
|
extern unzFile ZEXPORT unzOpen(const char *path) {
|
||||||
{
|
|
||||||
return unzOpenInternal(path, NULL, 0);
|
return unzOpenInternal(path, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen64 (const void *path)
|
extern unzFile ZEXPORT unzOpen64(const void *path) {
|
||||||
{
|
|
||||||
return unzOpenInternal(path, NULL, 1);
|
return unzOpenInternal(path, NULL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,8 +724,7 @@ extern void* unzGetOpaque(unzFile file) {
|
||||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||||
these files MUST be closed with unzCloseCurrentFile before call unzClose.
|
these files MUST be closed with unzCloseCurrentFile before call unzClose.
|
||||||
return UNZ_OK if there is no problem. */
|
return UNZ_OK if there is no problem. */
|
||||||
extern int ZEXPORT unzClose (unzFile file)
|
extern int ZEXPORT unzClose(unzFile file) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
return UNZ_PARAMERROR;
|
return UNZ_PARAMERROR;
|
||||||
|
@ -832,7 +734,7 @@ extern int ZEXPORT unzClose (unzFile file)
|
||||||
unzCloseCurrentFile(file);
|
unzCloseCurrentFile(file);
|
||||||
|
|
||||||
ZCLOSE64(s->z_filefunc, s->filestream);
|
ZCLOSE64(s->z_filefunc, s->filestream);
|
||||||
TRYFREE(s);
|
free(s);
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -841,8 +743,7 @@ extern int ZEXPORT unzClose (unzFile file)
|
||||||
Write info about the ZipFile in the *pglobal_info structure.
|
Write info about the ZipFile in the *pglobal_info structure.
|
||||||
No preparation of the structure is needed
|
No preparation of the structure is needed
|
||||||
return UNZ_OK if there is no problem. */
|
return UNZ_OK if there is no problem. */
|
||||||
extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
|
extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64* pglobal_info) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
return UNZ_PARAMERROR;
|
return UNZ_PARAMERROR;
|
||||||
|
@ -851,8 +752,7 @@ extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
|
extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
return UNZ_PARAMERROR;
|
return UNZ_PARAMERROR;
|
||||||
|
@ -863,10 +763,9 @@ extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Translate date/time from Dos format to tm_unz (readable more easilty)
|
Translate date/time from Dos format to tm_unz (readable more easily)
|
||||||
*/
|
*/
|
||||||
local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
|
local void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz* ptm) {
|
||||||
{
|
|
||||||
ZPOS64_T uDate;
|
ZPOS64_T uDate;
|
||||||
uDate = (ZPOS64_T)(ulDosDate>>16);
|
uDate = (ZPOS64_T)(ulDosDate>>16);
|
||||||
ptm->tm_mday = (int)(uDate&0x1f) ;
|
ptm->tm_mday = (int)(uDate&0x1f) ;
|
||||||
|
@ -881,28 +780,16 @@ local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
|
||||||
/*
|
/*
|
||||||
Get Info about the current file in the zipfile, with internal only info
|
Get Info about the current file in the zipfile, with internal only info
|
||||||
*/
|
*/
|
||||||
local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
|
local int unz64local_GetCurrentFileInfoInternal(unzFile file,
|
||||||
unz_file_info64 *pfile_info,
|
unz_file_info64 *pfile_info,
|
||||||
unz_file_info64_internal
|
unz_file_info64_internal
|
||||||
*pfile_info_internal,
|
*pfile_info_internal,
|
||||||
char *szFileName,
|
char *szFileName,
|
||||||
uLong fileNameBufferSize,
|
uLong fileNameBufferSize,
|
||||||
void *extraField,
|
void *extraField,
|
||||||
uLong extraFieldBufferSize,
|
uLong extraFieldBufferSize,
|
||||||
char *szComment,
|
char *szComment,
|
||||||
uLong commentBufferSize));
|
uLong commentBufferSize) {
|
||||||
|
|
||||||
local int unz64local_GetCurrentFileInfoInternal (unzFile file,
|
|
||||||
unz_file_info64 *pfile_info,
|
|
||||||
unz_file_info64_internal
|
|
||||||
*pfile_info_internal,
|
|
||||||
char *szFileName,
|
|
||||||
uLong fileNameBufferSize,
|
|
||||||
void *extraField,
|
|
||||||
uLong extraFieldBufferSize,
|
|
||||||
char *szComment,
|
|
||||||
uLong commentBufferSize)
|
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
unz_file_info64 file_info;
|
unz_file_info64 file_info;
|
||||||
unz_file_info64_internal file_info_internal;
|
unz_file_info64_internal file_info_internal;
|
||||||
|
@ -1067,33 +954,31 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
|
||||||
/* ZIP64 extra fields */
|
/* ZIP64 extra fields */
|
||||||
if (headerId == 0x0001)
|
if (headerId == 0x0001)
|
||||||
{
|
{
|
||||||
uLong uL;
|
if(file_info.uncompressed_size == MAXU32)
|
||||||
|
{
|
||||||
|
if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
|
||||||
|
err=UNZ_ERRNO;
|
||||||
|
}
|
||||||
|
|
||||||
if(file_info.uncompressed_size == MAXU32)
|
if(file_info.compressed_size == MAXU32)
|
||||||
{
|
{
|
||||||
if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
|
if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
|
||||||
err=UNZ_ERRNO;
|
err=UNZ_ERRNO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(file_info.compressed_size == MAXU32)
|
if(file_info_internal.offset_curfile == MAXU32)
|
||||||
{
|
{
|
||||||
if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
|
/* Relative Header offset */
|
||||||
err=UNZ_ERRNO;
|
if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
|
||||||
}
|
err=UNZ_ERRNO;
|
||||||
|
}
|
||||||
|
|
||||||
if(file_info_internal.offset_curfile == MAXU32)
|
if(file_info.disk_num_start == 0xffff)
|
||||||
{
|
{
|
||||||
/* Relative Header offset */
|
/* Disk Start Number */
|
||||||
if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
|
if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
|
||||||
err=UNZ_ERRNO;
|
err=UNZ_ERRNO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(file_info.disk_num_start == MAXU32)
|
|
||||||
{
|
|
||||||
/* Disk Start Number */
|
|
||||||
if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
|
|
||||||
err=UNZ_ERRNO;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1150,24 +1035,22 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
|
||||||
No preparation of the structure is needed
|
No preparation of the structure is needed
|
||||||
return UNZ_OK if there is no problem.
|
return UNZ_OK if there is no problem.
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
|
extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file,
|
||||||
unz_file_info64 * pfile_info,
|
unz_file_info64 * pfile_info,
|
||||||
char * szFileName, uLong fileNameBufferSize,
|
char * szFileName, uLong fileNameBufferSize,
|
||||||
void *extraField, uLong extraFieldBufferSize,
|
void *extraField, uLong extraFieldBufferSize,
|
||||||
char* szComment, uLong commentBufferSize)
|
char* szComment, uLong commentBufferSize) {
|
||||||
{
|
|
||||||
return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
|
return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
|
||||||
szFileName,fileNameBufferSize,
|
szFileName,fileNameBufferSize,
|
||||||
extraField,extraFieldBufferSize,
|
extraField,extraFieldBufferSize,
|
||||||
szComment,commentBufferSize);
|
szComment,commentBufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
|
extern int ZEXPORT unzGetCurrentFileInfo(unzFile file,
|
||||||
unz_file_info * pfile_info,
|
unz_file_info * pfile_info,
|
||||||
char * szFileName, uLong fileNameBufferSize,
|
char * szFileName, uLong fileNameBufferSize,
|
||||||
void *extraField, uLong extraFieldBufferSize,
|
void *extraField, uLong extraFieldBufferSize,
|
||||||
char* szComment, uLong commentBufferSize)
|
char* szComment, uLong commentBufferSize) {
|
||||||
{
|
|
||||||
int err;
|
int err;
|
||||||
unz_file_info64 file_info64;
|
unz_file_info64 file_info64;
|
||||||
err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
|
err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
|
||||||
|
@ -1191,7 +1074,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
|
||||||
pfile_info->internal_fa = file_info64.internal_fa;
|
pfile_info->internal_fa = file_info64.internal_fa;
|
||||||
pfile_info->external_fa = file_info64.external_fa;
|
pfile_info->external_fa = file_info64.external_fa;
|
||||||
|
|
||||||
pfile_info->tmu_date = file_info64.tmu_date,
|
pfile_info->tmu_date = file_info64.tmu_date;
|
||||||
|
|
||||||
|
|
||||||
pfile_info->compressed_size = (uLong)file_info64.compressed_size;
|
pfile_info->compressed_size = (uLong)file_info64.compressed_size;
|
||||||
|
@ -1204,8 +1087,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
|
||||||
Set the current file of the zipfile to the first file.
|
Set the current file of the zipfile to the first file.
|
||||||
return UNZ_OK if there is no problem
|
return UNZ_OK if there is no problem
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzGoToFirstFile (unzFile file)
|
extern int ZEXPORT unzGoToFirstFile(unzFile file) {
|
||||||
{
|
|
||||||
int err=UNZ_OK;
|
int err=UNZ_OK;
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
|
@ -1225,8 +1107,7 @@ extern int ZEXPORT unzGoToFirstFile (unzFile file)
|
||||||
return UNZ_OK if there is no problem
|
return UNZ_OK if there is no problem
|
||||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzGoToNextFile (unzFile file)
|
extern int ZEXPORT unzGoToNextFile(unzFile file) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1258,8 +1139,7 @@ extern int ZEXPORT unzGoToNextFile (unzFile file)
|
||||||
UNZ_OK if the file is found. It becomes the current file.
|
UNZ_OK if the file is found. It becomes the current file.
|
||||||
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
|
extern int ZEXPORT unzLocateFile(unzFile file, const char *szFileName, int iCaseSensitivity) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1334,8 +1214,7 @@ typedef struct unz_file_pos_s
|
||||||
} unz_file_pos;
|
} unz_file_pos;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos)
|
extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
|
|
||||||
if (file==NULL || file_pos==NULL)
|
if (file==NULL || file_pos==NULL)
|
||||||
|
@ -1350,10 +1229,7 @@ extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos)
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzGetFilePos(
|
extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) {
|
||||||
unzFile file,
|
|
||||||
unz_file_pos* file_pos)
|
|
||||||
{
|
|
||||||
unz64_file_pos file_pos64;
|
unz64_file_pos file_pos64;
|
||||||
int err = unzGetFilePos64(file,&file_pos64);
|
int err = unzGetFilePos64(file,&file_pos64);
|
||||||
if (err==UNZ_OK)
|
if (err==UNZ_OK)
|
||||||
|
@ -1364,8 +1240,7 @@ extern int ZEXPORT unzGetFilePos(
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
|
extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1386,10 +1261,7 @@ extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToFilePos(
|
extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos) {
|
||||||
unzFile file,
|
|
||||||
unz_file_pos* file_pos)
|
|
||||||
{
|
|
||||||
unz64_file_pos file_pos64;
|
unz64_file_pos file_pos64;
|
||||||
if (file_pos == NULL)
|
if (file_pos == NULL)
|
||||||
return UNZ_PARAMERROR;
|
return UNZ_PARAMERROR;
|
||||||
|
@ -1411,10 +1283,9 @@ extern int ZEXPORT unzGoToFilePos(
|
||||||
store in *piSizeVar the size of extra info in local header
|
store in *piSizeVar the size of extra info in local header
|
||||||
(filename and size of extra field data)
|
(filename and size of extra field data)
|
||||||
*/
|
*/
|
||||||
local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
|
local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar,
|
||||||
ZPOS64_T * poffset_local_extrafield,
|
ZPOS64_T * poffset_local_extrafield,
|
||||||
uInt * psize_local_extrafield)
|
uInt * psize_local_extrafield) {
|
||||||
{
|
|
||||||
uLong uMagic,uData,uFlags;
|
uLong uMagic,uData,uFlags;
|
||||||
uLong size_filename;
|
uLong size_filename;
|
||||||
uLong size_extra_field;
|
uLong size_extra_field;
|
||||||
|
@ -1498,9 +1369,8 @@ local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVa
|
||||||
Open for reading data the current file in the zipfile.
|
Open for reading data the current file in the zipfile.
|
||||||
If there is no error and the file is opened, the return value is UNZ_OK.
|
If there is no error and the file is opened, the return value is UNZ_OK.
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method,
|
||||||
int* level, int raw, const char* password)
|
int* level, int raw, const char* password) {
|
||||||
{
|
|
||||||
int err=UNZ_OK;
|
int err=UNZ_OK;
|
||||||
uInt iSizeVar;
|
uInt iSizeVar;
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
|
@ -1538,7 +1408,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
||||||
|
|
||||||
if (pfile_in_zip_read_info->read_buffer==NULL)
|
if (pfile_in_zip_read_info->read_buffer==NULL)
|
||||||
{
|
{
|
||||||
TRYFREE(pfile_in_zip_read_info);
|
free(pfile_in_zip_read_info);
|
||||||
return UNZ_INTERNALERROR;
|
return UNZ_INTERNALERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1595,8 +1465,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
||||||
pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
|
pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TRYFREE(pfile_in_zip_read_info->read_buffer);
|
free(pfile_in_zip_read_info->read_buffer);
|
||||||
TRYFREE(pfile_in_zip_read_info);
|
free(pfile_in_zip_read_info);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -1618,8 +1488,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
||||||
pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
|
pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TRYFREE(pfile_in_zip_read_info->read_buffer);
|
free(pfile_in_zip_read_info->read_buffer);
|
||||||
TRYFREE(pfile_in_zip_read_info);
|
free(pfile_in_zip_read_info);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
/* windowBits is passed < 0 to tell that there is no zlib header.
|
/* windowBits is passed < 0 to tell that there is no zlib header.
|
||||||
|
@ -1753,25 +1623,21 @@ extern int ZEXPORT unzSeekCurrentFile(unzFile file, int pos) {
|
||||||
}
|
}
|
||||||
/* GODOT end */
|
/* GODOT end */
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile (unzFile file)
|
extern int ZEXPORT unzOpenCurrentFile(unzFile file) {
|
||||||
{
|
|
||||||
return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
|
return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password)
|
extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char* password) {
|
||||||
{
|
|
||||||
return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
|
return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
|
extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int* method, int* level, int raw) {
|
||||||
{
|
|
||||||
return unzOpenCurrentFile3(file, method, level, raw, NULL);
|
return unzOpenCurrentFile3(file, method, level, raw, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Addition for GDAL : START */
|
/** Addition for GDAL : START */
|
||||||
|
|
||||||
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
|
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
||||||
s=(unz64_s*)file;
|
s=(unz64_s*)file;
|
||||||
|
@ -1791,13 +1657,12 @@ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
|
||||||
buf contain buffer where data must be copied
|
buf contain buffer where data must be copied
|
||||||
len the size of buf.
|
len the size of buf.
|
||||||
|
|
||||||
return the number of byte copied if somes bytes are copied
|
return the number of byte copied if some bytes are copied
|
||||||
return 0 if the end of file was reached
|
return 0 if the end of file was reached
|
||||||
return <0 with error code if there is an error
|
return <0 with error code if there is an error
|
||||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
|
extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len) {
|
||||||
{
|
|
||||||
int err=UNZ_OK;
|
int err=UNZ_OK;
|
||||||
uInt iRead = 0;
|
uInt iRead = 0;
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
|
@ -2004,8 +1869,7 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
|
||||||
/*
|
/*
|
||||||
Give the current position in uncompressed data
|
Give the current position in uncompressed data
|
||||||
*/
|
*/
|
||||||
extern z_off_t ZEXPORT unztell (unzFile file)
|
extern z_off_t ZEXPORT unztell(unzFile file) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
|
@ -2019,8 +1883,7 @@ extern z_off_t ZEXPORT unztell (unzFile file)
|
||||||
return (z_off_t)pfile_in_zip_read_info->stream.total_out;
|
return (z_off_t)pfile_in_zip_read_info->stream.total_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
|
extern ZPOS64_T ZEXPORT unztell64(unzFile file) {
|
||||||
{
|
|
||||||
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
||||||
|
@ -2039,8 +1902,7 @@ extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
|
||||||
/*
|
/*
|
||||||
return 1 if the end of file was reached, 0 elsewhere
|
return 1 if the end of file was reached, 0 elsewhere
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzeof (unzFile file)
|
extern int ZEXPORT unzeof(unzFile file) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
|
@ -2071,8 +1933,7 @@ more info in the local-header version than in the central-header)
|
||||||
the return value is the number of bytes copied in buf, or (if <0)
|
the return value is the number of bytes copied in buf, or (if <0)
|
||||||
the error code
|
the error code
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
|
extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
file_in_zip64_read_info_s* pfile_in_zip_read_info;
|
||||||
uInt read_now;
|
uInt read_now;
|
||||||
|
@ -2119,8 +1980,7 @@ extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
|
||||||
Close the file in zip opened with unzOpenCurrentFile
|
Close the file in zip opened with unzOpenCurrentFile
|
||||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzCloseCurrentFile (unzFile file)
|
extern int ZEXPORT unzCloseCurrentFile(unzFile file) {
|
||||||
{
|
|
||||||
int err=UNZ_OK;
|
int err=UNZ_OK;
|
||||||
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
|
@ -2142,7 +2002,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TRYFREE(pfile_in_zip_read_info->read_buffer);
|
free(pfile_in_zip_read_info->read_buffer);
|
||||||
pfile_in_zip_read_info->read_buffer = NULL;
|
pfile_in_zip_read_info->read_buffer = NULL;
|
||||||
if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
|
if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
|
||||||
inflateEnd(&pfile_in_zip_read_info->stream);
|
inflateEnd(&pfile_in_zip_read_info->stream);
|
||||||
|
@ -2153,7 +2013,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file)
|
||||||
|
|
||||||
|
|
||||||
pfile_in_zip_read_info->stream_initialised = 0;
|
pfile_in_zip_read_info->stream_initialised = 0;
|
||||||
TRYFREE(pfile_in_zip_read_info);
|
free(pfile_in_zip_read_info);
|
||||||
|
|
||||||
s->pfile_in_zip_read=NULL;
|
s->pfile_in_zip_read=NULL;
|
||||||
|
|
||||||
|
@ -2166,8 +2026,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file)
|
||||||
uSizeBuf is the size of the szComment buffer.
|
uSizeBuf is the size of the szComment buffer.
|
||||||
return the number of byte copied or an error code <0
|
return the number of byte copied or an error code <0
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
|
extern int ZEXPORT unzGetGlobalComment(unzFile file, char * szComment, uLong uSizeBuf) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
uLong uReadThis ;
|
uLong uReadThis ;
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
|
@ -2194,8 +2053,7 @@ extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uS
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Additions by RX '2004 */
|
/* Additions by RX '2004 */
|
||||||
extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
|
extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
|
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
|
@ -2209,8 +2067,7 @@ extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
|
||||||
return s->pos_in_central_dir;
|
return s->pos_in_central_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uLong ZEXPORT unzGetOffset (unzFile file)
|
extern uLong ZEXPORT unzGetOffset(unzFile file) {
|
||||||
{
|
|
||||||
ZPOS64_T offset64;
|
ZPOS64_T offset64;
|
||||||
|
|
||||||
if (file==NULL)
|
if (file==NULL)
|
||||||
|
@ -2219,8 +2076,7 @@ extern uLong ZEXPORT unzGetOffset (unzFile file)
|
||||||
return (uLong)offset64;
|
return (uLong)offset64;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
|
extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) {
|
||||||
{
|
|
||||||
unz64_s* s;
|
unz64_s* s;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -2237,7 +2093,6 @@ extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
|
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) {
|
||||||
{
|
|
||||||
return unzSetOffset64(file,pos);
|
return unzSetOffset64(file,pos);
|
||||||
}
|
}
|
||||||
|
|
134
thirdparty/minizip/unzip.h
vendored
134
thirdparty/minizip/unzip.h
vendored
|
@ -150,21 +150,21 @@ typedef struct unz_file_info_s
|
||||||
tm_unz tmu_date;
|
tm_unz tmu_date;
|
||||||
} unz_file_info;
|
} unz_file_info;
|
||||||
|
|
||||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
extern int ZEXPORT unzStringFileNameCompare(const char* fileName1,
|
||||||
const char* fileName2,
|
const char* fileName2,
|
||||||
int iCaseSensitivity));
|
int iCaseSensitivity);
|
||||||
/*
|
/*
|
||||||
Compare two filename (fileName1,fileName2).
|
Compare two filenames (fileName1,fileName2).
|
||||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
If iCaseSensitivity = 1, comparison is case sensitive (like strcmp)
|
||||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi
|
||||||
or strcasecmp)
|
or strcasecmp)
|
||||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
If iCaseSensitivity = 0, case sensitivity is default of your operating system
|
||||||
(like 1 on Unix, 2 on Windows)
|
(like 1 on Unix, 2 on Windows)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
extern unzFile ZEXPORT unzOpen(const char *path);
|
||||||
extern unzFile ZEXPORT unzOpen64 OF((const void *path));
|
extern unzFile ZEXPORT unzOpen64(const void *path);
|
||||||
/*
|
/*
|
||||||
Open a Zip file. path contain the full pathname (by example,
|
Open a Zip file. path contain the full pathname (by example,
|
||||||
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
|
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
|
||||||
|
@ -181,21 +181,21 @@ extern unzFile ZEXPORT unzOpen64 OF((const void *path));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen2 OF((const char *path,
|
extern unzFile ZEXPORT unzOpen2(const char *path,
|
||||||
zlib_filefunc_def* pzlib_filefunc_def));
|
zlib_filefunc_def* pzlib_filefunc_def);
|
||||||
/*
|
/*
|
||||||
Open a Zip file, like unzOpen, but provide a set of file low level API
|
Open a Zip file, like unzOpen, but provide a set of file low level API
|
||||||
for read/write the zip file (see ioapi.h)
|
for read/write the zip file (see ioapi.h)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen2_64 OF((const void *path,
|
extern unzFile ZEXPORT unzOpen2_64(const void *path,
|
||||||
zlib_filefunc64_def* pzlib_filefunc_def));
|
zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
/*
|
/*
|
||||||
Open a Zip file, like unz64Open, but provide a set of file low level API
|
Open a Zip file, like unz64Open, but provide a set of file low level API
|
||||||
for read/write the zip file (see ioapi.h)
|
for read/write the zip file (see ioapi.h)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzClose OF((unzFile file));
|
extern int ZEXPORT unzClose(unzFile file);
|
||||||
/*
|
/*
|
||||||
Close a ZipFile opened with unzOpen.
|
Close a ZipFile opened with unzOpen.
|
||||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||||
|
@ -206,20 +206,20 @@ extern int ZEXPORT unzClose OF((unzFile file));
|
||||||
extern void* unzGetOpaque(unzFile file);
|
extern void* unzGetOpaque(unzFile file);
|
||||||
/* GODOT end */
|
/* GODOT end */
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalInfo(unzFile file,
|
||||||
unz_global_info *pglobal_info));
|
unz_global_info *pglobal_info);
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalInfo64(unzFile file,
|
||||||
unz_global_info64 *pglobal_info));
|
unz_global_info64 *pglobal_info);
|
||||||
/*
|
/*
|
||||||
Write info about the ZipFile in the *pglobal_info structure.
|
Write info about the ZipFile in the *pglobal_info structure.
|
||||||
No preparation of the structure is needed
|
No preparation of the structure is needed
|
||||||
return UNZ_OK if there is no problem. */
|
return UNZ_OK if there is no problem. */
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalComment(unzFile file,
|
||||||
char *szComment,
|
char *szComment,
|
||||||
uLong uSizeBuf));
|
uLong uSizeBuf);
|
||||||
/*
|
/*
|
||||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||||
uSizeBuf is the size of the szComment buffer.
|
uSizeBuf is the size of the szComment buffer.
|
||||||
|
@ -230,22 +230,22 @@ extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/* Unzip package allow you browse the directory of the zipfile */
|
/* Unzip package allow you browse the directory of the zipfile */
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
extern int ZEXPORT unzGoToFirstFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Set the current file of the zipfile to the first file.
|
Set the current file of the zipfile to the first file.
|
||||||
return UNZ_OK if there is no problem
|
return UNZ_OK if there is no problem
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
extern int ZEXPORT unzGoToNextFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Set the current file of the zipfile to the next file.
|
Set the current file of the zipfile to the next file.
|
||||||
return UNZ_OK if there is no problem
|
return UNZ_OK if there is no problem
|
||||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
extern int ZEXPORT unzLocateFile(unzFile file,
|
||||||
const char *szFileName,
|
const char *szFileName,
|
||||||
int iCaseSensitivity));
|
int iCaseSensitivity);
|
||||||
/*
|
/*
|
||||||
Try locate the file szFileName in the zipfile.
|
Try locate the file szFileName in the zipfile.
|
||||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||||
|
@ -289,26 +289,26 @@ extern int ZEXPORT unzGoToFilePos64(
|
||||||
|
|
||||||
/* ****************************************** */
|
/* ****************************************** */
|
||||||
|
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file,
|
extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file,
|
||||||
unz_file_info64 *pfile_info,
|
unz_file_info64 *pfile_info,
|
||||||
char *szFileName,
|
char *szFileName,
|
||||||
uLong fileNameBufferSize,
|
uLong fileNameBufferSize,
|
||||||
void *extraField,
|
void *extraField,
|
||||||
uLong extraFieldBufferSize,
|
uLong extraFieldBufferSize,
|
||||||
char *szComment,
|
char *szComment,
|
||||||
uLong commentBufferSize));
|
uLong commentBufferSize);
|
||||||
|
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
extern int ZEXPORT unzGetCurrentFileInfo(unzFile file,
|
||||||
unz_file_info *pfile_info,
|
unz_file_info *pfile_info,
|
||||||
char *szFileName,
|
char *szFileName,
|
||||||
uLong fileNameBufferSize,
|
uLong fileNameBufferSize,
|
||||||
void *extraField,
|
void *extraField,
|
||||||
uLong extraFieldBufferSize,
|
uLong extraFieldBufferSize,
|
||||||
char *szComment,
|
char *szComment,
|
||||||
uLong commentBufferSize));
|
uLong commentBufferSize);
|
||||||
/*
|
/*
|
||||||
Get Info about the current file
|
Get Info about the current file
|
||||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
if pfile_info!=NULL, the *pfile_info structure will contain some info about
|
||||||
the current file
|
the current file
|
||||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
if szFileName!=NULL, the filemane string will be copied in szFileName
|
||||||
(fileNameBufferSize is the size of the buffer)
|
(fileNameBufferSize is the size of the buffer)
|
||||||
|
@ -322,7 +322,7 @@ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
||||||
|
|
||||||
/** Addition for GDAL : START */
|
/** Addition for GDAL : START */
|
||||||
|
|
||||||
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
|
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file);
|
||||||
|
|
||||||
/** Addition for GDAL : END */
|
/** Addition for GDAL : END */
|
||||||
|
|
||||||
|
@ -332,24 +332,24 @@ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
|
||||||
from it, and close it (you can close it before reading all the file)
|
from it, and close it (you can close it before reading all the file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
extern int ZEXPORT unzOpenCurrentFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Open for reading data the current file in the zipfile.
|
Open for reading data the current file in the zipfile.
|
||||||
If there is no error, the return value is UNZ_OK.
|
If there is no error, the return value is UNZ_OK.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
|
extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file,
|
||||||
const char* password));
|
const char* password);
|
||||||
/*
|
/*
|
||||||
Open for reading data the current file in the zipfile.
|
Open for reading data the current file in the zipfile.
|
||||||
password is a crypting password
|
password is a crypting password
|
||||||
If there is no error, the return value is UNZ_OK.
|
If there is no error, the return value is UNZ_OK.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
|
extern int ZEXPORT unzOpenCurrentFile2(unzFile file,
|
||||||
int* method,
|
int* method,
|
||||||
int* level,
|
int* level,
|
||||||
int raw));
|
int raw);
|
||||||
/*
|
/*
|
||||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||||
if raw==1
|
if raw==1
|
||||||
|
@ -359,11 +359,11 @@ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
|
||||||
but you CANNOT set method parameter as NULL
|
but you CANNOT set method parameter as NULL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
|
extern int ZEXPORT unzOpenCurrentFile3(unzFile file,
|
||||||
int* method,
|
int* method,
|
||||||
int* level,
|
int* level,
|
||||||
int raw,
|
int raw,
|
||||||
const char* password));
|
const char* password);
|
||||||
/*
|
/*
|
||||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||||
if raw==1
|
if raw==1
|
||||||
|
@ -374,21 +374,21 @@ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
extern int ZEXPORT unzCloseCurrentFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Close the file in zip opened with unzOpenCurrentFile
|
Close the file in zip opened with unzOpenCurrentFile
|
||||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
extern int ZEXPORT unzReadCurrentFile(unzFile file,
|
||||||
voidp buf,
|
voidp buf,
|
||||||
unsigned len));
|
unsigned len);
|
||||||
/*
|
/*
|
||||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||||
buf contain buffer where data must be copied
|
buf contain buffer where data must be copied
|
||||||
len the size of buf.
|
len the size of buf.
|
||||||
|
|
||||||
return the number of byte copied if somes bytes are copied
|
return the number of byte copied if some bytes are copied
|
||||||
return 0 if the end of file was reached
|
return 0 if the end of file was reached
|
||||||
return <0 with error code if there is an error
|
return <0 with error code if there is an error
|
||||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||||
|
@ -401,21 +401,21 @@ extern int ZEXPORT unzSeekCurrentFile(unzFile file, int pos);
|
||||||
*/
|
*/
|
||||||
/* GODOT end */
|
/* GODOT end */
|
||||||
|
|
||||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
extern z_off_t ZEXPORT unztell(unzFile file);
|
||||||
|
|
||||||
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
|
extern ZPOS64_T ZEXPORT unztell64(unzFile file);
|
||||||
/*
|
/*
|
||||||
Give the current position in uncompressed data
|
Give the current position in uncompressed data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzeof OF((unzFile file));
|
extern int ZEXPORT unzeof(unzFile file);
|
||||||
/*
|
/*
|
||||||
return 1 if the end of file was reached, 0 elsewhere
|
return 1 if the end of file was reached, 0 elsewhere
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
extern int ZEXPORT unzGetLocalExtrafield(unzFile file,
|
||||||
voidp buf,
|
voidp buf,
|
||||||
unsigned len));
|
unsigned len);
|
||||||
/*
|
/*
|
||||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||||
This is the local-header version of the extra field (sometimes, there is
|
This is the local-header version of the extra field (sometimes, there is
|
||||||
|
|
326
thirdparty/minizip/zip.c
vendored
326
thirdparty/minizip/zip.c
vendored
|
@ -14,7 +14,7 @@
|
||||||
Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives
|
Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives
|
||||||
Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions.
|
Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions.
|
||||||
Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data
|
Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data
|
||||||
It is used when recreting zip archive with RAW when deleting items from a zip.
|
It is used when recreating zip archive with RAW when deleting items from a zip.
|
||||||
ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed.
|
ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed.
|
||||||
Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required)
|
Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required)
|
||||||
Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
|
Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
|
||||||
|
@ -25,14 +25,13 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
#include "zip.h"
|
#include "zip.h"
|
||||||
|
|
||||||
#ifdef STDC
|
#ifdef STDC
|
||||||
# include <stddef.h>
|
# include <stddef.h>
|
||||||
# include <string.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef NO_ERRNO_H
|
#ifdef NO_ERRNO_H
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
@ -47,7 +46,7 @@
|
||||||
/* compile with -Dlocal if your debugger can't find static symbols */
|
/* compile with -Dlocal if your debugger can't find static symbols */
|
||||||
|
|
||||||
#ifndef VERSIONMADEBY
|
#ifndef VERSIONMADEBY
|
||||||
# define VERSIONMADEBY (0x0) /* platform depedent */
|
# define VERSIONMADEBY (0x0) /* platform dependent */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef Z_BUFSIZE
|
#ifndef Z_BUFSIZE
|
||||||
|
@ -61,9 +60,6 @@
|
||||||
#ifndef ALLOC
|
#ifndef ALLOC
|
||||||
# define ALLOC(size) (malloc(size))
|
# define ALLOC(size) (malloc(size))
|
||||||
#endif
|
#endif
|
||||||
#ifndef TRYFREE
|
|
||||||
# define TRYFREE(p) {if (p) free(p);}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#define SIZECENTRALDIRITEM (0x2e)
|
#define SIZECENTRALDIRITEM (0x2e)
|
||||||
|
@ -138,20 +134,20 @@ typedef struct
|
||||||
uInt pos_in_buffered_data; /* last written byte in buffered_data */
|
uInt pos_in_buffered_data; /* last written byte in buffered_data */
|
||||||
|
|
||||||
ZPOS64_T pos_local_header; /* offset of the local header of the file
|
ZPOS64_T pos_local_header; /* offset of the local header of the file
|
||||||
currenty writing */
|
currently writing */
|
||||||
char* central_header; /* central header data for the current file */
|
char* central_header; /* central header data for the current file */
|
||||||
uLong size_centralExtra;
|
uLong size_centralExtra;
|
||||||
uLong size_centralheader; /* size of the central header for cur file */
|
uLong size_centralheader; /* size of the central header for cur file */
|
||||||
uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */
|
uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */
|
||||||
uLong flag; /* flag of the file currently writing */
|
uLong flag; /* flag of the file currently writing */
|
||||||
|
|
||||||
int method; /* compression method of file currenty wr.*/
|
int method; /* compression method of file currently wr.*/
|
||||||
int raw; /* 1 for directly writing raw data */
|
int raw; /* 1 for directly writing raw data */
|
||||||
Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
|
Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
|
||||||
uLong dosDate;
|
uLong dosDate;
|
||||||
uLong crc32;
|
uLong crc32;
|
||||||
int encrypt;
|
int encrypt;
|
||||||
int zip64; /* Add ZIP64 extened information in the extra field */
|
int zip64; /* Add ZIP64 extended information in the extra field */
|
||||||
ZPOS64_T pos_zip64extrainfo;
|
ZPOS64_T pos_zip64extrainfo;
|
||||||
ZPOS64_T totalCompressedData;
|
ZPOS64_T totalCompressedData;
|
||||||
ZPOS64_T totalUncompressedData;
|
ZPOS64_T totalUncompressedData;
|
||||||
|
@ -165,10 +161,10 @@ typedef struct
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
zlib_filefunc64_32_def z_filefunc;
|
zlib_filefunc64_32_def z_filefunc;
|
||||||
voidpf filestream; /* io structore of the zipfile */
|
voidpf filestream; /* io structure of the zipfile */
|
||||||
linkedlist_data central_dir;/* datablock with central dir in construction*/
|
linkedlist_data central_dir;/* datablock with central dir in construction*/
|
||||||
int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
|
int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
|
||||||
curfile64_info ci; /* info on the file curretly writing */
|
curfile64_info ci; /* info on the file currently writing */
|
||||||
|
|
||||||
ZPOS64_T begin_pos; /* position of the beginning of the zipfile */
|
ZPOS64_T begin_pos; /* position of the beginning of the zipfile */
|
||||||
ZPOS64_T add_position_when_writing_offset;
|
ZPOS64_T add_position_when_writing_offset;
|
||||||
|
@ -186,8 +182,7 @@ typedef struct
|
||||||
#include "crypt.h"
|
#include "crypt.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
local linkedlist_datablock_internal* allocate_new_datablock()
|
local linkedlist_datablock_internal* allocate_new_datablock(void) {
|
||||||
{
|
|
||||||
linkedlist_datablock_internal* ldi;
|
linkedlist_datablock_internal* ldi;
|
||||||
ldi = (linkedlist_datablock_internal*)
|
ldi = (linkedlist_datablock_internal*)
|
||||||
ALLOC(sizeof(linkedlist_datablock_internal));
|
ALLOC(sizeof(linkedlist_datablock_internal));
|
||||||
|
@ -200,30 +195,26 @@ local linkedlist_datablock_internal* allocate_new_datablock()
|
||||||
return ldi;
|
return ldi;
|
||||||
}
|
}
|
||||||
|
|
||||||
local void free_datablock(linkedlist_datablock_internal* ldi)
|
local void free_datablock(linkedlist_datablock_internal* ldi) {
|
||||||
{
|
|
||||||
while (ldi!=NULL)
|
while (ldi!=NULL)
|
||||||
{
|
{
|
||||||
linkedlist_datablock_internal* ldinext = ldi->next_datablock;
|
linkedlist_datablock_internal* ldinext = ldi->next_datablock;
|
||||||
TRYFREE(ldi);
|
free(ldi);
|
||||||
ldi = ldinext;
|
ldi = ldinext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
local void init_linkedlist(linkedlist_data* ll)
|
local void init_linkedlist(linkedlist_data* ll) {
|
||||||
{
|
|
||||||
ll->first_block = ll->last_block = NULL;
|
ll->first_block = ll->last_block = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
local void free_linkedlist(linkedlist_data* ll)
|
local void free_linkedlist(linkedlist_data* ll) {
|
||||||
{
|
|
||||||
free_datablock(ll->first_block);
|
free_datablock(ll->first_block);
|
||||||
ll->first_block = ll->last_block = NULL;
|
ll->first_block = ll->last_block = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len)
|
local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) {
|
||||||
{
|
|
||||||
linkedlist_datablock_internal* ldi;
|
linkedlist_datablock_internal* ldi;
|
||||||
const unsigned char* from_copy;
|
const unsigned char* from_copy;
|
||||||
|
|
||||||
|
@ -238,7 +229,7 @@ local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len)
|
||||||
}
|
}
|
||||||
|
|
||||||
ldi = ll->last_block;
|
ldi = ll->last_block;
|
||||||
from_copy = (unsigned char*)buf;
|
from_copy = (const unsigned char*)buf;
|
||||||
|
|
||||||
while (len>0)
|
while (len>0)
|
||||||
{
|
{
|
||||||
|
@ -283,9 +274,7 @@ local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len)
|
||||||
nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T)
|
nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte));
|
local int zip64local_putValue(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) {
|
||||||
local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)
|
|
||||||
{
|
|
||||||
unsigned char buf[8];
|
unsigned char buf[8];
|
||||||
int n;
|
int n;
|
||||||
for (n = 0; n < nbByte; n++)
|
for (n = 0; n < nbByte; n++)
|
||||||
|
@ -307,9 +296,7 @@ local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
return ZIP_OK;
|
return ZIP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte));
|
local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) {
|
||||||
local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte)
|
|
||||||
{
|
|
||||||
unsigned char* buf=(unsigned char*)dest;
|
unsigned char* buf=(unsigned char*)dest;
|
||||||
int n;
|
int n;
|
||||||
for (n = 0; n < nbByte; n++) {
|
for (n = 0; n < nbByte; n++) {
|
||||||
|
@ -329,8 +316,7 @@ local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte)
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm)
|
local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) {
|
||||||
{
|
|
||||||
uLong year = (uLong)ptm->tm_year;
|
uLong year = (uLong)ptm->tm_year;
|
||||||
if (year>=1980)
|
if (year>=1980)
|
||||||
year-=1980;
|
year-=1980;
|
||||||
|
@ -344,10 +330,7 @@ local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi));
|
local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int* pi) {
|
||||||
|
|
||||||
local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi)
|
|
||||||
{
|
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
|
int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
|
||||||
if (err==1)
|
if (err==1)
|
||||||
|
@ -368,10 +351,7 @@ local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,vo
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
Reads a long in LSB order from the given gz_stream. Sets
|
Reads a long in LSB order from the given gz_stream. Sets
|
||||||
*/
|
*/
|
||||||
local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX));
|
local int zip64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) {
|
||||||
|
|
||||||
local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
|
|
||||||
{
|
|
||||||
uLong x ;
|
uLong x ;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int err;
|
int err;
|
||||||
|
@ -390,10 +370,7 @@ local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX));
|
local int zip64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) {
|
||||||
|
|
||||||
local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
|
|
||||||
{
|
|
||||||
uLong x ;
|
uLong x ;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int err;
|
int err;
|
||||||
|
@ -420,11 +397,8 @@ local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX));
|
|
||||||
|
|
||||||
|
local int zip64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) {
|
||||||
local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
|
|
||||||
{
|
|
||||||
ZPOS64_T x;
|
ZPOS64_T x;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int err;
|
int err;
|
||||||
|
@ -475,10 +449,7 @@ local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def
|
||||||
Locate the Central directory of a zipfile (at the end, just before
|
Locate the Central directory of a zipfile (at the end, just before
|
||||||
the global comment)
|
the global comment)
|
||||||
*/
|
*/
|
||||||
local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
|
local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) {
|
||||||
|
|
||||||
local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
|
|
||||||
{
|
|
||||||
unsigned char* buf;
|
unsigned char* buf;
|
||||||
ZPOS64_T uSizeFile;
|
ZPOS64_T uSizeFile;
|
||||||
ZPOS64_T uBackRead;
|
ZPOS64_T uBackRead;
|
||||||
|
@ -529,7 +500,7 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
|
||||||
if (uPosFound!=0)
|
if (uPosFound!=0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
TRYFREE(buf);
|
free(buf);
|
||||||
return uPosFound;
|
return uPosFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,10 +508,7 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
|
||||||
Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before
|
Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before
|
||||||
the global comment)
|
the global comment)
|
||||||
*/
|
*/
|
||||||
local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
|
local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) {
|
||||||
|
|
||||||
local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
|
|
||||||
{
|
|
||||||
unsigned char* buf;
|
unsigned char* buf;
|
||||||
ZPOS64_T uSizeFile;
|
ZPOS64_T uSizeFile;
|
||||||
ZPOS64_T uBackRead;
|
ZPOS64_T uBackRead;
|
||||||
|
@ -595,7 +563,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRYFREE(buf);
|
free(buf);
|
||||||
if (uPosFound == 0)
|
if (uPosFound == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -637,8 +605,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
|
||||||
return relativeOffset;
|
return relativeOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
local int LoadCentralDirectoryRecord(zip64_internal* pziinit)
|
local int LoadCentralDirectoryRecord(zip64_internal* pziinit) {
|
||||||
{
|
|
||||||
int err=ZIP_OK;
|
int err=ZIP_OK;
|
||||||
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
|
||||||
|
|
||||||
|
@ -648,9 +615,9 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit)
|
||||||
uLong uL;
|
uLong uL;
|
||||||
|
|
||||||
uLong number_disk; /* number of the current dist, used for
|
uLong number_disk; /* number of the current dist, used for
|
||||||
spaning ZIP, unsupported, always 0*/
|
spanning ZIP, unsupported, always 0*/
|
||||||
uLong number_disk_with_CD; /* number the the disk with central dir, used
|
uLong number_disk_with_CD; /* number the the disk with central dir, used
|
||||||
for spaning ZIP, unsupported, always 0*/
|
for spanning ZIP, unsupported, always 0*/
|
||||||
ZPOS64_T number_entry;
|
ZPOS64_T number_entry;
|
||||||
ZPOS64_T number_entry_CD; /* total number of entries in
|
ZPOS64_T number_entry_CD; /* total number of entries in
|
||||||
the central dir
|
the central dir
|
||||||
|
@ -830,7 +797,7 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit)
|
||||||
|
|
||||||
size_central_dir_to_read-=read_this;
|
size_central_dir_to_read-=read_this;
|
||||||
}
|
}
|
||||||
TRYFREE(buf_read);
|
free(buf_read);
|
||||||
}
|
}
|
||||||
pziinit->begin_pos = byte_before_the_zipfile;
|
pziinit->begin_pos = byte_before_the_zipfile;
|
||||||
pziinit->number_entry = number_entry_CD;
|
pziinit->number_entry = number_entry_CD;
|
||||||
|
@ -846,8 +813,7 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit)
|
||||||
|
|
||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def)
|
extern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) {
|
||||||
{
|
|
||||||
zip64_internal ziinit;
|
zip64_internal ziinit;
|
||||||
zip64_internal* zi;
|
zip64_internal* zi;
|
||||||
int err=ZIP_OK;
|
int err=ZIP_OK;
|
||||||
|
@ -907,9 +873,9 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl
|
||||||
if (err != ZIP_OK)
|
if (err != ZIP_OK)
|
||||||
{
|
{
|
||||||
# ifndef NO_ADDFILEINEXISTINGZIP
|
# ifndef NO_ADDFILEINEXISTINGZIP
|
||||||
TRYFREE(ziinit.globalcomment);
|
free(ziinit.globalcomment);
|
||||||
# endif /* !NO_ADDFILEINEXISTINGZIP*/
|
# endif /* !NO_ADDFILEINEXISTINGZIP*/
|
||||||
TRYFREE(zi);
|
free(zi);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -919,8 +885,7 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def)
|
extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) {
|
||||||
{
|
|
||||||
if (pzlib_filefunc32_def != NULL)
|
if (pzlib_filefunc32_def != NULL)
|
||||||
{
|
{
|
||||||
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
||||||
|
@ -931,8 +896,7 @@ extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* gl
|
||||||
return zipOpen3(pathname, append, globalcomment, NULL);
|
return zipOpen3(pathname, append, globalcomment, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def)
|
extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) {
|
||||||
{
|
|
||||||
if (pzlib_filefunc_def != NULL)
|
if (pzlib_filefunc_def != NULL)
|
||||||
{
|
{
|
||||||
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
|
||||||
|
@ -947,18 +911,15 @@ extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen (const char* pathname, int append)
|
extern zipFile ZEXPORT zipOpen(const char* pathname, int append) {
|
||||||
{
|
|
||||||
return zipOpen3((const void*)pathname,append,NULL,NULL);
|
return zipOpen3((const void*)pathname,append,NULL,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append)
|
extern zipFile ZEXPORT zipOpen64(const void* pathname, int append) {
|
||||||
{
|
|
||||||
return zipOpen3(pathname,append,NULL,NULL);
|
return zipOpen3(pathname,append,NULL,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local)
|
local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) {
|
||||||
{
|
|
||||||
/* write the local header */
|
/* write the local header */
|
||||||
int err;
|
int err;
|
||||||
uInt size_filename = (uInt)strlen(filename);
|
uInt size_filename = (uInt)strlen(filename);
|
||||||
|
@ -1054,14 +1015,13 @@ local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt s
|
||||||
It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize
|
It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize
|
||||||
unnecessary allocations.
|
unnecessary allocations.
|
||||||
*/
|
*/
|
||||||
extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void* extrafield_global, uInt size_extrafield_global,
|
const void* extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int raw,
|
const char* comment, int method, int level, int raw,
|
||||||
int windowBits,int memLevel, int strategy,
|
int windowBits,int memLevel, int strategy,
|
||||||
const char* password, uLong crcForCrypting,
|
const char* password, uLong crcForCrypting,
|
||||||
uLong versionMadeBy, uLong flagBase, int zip64)
|
uLong versionMadeBy, uLong flagBase, int zip64) {
|
||||||
{
|
|
||||||
zip64_internal* zi;
|
zip64_internal* zi;
|
||||||
uInt size_filename;
|
uInt size_filename;
|
||||||
uInt size_comment;
|
uInt size_comment;
|
||||||
|
@ -1085,6 +1045,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename,
|
||||||
return ZIP_PARAMERROR;
|
return ZIP_PARAMERROR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// The filename and comment length must fit in 16 bits.
|
||||||
|
if ((filename!=NULL) && (strlen(filename)>0xffff))
|
||||||
|
return ZIP_PARAMERROR;
|
||||||
|
if ((comment!=NULL) && (strlen(comment)>0xffff))
|
||||||
|
return ZIP_PARAMERROR;
|
||||||
|
// The extra field length must fit in 16 bits. If the member also requires
|
||||||
|
// a Zip64 extra block, that will also need to fit within that 16-bit
|
||||||
|
// length, but that will be checked for later.
|
||||||
|
if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff))
|
||||||
|
return ZIP_PARAMERROR;
|
||||||
|
|
||||||
zi = (zip64_internal*)file;
|
zi = (zip64_internal*)file;
|
||||||
|
|
||||||
if (zi->in_opened_file_inzip == 1)
|
if (zi->in_opened_file_inzip == 1)
|
||||||
|
@ -1266,35 +1237,33 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void* extrafield_global, uInt size_extrafield_global,
|
const void* extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int raw,
|
const char* comment, int method, int level, int raw,
|
||||||
int windowBits,int memLevel, int strategy,
|
int windowBits,int memLevel, int strategy,
|
||||||
const char* password, uLong crcForCrypting,
|
const char* password, uLong crcForCrypting,
|
||||||
uLong versionMadeBy, uLong flagBase)
|
uLong versionMadeBy, uLong flagBase) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, raw,
|
||||||
comment, method, level, raw,
|
windowBits, memLevel, strategy,
|
||||||
windowBits, memLevel, strategy,
|
password, crcForCrypting, versionMadeBy, flagBase, 0);
|
||||||
password, crcForCrypting, versionMadeBy, flagBase, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void* extrafield_global, uInt size_extrafield_global,
|
const void* extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int raw,
|
const char* comment, int method, int level, int raw,
|
||||||
int windowBits,int memLevel, int strategy,
|
int windowBits,int memLevel, int strategy,
|
||||||
const char* password, uLong crcForCrypting)
|
const char* password, uLong crcForCrypting) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, raw,
|
||||||
comment, method, level, raw,
|
windowBits, memLevel, strategy,
|
||||||
windowBits, memLevel, strategy,
|
password, crcForCrypting, VERSIONMADEBY, 0, 0);
|
||||||
password, crcForCrypting, VERSIONMADEBY, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
|
@ -1302,70 +1271,64 @@ extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, c
|
||||||
const void* extrafield_global, uInt size_extrafield_global,
|
const void* extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int raw,
|
const char* comment, int method, int level, int raw,
|
||||||
int windowBits,int memLevel, int strategy,
|
int windowBits,int memLevel, int strategy,
|
||||||
const char* password, uLong crcForCrypting, int zip64)
|
const char* password, uLong crcForCrypting, int zip64) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, raw,
|
||||||
comment, method, level, raw,
|
windowBits, memLevel, strategy,
|
||||||
windowBits, memLevel, strategy,
|
password, crcForCrypting, VERSIONMADEBY, 0, zip64);
|
||||||
password, crcForCrypting, VERSIONMADEBY, 0, zip64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void* extrafield_global, uInt size_extrafield_global,
|
const void* extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int raw)
|
const char* comment, int method, int level, int raw) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, raw,
|
||||||
comment, method, level, raw,
|
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
NULL, 0, VERSIONMADEBY, 0, 0);
|
||||||
NULL, 0, VERSIONMADEBY, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void* extrafield_global, uInt size_extrafield_global,
|
const void* extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int raw, int zip64)
|
const char* comment, int method, int level, int raw, int zip64) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, raw,
|
||||||
comment, method, level, raw,
|
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
NULL, 0, VERSIONMADEBY, 0, zip64);
|
||||||
NULL, 0, VERSIONMADEBY, 0, zip64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void*extrafield_global, uInt size_extrafield_global,
|
const void*extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level, int zip64)
|
const char* comment, int method, int level, int zip64) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, 0,
|
||||||
comment, method, level, 0,
|
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
NULL, 0, VERSIONMADEBY, 0, zip64);
|
||||||
NULL, 0, VERSIONMADEBY, 0, zip64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char* filename, const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local, uInt size_extrafield_local,
|
const void* extrafield_local, uInt size_extrafield_local,
|
||||||
const void*extrafield_global, uInt size_extrafield_global,
|
const void*extrafield_global, uInt size_extrafield_global,
|
||||||
const char* comment, int method, int level)
|
const char* comment, int method, int level) {
|
||||||
{
|
return zipOpenNewFileInZip4_64(file, filename, zipfi,
|
||||||
return zipOpenNewFileInZip4_64 (file, filename, zipfi,
|
extrafield_local, size_extrafield_local,
|
||||||
extrafield_local, size_extrafield_local,
|
extrafield_global, size_extrafield_global,
|
||||||
extrafield_global, size_extrafield_global,
|
comment, method, level, 0,
|
||||||
comment, method, level, 0,
|
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
NULL, 0, VERSIONMADEBY, 0, 0);
|
||||||
NULL, 0, VERSIONMADEBY, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local int zip64FlushWriteBuffer(zip64_internal* zi)
|
local int zip64FlushWriteBuffer(zip64_internal* zi) {
|
||||||
{
|
|
||||||
int err=ZIP_OK;
|
int err=ZIP_OK;
|
||||||
|
|
||||||
if (zi->ci.encrypt != 0)
|
if (zi->ci.encrypt != 0)
|
||||||
|
@ -1403,8 +1366,7 @@ local int zip64FlushWriteBuffer(zip64_internal* zi)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len)
|
extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void* buf, unsigned int len) {
|
||||||
{
|
|
||||||
zip64_internal* zi;
|
zip64_internal* zi;
|
||||||
int err=ZIP_OK;
|
int err=ZIP_OK;
|
||||||
|
|
||||||
|
@ -1454,7 +1416,7 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
zi->ci.stream.next_in = (Bytef*)buf;
|
zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf;
|
||||||
zi->ci.stream.avail_in = len;
|
zi->ci.stream.avail_in = len;
|
||||||
|
|
||||||
while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
|
while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
|
||||||
|
@ -1505,13 +1467,11 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32)
|
extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32) {
|
||||||
{
|
|
||||||
return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32);
|
return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32)
|
extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32) {
|
||||||
{
|
|
||||||
zip64_internal* zi;
|
zip64_internal* zi;
|
||||||
ZPOS64_T compressed_size;
|
ZPOS64_T compressed_size;
|
||||||
uLong invalidValue = 0xffffffff;
|
uLong invalidValue = 0xffffffff;
|
||||||
|
@ -1746,13 +1706,11 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZip (zipFile file)
|
extern int ZEXPORT zipCloseFileInZip(zipFile file) {
|
||||||
{
|
|
||||||
return zipCloseFileInZipRaw (file,0,0);
|
return zipCloseFileInZipRaw (file,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip)
|
local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) {
|
||||||
{
|
|
||||||
int err = ZIP_OK;
|
int err = ZIP_OK;
|
||||||
ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset;
|
ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset;
|
||||||
|
|
||||||
|
@ -1773,8 +1731,7 @@ local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T z
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
|
local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) {
|
||||||
{
|
|
||||||
int err = ZIP_OK;
|
int err = ZIP_OK;
|
||||||
|
|
||||||
uLong Zip64DataSize = 44;
|
uLong Zip64DataSize = 44;
|
||||||
|
@ -1812,8 +1769,8 @@ local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
|
|
||||||
{
|
local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) {
|
||||||
int err = ZIP_OK;
|
int err = ZIP_OK;
|
||||||
|
|
||||||
/*signature*/
|
/*signature*/
|
||||||
|
@ -1860,8 +1817,7 @@ local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centr
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
local int Write_GlobalComment(zip64_internal* zi, const char* global_comment)
|
local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) {
|
||||||
{
|
|
||||||
int err = ZIP_OK;
|
int err = ZIP_OK;
|
||||||
uInt size_global_comment = 0;
|
uInt size_global_comment = 0;
|
||||||
|
|
||||||
|
@ -1878,8 +1834,7 @@ local int Write_GlobalComment(zip64_internal* zi, const char* global_comment)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipClose (zipFile file, const char* global_comment)
|
extern int ZEXPORT zipClose(zipFile file, const char* global_comment) {
|
||||||
{
|
|
||||||
zip64_internal* zi;
|
zip64_internal* zi;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
uLong size_centraldir = 0;
|
uLong size_centraldir = 0;
|
||||||
|
@ -1940,15 +1895,14 @@ extern int ZEXPORT zipClose (zipFile file, const char* global_comment)
|
||||||
err = ZIP_ERRNO;
|
err = ZIP_ERRNO;
|
||||||
|
|
||||||
#ifndef NO_ADDFILEINEXISTINGZIP
|
#ifndef NO_ADDFILEINEXISTINGZIP
|
||||||
TRYFREE(zi->globalcomment);
|
free(zi->globalcomment);
|
||||||
#endif
|
#endif
|
||||||
TRYFREE(zi);
|
free(zi);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader)
|
extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader) {
|
||||||
{
|
|
||||||
char* p = pData;
|
char* p = pData;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
char* pNewHeader;
|
char* pNewHeader;
|
||||||
|
@ -2000,7 +1954,7 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe
|
||||||
else
|
else
|
||||||
retVal = ZIP_ERRNO;
|
retVal = ZIP_ERRNO;
|
||||||
|
|
||||||
TRYFREE(pNewHeader);
|
free(pNewHeader);
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
285
thirdparty/minizip/zip.h
vendored
285
thirdparty/minizip/zip.h
vendored
|
@ -113,8 +113,8 @@ typedef const char* zipcharpc;
|
||||||
#define APPEND_STATUS_CREATEAFTER (1)
|
#define APPEND_STATUS_CREATEAFTER (1)
|
||||||
#define APPEND_STATUS_ADDINZIP (2)
|
#define APPEND_STATUS_ADDINZIP (2)
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
|
extern zipFile ZEXPORT zipOpen(const char *pathname, int append);
|
||||||
extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
|
extern zipFile ZEXPORT zipOpen64(const void *pathname, int append);
|
||||||
/*
|
/*
|
||||||
Create a zipfile.
|
Create a zipfile.
|
||||||
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
|
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
|
||||||
|
@ -131,46 +131,46 @@ extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
|
||||||
|
|
||||||
/* Note : there is no delete function into a zipfile.
|
/* Note : there is no delete function into a zipfile.
|
||||||
If you want delete file into a zipfile, you must open a zipfile, and create another
|
If you want delete file into a zipfile, you must open a zipfile, and create another
|
||||||
Of couse, you can use RAW reading and writing to copy the file you did not want delte
|
Of course, you can use RAW reading and writing to copy the file you did not want delete
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,
|
extern zipFile ZEXPORT zipOpen2(const char *pathname,
|
||||||
|
int append,
|
||||||
|
zipcharpc* globalcomment,
|
||||||
|
zlib_filefunc_def* pzlib_filefunc_def);
|
||||||
|
|
||||||
|
extern zipFile ZEXPORT zipOpen2_64(const void *pathname,
|
||||||
int append,
|
int append,
|
||||||
zipcharpc* globalcomment,
|
zipcharpc* globalcomment,
|
||||||
zlib_filefunc_def* pzlib_filefunc_def));
|
zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname,
|
extern zipFile ZEXPORT zipOpen3(const void *pathname,
|
||||||
int append,
|
int append,
|
||||||
zipcharpc* globalcomment,
|
zipcharpc* globalcomment,
|
||||||
zlib_filefunc64_def* pzlib_filefunc_def));
|
zlib_filefunc64_32_def* pzlib_filefunc64_32_def);
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen3 OF((const void *pathname,
|
extern int ZEXPORT zipOpenNewFileInZip(zipFile file,
|
||||||
int append,
|
const char* filename,
|
||||||
zipcharpc* globalcomment,
|
const zip_fileinfo* zipfi,
|
||||||
zlib_filefunc64_32_def* pzlib_filefunc64_32_def));
|
const void* extrafield_local,
|
||||||
|
uInt size_extrafield_local,
|
||||||
|
const void* extrafield_global,
|
||||||
|
uInt size_extrafield_global,
|
||||||
|
const char* comment,
|
||||||
|
int method,
|
||||||
|
int level);
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip64(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level));
|
int level,
|
||||||
|
int zip64);
|
||||||
extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file,
|
|
||||||
const char* filename,
|
|
||||||
const zip_fileinfo* zipfi,
|
|
||||||
const void* extrafield_local,
|
|
||||||
uInt size_extrafield_local,
|
|
||||||
const void* extrafield_global,
|
|
||||||
uInt size_extrafield_global,
|
|
||||||
const char* comment,
|
|
||||||
int method,
|
|
||||||
int level,
|
|
||||||
int zip64));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Open a file in the ZIP for writing.
|
Open a file in the ZIP for writing.
|
||||||
|
@ -189,70 +189,69 @@ extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip2(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw));
|
int raw);
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw,
|
int raw,
|
||||||
int zip64));
|
int zip64);
|
||||||
/*
|
/*
|
||||||
Same than zipOpenNewFileInZip, except if raw=1, we write raw file
|
Same than zipOpenNewFileInZip, except if raw=1, we write raw file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip3(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw,
|
int raw,
|
||||||
int windowBits,
|
int windowBits,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy,
|
int strategy,
|
||||||
const char* password,
|
const char* password,
|
||||||
uLong crcForCrypting));
|
uLong crcForCrypting);
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw,
|
int raw,
|
||||||
int windowBits,
|
int windowBits,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy,
|
int strategy,
|
||||||
const char* password,
|
const char* password,
|
||||||
uLong crcForCrypting,
|
uLong crcForCrypting,
|
||||||
int zip64
|
int zip64);
|
||||||
));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Same than zipOpenNewFileInZip2, except
|
Same than zipOpenNewFileInZip2, except
|
||||||
|
@ -261,47 +260,45 @@ extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file,
|
||||||
crcForCrypting : crc of file to compress (needed for crypting)
|
crcForCrypting : crc of file to compress (needed for crypting)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip4(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw,
|
int raw,
|
||||||
int windowBits,
|
int windowBits,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy,
|
int strategy,
|
||||||
const char* password,
|
const char* password,
|
||||||
uLong crcForCrypting,
|
uLong crcForCrypting,
|
||||||
uLong versionMadeBy,
|
uLong versionMadeBy,
|
||||||
uLong flagBase
|
uLong flagBase);
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
uInt size_extrafield_local,
|
uInt size_extrafield_local,
|
||||||
const void* extrafield_global,
|
const void* extrafield_global,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw,
|
int raw,
|
||||||
int windowBits,
|
int windowBits,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy,
|
int strategy,
|
||||||
const char* password,
|
const char* password,
|
||||||
uLong crcForCrypting,
|
uLong crcForCrypting,
|
||||||
uLong versionMadeBy,
|
uLong versionMadeBy,
|
||||||
uLong flagBase,
|
uLong flagBase,
|
||||||
int zip64
|
int zip64);
|
||||||
));
|
|
||||||
/*
|
/*
|
||||||
Same than zipOpenNewFileInZip4, except
|
Same than zipOpenNewFileInZip4, except
|
||||||
versionMadeBy : value for Version made by field
|
versionMadeBy : value for Version made by field
|
||||||
|
@ -309,25 +306,25 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
|
extern int ZEXPORT zipWriteInFileInZip(zipFile file,
|
||||||
const void* buf,
|
const void* buf,
|
||||||
unsigned len));
|
unsigned len);
|
||||||
/*
|
/*
|
||||||
Write data in the zipfile
|
Write data in the zipfile
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
|
extern int ZEXPORT zipCloseFileInZip(zipFile file);
|
||||||
/*
|
/*
|
||||||
Close the current file in the zipfile
|
Close the current file in the zipfile
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
|
extern int ZEXPORT zipCloseFileInZipRaw(zipFile file,
|
||||||
uLong uncompressed_size,
|
uLong uncompressed_size,
|
||||||
uLong crc32));
|
uLong crc32);
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file,
|
extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file,
|
||||||
ZPOS64_T uncompressed_size,
|
ZPOS64_T uncompressed_size,
|
||||||
uLong crc32));
|
uLong crc32);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Close the current file in the zipfile, for file opened with
|
Close the current file in the zipfile, for file opened with
|
||||||
|
@ -335,14 +332,14 @@ extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file,
|
||||||
uncompressed_size and crc32 are value for the uncompressed size
|
uncompressed_size and crc32 are value for the uncompressed size
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipClose OF((zipFile file,
|
extern int ZEXPORT zipClose(zipFile file,
|
||||||
const char* global_comment));
|
const char* global_comment);
|
||||||
/*
|
/*
|
||||||
Close the zipfile
|
Close the zipfile
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader));
|
extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader);
|
||||||
/*
|
/*
|
||||||
zipRemoveExtraInfoBlock - Added by Mathias Svensson
|
zipRemoveExtraInfoBlock - Added by Mathias Svensson
|
||||||
|
|
||||||
|
|
32
thirdparty/zlib/adler32.c
vendored
32
thirdparty/zlib/adler32.c
vendored
|
@ -7,8 +7,6 @@
|
||||||
|
|
||||||
#include "zutil.h"
|
#include "zutil.h"
|
||||||
|
|
||||||
local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
|
|
||||||
|
|
||||||
#define BASE 65521U /* largest prime smaller than 65536 */
|
#define BASE 65521U /* largest prime smaller than 65536 */
|
||||||
#define NMAX 5552
|
#define NMAX 5552
|
||||||
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
|
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
|
||||||
|
@ -60,11 +58,7 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT adler32_z(adler, buf, len)
|
uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
|
||||||
uLong adler;
|
|
||||||
const Bytef *buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
unsigned long sum2;
|
unsigned long sum2;
|
||||||
unsigned n;
|
unsigned n;
|
||||||
|
|
||||||
|
@ -131,20 +125,12 @@ uLong ZEXPORT adler32_z(adler, buf, len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT adler32(adler, buf, len)
|
uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) {
|
||||||
uLong adler;
|
|
||||||
const Bytef *buf;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
return adler32_z(adler, buf, len);
|
return adler32_z(adler, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
local uLong adler32_combine_(adler1, adler2, len2)
|
local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) {
|
||||||
uLong adler1;
|
|
||||||
uLong adler2;
|
|
||||||
z_off64_t len2;
|
|
||||||
{
|
|
||||||
unsigned long sum1;
|
unsigned long sum1;
|
||||||
unsigned long sum2;
|
unsigned long sum2;
|
||||||
unsigned rem;
|
unsigned rem;
|
||||||
|
@ -169,18 +155,10 @@ local uLong adler32_combine_(adler1, adler2, len2)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT adler32_combine(adler1, adler2, len2)
|
uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) {
|
||||||
uLong adler1;
|
|
||||||
uLong adler2;
|
|
||||||
z_off_t len2;
|
|
||||||
{
|
|
||||||
return adler32_combine_(adler1, adler2, len2);
|
return adler32_combine_(adler1, adler2, len2);
|
||||||
}
|
}
|
||||||
|
|
||||||
uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
|
uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) {
|
||||||
uLong adler1;
|
|
||||||
uLong adler2;
|
|
||||||
z_off64_t len2;
|
|
||||||
{
|
|
||||||
return adler32_combine_(adler1, adler2, len2);
|
return adler32_combine_(adler1, adler2, len2);
|
||||||
}
|
}
|
||||||
|
|
21
thirdparty/zlib/compress.c
vendored
21
thirdparty/zlib/compress.c
vendored
|
@ -19,13 +19,8 @@
|
||||||
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
|
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
|
||||||
Z_STREAM_ERROR if the level parameter is invalid.
|
Z_STREAM_ERROR if the level parameter is invalid.
|
||||||
*/
|
*/
|
||||||
int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
|
int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||||
Bytef *dest;
|
uLong sourceLen, int level) {
|
||||||
uLongf *destLen;
|
|
||||||
const Bytef *source;
|
|
||||||
uLong sourceLen;
|
|
||||||
int level;
|
|
||||||
{
|
|
||||||
z_stream stream;
|
z_stream stream;
|
||||||
int err;
|
int err;
|
||||||
const uInt max = (uInt)-1;
|
const uInt max = (uInt)-1;
|
||||||
|
@ -65,12 +60,8 @@ int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
*/
|
*/
|
||||||
int ZEXPORT compress(dest, destLen, source, sourceLen)
|
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||||
Bytef *dest;
|
uLong sourceLen) {
|
||||||
uLongf *destLen;
|
|
||||||
const Bytef *source;
|
|
||||||
uLong sourceLen;
|
|
||||||
{
|
|
||||||
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,9 +69,7 @@ int ZEXPORT compress(dest, destLen, source, sourceLen)
|
||||||
If the default memLevel or windowBits for deflateInit() is changed, then
|
If the default memLevel or windowBits for deflateInit() is changed, then
|
||||||
this function needs to be updated.
|
this function needs to be updated.
|
||||||
*/
|
*/
|
||||||
uLong ZEXPORT compressBound(sourceLen)
|
uLong ZEXPORT compressBound(uLong sourceLen) {
|
||||||
uLong sourceLen;
|
|
||||||
{
|
|
||||||
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
||||||
(sourceLen >> 25) + 13;
|
(sourceLen >> 25) + 13;
|
||||||
}
|
}
|
||||||
|
|
248
thirdparty/zlib/crc32.c
vendored
248
thirdparty/zlib/crc32.c
vendored
|
@ -103,19 +103,6 @@
|
||||||
# define ARMCRC32
|
# define ARMCRC32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Local functions. */
|
|
||||||
local z_crc_t multmodp OF((z_crc_t a, z_crc_t b));
|
|
||||||
local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
|
|
||||||
|
|
||||||
#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
|
|
||||||
local z_word_t byte_swap OF((z_word_t word));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(W) && !defined(ARMCRC32)
|
|
||||||
local z_crc_t crc_word OF((z_word_t data));
|
|
||||||
local z_word_t crc_word_big OF((z_word_t data));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
|
#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
|
||||||
/*
|
/*
|
||||||
Swap the bytes in a z_word_t to convert between little and big endian. Any
|
Swap the bytes in a z_word_t to convert between little and big endian. Any
|
||||||
|
@ -123,9 +110,7 @@ local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
|
||||||
instruction, if one is available. This assumes that word_t is either 32 bits
|
instruction, if one is available. This assumes that word_t is either 32 bits
|
||||||
or 64 bits.
|
or 64 bits.
|
||||||
*/
|
*/
|
||||||
local z_word_t byte_swap(word)
|
local z_word_t byte_swap(z_word_t word) {
|
||||||
z_word_t word;
|
|
||||||
{
|
|
||||||
# if W == 8
|
# if W == 8
|
||||||
return
|
return
|
||||||
(word & 0xff00000000000000) >> 56 |
|
(word & 0xff00000000000000) >> 56 |
|
||||||
|
@ -146,24 +131,77 @@ local z_word_t byte_swap(word)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
/* =========================================================================
|
||||||
|
* Table of powers of x for combining CRC-32s, filled in by make_crc_table()
|
||||||
|
* below.
|
||||||
|
*/
|
||||||
|
local z_crc_t FAR x2n_table[32];
|
||||||
|
#else
|
||||||
|
/* =========================================================================
|
||||||
|
* Tables for byte-wise and braided CRC-32 calculations, and a table of powers
|
||||||
|
* of x for combining CRC-32s, all made by make_crc_table().
|
||||||
|
*/
|
||||||
|
# include "crc32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* CRC polynomial. */
|
/* CRC polynomial. */
|
||||||
#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */
|
#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */
|
||||||
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
/*
|
||||||
|
Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
|
||||||
|
reflected. For speed, this requires that a not be zero.
|
||||||
|
*/
|
||||||
|
local z_crc_t multmodp(z_crc_t a, z_crc_t b) {
|
||||||
|
z_crc_t m, p;
|
||||||
|
|
||||||
|
m = (z_crc_t)1 << 31;
|
||||||
|
p = 0;
|
||||||
|
for (;;) {
|
||||||
|
if (a & m) {
|
||||||
|
p ^= b;
|
||||||
|
if ((a & (m - 1)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m >>= 1;
|
||||||
|
b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
|
||||||
|
initialized.
|
||||||
|
*/
|
||||||
|
local z_crc_t x2nmodp(z_off64_t n, unsigned k) {
|
||||||
|
z_crc_t p;
|
||||||
|
|
||||||
|
p = (z_crc_t)1 << 31; /* x^0 == 1 */
|
||||||
|
while (n) {
|
||||||
|
if (n & 1)
|
||||||
|
p = multmodp(x2n_table[k & 31], p);
|
||||||
|
n >>= 1;
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
/* =========================================================================
|
||||||
|
* Build the tables for byte-wise and braided CRC-32 calculations, and a table
|
||||||
|
* of powers of x for combining CRC-32s.
|
||||||
|
*/
|
||||||
local z_crc_t FAR crc_table[256];
|
local z_crc_t FAR crc_table[256];
|
||||||
local z_crc_t FAR x2n_table[32];
|
|
||||||
local void make_crc_table OF((void));
|
|
||||||
#ifdef W
|
#ifdef W
|
||||||
local z_word_t FAR crc_big_table[256];
|
local z_word_t FAR crc_big_table[256];
|
||||||
local z_crc_t FAR crc_braid_table[W][256];
|
local z_crc_t FAR crc_braid_table[W][256];
|
||||||
local z_word_t FAR crc_braid_big_table[W][256];
|
local z_word_t FAR crc_braid_big_table[W][256];
|
||||||
local void braid OF((z_crc_t [][256], z_word_t [][256], int, int));
|
local void braid(z_crc_t [][256], z_word_t [][256], int, int);
|
||||||
#endif
|
#endif
|
||||||
#ifdef MAKECRCH
|
#ifdef MAKECRCH
|
||||||
local void write_table OF((FILE *, const z_crc_t FAR *, int));
|
local void write_table(FILE *, const z_crc_t FAR *, int);
|
||||||
local void write_table32hi OF((FILE *, const z_word_t FAR *, int));
|
local void write_table32hi(FILE *, const z_word_t FAR *, int);
|
||||||
local void write_table64 OF((FILE *, const z_word_t FAR *, int));
|
local void write_table64(FILE *, const z_word_t FAR *, int);
|
||||||
#endif /* MAKECRCH */
|
#endif /* MAKECRCH */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -176,7 +214,6 @@ local void make_crc_table OF((void));
|
||||||
|
|
||||||
/* Definition of once functionality. */
|
/* Definition of once functionality. */
|
||||||
typedef struct once_s once_t;
|
typedef struct once_s once_t;
|
||||||
local void once OF((once_t *, void (*)(void)));
|
|
||||||
|
|
||||||
/* Check for the availability of atomics. */
|
/* Check for the availability of atomics. */
|
||||||
#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
|
#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
|
||||||
|
@ -196,10 +233,7 @@ struct once_s {
|
||||||
invoke once() at the same time. The state must be a once_t initialized with
|
invoke once() at the same time. The state must be a once_t initialized with
|
||||||
ONCE_INIT.
|
ONCE_INIT.
|
||||||
*/
|
*/
|
||||||
local void once(state, init)
|
local void once(once_t *state, void (*init)(void)) {
|
||||||
once_t *state;
|
|
||||||
void (*init)(void);
|
|
||||||
{
|
|
||||||
if (!atomic_load(&state->done)) {
|
if (!atomic_load(&state->done)) {
|
||||||
if (atomic_flag_test_and_set(&state->begun))
|
if (atomic_flag_test_and_set(&state->begun))
|
||||||
while (!atomic_load(&state->done))
|
while (!atomic_load(&state->done))
|
||||||
|
@ -222,10 +256,7 @@ struct once_s {
|
||||||
|
|
||||||
/* Test and set. Alas, not atomic, but tries to minimize the period of
|
/* Test and set. Alas, not atomic, but tries to minimize the period of
|
||||||
vulnerability. */
|
vulnerability. */
|
||||||
local int test_and_set OF((int volatile *));
|
local int test_and_set(int volatile *flag) {
|
||||||
local int test_and_set(flag)
|
|
||||||
int volatile *flag;
|
|
||||||
{
|
|
||||||
int was;
|
int was;
|
||||||
|
|
||||||
was = *flag;
|
was = *flag;
|
||||||
|
@ -234,10 +265,7 @@ local int test_and_set(flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run the provided init() function once. This is not thread-safe. */
|
/* Run the provided init() function once. This is not thread-safe. */
|
||||||
local void once(state, init)
|
local void once(once_t *state, void (*init)(void)) {
|
||||||
once_t *state;
|
|
||||||
void (*init)(void);
|
|
||||||
{
|
|
||||||
if (!state->done) {
|
if (!state->done) {
|
||||||
if (test_and_set(&state->begun))
|
if (test_and_set(&state->begun))
|
||||||
while (!state->done)
|
while (!state->done)
|
||||||
|
@ -279,8 +307,7 @@ local once_t made = ONCE_INIT;
|
||||||
combinations of CRC register values and incoming bytes.
|
combinations of CRC register values and incoming bytes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
local void make_crc_table()
|
local void make_crc_table(void) {
|
||||||
{
|
|
||||||
unsigned i, j, n;
|
unsigned i, j, n;
|
||||||
z_crc_t p;
|
z_crc_t p;
|
||||||
|
|
||||||
|
@ -447,11 +474,7 @@ local void make_crc_table()
|
||||||
Write the 32-bit values in table[0..k-1] to out, five per line in
|
Write the 32-bit values in table[0..k-1] to out, five per line in
|
||||||
hexadecimal separated by commas.
|
hexadecimal separated by commas.
|
||||||
*/
|
*/
|
||||||
local void write_table(out, table, k)
|
local void write_table(FILE *out, const z_crc_t FAR *table, int k) {
|
||||||
FILE *out;
|
|
||||||
const z_crc_t FAR *table;
|
|
||||||
int k;
|
|
||||||
{
|
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < k; n++)
|
for (n = 0; n < k; n++)
|
||||||
|
@ -464,11 +487,7 @@ local void write_table(out, table, k)
|
||||||
Write the high 32-bits of each value in table[0..k-1] to out, five per line
|
Write the high 32-bits of each value in table[0..k-1] to out, five per line
|
||||||
in hexadecimal separated by commas.
|
in hexadecimal separated by commas.
|
||||||
*/
|
*/
|
||||||
local void write_table32hi(out, table, k)
|
local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) {
|
||||||
FILE *out;
|
|
||||||
const z_word_t FAR *table;
|
|
||||||
int k;
|
|
||||||
{
|
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < k; n++)
|
for (n = 0; n < k; n++)
|
||||||
|
@ -484,11 +503,7 @@ int k;
|
||||||
bits. If not, then the type cast and format string can be adjusted
|
bits. If not, then the type cast and format string can be adjusted
|
||||||
accordingly.
|
accordingly.
|
||||||
*/
|
*/
|
||||||
local void write_table64(out, table, k)
|
local void write_table64(FILE *out, const z_word_t FAR *table, int k) {
|
||||||
FILE *out;
|
|
||||||
const z_word_t FAR *table;
|
|
||||||
int k;
|
|
||||||
{
|
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < k; n++)
|
for (n = 0; n < k; n++)
|
||||||
|
@ -498,8 +513,7 @@ local void write_table64(out, table, k)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Actually do the deed. */
|
/* Actually do the deed. */
|
||||||
int main()
|
int main(void) {
|
||||||
{
|
|
||||||
make_crc_table();
|
make_crc_table();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -511,12 +525,7 @@ int main()
|
||||||
Generate the little and big-endian braid tables for the given n and z_word_t
|
Generate the little and big-endian braid tables for the given n and z_word_t
|
||||||
size w. Each array must have room for w blocks of 256 elements.
|
size w. Each array must have room for w blocks of 256 elements.
|
||||||
*/
|
*/
|
||||||
local void braid(ltl, big, n, w)
|
local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) {
|
||||||
z_crc_t ltl[][256];
|
|
||||||
z_word_t big[][256];
|
|
||||||
int n;
|
|
||||||
int w;
|
|
||||||
{
|
|
||||||
int k;
|
int k;
|
||||||
z_crc_t i, p, q;
|
z_crc_t i, p, q;
|
||||||
for (k = 0; k < w; k++) {
|
for (k = 0; k < w; k++) {
|
||||||
|
@ -531,69 +540,13 @@ local void braid(ltl, big, n, w)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else /* !DYNAMIC_CRC_TABLE */
|
|
||||||
/* ========================================================================
|
|
||||||
* Tables for byte-wise and braided CRC-32 calculations, and a table of powers
|
|
||||||
* of x for combining CRC-32s, all made by make_crc_table().
|
|
||||||
*/
|
|
||||||
#include "crc32.h"
|
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
|
||||||
/* ========================================================================
|
|
||||||
* Routines used for CRC calculation. Some are also required for the table
|
|
||||||
* generation above.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
|
|
||||||
reflected. For speed, this requires that a not be zero.
|
|
||||||
*/
|
|
||||||
local z_crc_t multmodp(a, b)
|
|
||||||
z_crc_t a;
|
|
||||||
z_crc_t b;
|
|
||||||
{
|
|
||||||
z_crc_t m, p;
|
|
||||||
|
|
||||||
m = (z_crc_t)1 << 31;
|
|
||||||
p = 0;
|
|
||||||
for (;;) {
|
|
||||||
if (a & m) {
|
|
||||||
p ^= b;
|
|
||||||
if ((a & (m - 1)) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m >>= 1;
|
|
||||||
b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
|
|
||||||
initialized.
|
|
||||||
*/
|
|
||||||
local z_crc_t x2nmodp(n, k)
|
|
||||||
z_off64_t n;
|
|
||||||
unsigned k;
|
|
||||||
{
|
|
||||||
z_crc_t p;
|
|
||||||
|
|
||||||
p = (z_crc_t)1 << 31; /* x^0 == 1 */
|
|
||||||
while (n) {
|
|
||||||
if (n & 1)
|
|
||||||
p = multmodp(x2n_table[k & 31], p);
|
|
||||||
n >>= 1;
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
* This function can be used by asm versions of crc32(), and to force the
|
* This function can be used by asm versions of crc32(), and to force the
|
||||||
* generation of the CRC tables in a threaded application.
|
* generation of the CRC tables in a threaded application.
|
||||||
*/
|
*/
|
||||||
const z_crc_t FAR * ZEXPORT get_crc_table()
|
const z_crc_t FAR * ZEXPORT get_crc_table(void) {
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
once(&made, make_crc_table);
|
once(&made, make_crc_table);
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
@ -619,11 +572,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table()
|
||||||
#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */
|
#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */
|
||||||
#define Z_BATCH_MIN 800 /* fewest words in a final batch */
|
#define Z_BATCH_MIN 800 /* fewest words in a final batch */
|
||||||
|
|
||||||
unsigned long ZEXPORT crc32_z(crc, buf, len)
|
unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
|
||||||
unsigned long crc;
|
z_size_t len) {
|
||||||
const unsigned char FAR *buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
z_crc_t val;
|
z_crc_t val;
|
||||||
z_word_t crc1, crc2;
|
z_word_t crc1, crc2;
|
||||||
const z_word_t *word;
|
const z_word_t *word;
|
||||||
|
@ -723,18 +673,14 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
|
||||||
least-significant byte of the word as the first byte of data, without any pre
|
least-significant byte of the word as the first byte of data, without any pre
|
||||||
or post conditioning. This is used to combine the CRCs of each braid.
|
or post conditioning. This is used to combine the CRCs of each braid.
|
||||||
*/
|
*/
|
||||||
local z_crc_t crc_word(data)
|
local z_crc_t crc_word(z_word_t data) {
|
||||||
z_word_t data;
|
|
||||||
{
|
|
||||||
int k;
|
int k;
|
||||||
for (k = 0; k < W; k++)
|
for (k = 0; k < W; k++)
|
||||||
data = (data >> 8) ^ crc_table[data & 0xff];
|
data = (data >> 8) ^ crc_table[data & 0xff];
|
||||||
return (z_crc_t)data;
|
return (z_crc_t)data;
|
||||||
}
|
}
|
||||||
|
|
||||||
local z_word_t crc_word_big(data)
|
local z_word_t crc_word_big(z_word_t data) {
|
||||||
z_word_t data;
|
|
||||||
{
|
|
||||||
int k;
|
int k;
|
||||||
for (k = 0; k < W; k++)
|
for (k = 0; k < W; k++)
|
||||||
data = (data << 8) ^
|
data = (data << 8) ^
|
||||||
|
@ -745,11 +691,8 @@ local z_word_t crc_word_big(data)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
unsigned long ZEXPORT crc32_z(crc, buf, len)
|
unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
|
||||||
unsigned long crc;
|
z_size_t len) {
|
||||||
const unsigned char FAR *buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
/* Return initial CRC, if requested. */
|
/* Return initial CRC, if requested. */
|
||||||
if (buf == Z_NULL) return 0;
|
if (buf == Z_NULL) return 0;
|
||||||
|
|
||||||
|
@ -781,8 +724,8 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
|
||||||
words = (z_word_t const *)buf;
|
words = (z_word_t const *)buf;
|
||||||
|
|
||||||
/* Do endian check at execution time instead of compile time, since ARM
|
/* Do endian check at execution time instead of compile time, since ARM
|
||||||
processors can change the endianess at execution time. If the
|
processors can change the endianness at execution time. If the
|
||||||
compiler knows what the endianess will be, it can optimize out the
|
compiler knows what the endianness will be, it can optimize out the
|
||||||
check and the unused branch. */
|
check and the unused branch. */
|
||||||
endian = 1;
|
endian = 1;
|
||||||
if (*(unsigned char *)&endian) {
|
if (*(unsigned char *)&endian) {
|
||||||
|
@ -1069,20 +1012,13 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
unsigned long ZEXPORT crc32(crc, buf, len)
|
unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,
|
||||||
unsigned long crc;
|
uInt len) {
|
||||||
const unsigned char FAR *buf;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
return crc32_z(crc, buf, len);
|
return crc32_z(crc, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
|
uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
|
||||||
uLong crc1;
|
|
||||||
uLong crc2;
|
|
||||||
z_off64_t len2;
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
once(&made, make_crc_table);
|
once(&made, make_crc_table);
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
@ -1090,18 +1026,12 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT crc32_combine(crc1, crc2, len2)
|
uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
|
||||||
uLong crc1;
|
|
||||||
uLong crc2;
|
|
||||||
z_off_t len2;
|
|
||||||
{
|
|
||||||
return crc32_combine64(crc1, crc2, (z_off64_t)len2);
|
return crc32_combine64(crc1, crc2, (z_off64_t)len2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT crc32_combine_gen64(len2)
|
uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
|
||||||
z_off64_t len2;
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
once(&made, make_crc_table);
|
once(&made, make_crc_table);
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
@ -1109,17 +1039,11 @@ uLong ZEXPORT crc32_combine_gen64(len2)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT crc32_combine_gen(len2)
|
uLong ZEXPORT crc32_combine_gen(z_off_t len2) {
|
||||||
z_off_t len2;
|
|
||||||
{
|
|
||||||
return crc32_combine_gen64((z_off64_t)len2);
|
return crc32_combine_gen64((z_off64_t)len2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
uLong ZEXPORT crc32_combine_op(crc1, crc2, op)
|
uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {
|
||||||
uLong crc1;
|
|
||||||
uLong crc2;
|
|
||||||
uLong op;
|
|
||||||
{
|
|
||||||
return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
|
return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
569
thirdparty/zlib/deflate.c
vendored
569
thirdparty/zlib/deflate.c
vendored
|
@ -1,5 +1,5 @@
|
||||||
/* deflate.c -- compress data using the deflation algorithm
|
/* deflate.c -- compress data using the deflation algorithm
|
||||||
* Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
|
* Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
#include "deflate.h"
|
#include "deflate.h"
|
||||||
|
|
||||||
const char deflate_copyright[] =
|
const char deflate_copyright[] =
|
||||||
" deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
|
" deflate 1.3 Copyright 1995-2023 Jean-loup Gailly and Mark Adler ";
|
||||||
/*
|
/*
|
||||||
If you use the zlib library in a product, an acknowledgment is welcome
|
If you use the zlib library in a product, an acknowledgment is welcome
|
||||||
in the documentation of your product. If for some reason you cannot
|
in the documentation of your product. If for some reason you cannot
|
||||||
|
@ -60,9 +60,6 @@ const char deflate_copyright[] =
|
||||||
copyright string in the executable of your product.
|
copyright string in the executable of your product.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Function prototypes.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
need_more, /* block not completed, need more input or more output */
|
need_more, /* block not completed, need more input or more output */
|
||||||
block_done, /* block flush performed */
|
block_done, /* block flush performed */
|
||||||
|
@ -70,29 +67,16 @@ typedef enum {
|
||||||
finish_done /* finish done, accept no more input or output */
|
finish_done /* finish done, accept no more input or output */
|
||||||
} block_state;
|
} block_state;
|
||||||
|
|
||||||
typedef block_state (*compress_func) OF((deflate_state *s, int flush));
|
typedef block_state (*compress_func)(deflate_state *s, int flush);
|
||||||
/* Compression function. Returns the block state after the call. */
|
/* Compression function. Returns the block state after the call. */
|
||||||
|
|
||||||
local int deflateStateCheck OF((z_streamp strm));
|
local block_state deflate_stored(deflate_state *s, int flush);
|
||||||
local void slide_hash OF((deflate_state *s));
|
local block_state deflate_fast(deflate_state *s, int flush);
|
||||||
local void fill_window OF((deflate_state *s));
|
|
||||||
local block_state deflate_stored OF((deflate_state *s, int flush));
|
|
||||||
local block_state deflate_fast OF((deflate_state *s, int flush));
|
|
||||||
#ifndef FASTEST
|
#ifndef FASTEST
|
||||||
local block_state deflate_slow OF((deflate_state *s, int flush));
|
local block_state deflate_slow(deflate_state *s, int flush);
|
||||||
#endif
|
|
||||||
local block_state deflate_rle OF((deflate_state *s, int flush));
|
|
||||||
local block_state deflate_huff OF((deflate_state *s, int flush));
|
|
||||||
local void lm_init OF((deflate_state *s));
|
|
||||||
local void putShortMSB OF((deflate_state *s, uInt b));
|
|
||||||
local void flush_pending OF((z_streamp strm));
|
|
||||||
local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
|
|
||||||
local uInt longest_match OF((deflate_state *s, IPos cur_match));
|
|
||||||
|
|
||||||
#ifdef ZLIB_DEBUG
|
|
||||||
local void check_match OF((deflate_state *s, IPos start, IPos match,
|
|
||||||
int length));
|
|
||||||
#endif
|
#endif
|
||||||
|
local block_state deflate_rle(deflate_state *s, int flush);
|
||||||
|
local block_state deflate_huff(deflate_state *s, int flush);
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Local data
|
* Local data
|
||||||
|
@ -195,9 +179,12 @@ local const config configuration_table[10] = {
|
||||||
* bit values at the expense of memory usage). We slide even when level == 0 to
|
* bit values at the expense of memory usage). We slide even when level == 0 to
|
||||||
* keep the hash table consistent if we switch back to level > 0 later.
|
* keep the hash table consistent if we switch back to level > 0 later.
|
||||||
*/
|
*/
|
||||||
local void slide_hash(s)
|
#if defined(__has_feature)
|
||||||
deflate_state *s;
|
# if __has_feature(memory_sanitizer)
|
||||||
{
|
__attribute__((no_sanitize("memory")))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
local void slide_hash(deflate_state *s) {
|
||||||
unsigned n, m;
|
unsigned n, m;
|
||||||
Posf *p;
|
Posf *p;
|
||||||
uInt wsize = s->w_size;
|
uInt wsize = s->w_size;
|
||||||
|
@ -221,30 +208,177 @@ local void slide_hash(s)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Read a new buffer from the current input stream, update the adler32
|
||||||
|
* and total number of bytes read. All deflate() input goes through
|
||||||
|
* this function so some applications may wish to modify it to avoid
|
||||||
|
* allocating a large strm->next_in buffer and copying from it.
|
||||||
|
* (See also flush_pending()).
|
||||||
|
*/
|
||||||
|
local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) {
|
||||||
|
unsigned len = strm->avail_in;
|
||||||
|
|
||||||
|
if (len > size) len = size;
|
||||||
|
if (len == 0) return 0;
|
||||||
|
|
||||||
|
strm->avail_in -= len;
|
||||||
|
|
||||||
|
zmemcpy(buf, strm->next_in, len);
|
||||||
|
if (strm->state->wrap == 1) {
|
||||||
|
strm->adler = adler32(strm->adler, buf, len);
|
||||||
|
}
|
||||||
|
#ifdef GZIP
|
||||||
|
else if (strm->state->wrap == 2) {
|
||||||
|
strm->adler = crc32(strm->adler, buf, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
strm->next_in += len;
|
||||||
|
strm->total_in += len;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Fill the window when the lookahead becomes insufficient.
|
||||||
|
* Updates strstart and lookahead.
|
||||||
|
*
|
||||||
|
* IN assertion: lookahead < MIN_LOOKAHEAD
|
||||||
|
* OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
|
||||||
|
* At least one byte has been read, or avail_in == 0; reads are
|
||||||
|
* performed for at least two bytes (required for the zip translate_eol
|
||||||
|
* option -- not supported here).
|
||||||
|
*/
|
||||||
|
local void fill_window(deflate_state *s) {
|
||||||
|
unsigned n;
|
||||||
|
unsigned more; /* Amount of free space at the end of the window. */
|
||||||
|
uInt wsize = s->w_size;
|
||||||
|
|
||||||
|
Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
|
||||||
|
|
||||||
|
do {
|
||||||
|
more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
|
||||||
|
|
||||||
|
/* Deal with !@#$% 64K limit: */
|
||||||
|
if (sizeof(int) <= 2) {
|
||||||
|
if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
|
||||||
|
more = wsize;
|
||||||
|
|
||||||
|
} else if (more == (unsigned)(-1)) {
|
||||||
|
/* Very unlikely, but possible on 16 bit machine if
|
||||||
|
* strstart == 0 && lookahead == 1 (input done a byte at time)
|
||||||
|
*/
|
||||||
|
more--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the window is almost full and there is insufficient lookahead,
|
||||||
|
* move the upper half to the lower one to make room in the upper half.
|
||||||
|
*/
|
||||||
|
if (s->strstart >= wsize + MAX_DIST(s)) {
|
||||||
|
|
||||||
|
zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
|
||||||
|
s->match_start -= wsize;
|
||||||
|
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
|
||||||
|
s->block_start -= (long) wsize;
|
||||||
|
if (s->insert > s->strstart)
|
||||||
|
s->insert = s->strstart;
|
||||||
|
slide_hash(s);
|
||||||
|
more += wsize;
|
||||||
|
}
|
||||||
|
if (s->strm->avail_in == 0) break;
|
||||||
|
|
||||||
|
/* If there was no sliding:
|
||||||
|
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
|
||||||
|
* more == window_size - lookahead - strstart
|
||||||
|
* => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
|
||||||
|
* => more >= window_size - 2*WSIZE + 2
|
||||||
|
* In the BIG_MEM or MMAP case (not yet supported),
|
||||||
|
* window_size == input_size + MIN_LOOKAHEAD &&
|
||||||
|
* strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
|
||||||
|
* Otherwise, window_size == 2*WSIZE so more >= 2.
|
||||||
|
* If there was sliding, more >= WSIZE. So in all cases, more >= 2.
|
||||||
|
*/
|
||||||
|
Assert(more >= 2, "more < 2");
|
||||||
|
|
||||||
|
n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
|
||||||
|
s->lookahead += n;
|
||||||
|
|
||||||
|
/* Initialize the hash value now that we have some input: */
|
||||||
|
if (s->lookahead + s->insert >= MIN_MATCH) {
|
||||||
|
uInt str = s->strstart - s->insert;
|
||||||
|
s->ins_h = s->window[str];
|
||||||
|
UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
|
||||||
|
#if MIN_MATCH != 3
|
||||||
|
Call UPDATE_HASH() MIN_MATCH-3 more times
|
||||||
|
#endif
|
||||||
|
while (s->insert) {
|
||||||
|
UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
|
||||||
|
#ifndef FASTEST
|
||||||
|
s->prev[str & s->w_mask] = s->head[s->ins_h];
|
||||||
|
#endif
|
||||||
|
s->head[s->ins_h] = (Pos)str;
|
||||||
|
str++;
|
||||||
|
s->insert--;
|
||||||
|
if (s->lookahead + s->insert < MIN_MATCH)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
|
||||||
|
* but this is not important since only literal bytes will be emitted.
|
||||||
|
*/
|
||||||
|
|
||||||
|
} while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
|
||||||
|
|
||||||
|
/* If the WIN_INIT bytes after the end of the current data have never been
|
||||||
|
* written, then zero those bytes in order to avoid memory check reports of
|
||||||
|
* the use of uninitialized (or uninitialised as Julian writes) bytes by
|
||||||
|
* the longest match routines. Update the high water mark for the next
|
||||||
|
* time through here. WIN_INIT is set to MAX_MATCH since the longest match
|
||||||
|
* routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
|
||||||
|
*/
|
||||||
|
if (s->high_water < s->window_size) {
|
||||||
|
ulg curr = s->strstart + (ulg)(s->lookahead);
|
||||||
|
ulg init;
|
||||||
|
|
||||||
|
if (s->high_water < curr) {
|
||||||
|
/* Previous high water mark below current data -- zero WIN_INIT
|
||||||
|
* bytes or up to end of window, whichever is less.
|
||||||
|
*/
|
||||||
|
init = s->window_size - curr;
|
||||||
|
if (init > WIN_INIT)
|
||||||
|
init = WIN_INIT;
|
||||||
|
zmemzero(s->window + curr, (unsigned)init);
|
||||||
|
s->high_water = curr + init;
|
||||||
|
}
|
||||||
|
else if (s->high_water < (ulg)curr + WIN_INIT) {
|
||||||
|
/* High water mark at or above current data, but below current data
|
||||||
|
* plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
|
||||||
|
* to end of window, whichever is less.
|
||||||
|
*/
|
||||||
|
init = (ulg)curr + WIN_INIT - s->high_water;
|
||||||
|
if (init > s->window_size - s->high_water)
|
||||||
|
init = s->window_size - s->high_water;
|
||||||
|
zmemzero(s->window + s->high_water, (unsigned)init);
|
||||||
|
s->high_water += init;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
|
||||||
|
"not enough room for search");
|
||||||
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateInit_(strm, level, version, stream_size)
|
int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version,
|
||||||
z_streamp strm;
|
int stream_size) {
|
||||||
int level;
|
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{
|
|
||||||
return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
|
return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
|
||||||
Z_DEFAULT_STRATEGY, version, stream_size);
|
Z_DEFAULT_STRATEGY, version, stream_size);
|
||||||
/* To do: ignore strm->next_in if we use it as window */
|
/* To do: ignore strm->next_in if we use it as window */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
|
int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
|
||||||
version, stream_size)
|
int windowBits, int memLevel, int strategy,
|
||||||
z_streamp strm;
|
const char *version, int stream_size) {
|
||||||
int level;
|
|
||||||
int method;
|
|
||||||
int windowBits;
|
|
||||||
int memLevel;
|
|
||||||
int strategy;
|
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
int wrap = 1;
|
int wrap = 1;
|
||||||
static const char my_version[] = ZLIB_VERSION;
|
static const char my_version[] = ZLIB_VERSION;
|
||||||
|
@ -386,9 +520,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
|
||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
* Check for a valid deflate stream state. Return 0 if ok, 1 if not.
|
* Check for a valid deflate stream state. Return 0 if ok, 1 if not.
|
||||||
*/
|
*/
|
||||||
local int deflateStateCheck(strm)
|
local int deflateStateCheck(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
if (strm == Z_NULL ||
|
if (strm == Z_NULL ||
|
||||||
strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
|
strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
|
||||||
|
@ -409,11 +541,8 @@ local int deflateStateCheck(strm)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
|
int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary,
|
||||||
z_streamp strm;
|
uInt dictLength) {
|
||||||
const Bytef *dictionary;
|
|
||||||
uInt dictLength;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
uInt str, n;
|
uInt str, n;
|
||||||
int wrap;
|
int wrap;
|
||||||
|
@ -478,11 +607,8 @@ int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
|
int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary,
|
||||||
z_streamp strm;
|
uInt *dictLength) {
|
||||||
Bytef *dictionary;
|
|
||||||
uInt *dictLength;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
uInt len;
|
uInt len;
|
||||||
|
|
||||||
|
@ -500,9 +626,7 @@ int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateResetKeep(strm)
|
int ZEXPORT deflateResetKeep(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
|
|
||||||
if (deflateStateCheck(strm)) {
|
if (deflateStateCheck(strm)) {
|
||||||
|
@ -537,10 +661,32 @@ int ZEXPORT deflateResetKeep(strm)
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Initialize the "longest match" routines for a new zlib stream
|
||||||
|
*/
|
||||||
|
local void lm_init(deflate_state *s) {
|
||||||
|
s->window_size = (ulg)2L*s->w_size;
|
||||||
|
|
||||||
|
CLEAR_HASH(s);
|
||||||
|
|
||||||
|
/* Set the default configuration parameters:
|
||||||
|
*/
|
||||||
|
s->max_lazy_match = configuration_table[s->level].max_lazy;
|
||||||
|
s->good_match = configuration_table[s->level].good_length;
|
||||||
|
s->nice_match = configuration_table[s->level].nice_length;
|
||||||
|
s->max_chain_length = configuration_table[s->level].max_chain;
|
||||||
|
|
||||||
|
s->strstart = 0;
|
||||||
|
s->block_start = 0L;
|
||||||
|
s->lookahead = 0;
|
||||||
|
s->insert = 0;
|
||||||
|
s->match_length = s->prev_length = MIN_MATCH-1;
|
||||||
|
s->match_available = 0;
|
||||||
|
s->ins_h = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateReset(strm)
|
int ZEXPORT deflateReset(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = deflateResetKeep(strm);
|
ret = deflateResetKeep(strm);
|
||||||
|
@ -550,10 +696,7 @@ int ZEXPORT deflateReset(strm)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateSetHeader(strm, head)
|
int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) {
|
||||||
z_streamp strm;
|
|
||||||
gz_headerp head;
|
|
||||||
{
|
|
||||||
if (deflateStateCheck(strm) || strm->state->wrap != 2)
|
if (deflateStateCheck(strm) || strm->state->wrap != 2)
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
strm->state->gzhead = head;
|
strm->state->gzhead = head;
|
||||||
|
@ -561,11 +704,7 @@ int ZEXPORT deflateSetHeader(strm, head)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflatePending(strm, pending, bits)
|
int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) {
|
||||||
unsigned *pending;
|
|
||||||
int *bits;
|
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
if (pending != Z_NULL)
|
if (pending != Z_NULL)
|
||||||
*pending = strm->state->pending;
|
*pending = strm->state->pending;
|
||||||
|
@ -575,11 +714,7 @@ int ZEXPORT deflatePending(strm, pending, bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflatePrime(strm, bits, value)
|
int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) {
|
||||||
z_streamp strm;
|
|
||||||
int bits;
|
|
||||||
int value;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
int put;
|
int put;
|
||||||
|
|
||||||
|
@ -602,11 +737,7 @@ int ZEXPORT deflatePrime(strm, bits, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateParams(strm, level, strategy)
|
int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) {
|
||||||
z_streamp strm;
|
|
||||||
int level;
|
|
||||||
int strategy;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
compress_func func;
|
compress_func func;
|
||||||
|
|
||||||
|
@ -651,13 +782,8 @@ int ZEXPORT deflateParams(strm, level, strategy)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
|
int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy,
|
||||||
z_streamp strm;
|
int nice_length, int max_chain) {
|
||||||
int good_length;
|
|
||||||
int max_lazy;
|
|
||||||
int nice_length;
|
|
||||||
int max_chain;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
|
|
||||||
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -693,10 +819,7 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
|
||||||
*
|
*
|
||||||
* Shifts are used to approximate divisions, for speed.
|
* Shifts are used to approximate divisions, for speed.
|
||||||
*/
|
*/
|
||||||
uLong ZEXPORT deflateBound(strm, sourceLen)
|
uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) {
|
||||||
z_streamp strm;
|
|
||||||
uLong sourceLen;
|
|
||||||
{
|
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
uLong fixedlen, storelen, wraplen;
|
uLong fixedlen, storelen, wraplen;
|
||||||
|
|
||||||
|
@ -752,7 +875,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
|
||||||
|
|
||||||
/* if not default parameters, return one of the conservative bounds */
|
/* if not default parameters, return one of the conservative bounds */
|
||||||
if (s->w_bits != 15 || s->hash_bits != 8 + 7)
|
if (s->w_bits != 15 || s->hash_bits != 8 + 7)
|
||||||
return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
|
return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) +
|
||||||
|
wraplen;
|
||||||
|
|
||||||
/* default settings: return tight bound for that case -- ~0.03% overhead
|
/* default settings: return tight bound for that case -- ~0.03% overhead
|
||||||
plus a small constant */
|
plus a small constant */
|
||||||
|
@ -765,10 +889,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
|
||||||
* IN assertion: the stream state is correct and there is enough room in
|
* IN assertion: the stream state is correct and there is enough room in
|
||||||
* pending_buf.
|
* pending_buf.
|
||||||
*/
|
*/
|
||||||
local void putShortMSB(s, b)
|
local void putShortMSB(deflate_state *s, uInt b) {
|
||||||
deflate_state *s;
|
|
||||||
uInt b;
|
|
||||||
{
|
|
||||||
put_byte(s, (Byte)(b >> 8));
|
put_byte(s, (Byte)(b >> 8));
|
||||||
put_byte(s, (Byte)(b & 0xff));
|
put_byte(s, (Byte)(b & 0xff));
|
||||||
}
|
}
|
||||||
|
@ -779,9 +900,7 @@ local void putShortMSB(s, b)
|
||||||
* applications may wish to modify it to avoid allocating a large
|
* applications may wish to modify it to avoid allocating a large
|
||||||
* strm->next_out buffer and copying into it. (See also read_buf()).
|
* strm->next_out buffer and copying into it. (See also read_buf()).
|
||||||
*/
|
*/
|
||||||
local void flush_pending(strm)
|
local void flush_pending(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
unsigned len;
|
unsigned len;
|
||||||
deflate_state *s = strm->state;
|
deflate_state *s = strm->state;
|
||||||
|
|
||||||
|
@ -812,10 +931,7 @@ local void flush_pending(strm)
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflate(strm, flush)
|
int ZEXPORT deflate(z_streamp strm, int flush) {
|
||||||
z_streamp strm;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
int old_flush; /* value of flush param for previous deflate call */
|
int old_flush; /* value of flush param for previous deflate call */
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
|
|
||||||
|
@ -1127,9 +1243,7 @@ int ZEXPORT deflate(strm, flush)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
int ZEXPORT deflateEnd(strm)
|
int ZEXPORT deflateEnd(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -1153,11 +1267,10 @@ int ZEXPORT deflateEnd(strm)
|
||||||
* To simplify the source, this is not supported for 16-bit MSDOS (which
|
* To simplify the source, this is not supported for 16-bit MSDOS (which
|
||||||
* doesn't have enough memory anyway to duplicate compression states).
|
* doesn't have enough memory anyway to duplicate compression states).
|
||||||
*/
|
*/
|
||||||
int ZEXPORT deflateCopy(dest, source)
|
int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) {
|
||||||
z_streamp dest;
|
|
||||||
z_streamp source;
|
|
||||||
{
|
|
||||||
#ifdef MAXSEG_64K
|
#ifdef MAXSEG_64K
|
||||||
|
(void)dest;
|
||||||
|
(void)source;
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
#else
|
#else
|
||||||
deflate_state *ds;
|
deflate_state *ds;
|
||||||
|
@ -1205,66 +1318,6 @@ int ZEXPORT deflateCopy(dest, source)
|
||||||
#endif /* MAXSEG_64K */
|
#endif /* MAXSEG_64K */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Read a new buffer from the current input stream, update the adler32
|
|
||||||
* and total number of bytes read. All deflate() input goes through
|
|
||||||
* this function so some applications may wish to modify it to avoid
|
|
||||||
* allocating a large strm->next_in buffer and copying from it.
|
|
||||||
* (See also flush_pending()).
|
|
||||||
*/
|
|
||||||
local unsigned read_buf(strm, buf, size)
|
|
||||||
z_streamp strm;
|
|
||||||
Bytef *buf;
|
|
||||||
unsigned size;
|
|
||||||
{
|
|
||||||
unsigned len = strm->avail_in;
|
|
||||||
|
|
||||||
if (len > size) len = size;
|
|
||||||
if (len == 0) return 0;
|
|
||||||
|
|
||||||
strm->avail_in -= len;
|
|
||||||
|
|
||||||
zmemcpy(buf, strm->next_in, len);
|
|
||||||
if (strm->state->wrap == 1) {
|
|
||||||
strm->adler = adler32(strm->adler, buf, len);
|
|
||||||
}
|
|
||||||
#ifdef GZIP
|
|
||||||
else if (strm->state->wrap == 2) {
|
|
||||||
strm->adler = crc32(strm->adler, buf, len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
strm->next_in += len;
|
|
||||||
strm->total_in += len;
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Initialize the "longest match" routines for a new zlib stream
|
|
||||||
*/
|
|
||||||
local void lm_init(s)
|
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
s->window_size = (ulg)2L*s->w_size;
|
|
||||||
|
|
||||||
CLEAR_HASH(s);
|
|
||||||
|
|
||||||
/* Set the default configuration parameters:
|
|
||||||
*/
|
|
||||||
s->max_lazy_match = configuration_table[s->level].max_lazy;
|
|
||||||
s->good_match = configuration_table[s->level].good_length;
|
|
||||||
s->nice_match = configuration_table[s->level].nice_length;
|
|
||||||
s->max_chain_length = configuration_table[s->level].max_chain;
|
|
||||||
|
|
||||||
s->strstart = 0;
|
|
||||||
s->block_start = 0L;
|
|
||||||
s->lookahead = 0;
|
|
||||||
s->insert = 0;
|
|
||||||
s->match_length = s->prev_length = MIN_MATCH-1;
|
|
||||||
s->match_available = 0;
|
|
||||||
s->ins_h = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef FASTEST
|
#ifndef FASTEST
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Set match_start to the longest match starting at the given string and
|
* Set match_start to the longest match starting at the given string and
|
||||||
|
@ -1275,10 +1328,7 @@ local void lm_init(s)
|
||||||
* string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
|
* string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
|
||||||
* OUT assertion: the match length is not greater than s->lookahead.
|
* OUT assertion: the match length is not greater than s->lookahead.
|
||||||
*/
|
*/
|
||||||
local uInt longest_match(s, cur_match)
|
local uInt longest_match(deflate_state *s, IPos cur_match) {
|
||||||
deflate_state *s;
|
|
||||||
IPos cur_match; /* current match */
|
|
||||||
{
|
|
||||||
unsigned chain_length = s->max_chain_length;/* max hash chain length */
|
unsigned chain_length = s->max_chain_length;/* max hash chain length */
|
||||||
register Bytef *scan = s->window + s->strstart; /* current string */
|
register Bytef *scan = s->window + s->strstart; /* current string */
|
||||||
register Bytef *match; /* matched string */
|
register Bytef *match; /* matched string */
|
||||||
|
@ -1426,10 +1476,7 @@ local uInt longest_match(s, cur_match)
|
||||||
/* ---------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------
|
||||||
* Optimized version for FASTEST only
|
* Optimized version for FASTEST only
|
||||||
*/
|
*/
|
||||||
local uInt longest_match(s, cur_match)
|
local uInt longest_match(deflate_state *s, IPos cur_match) {
|
||||||
deflate_state *s;
|
|
||||||
IPos cur_match; /* current match */
|
|
||||||
{
|
|
||||||
register Bytef *scan = s->window + s->strstart; /* current string */
|
register Bytef *scan = s->window + s->strstart; /* current string */
|
||||||
register Bytef *match; /* matched string */
|
register Bytef *match; /* matched string */
|
||||||
register int len; /* length of current match */
|
register int len; /* length of current match */
|
||||||
|
@ -1490,11 +1537,7 @@ local uInt longest_match(s, cur_match)
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Check that the match at match_start is indeed a match.
|
* Check that the match at match_start is indeed a match.
|
||||||
*/
|
*/
|
||||||
local void check_match(s, start, match, length)
|
local void check_match(deflate_state *s, IPos start, IPos match, int length) {
|
||||||
deflate_state *s;
|
|
||||||
IPos start, match;
|
|
||||||
int length;
|
|
||||||
{
|
|
||||||
/* check that the match is indeed a match */
|
/* check that the match is indeed a match */
|
||||||
if (zmemcmp(s->window + match,
|
if (zmemcmp(s->window + match,
|
||||||
s->window + start, length) != EQUAL) {
|
s->window + start, length) != EQUAL) {
|
||||||
|
@ -1514,137 +1557,6 @@ local void check_match(s, start, match, length)
|
||||||
# define check_match(s, start, match, length)
|
# define check_match(s, start, match, length)
|
||||||
#endif /* ZLIB_DEBUG */
|
#endif /* ZLIB_DEBUG */
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Fill the window when the lookahead becomes insufficient.
|
|
||||||
* Updates strstart and lookahead.
|
|
||||||
*
|
|
||||||
* IN assertion: lookahead < MIN_LOOKAHEAD
|
|
||||||
* OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
|
|
||||||
* At least one byte has been read, or avail_in == 0; reads are
|
|
||||||
* performed for at least two bytes (required for the zip translate_eol
|
|
||||||
* option -- not supported here).
|
|
||||||
*/
|
|
||||||
local void fill_window(s)
|
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
unsigned n;
|
|
||||||
unsigned more; /* Amount of free space at the end of the window. */
|
|
||||||
uInt wsize = s->w_size;
|
|
||||||
|
|
||||||
Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
|
|
||||||
|
|
||||||
do {
|
|
||||||
more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
|
|
||||||
|
|
||||||
/* Deal with !@#$% 64K limit: */
|
|
||||||
if (sizeof(int) <= 2) {
|
|
||||||
if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
|
|
||||||
more = wsize;
|
|
||||||
|
|
||||||
} else if (more == (unsigned)(-1)) {
|
|
||||||
/* Very unlikely, but possible on 16 bit machine if
|
|
||||||
* strstart == 0 && lookahead == 1 (input done a byte at time)
|
|
||||||
*/
|
|
||||||
more--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the window is almost full and there is insufficient lookahead,
|
|
||||||
* move the upper half to the lower one to make room in the upper half.
|
|
||||||
*/
|
|
||||||
if (s->strstart >= wsize + MAX_DIST(s)) {
|
|
||||||
|
|
||||||
zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
|
|
||||||
s->match_start -= wsize;
|
|
||||||
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
|
|
||||||
s->block_start -= (long) wsize;
|
|
||||||
if (s->insert > s->strstart)
|
|
||||||
s->insert = s->strstart;
|
|
||||||
slide_hash(s);
|
|
||||||
more += wsize;
|
|
||||||
}
|
|
||||||
if (s->strm->avail_in == 0) break;
|
|
||||||
|
|
||||||
/* If there was no sliding:
|
|
||||||
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
|
|
||||||
* more == window_size - lookahead - strstart
|
|
||||||
* => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
|
|
||||||
* => more >= window_size - 2*WSIZE + 2
|
|
||||||
* In the BIG_MEM or MMAP case (not yet supported),
|
|
||||||
* window_size == input_size + MIN_LOOKAHEAD &&
|
|
||||||
* strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
|
|
||||||
* Otherwise, window_size == 2*WSIZE so more >= 2.
|
|
||||||
* If there was sliding, more >= WSIZE. So in all cases, more >= 2.
|
|
||||||
*/
|
|
||||||
Assert(more >= 2, "more < 2");
|
|
||||||
|
|
||||||
n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
|
|
||||||
s->lookahead += n;
|
|
||||||
|
|
||||||
/* Initialize the hash value now that we have some input: */
|
|
||||||
if (s->lookahead + s->insert >= MIN_MATCH) {
|
|
||||||
uInt str = s->strstart - s->insert;
|
|
||||||
s->ins_h = s->window[str];
|
|
||||||
UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
|
|
||||||
#if MIN_MATCH != 3
|
|
||||||
Call UPDATE_HASH() MIN_MATCH-3 more times
|
|
||||||
#endif
|
|
||||||
while (s->insert) {
|
|
||||||
UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
|
|
||||||
#ifndef FASTEST
|
|
||||||
s->prev[str & s->w_mask] = s->head[s->ins_h];
|
|
||||||
#endif
|
|
||||||
s->head[s->ins_h] = (Pos)str;
|
|
||||||
str++;
|
|
||||||
s->insert--;
|
|
||||||
if (s->lookahead + s->insert < MIN_MATCH)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
|
|
||||||
* but this is not important since only literal bytes will be emitted.
|
|
||||||
*/
|
|
||||||
|
|
||||||
} while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
|
|
||||||
|
|
||||||
/* If the WIN_INIT bytes after the end of the current data have never been
|
|
||||||
* written, then zero those bytes in order to avoid memory check reports of
|
|
||||||
* the use of uninitialized (or uninitialised as Julian writes) bytes by
|
|
||||||
* the longest match routines. Update the high water mark for the next
|
|
||||||
* time through here. WIN_INIT is set to MAX_MATCH since the longest match
|
|
||||||
* routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
|
|
||||||
*/
|
|
||||||
if (s->high_water < s->window_size) {
|
|
||||||
ulg curr = s->strstart + (ulg)(s->lookahead);
|
|
||||||
ulg init;
|
|
||||||
|
|
||||||
if (s->high_water < curr) {
|
|
||||||
/* Previous high water mark below current data -- zero WIN_INIT
|
|
||||||
* bytes or up to end of window, whichever is less.
|
|
||||||
*/
|
|
||||||
init = s->window_size - curr;
|
|
||||||
if (init > WIN_INIT)
|
|
||||||
init = WIN_INIT;
|
|
||||||
zmemzero(s->window + curr, (unsigned)init);
|
|
||||||
s->high_water = curr + init;
|
|
||||||
}
|
|
||||||
else if (s->high_water < (ulg)curr + WIN_INIT) {
|
|
||||||
/* High water mark at or above current data, but below current data
|
|
||||||
* plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
|
|
||||||
* to end of window, whichever is less.
|
|
||||||
*/
|
|
||||||
init = (ulg)curr + WIN_INIT - s->high_water;
|
|
||||||
if (init > s->window_size - s->high_water)
|
|
||||||
init = s->window_size - s->high_water;
|
|
||||||
zmemzero(s->window + s->high_water, (unsigned)init);
|
|
||||||
s->high_water += init;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
|
|
||||||
"not enough room for search");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Flush the current block, with given end-of-file flag.
|
* Flush the current block, with given end-of-file flag.
|
||||||
* IN assertion: strstart is set to the end of the current match.
|
* IN assertion: strstart is set to the end of the current match.
|
||||||
|
@ -1687,10 +1599,7 @@ local void fill_window(s)
|
||||||
* copied. It is most efficient with large input and output buffers, which
|
* copied. It is most efficient with large input and output buffers, which
|
||||||
* maximizes the opportunities to have a single copy from next_in to next_out.
|
* maximizes the opportunities to have a single copy from next_in to next_out.
|
||||||
*/
|
*/
|
||||||
local block_state deflate_stored(s, flush)
|
local block_state deflate_stored(deflate_state *s, int flush) {
|
||||||
deflate_state *s;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
/* Smallest worthy block size when not flushing or finishing. By default
|
/* Smallest worthy block size when not flushing or finishing. By default
|
||||||
* this is 32K. This can be as small as 507 bytes for memLevel == 1. For
|
* this is 32K. This can be as small as 507 bytes for memLevel == 1. For
|
||||||
* large input and output buffers, the stored block size will be larger.
|
* large input and output buffers, the stored block size will be larger.
|
||||||
|
@ -1874,10 +1783,7 @@ local block_state deflate_stored(s, flush)
|
||||||
* new strings in the dictionary only for unmatched strings or for short
|
* new strings in the dictionary only for unmatched strings or for short
|
||||||
* matches. It is used only for the fast compression options.
|
* matches. It is used only for the fast compression options.
|
||||||
*/
|
*/
|
||||||
local block_state deflate_fast(s, flush)
|
local block_state deflate_fast(deflate_state *s, int flush) {
|
||||||
deflate_state *s;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
IPos hash_head; /* head of the hash chain */
|
IPos hash_head; /* head of the hash chain */
|
||||||
int bflush; /* set if current block must be flushed */
|
int bflush; /* set if current block must be flushed */
|
||||||
|
|
||||||
|
@ -1976,10 +1882,7 @@ local block_state deflate_fast(s, flush)
|
||||||
* evaluation for matches: a match is finally adopted only if there is
|
* evaluation for matches: a match is finally adopted only if there is
|
||||||
* no better match at the next window position.
|
* no better match at the next window position.
|
||||||
*/
|
*/
|
||||||
local block_state deflate_slow(s, flush)
|
local block_state deflate_slow(deflate_state *s, int flush) {
|
||||||
deflate_state *s;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
IPos hash_head; /* head of hash chain */
|
IPos hash_head; /* head of hash chain */
|
||||||
int bflush; /* set if current block must be flushed */
|
int bflush; /* set if current block must be flushed */
|
||||||
|
|
||||||
|
@ -2107,10 +2010,7 @@ local block_state deflate_slow(s, flush)
|
||||||
* one. Do not maintain a hash table. (It will be regenerated if this run of
|
* one. Do not maintain a hash table. (It will be regenerated if this run of
|
||||||
* deflate switches away from Z_RLE.)
|
* deflate switches away from Z_RLE.)
|
||||||
*/
|
*/
|
||||||
local block_state deflate_rle(s, flush)
|
local block_state deflate_rle(deflate_state *s, int flush) {
|
||||||
deflate_state *s;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
int bflush; /* set if current block must be flushed */
|
int bflush; /* set if current block must be flushed */
|
||||||
uInt prev; /* byte at distance one to match */
|
uInt prev; /* byte at distance one to match */
|
||||||
Bytef *scan, *strend; /* scan goes up to strend for length of run */
|
Bytef *scan, *strend; /* scan goes up to strend for length of run */
|
||||||
|
@ -2181,10 +2081,7 @@ local block_state deflate_rle(s, flush)
|
||||||
* For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
|
* For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
|
||||||
* (It will be regenerated if this run of deflate switches away from Huffman.)
|
* (It will be regenerated if this run of deflate switches away from Huffman.)
|
||||||
*/
|
*/
|
||||||
local block_state deflate_huff(s, flush)
|
local block_state deflate_huff(deflate_state *s, int flush) {
|
||||||
deflate_state *s;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
int bflush; /* set if current block must be flushed */
|
int bflush; /* set if current block must be flushed */
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
16
thirdparty/zlib/deflate.h
vendored
16
thirdparty/zlib/deflate.h
vendored
|
@ -291,14 +291,14 @@ typedef struct internal_state {
|
||||||
memory checker errors from longest match routines */
|
memory checker errors from longest match routines */
|
||||||
|
|
||||||
/* in trees.c */
|
/* in trees.c */
|
||||||
void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
|
void ZLIB_INTERNAL _tr_init(deflate_state *s);
|
||||||
int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
|
int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc);
|
||||||
void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
|
void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
|
||||||
ulg stored_len, int last));
|
ulg stored_len, int last);
|
||||||
void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
|
void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s);
|
||||||
void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
|
void ZLIB_INTERNAL _tr_align(deflate_state *s);
|
||||||
void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
|
void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
|
||||||
ulg stored_len, int last));
|
ulg stored_len, int last);
|
||||||
|
|
||||||
#define d_code(dist) \
|
#define d_code(dist) \
|
||||||
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
|
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
|
||||||
|
|
4
thirdparty/zlib/gzclose.c
vendored
4
thirdparty/zlib/gzclose.c
vendored
|
@ -8,9 +8,7 @@
|
||||||
/* gzclose() is in a separate file so that it is linked in only if it is used.
|
/* 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
|
That way the other gzclose functions can be used instead to avoid linking in
|
||||||
unneeded compression or decompression routines. */
|
unneeded compression or decompression routines. */
|
||||||
int ZEXPORT gzclose(file)
|
int ZEXPORT gzclose(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
#ifndef NO_GZCOMPRESS
|
#ifndef NO_GZCOMPRESS
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
|
23
thirdparty/zlib/gzguts.h
vendored
23
thirdparty/zlib/gzguts.h
vendored
|
@ -7,9 +7,8 @@
|
||||||
# ifndef _LARGEFILE_SOURCE
|
# ifndef _LARGEFILE_SOURCE
|
||||||
# define _LARGEFILE_SOURCE 1
|
# define _LARGEFILE_SOURCE 1
|
||||||
# endif
|
# endif
|
||||||
# ifdef _FILE_OFFSET_BITS
|
# undef _FILE_OFFSET_BITS
|
||||||
# undef _FILE_OFFSET_BITS
|
# undef _TIME_BITS
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_HIDDEN
|
#ifdef HAVE_HIDDEN
|
||||||
|
@ -119,8 +118,8 @@
|
||||||
|
|
||||||
/* gz* functions always use library allocation functions */
|
/* gz* functions always use library allocation functions */
|
||||||
#ifndef STDC
|
#ifndef STDC
|
||||||
extern voidp malloc OF((uInt size));
|
extern voidp malloc(uInt size);
|
||||||
extern void free OF((voidpf ptr));
|
extern void free(voidpf ptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* get errno and strerror definition */
|
/* get errno and strerror definition */
|
||||||
|
@ -138,10 +137,10 @@
|
||||||
|
|
||||||
/* provide prototypes for these when building zlib without LFS */
|
/* provide prototypes for these when building zlib without LFS */
|
||||||
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
|
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
|
||||||
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
|
||||||
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
|
ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
|
||||||
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
|
ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
|
||||||
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
|
ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* default memLevel */
|
/* default memLevel */
|
||||||
|
@ -203,9 +202,9 @@ typedef struct {
|
||||||
typedef gz_state FAR *gz_statep;
|
typedef gz_state FAR *gz_statep;
|
||||||
|
|
||||||
/* shared functions */
|
/* shared functions */
|
||||||
void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
|
void ZLIB_INTERNAL gz_error(gz_statep, int, const char *);
|
||||||
#if defined UNDER_CE
|
#if defined UNDER_CE
|
||||||
char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
|
char ZLIB_INTERNAL *gz_strwinerror(DWORD error);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
|
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
|
||||||
|
@ -214,6 +213,6 @@ char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
|
||||||
#ifdef INT_MAX
|
#ifdef INT_MAX
|
||||||
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
|
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
|
||||||
#else
|
#else
|
||||||
unsigned ZLIB_INTERNAL gz_intmax OF((void));
|
unsigned ZLIB_INTERNAL gz_intmax(void);
|
||||||
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
|
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
|
||||||
#endif
|
#endif
|
||||||
|
|
101
thirdparty/zlib/gzlib.c
vendored
101
thirdparty/zlib/gzlib.c
vendored
|
@ -15,10 +15,6 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Local functions */
|
|
||||||
local void gz_reset OF((gz_statep));
|
|
||||||
local gzFile gz_open OF((const void *, int, const char *));
|
|
||||||
|
|
||||||
#if defined UNDER_CE
|
#if defined UNDER_CE
|
||||||
|
|
||||||
/* Map the Windows error number in ERROR to a locale-dependent error message
|
/* Map the Windows error number in ERROR to a locale-dependent error message
|
||||||
|
@ -30,9 +26,7 @@ local gzFile gz_open OF((const void *, int, const char *));
|
||||||
|
|
||||||
The gz_strwinerror function does not change the current setting of
|
The gz_strwinerror function does not change the current setting of
|
||||||
GetLastError. */
|
GetLastError. */
|
||||||
char ZLIB_INTERNAL *gz_strwinerror(error)
|
char ZLIB_INTERNAL *gz_strwinerror(DWORD error) {
|
||||||
DWORD error;
|
|
||||||
{
|
|
||||||
static char buf[1024];
|
static char buf[1024];
|
||||||
|
|
||||||
wchar_t *msgbuf;
|
wchar_t *msgbuf;
|
||||||
|
@ -72,9 +66,7 @@ char ZLIB_INTERNAL *gz_strwinerror(error)
|
||||||
#endif /* UNDER_CE */
|
#endif /* UNDER_CE */
|
||||||
|
|
||||||
/* Reset gzip file state */
|
/* Reset gzip file state */
|
||||||
local void gz_reset(state)
|
local void gz_reset(gz_statep state) {
|
||||||
gz_statep state;
|
|
||||||
{
|
|
||||||
state->x.have = 0; /* no output data available */
|
state->x.have = 0; /* no output data available */
|
||||||
if (state->mode == GZ_READ) { /* for reading ... */
|
if (state->mode == GZ_READ) { /* for reading ... */
|
||||||
state->eof = 0; /* not at end of file */
|
state->eof = 0; /* not at end of file */
|
||||||
|
@ -90,11 +82,7 @@ local void gz_reset(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open a gzip file either by name or file descriptor. */
|
/* Open a gzip file either by name or file descriptor. */
|
||||||
local gzFile gz_open(path, fd, mode)
|
local gzFile gz_open(const void *path, int fd, const char *mode) {
|
||||||
const void *path;
|
|
||||||
int fd;
|
|
||||||
const char *mode;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
z_size_t len;
|
z_size_t len;
|
||||||
int oflag;
|
int oflag;
|
||||||
|
@ -269,26 +257,17 @@ local gzFile gz_open(path, fd, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
gzFile ZEXPORT gzopen(path, mode)
|
gzFile ZEXPORT gzopen(const char *path, const char *mode) {
|
||||||
const char *path;
|
|
||||||
const char *mode;
|
|
||||||
{
|
|
||||||
return gz_open(path, -1, mode);
|
return gz_open(path, -1, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
gzFile ZEXPORT gzopen64(path, mode)
|
gzFile ZEXPORT gzopen64(const char *path, const char *mode) {
|
||||||
const char *path;
|
|
||||||
const char *mode;
|
|
||||||
{
|
|
||||||
return gz_open(path, -1, mode);
|
return gz_open(path, -1, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
gzFile ZEXPORT gzdopen(fd, mode)
|
gzFile ZEXPORT gzdopen(int fd, const char *mode) {
|
||||||
int fd;
|
|
||||||
const char *mode;
|
|
||||||
{
|
|
||||||
char *path; /* identifier for error messages */
|
char *path; /* identifier for error messages */
|
||||||
gzFile gz;
|
gzFile gz;
|
||||||
|
|
||||||
|
@ -306,19 +285,13 @@ gzFile ZEXPORT gzdopen(fd, mode)
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
#ifdef WIDECHAR
|
#ifdef WIDECHAR
|
||||||
gzFile ZEXPORT gzopen_w(path, mode)
|
gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) {
|
||||||
const wchar_t *path;
|
|
||||||
const char *mode;
|
|
||||||
{
|
|
||||||
return gz_open(path, -2, mode);
|
return gz_open(path, -2, mode);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzbuffer(file, size)
|
int ZEXPORT gzbuffer(gzFile file, unsigned size) {
|
||||||
gzFile file;
|
|
||||||
unsigned size;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
/* get internal structure and check integrity */
|
||||||
|
@ -335,16 +308,14 @@ int ZEXPORT gzbuffer(file, size)
|
||||||
/* check and set requested size */
|
/* check and set requested size */
|
||||||
if ((size << 1) < size)
|
if ((size << 1) < size)
|
||||||
return -1; /* need to be able to double it */
|
return -1; /* need to be able to double it */
|
||||||
if (size < 2)
|
if (size < 8)
|
||||||
size = 2; /* need two bytes to check magic header */
|
size = 8; /* needed to behave well with flushing */
|
||||||
state->want = size;
|
state->want = size;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzrewind(file)
|
int ZEXPORT gzrewind(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure */
|
/* get internal structure */
|
||||||
|
@ -365,11 +336,7 @@ int ZEXPORT gzrewind(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_off64_t ZEXPORT gzseek64(file, offset, whence)
|
z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
|
||||||
gzFile file;
|
|
||||||
z_off64_t offset;
|
|
||||||
int whence;
|
|
||||||
{
|
|
||||||
unsigned n;
|
unsigned n;
|
||||||
z_off64_t ret;
|
z_off64_t ret;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
@ -442,11 +409,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_off_t ZEXPORT gzseek(file, offset, whence)
|
z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) {
|
||||||
gzFile file;
|
|
||||||
z_off_t offset;
|
|
||||||
int whence;
|
|
||||||
{
|
|
||||||
z_off64_t ret;
|
z_off64_t ret;
|
||||||
|
|
||||||
ret = gzseek64(file, (z_off64_t)offset, whence);
|
ret = gzseek64(file, (z_off64_t)offset, whence);
|
||||||
|
@ -454,9 +417,7 @@ z_off_t ZEXPORT gzseek(file, offset, whence)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_off64_t ZEXPORT gztell64(file)
|
z_off64_t ZEXPORT gztell64(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
/* get internal structure and check integrity */
|
||||||
|
@ -471,9 +432,7 @@ z_off64_t ZEXPORT gztell64(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_off_t ZEXPORT gztell(file)
|
z_off_t ZEXPORT gztell(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
z_off64_t ret;
|
z_off64_t ret;
|
||||||
|
|
||||||
ret = gztell64(file);
|
ret = gztell64(file);
|
||||||
|
@ -481,9 +440,7 @@ z_off_t ZEXPORT gztell(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_off64_t ZEXPORT gzoffset64(file)
|
z_off64_t ZEXPORT gzoffset64(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
z_off64_t offset;
|
z_off64_t offset;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
@ -504,9 +461,7 @@ z_off64_t ZEXPORT gzoffset64(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_off_t ZEXPORT gzoffset(file)
|
z_off_t ZEXPORT gzoffset(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
z_off64_t ret;
|
z_off64_t ret;
|
||||||
|
|
||||||
ret = gzoffset64(file);
|
ret = gzoffset64(file);
|
||||||
|
@ -514,9 +469,7 @@ z_off_t ZEXPORT gzoffset(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzeof(file)
|
int ZEXPORT gzeof(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
/* get internal structure and check integrity */
|
||||||
|
@ -531,10 +484,7 @@ int ZEXPORT gzeof(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
const char * ZEXPORT gzerror(file, errnum)
|
const char * ZEXPORT gzerror(gzFile file, int *errnum) {
|
||||||
gzFile file;
|
|
||||||
int *errnum;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
/* get internal structure and check integrity */
|
||||||
|
@ -552,9 +502,7 @@ const char * ZEXPORT gzerror(file, errnum)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
void ZEXPORT gzclearerr(file)
|
void ZEXPORT gzclearerr(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
/* get internal structure and check integrity */
|
||||||
|
@ -578,11 +526,7 @@ void ZEXPORT gzclearerr(file)
|
||||||
memory). Simply save the error message as a static string. If there is an
|
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
|
allocation failure constructing the error message, then convert the error to
|
||||||
out of memory. */
|
out of memory. */
|
||||||
void ZLIB_INTERNAL gz_error(state, err, msg)
|
void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) {
|
||||||
gz_statep state;
|
|
||||||
int err;
|
|
||||||
const char *msg;
|
|
||||||
{
|
|
||||||
/* free previously allocated message and clear */
|
/* free previously allocated message and clear */
|
||||||
if (state->msg != NULL) {
|
if (state->msg != NULL) {
|
||||||
if (state->err != Z_MEM_ERROR)
|
if (state->err != Z_MEM_ERROR)
|
||||||
|
@ -624,8 +568,7 @@ void ZLIB_INTERNAL gz_error(state, err, msg)
|
||||||
available) -- we need to do this to cover cases where 2's complement 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,
|
used, since C standard permits 1's complement and sign-bit representations,
|
||||||
otherwise we could just use ((unsigned)-1) >> 1 */
|
otherwise we could just use ((unsigned)-1) >> 1 */
|
||||||
unsigned ZLIB_INTERNAL gz_intmax()
|
unsigned ZLIB_INTERNAL gz_intmax(void) {
|
||||||
{
|
|
||||||
unsigned p, q;
|
unsigned p, q;
|
||||||
|
|
||||||
p = 1;
|
p = 1;
|
||||||
|
|
88
thirdparty/zlib/gzread.c
vendored
88
thirdparty/zlib/gzread.c
vendored
|
@ -5,25 +5,12 @@
|
||||||
|
|
||||||
#include "gzguts.h"
|
#include "gzguts.h"
|
||||||
|
|
||||||
/* Local functions */
|
|
||||||
local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
|
|
||||||
local int gz_avail OF((gz_statep));
|
|
||||||
local int gz_look OF((gz_statep));
|
|
||||||
local int gz_decomp OF((gz_statep));
|
|
||||||
local int gz_fetch OF((gz_statep));
|
|
||||||
local int gz_skip OF((gz_statep, z_off64_t));
|
|
||||||
local z_size_t gz_read OF((gz_statep, voidp, z_size_t));
|
|
||||||
|
|
||||||
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
|
/* 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.
|
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
|
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. */
|
read the number of bytes requested, depending on the type of descriptor. */
|
||||||
local int gz_load(state, buf, len, have)
|
local int gz_load(gz_statep state, unsigned char *buf, unsigned len,
|
||||||
gz_statep state;
|
unsigned *have) {
|
||||||
unsigned char *buf;
|
|
||||||
unsigned len;
|
|
||||||
unsigned *have;
|
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
unsigned get, max = ((unsigned)-1 >> 2) + 1;
|
unsigned get, max = ((unsigned)-1 >> 2) + 1;
|
||||||
|
|
||||||
|
@ -53,9 +40,7 @@ local int gz_load(state, buf, len, have)
|
||||||
If strm->avail_in != 0, then the current data is moved to the beginning of
|
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
|
the input buffer, and then the remainder of the buffer is loaded with the
|
||||||
available data from the input file. */
|
available data from the input file. */
|
||||||
local int gz_avail(state)
|
local int gz_avail(gz_statep state) {
|
||||||
gz_statep state;
|
|
||||||
{
|
|
||||||
unsigned got;
|
unsigned got;
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
|
||||||
|
@ -88,9 +73,7 @@ local int gz_avail(state)
|
||||||
case, all further file reads will be directly to either the output buffer or
|
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.
|
a user buffer. If decompressing, the inflate state will be initialized.
|
||||||
gz_look() will return 0 on success or -1 on failure. */
|
gz_look() will return 0 on success or -1 on failure. */
|
||||||
local int gz_look(state)
|
local int gz_look(gz_statep state) {
|
||||||
gz_statep state;
|
|
||||||
{
|
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
|
||||||
/* allocate read buffers and inflate memory */
|
/* allocate read buffers and inflate memory */
|
||||||
|
@ -170,9 +153,7 @@ local int gz_look(state)
|
||||||
data. If the gzip stream completes, state->how is reset to LOOK to look for
|
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
|
the next gzip stream or raw data, once state->x.have is depleted. Returns 0
|
||||||
on success, -1 on failure. */
|
on success, -1 on failure. */
|
||||||
local int gz_decomp(state)
|
local int gz_decomp(gz_statep state) {
|
||||||
gz_statep state;
|
|
||||||
{
|
|
||||||
int ret = Z_OK;
|
int ret = Z_OK;
|
||||||
unsigned had;
|
unsigned had;
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
@ -224,9 +205,7 @@ local int gz_decomp(state)
|
||||||
looked for to determine whether to copy or decompress. Returns -1 on error,
|
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
|
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. */
|
end of the input file has been reached and all data has been processed. */
|
||||||
local int gz_fetch(state)
|
local int gz_fetch(gz_statep state) {
|
||||||
gz_statep state;
|
|
||||||
{
|
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -254,10 +233,7 @@ local int gz_fetch(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
|
/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
|
||||||
local int gz_skip(state, len)
|
local int gz_skip(gz_statep state, z_off64_t len) {
|
||||||
gz_statep state;
|
|
||||||
z_off64_t len;
|
|
||||||
{
|
|
||||||
unsigned n;
|
unsigned n;
|
||||||
|
|
||||||
/* skip over len bytes or reach end-of-file, whichever comes first */
|
/* skip over len bytes or reach end-of-file, whichever comes first */
|
||||||
|
@ -289,11 +265,7 @@ local int gz_skip(state, len)
|
||||||
input. Return the number of bytes read. If zero is returned, either 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
|
end of file was reached, or there was an error. state->err must be
|
||||||
consulted in that case to determine which. */
|
consulted in that case to determine which. */
|
||||||
local z_size_t gz_read(state, buf, len)
|
local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
|
||||||
gz_statep state;
|
|
||||||
voidp buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
z_size_t got;
|
z_size_t got;
|
||||||
unsigned n;
|
unsigned n;
|
||||||
|
|
||||||
|
@ -370,11 +342,7 @@ local z_size_t gz_read(state, buf, len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzread(file, buf, len)
|
int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) {
|
||||||
gzFile file;
|
|
||||||
voidp buf;
|
|
||||||
unsigned len;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure */
|
/* get internal structure */
|
||||||
|
@ -406,12 +374,7 @@ int ZEXPORT gzread(file, buf, len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_size_t ZEXPORT gzfread(buf, size, nitems, file)
|
z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) {
|
||||||
voidp buf;
|
|
||||||
z_size_t size;
|
|
||||||
z_size_t nitems;
|
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
z_size_t len;
|
z_size_t len;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
@ -442,9 +405,7 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file)
|
||||||
#else
|
#else
|
||||||
# undef gzgetc
|
# undef gzgetc
|
||||||
#endif
|
#endif
|
||||||
int ZEXPORT gzgetc(file)
|
int ZEXPORT gzgetc(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
unsigned char buf[1];
|
unsigned char buf[1];
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
@ -469,17 +430,12 @@ int ZEXPORT gzgetc(file)
|
||||||
return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
|
return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT gzgetc_(file)
|
int ZEXPORT gzgetc_(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
return gzgetc(file);
|
return gzgetc(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzungetc(c, file)
|
int ZEXPORT gzungetc(int c, gzFile file) {
|
||||||
int c;
|
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure */
|
/* get internal structure */
|
||||||
|
@ -487,6 +443,10 @@ int ZEXPORT gzungetc(c, file)
|
||||||
return -1;
|
return -1;
|
||||||
state = (gz_statep)file;
|
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 */
|
/* check that we're reading and that there's no (serious) error */
|
||||||
if (state->mode != GZ_READ ||
|
if (state->mode != GZ_READ ||
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
||||||
|
@ -536,11 +496,7 @@ int ZEXPORT gzungetc(c, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
char * ZEXPORT gzgets(file, buf, len)
|
char * ZEXPORT gzgets(gzFile file, char *buf, int len) {
|
||||||
gzFile file;
|
|
||||||
char *buf;
|
|
||||||
int len;
|
|
||||||
{
|
|
||||||
unsigned left, n;
|
unsigned left, n;
|
||||||
char *str;
|
char *str;
|
||||||
unsigned char *eol;
|
unsigned char *eol;
|
||||||
|
@ -600,9 +556,7 @@ char * ZEXPORT gzgets(file, buf, len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzdirect(file)
|
int ZEXPORT gzdirect(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure */
|
/* get internal structure */
|
||||||
|
@ -620,9 +574,7 @@ int ZEXPORT gzdirect(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzclose_r(file)
|
int ZEXPORT gzclose_r(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
int ret, err;
|
int ret, err;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
|
84
thirdparty/zlib/gzwrite.c
vendored
84
thirdparty/zlib/gzwrite.c
vendored
|
@ -5,18 +5,10 @@
|
||||||
|
|
||||||
#include "gzguts.h"
|
#include "gzguts.h"
|
||||||
|
|
||||||
/* Local functions */
|
|
||||||
local int gz_init OF((gz_statep));
|
|
||||||
local int gz_comp OF((gz_statep, int));
|
|
||||||
local int gz_zero OF((gz_statep, z_off64_t));
|
|
||||||
local z_size_t gz_write OF((gz_statep, voidpc, z_size_t));
|
|
||||||
|
|
||||||
/* Initialize state for writing a gzip file. Mark initialization by setting
|
/* 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
|
state->size to non-zero. Return -1 on a memory allocation failure, or 0 on
|
||||||
success. */
|
success. */
|
||||||
local int gz_init(state)
|
local int gz_init(gz_statep state) {
|
||||||
gz_statep state;
|
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
|
||||||
|
@ -70,10 +62,7 @@ local int gz_init(state)
|
||||||
deflate() flush value. If flush is Z_FINISH, then the deflate() state is
|
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
|
reset to start a new gzip stream. If gz->direct is true, then simply write
|
||||||
to the output file without compressing, and ignore flush. */
|
to the output file without compressing, and ignore flush. */
|
||||||
local int gz_comp(state, flush)
|
local int gz_comp(gz_statep state, int flush) {
|
||||||
gz_statep state;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
int ret, writ;
|
int ret, writ;
|
||||||
unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
|
unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
@ -151,10 +140,7 @@ local int gz_comp(state, flush)
|
||||||
|
|
||||||
/* Compress len zeros to output. Return -1 on a write error or memory
|
/* Compress len zeros to output. Return -1 on a write error or memory
|
||||||
allocation failure by gz_comp(), or 0 on success. */
|
allocation failure by gz_comp(), or 0 on success. */
|
||||||
local int gz_zero(state, len)
|
local int gz_zero(gz_statep state, z_off64_t len) {
|
||||||
gz_statep state;
|
|
||||||
z_off64_t len;
|
|
||||||
{
|
|
||||||
int first;
|
int first;
|
||||||
unsigned n;
|
unsigned n;
|
||||||
z_streamp strm = &(state->strm);
|
z_streamp strm = &(state->strm);
|
||||||
|
@ -184,11 +170,7 @@ local int gz_zero(state, len)
|
||||||
|
|
||||||
/* Write len bytes from buf to file. Return the number of bytes written. If
|
/* 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. */
|
the returned value is less than len, then there was an error. */
|
||||||
local z_size_t gz_write(state, buf, len)
|
local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
|
||||||
gz_statep state;
|
|
||||||
voidpc buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
z_size_t put = len;
|
z_size_t put = len;
|
||||||
|
|
||||||
/* if len is zero, avoid unnecessary operations */
|
/* if len is zero, avoid unnecessary operations */
|
||||||
|
@ -252,11 +234,7 @@ local z_size_t gz_write(state, buf, len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzwrite(file, buf, len)
|
int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) {
|
||||||
gzFile file;
|
|
||||||
voidpc buf;
|
|
||||||
unsigned len;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure */
|
/* get internal structure */
|
||||||
|
@ -280,12 +258,8 @@ int ZEXPORT gzwrite(file, buf, len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
z_size_t ZEXPORT gzfwrite(buf, size, nitems, file)
|
z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems,
|
||||||
voidpc buf;
|
gzFile file) {
|
||||||
z_size_t size;
|
|
||||||
z_size_t nitems;
|
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
z_size_t len;
|
z_size_t len;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
@ -310,10 +284,7 @@ z_size_t ZEXPORT gzfwrite(buf, size, nitems, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzputc(file, c)
|
int ZEXPORT gzputc(gzFile file, int c) {
|
||||||
gzFile file;
|
|
||||||
int c;
|
|
||||||
{
|
|
||||||
unsigned have;
|
unsigned have;
|
||||||
unsigned char buf[1];
|
unsigned char buf[1];
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
@ -358,10 +329,7 @@ int ZEXPORT gzputc(file, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzputs(file, s)
|
int ZEXPORT gzputs(gzFile file, const char *s) {
|
||||||
gzFile file;
|
|
||||||
const char *s;
|
|
||||||
{
|
|
||||||
z_size_t len, put;
|
z_size_t len, put;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
@ -388,8 +356,7 @@ int ZEXPORT gzputs(file, s)
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
|
int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
|
||||||
{
|
|
||||||
int len;
|
int len;
|
||||||
unsigned left;
|
unsigned left;
|
||||||
char *next;
|
char *next;
|
||||||
|
@ -460,8 +427,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
|
int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) {
|
||||||
{
|
|
||||||
va_list va;
|
va_list va;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -474,13 +440,10 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
|
||||||
#else /* !STDC && !Z_HAVE_STDARG_H */
|
#else /* !STDC && !Z_HAVE_STDARG_H */
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
|
||||||
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
|
int a4, int a5, int a6, int a7, int a8, int a9, int a10,
|
||||||
gzFile file;
|
int a11, int a12, int a13, int a14, int a15, int a16,
|
||||||
const char *format;
|
int a17, int a18, int a19, int a20) {
|
||||||
int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
|
||||||
a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
|
|
||||||
{
|
|
||||||
unsigned len, left;
|
unsigned len, left;
|
||||||
char *next;
|
char *next;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
@ -562,10 +525,7 @@ int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzflush(file, flush)
|
int ZEXPORT gzflush(gzFile file, int flush) {
|
||||||
gzFile file;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
/* get internal structure */
|
/* get internal structure */
|
||||||
|
@ -594,11 +554,7 @@ int ZEXPORT gzflush(file, flush)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzsetparams(file, level, strategy)
|
int ZEXPORT gzsetparams(gzFile file, int level, int strategy) {
|
||||||
gzFile file;
|
|
||||||
int level;
|
|
||||||
int strategy;
|
|
||||||
{
|
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
z_streamp strm;
|
z_streamp strm;
|
||||||
|
|
||||||
|
@ -609,7 +565,7 @@ int ZEXPORT gzsetparams(file, level, strategy)
|
||||||
strm = &(state->strm);
|
strm = &(state->strm);
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
/* check that we're writing and that there's no error */
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct)
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
|
|
||||||
/* if no change is requested, then do nothing */
|
/* if no change is requested, then do nothing */
|
||||||
|
@ -636,9 +592,7 @@ int ZEXPORT gzsetparams(file, level, strategy)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
/* -- see zlib.h -- */
|
||||||
int ZEXPORT gzclose_w(file)
|
int ZEXPORT gzclose_w(gzFile file) {
|
||||||
gzFile file;
|
|
||||||
{
|
|
||||||
int ret = Z_OK;
|
int ret = Z_OK;
|
||||||
gz_statep state;
|
gz_statep state;
|
||||||
|
|
||||||
|
|
644
thirdparty/zlib/infback.c
vendored
644
thirdparty/zlib/infback.c
vendored
|
@ -1,644 +0,0 @@
|
||||||
/* infback.c -- inflate using a call-back interface
|
|
||||||
* Copyright (C) 1995-2022 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This code is largely copied from inflate.c. Normally either infback.o or
|
|
||||||
inflate.o would be linked into an application--not both. The interface
|
|
||||||
with inffast.c is retained so that optimized assembler-coded versions of
|
|
||||||
inflate_fast() can be used with either inflate.c or infback.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
#include "inftrees.h"
|
|
||||||
#include "inflate.h"
|
|
||||||
#include "inffast.h"
|
|
||||||
|
|
||||||
/* function prototypes */
|
|
||||||
local void fixedtables OF((struct inflate_state FAR *state));
|
|
||||||
|
|
||||||
/*
|
|
||||||
strm provides memory allocation functions in zalloc and zfree, or
|
|
||||||
Z_NULL to use the library memory allocation functions.
|
|
||||||
|
|
||||||
windowBits is in the range 8..15, and window is a user-supplied
|
|
||||||
window and output buffer that is 2**windowBits bytes.
|
|
||||||
*/
|
|
||||||
int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
|
|
||||||
z_streamp strm;
|
|
||||||
int windowBits;
|
|
||||||
unsigned char FAR *window;
|
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
|
|
||||||
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
|
|
||||||
stream_size != (int)(sizeof(z_stream)))
|
|
||||||
return Z_VERSION_ERROR;
|
|
||||||
if (strm == Z_NULL || window == Z_NULL ||
|
|
||||||
windowBits < 8 || windowBits > 15)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
strm->msg = Z_NULL; /* in case we return an error */
|
|
||||||
if (strm->zalloc == (alloc_func)0) {
|
|
||||||
#ifdef Z_SOLO
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
#else
|
|
||||||
strm->zalloc = zcalloc;
|
|
||||||
strm->opaque = (voidpf)0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (strm->zfree == (free_func)0)
|
|
||||||
#ifdef Z_SOLO
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
#else
|
|
||||||
strm->zfree = zcfree;
|
|
||||||
#endif
|
|
||||||
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
|
|
||||||
sizeof(struct inflate_state));
|
|
||||||
if (state == Z_NULL) return Z_MEM_ERROR;
|
|
||||||
Tracev((stderr, "inflate: allocated\n"));
|
|
||||||
strm->state = (struct internal_state FAR *)state;
|
|
||||||
state->dmax = 32768U;
|
|
||||||
state->wbits = (uInt)windowBits;
|
|
||||||
state->wsize = 1U << windowBits;
|
|
||||||
state->window = window;
|
|
||||||
state->wnext = 0;
|
|
||||||
state->whave = 0;
|
|
||||||
state->sane = 1;
|
|
||||||
return Z_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Return state with length and distance decoding tables and index sizes set to
|
|
||||||
fixed code decoding. Normally this returns fixed tables from inffixed.h.
|
|
||||||
If BUILDFIXED is defined, then instead this routine builds the tables the
|
|
||||||
first time it's called, and returns those tables the first time and
|
|
||||||
thereafter. This reduces the size of the code by about 2K bytes, in
|
|
||||||
exchange for a little execution time. However, BUILDFIXED should not be
|
|
||||||
used for threaded applications, since the rewriting of the tables and virgin
|
|
||||||
may not be thread-safe.
|
|
||||||
*/
|
|
||||||
local void fixedtables(state)
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
{
|
|
||||||
#ifdef BUILDFIXED
|
|
||||||
static int virgin = 1;
|
|
||||||
static code *lenfix, *distfix;
|
|
||||||
static code fixed[544];
|
|
||||||
|
|
||||||
/* build fixed huffman tables if first call (may not be thread safe) */
|
|
||||||
if (virgin) {
|
|
||||||
unsigned sym, bits;
|
|
||||||
static code *next;
|
|
||||||
|
|
||||||
/* literal/length table */
|
|
||||||
sym = 0;
|
|
||||||
while (sym < 144) state->lens[sym++] = 8;
|
|
||||||
while (sym < 256) state->lens[sym++] = 9;
|
|
||||||
while (sym < 280) state->lens[sym++] = 7;
|
|
||||||
while (sym < 288) state->lens[sym++] = 8;
|
|
||||||
next = fixed;
|
|
||||||
lenfix = next;
|
|
||||||
bits = 9;
|
|
||||||
inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
|
|
||||||
|
|
||||||
/* distance table */
|
|
||||||
sym = 0;
|
|
||||||
while (sym < 32) state->lens[sym++] = 5;
|
|
||||||
distfix = next;
|
|
||||||
bits = 5;
|
|
||||||
inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
|
|
||||||
|
|
||||||
/* do this just once */
|
|
||||||
virgin = 0;
|
|
||||||
}
|
|
||||||
#else /* !BUILDFIXED */
|
|
||||||
# include "inffixed.h"
|
|
||||||
#endif /* BUILDFIXED */
|
|
||||||
state->lencode = lenfix;
|
|
||||||
state->lenbits = 9;
|
|
||||||
state->distcode = distfix;
|
|
||||||
state->distbits = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Macros for inflateBack(): */
|
|
||||||
|
|
||||||
/* Load returned state from inflate_fast() */
|
|
||||||
#define LOAD() \
|
|
||||||
do { \
|
|
||||||
put = strm->next_out; \
|
|
||||||
left = strm->avail_out; \
|
|
||||||
next = strm->next_in; \
|
|
||||||
have = strm->avail_in; \
|
|
||||||
hold = state->hold; \
|
|
||||||
bits = state->bits; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Set state from registers for inflate_fast() */
|
|
||||||
#define RESTORE() \
|
|
||||||
do { \
|
|
||||||
strm->next_out = put; \
|
|
||||||
strm->avail_out = left; \
|
|
||||||
strm->next_in = next; \
|
|
||||||
strm->avail_in = have; \
|
|
||||||
state->hold = hold; \
|
|
||||||
state->bits = bits; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Clear the input bit accumulator */
|
|
||||||
#define INITBITS() \
|
|
||||||
do { \
|
|
||||||
hold = 0; \
|
|
||||||
bits = 0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Assure that some input is available. If input is requested, but denied,
|
|
||||||
then return a Z_BUF_ERROR from inflateBack(). */
|
|
||||||
#define PULL() \
|
|
||||||
do { \
|
|
||||||
if (have == 0) { \
|
|
||||||
have = in(in_desc, &next); \
|
|
||||||
if (have == 0) { \
|
|
||||||
next = Z_NULL; \
|
|
||||||
ret = Z_BUF_ERROR; \
|
|
||||||
goto inf_leave; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Get a byte of input into the bit accumulator, or return from inflateBack()
|
|
||||||
with an error if there is no input available. */
|
|
||||||
#define PULLBYTE() \
|
|
||||||
do { \
|
|
||||||
PULL(); \
|
|
||||||
have--; \
|
|
||||||
hold += (unsigned long)(*next++) << bits; \
|
|
||||||
bits += 8; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Assure that there are at least n bits in the bit accumulator. If there is
|
|
||||||
not enough available input to do that, then return from inflateBack() with
|
|
||||||
an error. */
|
|
||||||
#define NEEDBITS(n) \
|
|
||||||
do { \
|
|
||||||
while (bits < (unsigned)(n)) \
|
|
||||||
PULLBYTE(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Return the low n bits of the bit accumulator (n < 16) */
|
|
||||||
#define BITS(n) \
|
|
||||||
((unsigned)hold & ((1U << (n)) - 1))
|
|
||||||
|
|
||||||
/* Remove n bits from the bit accumulator */
|
|
||||||
#define DROPBITS(n) \
|
|
||||||
do { \
|
|
||||||
hold >>= (n); \
|
|
||||||
bits -= (unsigned)(n); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Remove zero to seven bits as needed to go to a byte boundary */
|
|
||||||
#define BYTEBITS() \
|
|
||||||
do { \
|
|
||||||
hold >>= bits & 7; \
|
|
||||||
bits -= bits & 7; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Assure that some output space is available, by writing out the window
|
|
||||||
if it's full. If the write fails, return from inflateBack() with a
|
|
||||||
Z_BUF_ERROR. */
|
|
||||||
#define ROOM() \
|
|
||||||
do { \
|
|
||||||
if (left == 0) { \
|
|
||||||
put = state->window; \
|
|
||||||
left = state->wsize; \
|
|
||||||
state->whave = left; \
|
|
||||||
if (out(out_desc, put, left)) { \
|
|
||||||
ret = Z_BUF_ERROR; \
|
|
||||||
goto inf_leave; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
strm provides the memory allocation functions and window buffer on input,
|
|
||||||
and provides information on the unused input on return. For Z_DATA_ERROR
|
|
||||||
returns, strm will also provide an error message.
|
|
||||||
|
|
||||||
in() and out() are the call-back input and output functions. When
|
|
||||||
inflateBack() needs more input, it calls in(). When inflateBack() has
|
|
||||||
filled the window with output, or when it completes with data in the
|
|
||||||
window, it calls out() to write out the data. The application must not
|
|
||||||
change the provided input until in() is called again or inflateBack()
|
|
||||||
returns. The application must not change the window/output buffer until
|
|
||||||
inflateBack() returns.
|
|
||||||
|
|
||||||
in() and out() are called with a descriptor parameter provided in the
|
|
||||||
inflateBack() call. This parameter can be a structure that provides the
|
|
||||||
information required to do the read or write, as well as accumulated
|
|
||||||
information on the input and output such as totals and check values.
|
|
||||||
|
|
||||||
in() should return zero on failure. out() should return non-zero on
|
|
||||||
failure. If either in() or out() fails, than inflateBack() returns a
|
|
||||||
Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
|
|
||||||
was in() or out() that caused in the error. Otherwise, inflateBack()
|
|
||||||
returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
|
|
||||||
error, or Z_MEM_ERROR if it could not allocate memory for the state.
|
|
||||||
inflateBack() can also return Z_STREAM_ERROR if the input parameters
|
|
||||||
are not correct, i.e. strm is Z_NULL or the state was not initialized.
|
|
||||||
*/
|
|
||||||
int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
|
|
||||||
z_streamp strm;
|
|
||||||
in_func in;
|
|
||||||
void FAR *in_desc;
|
|
||||||
out_func out;
|
|
||||||
void FAR *out_desc;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
z_const unsigned char FAR *next; /* next input */
|
|
||||||
unsigned char FAR *put; /* next output */
|
|
||||||
unsigned have, left; /* available input and output */
|
|
||||||
unsigned long hold; /* bit buffer */
|
|
||||||
unsigned bits; /* bits in bit buffer */
|
|
||||||
unsigned copy; /* number of stored or match bytes to copy */
|
|
||||||
unsigned char FAR *from; /* where to copy match bytes from */
|
|
||||||
code here; /* current decoding table entry */
|
|
||||||
code last; /* parent table entry */
|
|
||||||
unsigned len; /* length to copy for repeats, bits to drop */
|
|
||||||
int ret; /* return code */
|
|
||||||
static const unsigned short order[19] = /* permutation of code lengths */
|
|
||||||
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
|
|
||||||
|
|
||||||
/* Check that the strm exists and that the state was initialized */
|
|
||||||
if (strm == Z_NULL || strm->state == Z_NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (struct inflate_state FAR *)strm->state;
|
|
||||||
|
|
||||||
/* Reset the state */
|
|
||||||
strm->msg = Z_NULL;
|
|
||||||
state->mode = TYPE;
|
|
||||||
state->last = 0;
|
|
||||||
state->whave = 0;
|
|
||||||
next = strm->next_in;
|
|
||||||
have = next != Z_NULL ? strm->avail_in : 0;
|
|
||||||
hold = 0;
|
|
||||||
bits = 0;
|
|
||||||
put = state->window;
|
|
||||||
left = state->wsize;
|
|
||||||
|
|
||||||
/* Inflate until end of block marked as last */
|
|
||||||
for (;;)
|
|
||||||
switch (state->mode) {
|
|
||||||
case TYPE:
|
|
||||||
/* determine and dispatch block type */
|
|
||||||
if (state->last) {
|
|
||||||
BYTEBITS();
|
|
||||||
state->mode = DONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
NEEDBITS(3);
|
|
||||||
state->last = BITS(1);
|
|
||||||
DROPBITS(1);
|
|
||||||
switch (BITS(2)) {
|
|
||||||
case 0: /* stored block */
|
|
||||||
Tracev((stderr, "inflate: stored block%s\n",
|
|
||||||
state->last ? " (last)" : ""));
|
|
||||||
state->mode = STORED;
|
|
||||||
break;
|
|
||||||
case 1: /* fixed block */
|
|
||||||
fixedtables(state);
|
|
||||||
Tracev((stderr, "inflate: fixed codes block%s\n",
|
|
||||||
state->last ? " (last)" : ""));
|
|
||||||
state->mode = LEN; /* decode codes */
|
|
||||||
break;
|
|
||||||
case 2: /* dynamic block */
|
|
||||||
Tracev((stderr, "inflate: dynamic codes block%s\n",
|
|
||||||
state->last ? " (last)" : ""));
|
|
||||||
state->mode = TABLE;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
strm->msg = (char *)"invalid block type";
|
|
||||||
state->mode = BAD;
|
|
||||||
}
|
|
||||||
DROPBITS(2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STORED:
|
|
||||||
/* get and verify stored block length */
|
|
||||||
BYTEBITS(); /* go to byte boundary */
|
|
||||||
NEEDBITS(32);
|
|
||||||
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
|
|
||||||
strm->msg = (char *)"invalid stored block lengths";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
state->length = (unsigned)hold & 0xffff;
|
|
||||||
Tracev((stderr, "inflate: stored length %u\n",
|
|
||||||
state->length));
|
|
||||||
INITBITS();
|
|
||||||
|
|
||||||
/* copy stored block from input to output */
|
|
||||||
while (state->length != 0) {
|
|
||||||
copy = state->length;
|
|
||||||
PULL();
|
|
||||||
ROOM();
|
|
||||||
if (copy > have) copy = have;
|
|
||||||
if (copy > left) copy = left;
|
|
||||||
zmemcpy(put, next, copy);
|
|
||||||
have -= copy;
|
|
||||||
next += copy;
|
|
||||||
left -= copy;
|
|
||||||
put += copy;
|
|
||||||
state->length -= copy;
|
|
||||||
}
|
|
||||||
Tracev((stderr, "inflate: stored end\n"));
|
|
||||||
state->mode = TYPE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TABLE:
|
|
||||||
/* get dynamic table entries descriptor */
|
|
||||||
NEEDBITS(14);
|
|
||||||
state->nlen = BITS(5) + 257;
|
|
||||||
DROPBITS(5);
|
|
||||||
state->ndist = BITS(5) + 1;
|
|
||||||
DROPBITS(5);
|
|
||||||
state->ncode = BITS(4) + 4;
|
|
||||||
DROPBITS(4);
|
|
||||||
#ifndef PKZIP_BUG_WORKAROUND
|
|
||||||
if (state->nlen > 286 || state->ndist > 30) {
|
|
||||||
strm->msg = (char *)"too many length or distance symbols";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
Tracev((stderr, "inflate: table sizes ok\n"));
|
|
||||||
|
|
||||||
/* get code length code lengths (not a typo) */
|
|
||||||
state->have = 0;
|
|
||||||
while (state->have < state->ncode) {
|
|
||||||
NEEDBITS(3);
|
|
||||||
state->lens[order[state->have++]] = (unsigned short)BITS(3);
|
|
||||||
DROPBITS(3);
|
|
||||||
}
|
|
||||||
while (state->have < 19)
|
|
||||||
state->lens[order[state->have++]] = 0;
|
|
||||||
state->next = state->codes;
|
|
||||||
state->lencode = (code const FAR *)(state->next);
|
|
||||||
state->lenbits = 7;
|
|
||||||
ret = inflate_table(CODES, state->lens, 19, &(state->next),
|
|
||||||
&(state->lenbits), state->work);
|
|
||||||
if (ret) {
|
|
||||||
strm->msg = (char *)"invalid code lengths set";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Tracev((stderr, "inflate: code lengths ok\n"));
|
|
||||||
|
|
||||||
/* get length and distance code code lengths */
|
|
||||||
state->have = 0;
|
|
||||||
while (state->have < state->nlen + state->ndist) {
|
|
||||||
for (;;) {
|
|
||||||
here = state->lencode[BITS(state->lenbits)];
|
|
||||||
if ((unsigned)(here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
if (here.val < 16) {
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
state->lens[state->have++] = here.val;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (here.val == 16) {
|
|
||||||
NEEDBITS(here.bits + 2);
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
if (state->have == 0) {
|
|
||||||
strm->msg = (char *)"invalid bit length repeat";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
len = (unsigned)(state->lens[state->have - 1]);
|
|
||||||
copy = 3 + BITS(2);
|
|
||||||
DROPBITS(2);
|
|
||||||
}
|
|
||||||
else if (here.val == 17) {
|
|
||||||
NEEDBITS(here.bits + 3);
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
len = 0;
|
|
||||||
copy = 3 + BITS(3);
|
|
||||||
DROPBITS(3);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
NEEDBITS(here.bits + 7);
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
len = 0;
|
|
||||||
copy = 11 + BITS(7);
|
|
||||||
DROPBITS(7);
|
|
||||||
}
|
|
||||||
if (state->have + copy > state->nlen + state->ndist) {
|
|
||||||
strm->msg = (char *)"invalid bit length repeat";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (copy--)
|
|
||||||
state->lens[state->have++] = (unsigned short)len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* handle error breaks in while */
|
|
||||||
if (state->mode == BAD) break;
|
|
||||||
|
|
||||||
/* check for end-of-block code (better have one) */
|
|
||||||
if (state->lens[256] == 0) {
|
|
||||||
strm->msg = (char *)"invalid code -- missing end-of-block";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* build code tables -- note: do not change the lenbits or distbits
|
|
||||||
values here (9 and 6) without reading the comments in inftrees.h
|
|
||||||
concerning the ENOUGH constants, which depend on those values */
|
|
||||||
state->next = state->codes;
|
|
||||||
state->lencode = (code const FAR *)(state->next);
|
|
||||||
state->lenbits = 9;
|
|
||||||
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
|
|
||||||
&(state->lenbits), state->work);
|
|
||||||
if (ret) {
|
|
||||||
strm->msg = (char *)"invalid literal/lengths set";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
state->distcode = (code const FAR *)(state->next);
|
|
||||||
state->distbits = 6;
|
|
||||||
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
|
|
||||||
&(state->next), &(state->distbits), state->work);
|
|
||||||
if (ret) {
|
|
||||||
strm->msg = (char *)"invalid distances set";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Tracev((stderr, "inflate: codes ok\n"));
|
|
||||||
state->mode = LEN;
|
|
||||||
/* fallthrough */
|
|
||||||
|
|
||||||
case LEN:
|
|
||||||
/* use inflate_fast() if we have enough input and output */
|
|
||||||
if (have >= 6 && left >= 258) {
|
|
||||||
RESTORE();
|
|
||||||
if (state->whave < state->wsize)
|
|
||||||
state->whave = state->wsize - left;
|
|
||||||
inflate_fast(strm, state->wsize);
|
|
||||||
LOAD();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get a literal, length, or end-of-block code */
|
|
||||||
for (;;) {
|
|
||||||
here = state->lencode[BITS(state->lenbits)];
|
|
||||||
if ((unsigned)(here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
if (here.op && (here.op & 0xf0) == 0) {
|
|
||||||
last = here;
|
|
||||||
for (;;) {
|
|
||||||
here = state->lencode[last.val +
|
|
||||||
(BITS(last.bits + last.op) >> last.bits)];
|
|
||||||
if ((unsigned)(last.bits + here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
DROPBITS(last.bits);
|
|
||||||
}
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
state->length = (unsigned)here.val;
|
|
||||||
|
|
||||||
/* process literal */
|
|
||||||
if (here.op == 0) {
|
|
||||||
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
|
||||||
"inflate: literal '%c'\n" :
|
|
||||||
"inflate: literal 0x%02x\n", here.val));
|
|
||||||
ROOM();
|
|
||||||
*put++ = (unsigned char)(state->length);
|
|
||||||
left--;
|
|
||||||
state->mode = LEN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process end of block */
|
|
||||||
if (here.op & 32) {
|
|
||||||
Tracevv((stderr, "inflate: end of block\n"));
|
|
||||||
state->mode = TYPE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* invalid code */
|
|
||||||
if (here.op & 64) {
|
|
||||||
strm->msg = (char *)"invalid literal/length code";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* length code -- get extra bits, if any */
|
|
||||||
state->extra = (unsigned)(here.op) & 15;
|
|
||||||
if (state->extra != 0) {
|
|
||||||
NEEDBITS(state->extra);
|
|
||||||
state->length += BITS(state->extra);
|
|
||||||
DROPBITS(state->extra);
|
|
||||||
}
|
|
||||||
Tracevv((stderr, "inflate: length %u\n", state->length));
|
|
||||||
|
|
||||||
/* get distance code */
|
|
||||||
for (;;) {
|
|
||||||
here = state->distcode[BITS(state->distbits)];
|
|
||||||
if ((unsigned)(here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
if ((here.op & 0xf0) == 0) {
|
|
||||||
last = here;
|
|
||||||
for (;;) {
|
|
||||||
here = state->distcode[last.val +
|
|
||||||
(BITS(last.bits + last.op) >> last.bits)];
|
|
||||||
if ((unsigned)(last.bits + here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
DROPBITS(last.bits);
|
|
||||||
}
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
if (here.op & 64) {
|
|
||||||
strm->msg = (char *)"invalid distance code";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
state->offset = (unsigned)here.val;
|
|
||||||
|
|
||||||
/* get distance extra bits, if any */
|
|
||||||
state->extra = (unsigned)(here.op) & 15;
|
|
||||||
if (state->extra != 0) {
|
|
||||||
NEEDBITS(state->extra);
|
|
||||||
state->offset += BITS(state->extra);
|
|
||||||
DROPBITS(state->extra);
|
|
||||||
}
|
|
||||||
if (state->offset > state->wsize - (state->whave < state->wsize ?
|
|
||||||
left : 0)) {
|
|
||||||
strm->msg = (char *)"invalid distance too far back";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Tracevv((stderr, "inflate: distance %u\n", state->offset));
|
|
||||||
|
|
||||||
/* copy match from window to output */
|
|
||||||
do {
|
|
||||||
ROOM();
|
|
||||||
copy = state->wsize - state->offset;
|
|
||||||
if (copy < left) {
|
|
||||||
from = put + copy;
|
|
||||||
copy = left - copy;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
from = put - state->offset;
|
|
||||||
copy = left;
|
|
||||||
}
|
|
||||||
if (copy > state->length) copy = state->length;
|
|
||||||
state->length -= copy;
|
|
||||||
left -= copy;
|
|
||||||
do {
|
|
||||||
*put++ = *from++;
|
|
||||||
} while (--copy);
|
|
||||||
} while (state->length != 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DONE:
|
|
||||||
/* inflate stream terminated properly */
|
|
||||||
ret = Z_STREAM_END;
|
|
||||||
goto inf_leave;
|
|
||||||
|
|
||||||
case BAD:
|
|
||||||
ret = Z_DATA_ERROR;
|
|
||||||
goto inf_leave;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* can't happen, but makes compilers happy */
|
|
||||||
ret = Z_STREAM_ERROR;
|
|
||||||
goto inf_leave;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write leftover output and return unused input */
|
|
||||||
inf_leave:
|
|
||||||
if (left < state->wsize) {
|
|
||||||
if (out(out_desc, state->window, state->wsize - left) &&
|
|
||||||
ret == Z_STREAM_END)
|
|
||||||
ret = Z_BUF_ERROR;
|
|
||||||
}
|
|
||||||
strm->next_in = next;
|
|
||||||
strm->avail_in = have;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ZEXPORT inflateBackEnd(strm)
|
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
ZFREE(strm, strm->state);
|
|
||||||
strm->state = Z_NULL;
|
|
||||||
Tracev((stderr, "inflate: end\n"));
|
|
||||||
return Z_OK;
|
|
||||||
}
|
|
5
thirdparty/zlib/inffast.c
vendored
5
thirdparty/zlib/inffast.c
vendored
|
@ -47,10 +47,7 @@
|
||||||
requires strm->avail_out >= 258 for each loop to avoid checking for
|
requires strm->avail_out >= 258 for each loop to avoid checking for
|
||||||
output space.
|
output space.
|
||||||
*/
|
*/
|
||||||
void ZLIB_INTERNAL inflate_fast(strm, start)
|
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
|
||||||
z_streamp strm;
|
|
||||||
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
z_const unsigned char FAR *in; /* local strm->next_in */
|
z_const unsigned char FAR *in; /* local strm->next_in */
|
||||||
z_const unsigned char FAR *last; /* have enough input while in < last */
|
z_const unsigned char FAR *last; /* have enough input while in < last */
|
||||||
|
|
2
thirdparty/zlib/inffast.h
vendored
2
thirdparty/zlib/inffast.h
vendored
|
@ -8,4 +8,4 @@
|
||||||
subject to change. Applications should only use zlib.h.
|
subject to change. Applications should only use zlib.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
|
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start);
|
||||||
|
|
129
thirdparty/zlib/inflate.c
vendored
129
thirdparty/zlib/inflate.c
vendored
|
@ -91,20 +91,7 @@
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* function prototypes */
|
local int inflateStateCheck(z_streamp strm) {
|
||||||
local int inflateStateCheck OF((z_streamp strm));
|
|
||||||
local void fixedtables OF((struct inflate_state FAR *state));
|
|
||||||
local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
|
|
||||||
unsigned copy));
|
|
||||||
#ifdef BUILDFIXED
|
|
||||||
void makefixed OF((void));
|
|
||||||
#endif
|
|
||||||
local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
|
|
||||||
unsigned len));
|
|
||||||
|
|
||||||
local int inflateStateCheck(strm)
|
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
if (strm == Z_NULL ||
|
if (strm == Z_NULL ||
|
||||||
strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
|
strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
|
||||||
|
@ -116,9 +103,7 @@ z_streamp strm;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateResetKeep(strm)
|
int ZEXPORT inflateResetKeep(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -142,9 +127,7 @@ z_streamp strm;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateReset(strm)
|
int ZEXPORT inflateReset(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -155,10 +138,7 @@ z_streamp strm;
|
||||||
return inflateResetKeep(strm);
|
return inflateResetKeep(strm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateReset2(strm, windowBits)
|
int ZEXPORT inflateReset2(z_streamp strm, int windowBits) {
|
||||||
z_streamp strm;
|
|
||||||
int windowBits;
|
|
||||||
{
|
|
||||||
int wrap;
|
int wrap;
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
|
@ -195,12 +175,8 @@ int windowBits;
|
||||||
return inflateReset(strm);
|
return inflateReset(strm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
|
int ZEXPORT inflateInit2_(z_streamp strm, int windowBits,
|
||||||
z_streamp strm;
|
const char *version, int stream_size) {
|
||||||
int windowBits;
|
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
|
@ -239,22 +215,17 @@ int stream_size;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateInit_(strm, version, stream_size)
|
int ZEXPORT inflateInit_(z_streamp strm, const char *version,
|
||||||
z_streamp strm;
|
int stream_size) {
|
||||||
const char *version;
|
|
||||||
int stream_size;
|
|
||||||
{
|
|
||||||
return inflateInit2_(strm, DEF_WBITS, version, stream_size);
|
return inflateInit2_(strm, DEF_WBITS, version, stream_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflatePrime(strm, bits, value)
|
int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) {
|
||||||
z_streamp strm;
|
|
||||||
int bits;
|
|
||||||
int value;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
if (bits == 0)
|
||||||
|
return Z_OK;
|
||||||
state = (struct inflate_state FAR *)strm->state;
|
state = (struct inflate_state FAR *)strm->state;
|
||||||
if (bits < 0) {
|
if (bits < 0) {
|
||||||
state->hold = 0;
|
state->hold = 0;
|
||||||
|
@ -278,9 +249,7 @@ int value;
|
||||||
used for threaded applications, since the rewriting of the tables and virgin
|
used for threaded applications, since the rewriting of the tables and virgin
|
||||||
may not be thread-safe.
|
may not be thread-safe.
|
||||||
*/
|
*/
|
||||||
local void fixedtables(state)
|
local void fixedtables(struct inflate_state FAR *state) {
|
||||||
struct inflate_state FAR *state;
|
|
||||||
{
|
|
||||||
#ifdef BUILDFIXED
|
#ifdef BUILDFIXED
|
||||||
static int virgin = 1;
|
static int virgin = 1;
|
||||||
static code *lenfix, *distfix;
|
static code *lenfix, *distfix;
|
||||||
|
@ -342,7 +311,7 @@ struct inflate_state FAR *state;
|
||||||
|
|
||||||
a.out > inffixed.h
|
a.out > inffixed.h
|
||||||
*/
|
*/
|
||||||
void makefixed()
|
void makefixed(void)
|
||||||
{
|
{
|
||||||
unsigned low, size;
|
unsigned low, size;
|
||||||
struct inflate_state state;
|
struct inflate_state state;
|
||||||
|
@ -396,11 +365,7 @@ void makefixed()
|
||||||
output will fall in the output data, making match copies simpler and faster.
|
output will fall in the output data, making match copies simpler and faster.
|
||||||
The advantage may be dependent on the size of the processor's data caches.
|
The advantage may be dependent on the size of the processor's data caches.
|
||||||
*/
|
*/
|
||||||
local int updatewindow(strm, end, copy)
|
local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) {
|
||||||
z_streamp strm;
|
|
||||||
const Bytef *end;
|
|
||||||
unsigned copy;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
unsigned dist;
|
unsigned dist;
|
||||||
|
|
||||||
|
@ -622,10 +587,7 @@ unsigned copy;
|
||||||
will return Z_BUF_ERROR if it has not reached the end of the stream.
|
will return Z_BUF_ERROR if it has not reached the end of the stream.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ZEXPORT inflate(strm, flush)
|
int ZEXPORT inflate(z_streamp strm, int flush) {
|
||||||
z_streamp strm;
|
|
||||||
int flush;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
z_const unsigned char FAR *next; /* next input */
|
z_const unsigned char FAR *next; /* next input */
|
||||||
unsigned char FAR *put; /* next output */
|
unsigned char FAR *put; /* next output */
|
||||||
|
@ -1301,9 +1263,7 @@ int flush;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateEnd(strm)
|
int ZEXPORT inflateEnd(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
if (inflateStateCheck(strm))
|
if (inflateStateCheck(strm))
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
|
@ -1315,11 +1275,8 @@ z_streamp strm;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
|
int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary,
|
||||||
z_streamp strm;
|
uInt *dictLength) {
|
||||||
Bytef *dictionary;
|
|
||||||
uInt *dictLength;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
/* check state */
|
/* check state */
|
||||||
|
@ -1338,11 +1295,8 @@ uInt *dictLength;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
|
int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary,
|
||||||
z_streamp strm;
|
uInt dictLength) {
|
||||||
const Bytef *dictionary;
|
|
||||||
uInt dictLength;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
unsigned long dictid;
|
unsigned long dictid;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1373,10 +1327,7 @@ uInt dictLength;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateGetHeader(strm, head)
|
int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) {
|
||||||
z_streamp strm;
|
|
||||||
gz_headerp head;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
/* check state */
|
/* check state */
|
||||||
|
@ -1401,11 +1352,8 @@ gz_headerp head;
|
||||||
called again with more data and the *have state. *have is initialized to
|
called again with more data and the *have state. *have is initialized to
|
||||||
zero for the first call.
|
zero for the first call.
|
||||||
*/
|
*/
|
||||||
local unsigned syncsearch(have, buf, len)
|
local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf,
|
||||||
unsigned FAR *have;
|
unsigned len) {
|
||||||
const unsigned char FAR *buf;
|
|
||||||
unsigned len;
|
|
||||||
{
|
|
||||||
unsigned got;
|
unsigned got;
|
||||||
unsigned next;
|
unsigned next;
|
||||||
|
|
||||||
|
@ -1424,9 +1372,7 @@ unsigned len;
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateSync(strm)
|
int ZEXPORT inflateSync(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
unsigned len; /* number of bytes to look at or looked at */
|
unsigned len; /* number of bytes to look at or looked at */
|
||||||
int flags; /* temporary to save header status */
|
int flags; /* temporary to save header status */
|
||||||
unsigned long in, out; /* temporary to save total_in and total_out */
|
unsigned long in, out; /* temporary to save total_in and total_out */
|
||||||
|
@ -1482,9 +1428,7 @@ z_streamp strm;
|
||||||
block. When decompressing, PPP checks that at the end of input packet,
|
block. When decompressing, PPP checks that at the end of input packet,
|
||||||
inflate is waiting for these length bytes.
|
inflate is waiting for these length bytes.
|
||||||
*/
|
*/
|
||||||
int ZEXPORT inflateSyncPoint(strm)
|
int ZEXPORT inflateSyncPoint(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -1492,10 +1436,7 @@ z_streamp strm;
|
||||||
return state->mode == STORED && state->bits == 0;
|
return state->mode == STORED && state->bits == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateCopy(dest, source)
|
int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) {
|
||||||
z_streamp dest;
|
|
||||||
z_streamp source;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
struct inflate_state FAR *copy;
|
struct inflate_state FAR *copy;
|
||||||
unsigned char FAR *window;
|
unsigned char FAR *window;
|
||||||
|
@ -1539,10 +1480,7 @@ z_streamp source;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateUndermine(strm, subvert)
|
int ZEXPORT inflateUndermine(z_streamp strm, int subvert) {
|
||||||
z_streamp strm;
|
|
||||||
int subvert;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -1557,10 +1495,7 @@ int subvert;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT inflateValidate(strm, check)
|
int ZEXPORT inflateValidate(z_streamp strm, int check) {
|
||||||
z_streamp strm;
|
|
||||||
int check;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
|
||||||
|
@ -1572,9 +1507,7 @@ int check;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
long ZEXPORT inflateMark(strm)
|
long ZEXPORT inflateMark(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
if (inflateStateCheck(strm))
|
if (inflateStateCheck(strm))
|
||||||
|
@ -1585,9 +1518,7 @@ z_streamp strm;
|
||||||
(state->mode == MATCH ? state->was - state->length : 0));
|
(state->mode == MATCH ? state->was - state->length : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long ZEXPORT inflateCodesUsed(strm)
|
unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) {
|
||||||
z_streamp strm;
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
struct inflate_state FAR *state;
|
||||||
if (inflateStateCheck(strm)) return (unsigned long)-1;
|
if (inflateStateCheck(strm)) return (unsigned long)-1;
|
||||||
state = (struct inflate_state FAR *)strm->state;
|
state = (struct inflate_state FAR *)strm->state;
|
||||||
|
|
17
thirdparty/zlib/inftrees.c
vendored
17
thirdparty/zlib/inftrees.c
vendored
|
@ -1,5 +1,5 @@
|
||||||
/* inftrees.c -- generate Huffman trees for efficient decoding
|
/* inftrees.c -- generate Huffman trees for efficient decoding
|
||||||
* Copyright (C) 1995-2022 Mark Adler
|
* Copyright (C) 1995-2023 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
||||||
#define MAXBITS 15
|
#define MAXBITS 15
|
||||||
|
|
||||||
const char inflate_copyright[] =
|
const char inflate_copyright[] =
|
||||||
" inflate 1.2.13 Copyright 1995-2022 Mark Adler ";
|
" inflate 1.3 Copyright 1995-2023 Mark Adler ";
|
||||||
/*
|
/*
|
||||||
If you use the zlib library in a product, an acknowledgment is welcome
|
If you use the zlib library in a product, an acknowledgment is welcome
|
||||||
in the documentation of your product. If for some reason you cannot
|
in the documentation of your product. If for some reason you cannot
|
||||||
|
@ -29,14 +29,9 @@ const char inflate_copyright[] =
|
||||||
table index bits. It will differ if the request is greater than the
|
table index bits. It will differ if the request is greater than the
|
||||||
longest code or if it is less than the shortest code.
|
longest code or if it is less than the shortest code.
|
||||||
*/
|
*/
|
||||||
int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)
|
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
|
||||||
codetype type;
|
unsigned codes, code FAR * FAR *table,
|
||||||
unsigned short FAR *lens;
|
unsigned FAR *bits, unsigned short FAR *work) {
|
||||||
unsigned codes;
|
|
||||||
code FAR * FAR *table;
|
|
||||||
unsigned FAR *bits;
|
|
||||||
unsigned short FAR *work;
|
|
||||||
{
|
|
||||||
unsigned len; /* a code's length in bits */
|
unsigned len; /* a code's length in bits */
|
||||||
unsigned sym; /* index of code symbols */
|
unsigned sym; /* index of code symbols */
|
||||||
unsigned min, max; /* minimum and maximum code lengths */
|
unsigned min, max; /* minimum and maximum code lengths */
|
||||||
|
@ -62,7 +57,7 @@ unsigned short FAR *work;
|
||||||
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
||||||
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
||||||
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
||||||
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65};
|
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 198, 203};
|
||||||
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
|
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
|
||||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
||||||
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
||||||
|
|
6
thirdparty/zlib/inftrees.h
vendored
6
thirdparty/zlib/inftrees.h
vendored
|
@ -57,6 +57,6 @@ typedef enum {
|
||||||
DISTS
|
DISTS
|
||||||
} codetype;
|
} codetype;
|
||||||
|
|
||||||
int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
|
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
|
||||||
unsigned codes, code FAR * FAR *table,
|
unsigned codes, code FAR * FAR *table,
|
||||||
unsigned FAR *bits, unsigned short FAR *work));
|
unsigned FAR *bits, unsigned short FAR *work);
|
||||||
|
|
526
thirdparty/zlib/trees.c
vendored
526
thirdparty/zlib/trees.c
vendored
|
@ -122,39 +122,116 @@ struct static_tree_desc_s {
|
||||||
int max_length; /* max bit length for the codes */
|
int max_length; /* max bit length for the codes */
|
||||||
};
|
};
|
||||||
|
|
||||||
local const static_tree_desc static_l_desc =
|
#ifdef NO_INIT_GLOBAL_POINTERS
|
||||||
|
# define TCONST
|
||||||
|
#else
|
||||||
|
# define TCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
local TCONST static_tree_desc static_l_desc =
|
||||||
{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
|
{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
|
||||||
|
|
||||||
local const static_tree_desc static_d_desc =
|
local TCONST static_tree_desc static_d_desc =
|
||||||
{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
|
{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
|
||||||
|
|
||||||
local const static_tree_desc static_bl_desc =
|
local TCONST static_tree_desc static_bl_desc =
|
||||||
{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
|
{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Local (static) routines in this file.
|
* Output a short LSB first on the stream.
|
||||||
|
* IN assertion: there is enough room in pendingBuf.
|
||||||
*/
|
*/
|
||||||
|
#define put_short(s, w) { \
|
||||||
|
put_byte(s, (uch)((w) & 0xff)); \
|
||||||
|
put_byte(s, (uch)((ush)(w) >> 8)); \
|
||||||
|
}
|
||||||
|
|
||||||
local void tr_static_init OF((void));
|
/* ===========================================================================
|
||||||
local void init_block OF((deflate_state *s));
|
* Reverse the first len bits of a code, using straightforward code (a faster
|
||||||
local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
|
* method would use a table)
|
||||||
local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
|
* IN assertion: 1 <= len <= 15
|
||||||
local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
|
*/
|
||||||
local void build_tree OF((deflate_state *s, tree_desc *desc));
|
local unsigned bi_reverse(unsigned code, int len) {
|
||||||
local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
|
register unsigned res = 0;
|
||||||
local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
|
do {
|
||||||
local int build_bl_tree OF((deflate_state *s));
|
res |= code & 1;
|
||||||
local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
|
code >>= 1, res <<= 1;
|
||||||
int blcodes));
|
} while (--len > 0);
|
||||||
local void compress_block OF((deflate_state *s, const ct_data *ltree,
|
return res >> 1;
|
||||||
const ct_data *dtree));
|
}
|
||||||
local int detect_data_type OF((deflate_state *s));
|
|
||||||
local unsigned bi_reverse OF((unsigned code, int len));
|
/* ===========================================================================
|
||||||
local void bi_windup OF((deflate_state *s));
|
* Flush the bit buffer, keeping at most 7 bits in it.
|
||||||
local void bi_flush OF((deflate_state *s));
|
*/
|
||||||
|
local void bi_flush(deflate_state *s) {
|
||||||
|
if (s->bi_valid == 16) {
|
||||||
|
put_short(s, s->bi_buf);
|
||||||
|
s->bi_buf = 0;
|
||||||
|
s->bi_valid = 0;
|
||||||
|
} else if (s->bi_valid >= 8) {
|
||||||
|
put_byte(s, (Byte)s->bi_buf);
|
||||||
|
s->bi_buf >>= 8;
|
||||||
|
s->bi_valid -= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Flush the bit buffer and align the output on a byte boundary
|
||||||
|
*/
|
||||||
|
local void bi_windup(deflate_state *s) {
|
||||||
|
if (s->bi_valid > 8) {
|
||||||
|
put_short(s, s->bi_buf);
|
||||||
|
} else if (s->bi_valid > 0) {
|
||||||
|
put_byte(s, (Byte)s->bi_buf);
|
||||||
|
}
|
||||||
|
s->bi_buf = 0;
|
||||||
|
s->bi_valid = 0;
|
||||||
|
#ifdef ZLIB_DEBUG
|
||||||
|
s->bits_sent = (s->bits_sent + 7) & ~7;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Generate the codes for a given tree and bit counts (which need not be
|
||||||
|
* optimal).
|
||||||
|
* IN assertion: the array bl_count contains the bit length statistics for
|
||||||
|
* the given tree and the field len is set for all tree elements.
|
||||||
|
* OUT assertion: the field code is set for all tree elements of non
|
||||||
|
* zero code length.
|
||||||
|
*/
|
||||||
|
local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) {
|
||||||
|
ush next_code[MAX_BITS+1]; /* next code value for each bit length */
|
||||||
|
unsigned code = 0; /* running code value */
|
||||||
|
int bits; /* bit index */
|
||||||
|
int n; /* code index */
|
||||||
|
|
||||||
|
/* The distribution counts are first used to generate the code values
|
||||||
|
* without bit reversal.
|
||||||
|
*/
|
||||||
|
for (bits = 1; bits <= MAX_BITS; bits++) {
|
||||||
|
code = (code + bl_count[bits - 1]) << 1;
|
||||||
|
next_code[bits] = (ush)code;
|
||||||
|
}
|
||||||
|
/* Check that the bit counts in bl_count are consistent. The last code
|
||||||
|
* must be all ones.
|
||||||
|
*/
|
||||||
|
Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
|
||||||
|
"inconsistent bit counts");
|
||||||
|
Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
|
||||||
|
|
||||||
|
for (n = 0; n <= max_code; n++) {
|
||||||
|
int len = tree[n].Len;
|
||||||
|
if (len == 0) continue;
|
||||||
|
/* Now reverse the bits */
|
||||||
|
tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
|
||||||
|
|
||||||
|
Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
|
||||||
|
n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef GEN_TREES_H
|
#ifdef GEN_TREES_H
|
||||||
local void gen_trees_header OF((void));
|
local void gen_trees_header(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ZLIB_DEBUG
|
#ifndef ZLIB_DEBUG
|
||||||
|
@ -167,27 +244,12 @@ local void gen_trees_header OF((void));
|
||||||
send_bits(s, tree[c].Code, tree[c].Len); }
|
send_bits(s, tree[c].Code, tree[c].Len); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Output a short LSB first on the stream.
|
|
||||||
* IN assertion: there is enough room in pendingBuf.
|
|
||||||
*/
|
|
||||||
#define put_short(s, w) { \
|
|
||||||
put_byte(s, (uch)((w) & 0xff)); \
|
|
||||||
put_byte(s, (uch)((ush)(w) >> 8)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Send a value on a given number of bits.
|
* Send a value on a given number of bits.
|
||||||
* IN assertion: length <= 16 and value fits in length bits.
|
* IN assertion: length <= 16 and value fits in length bits.
|
||||||
*/
|
*/
|
||||||
#ifdef ZLIB_DEBUG
|
#ifdef ZLIB_DEBUG
|
||||||
local void send_bits OF((deflate_state *s, int value, int length));
|
local void send_bits(deflate_state *s, int value, int length) {
|
||||||
|
|
||||||
local void send_bits(s, value, length)
|
|
||||||
deflate_state *s;
|
|
||||||
int value; /* value to send */
|
|
||||||
int length; /* number of bits */
|
|
||||||
{
|
|
||||||
Tracevv((stderr," l %2d v %4x ", length, value));
|
Tracevv((stderr," l %2d v %4x ", length, value));
|
||||||
Assert(length > 0 && length <= 15, "invalid length");
|
Assert(length > 0 && length <= 15, "invalid length");
|
||||||
s->bits_sent += (ulg)length;
|
s->bits_sent += (ulg)length;
|
||||||
|
@ -229,8 +291,7 @@ local void send_bits(s, value, length)
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Initialize the various 'constant' tables.
|
* Initialize the various 'constant' tables.
|
||||||
*/
|
*/
|
||||||
local void tr_static_init()
|
local void tr_static_init(void) {
|
||||||
{
|
|
||||||
#if defined(GEN_TREES_H) || !defined(STDC)
|
#if defined(GEN_TREES_H) || !defined(STDC)
|
||||||
static int static_init_done = 0;
|
static int static_init_done = 0;
|
||||||
int n; /* iterates over tree elements */
|
int n; /* iterates over tree elements */
|
||||||
|
@ -323,8 +384,7 @@ local void tr_static_init()
|
||||||
((i) == (last)? "\n};\n\n" : \
|
((i) == (last)? "\n};\n\n" : \
|
||||||
((i) % (width) == (width) - 1 ? ",\n" : ", "))
|
((i) % (width) == (width) - 1 ? ",\n" : ", "))
|
||||||
|
|
||||||
void gen_trees_header()
|
void gen_trees_header(void) {
|
||||||
{
|
|
||||||
FILE *header = fopen("trees.h", "w");
|
FILE *header = fopen("trees.h", "w");
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -373,12 +433,26 @@ void gen_trees_header()
|
||||||
}
|
}
|
||||||
#endif /* GEN_TREES_H */
|
#endif /* GEN_TREES_H */
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Initialize a new block.
|
||||||
|
*/
|
||||||
|
local void init_block(deflate_state *s) {
|
||||||
|
int n; /* iterates over tree elements */
|
||||||
|
|
||||||
|
/* Initialize the trees. */
|
||||||
|
for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
|
||||||
|
for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
|
||||||
|
for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
|
||||||
|
|
||||||
|
s->dyn_ltree[END_BLOCK].Freq = 1;
|
||||||
|
s->opt_len = s->static_len = 0L;
|
||||||
|
s->sym_next = s->matches = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Initialize the tree data structures for a new zlib stream.
|
* Initialize the tree data structures for a new zlib stream.
|
||||||
*/
|
*/
|
||||||
void ZLIB_INTERNAL _tr_init(s)
|
void ZLIB_INTERNAL _tr_init(deflate_state *s) {
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
tr_static_init();
|
tr_static_init();
|
||||||
|
|
||||||
s->l_desc.dyn_tree = s->dyn_ltree;
|
s->l_desc.dyn_tree = s->dyn_ltree;
|
||||||
|
@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s)
|
||||||
init_block(s);
|
init_block(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Initialize a new block.
|
|
||||||
*/
|
|
||||||
local void init_block(s)
|
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
int n; /* iterates over tree elements */
|
|
||||||
|
|
||||||
/* Initialize the trees. */
|
|
||||||
for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
|
|
||||||
for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
|
|
||||||
for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
|
|
||||||
|
|
||||||
s->dyn_ltree[END_BLOCK].Freq = 1;
|
|
||||||
s->opt_len = s->static_len = 0L;
|
|
||||||
s->sym_next = s->matches = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SMALLEST 1
|
#define SMALLEST 1
|
||||||
/* Index within the heap array of least frequent node in the Huffman tree */
|
/* Index within the heap array of least frequent node in the Huffman tree */
|
||||||
|
|
||||||
|
@ -448,11 +504,7 @@ local void init_block(s)
|
||||||
* when the heap property is re-established (each father smaller than its
|
* when the heap property is re-established (each father smaller than its
|
||||||
* two sons).
|
* two sons).
|
||||||
*/
|
*/
|
||||||
local void pqdownheap(s, tree, k)
|
local void pqdownheap(deflate_state *s, ct_data *tree, int k) {
|
||||||
deflate_state *s;
|
|
||||||
ct_data *tree; /* the tree to restore */
|
|
||||||
int k; /* node to move down */
|
|
||||||
{
|
|
||||||
int v = s->heap[k];
|
int v = s->heap[k];
|
||||||
int j = k << 1; /* left son of k */
|
int j = k << 1; /* left son of k */
|
||||||
while (j <= s->heap_len) {
|
while (j <= s->heap_len) {
|
||||||
|
@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k)
|
||||||
* The length opt_len is updated; static_len is also updated if stree is
|
* The length opt_len is updated; static_len is also updated if stree is
|
||||||
* not null.
|
* not null.
|
||||||
*/
|
*/
|
||||||
local void gen_bitlen(s, desc)
|
local void gen_bitlen(deflate_state *s, tree_desc *desc) {
|
||||||
deflate_state *s;
|
|
||||||
tree_desc *desc; /* the tree descriptor */
|
|
||||||
{
|
|
||||||
ct_data *tree = desc->dyn_tree;
|
ct_data *tree = desc->dyn_tree;
|
||||||
int max_code = desc->max_code;
|
int max_code = desc->max_code;
|
||||||
const ct_data *stree = desc->stat_desc->static_tree;
|
const ct_data *stree = desc->stat_desc->static_tree;
|
||||||
|
@ -561,48 +610,9 @@ local void gen_bitlen(s, desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
#ifdef DUMP_BL_TREE
|
||||||
* Generate the codes for a given tree and bit counts (which need not be
|
# include <stdio.h>
|
||||||
* optimal).
|
#endif
|
||||||
* IN assertion: the array bl_count contains the bit length statistics for
|
|
||||||
* the given tree and the field len is set for all tree elements.
|
|
||||||
* OUT assertion: the field code is set for all tree elements of non
|
|
||||||
* zero code length.
|
|
||||||
*/
|
|
||||||
local void gen_codes(tree, max_code, bl_count)
|
|
||||||
ct_data *tree; /* the tree to decorate */
|
|
||||||
int max_code; /* largest code with non zero frequency */
|
|
||||||
ushf *bl_count; /* number of codes at each bit length */
|
|
||||||
{
|
|
||||||
ush next_code[MAX_BITS+1]; /* next code value for each bit length */
|
|
||||||
unsigned code = 0; /* running code value */
|
|
||||||
int bits; /* bit index */
|
|
||||||
int n; /* code index */
|
|
||||||
|
|
||||||
/* The distribution counts are first used to generate the code values
|
|
||||||
* without bit reversal.
|
|
||||||
*/
|
|
||||||
for (bits = 1; bits <= MAX_BITS; bits++) {
|
|
||||||
code = (code + bl_count[bits - 1]) << 1;
|
|
||||||
next_code[bits] = (ush)code;
|
|
||||||
}
|
|
||||||
/* Check that the bit counts in bl_count are consistent. The last code
|
|
||||||
* must be all ones.
|
|
||||||
*/
|
|
||||||
Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
|
|
||||||
"inconsistent bit counts");
|
|
||||||
Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
|
|
||||||
|
|
||||||
for (n = 0; n <= max_code; n++) {
|
|
||||||
int len = tree[n].Len;
|
|
||||||
if (len == 0) continue;
|
|
||||||
/* Now reverse the bits */
|
|
||||||
tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
|
|
||||||
|
|
||||||
Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
|
|
||||||
n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Construct one Huffman tree and assigns the code bit strings and lengths.
|
* Construct one Huffman tree and assigns the code bit strings and lengths.
|
||||||
|
@ -612,10 +622,7 @@ local void gen_codes(tree, max_code, bl_count)
|
||||||
* and corresponding code. The length opt_len is updated; static_len is
|
* and corresponding code. The length opt_len is updated; static_len is
|
||||||
* also updated if stree is not null. The field max_code is set.
|
* also updated if stree is not null. The field max_code is set.
|
||||||
*/
|
*/
|
||||||
local void build_tree(s, desc)
|
local void build_tree(deflate_state *s, tree_desc *desc) {
|
||||||
deflate_state *s;
|
|
||||||
tree_desc *desc; /* the tree descriptor */
|
|
||||||
{
|
|
||||||
ct_data *tree = desc->dyn_tree;
|
ct_data *tree = desc->dyn_tree;
|
||||||
const ct_data *stree = desc->stat_desc->static_tree;
|
const ct_data *stree = desc->stat_desc->static_tree;
|
||||||
int elems = desc->stat_desc->elems;
|
int elems = desc->stat_desc->elems;
|
||||||
|
@ -700,11 +707,7 @@ local void build_tree(s, desc)
|
||||||
* Scan a literal or distance tree to determine the frequencies of the codes
|
* Scan a literal or distance tree to determine the frequencies of the codes
|
||||||
* in the bit length tree.
|
* in the bit length tree.
|
||||||
*/
|
*/
|
||||||
local void scan_tree(s, tree, max_code)
|
local void scan_tree(deflate_state *s, ct_data *tree, int max_code) {
|
||||||
deflate_state *s;
|
|
||||||
ct_data *tree; /* the tree to be scanned */
|
|
||||||
int max_code; /* and its largest code of non zero frequency */
|
|
||||||
{
|
|
||||||
int n; /* iterates over all tree elements */
|
int n; /* iterates over all tree elements */
|
||||||
int prevlen = -1; /* last emitted length */
|
int prevlen = -1; /* last emitted length */
|
||||||
int curlen; /* length of current code */
|
int curlen; /* length of current code */
|
||||||
|
@ -745,11 +748,7 @@ local void scan_tree(s, tree, max_code)
|
||||||
* Send a literal or distance tree in compressed form, using the codes in
|
* Send a literal or distance tree in compressed form, using the codes in
|
||||||
* bl_tree.
|
* bl_tree.
|
||||||
*/
|
*/
|
||||||
local void send_tree(s, tree, max_code)
|
local void send_tree(deflate_state *s, ct_data *tree, int max_code) {
|
||||||
deflate_state *s;
|
|
||||||
ct_data *tree; /* the tree to be scanned */
|
|
||||||
int max_code; /* and its largest code of non zero frequency */
|
|
||||||
{
|
|
||||||
int n; /* iterates over all tree elements */
|
int n; /* iterates over all tree elements */
|
||||||
int prevlen = -1; /* last emitted length */
|
int prevlen = -1; /* last emitted length */
|
||||||
int curlen; /* length of current code */
|
int curlen; /* length of current code */
|
||||||
|
@ -796,9 +795,7 @@ local void send_tree(s, tree, max_code)
|
||||||
* Construct the Huffman tree for the bit lengths and return the index in
|
* Construct the Huffman tree for the bit lengths and return the index in
|
||||||
* bl_order of the last bit length code to send.
|
* bl_order of the last bit length code to send.
|
||||||
*/
|
*/
|
||||||
local int build_bl_tree(s)
|
local int build_bl_tree(deflate_state *s) {
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
int max_blindex; /* index of last bit length code of non zero freq */
|
int max_blindex; /* index of last bit length code of non zero freq */
|
||||||
|
|
||||||
/* Determine the bit length frequencies for literal and distance trees */
|
/* Determine the bit length frequencies for literal and distance trees */
|
||||||
|
@ -831,10 +828,8 @@ local int build_bl_tree(s)
|
||||||
* lengths of the bit length codes, the literal tree and the distance tree.
|
* lengths of the bit length codes, the literal tree and the distance tree.
|
||||||
* IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
|
* IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
|
||||||
*/
|
*/
|
||||||
local void send_all_trees(s, lcodes, dcodes, blcodes)
|
local void send_all_trees(deflate_state *s, int lcodes, int dcodes,
|
||||||
deflate_state *s;
|
int blcodes) {
|
||||||
int lcodes, dcodes, blcodes; /* number of codes for each tree */
|
|
||||||
{
|
|
||||||
int rank; /* index in bl_order */
|
int rank; /* index in bl_order */
|
||||||
|
|
||||||
Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
|
Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
|
||||||
|
@ -860,12 +855,8 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Send a stored block
|
* Send a stored block
|
||||||
*/
|
*/
|
||||||
void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
|
void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
|
||||||
deflate_state *s;
|
ulg stored_len, int last) {
|
||||||
charf *buf; /* input block */
|
|
||||||
ulg stored_len; /* length of input block */
|
|
||||||
int last; /* one if this is the last block for a file */
|
|
||||||
{
|
|
||||||
send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */
|
send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */
|
||||||
bi_windup(s); /* align on byte boundary */
|
bi_windup(s); /* align on byte boundary */
|
||||||
put_short(s, (ush)stored_len);
|
put_short(s, (ush)stored_len);
|
||||||
|
@ -884,9 +875,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
|
* Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
|
||||||
*/
|
*/
|
||||||
void ZLIB_INTERNAL _tr_flush_bits(s)
|
void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) {
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
bi_flush(s);
|
bi_flush(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -894,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s)
|
||||||
* Send one empty static block to give enough lookahead for inflate.
|
* Send one empty static block to give enough lookahead for inflate.
|
||||||
* This takes 10 bits, of which 7 may remain in the bit buffer.
|
* This takes 10 bits, of which 7 may remain in the bit buffer.
|
||||||
*/
|
*/
|
||||||
void ZLIB_INTERNAL _tr_align(s)
|
void ZLIB_INTERNAL _tr_align(deflate_state *s) {
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
send_bits(s, STATIC_TREES<<1, 3);
|
send_bits(s, STATIC_TREES<<1, 3);
|
||||||
send_code(s, END_BLOCK, static_ltree);
|
send_code(s, END_BLOCK, static_ltree);
|
||||||
#ifdef ZLIB_DEBUG
|
#ifdef ZLIB_DEBUG
|
||||||
|
@ -905,16 +892,99 @@ void ZLIB_INTERNAL _tr_align(s)
|
||||||
bi_flush(s);
|
bi_flush(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Send the block data compressed using the given Huffman trees
|
||||||
|
*/
|
||||||
|
local void compress_block(deflate_state *s, const ct_data *ltree,
|
||||||
|
const ct_data *dtree) {
|
||||||
|
unsigned dist; /* distance of matched string */
|
||||||
|
int lc; /* match length or unmatched char (if dist == 0) */
|
||||||
|
unsigned sx = 0; /* running index in sym_buf */
|
||||||
|
unsigned code; /* the code to send */
|
||||||
|
int extra; /* number of extra bits to send */
|
||||||
|
|
||||||
|
if (s->sym_next != 0) do {
|
||||||
|
dist = s->sym_buf[sx++] & 0xff;
|
||||||
|
dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
|
||||||
|
lc = s->sym_buf[sx++];
|
||||||
|
if (dist == 0) {
|
||||||
|
send_code(s, lc, ltree); /* send a literal byte */
|
||||||
|
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
|
||||||
|
} else {
|
||||||
|
/* Here, lc is the match length - MIN_MATCH */
|
||||||
|
code = _length_code[lc];
|
||||||
|
send_code(s, code + LITERALS + 1, ltree); /* send length code */
|
||||||
|
extra = extra_lbits[code];
|
||||||
|
if (extra != 0) {
|
||||||
|
lc -= base_length[code];
|
||||||
|
send_bits(s, lc, extra); /* send the extra length bits */
|
||||||
|
}
|
||||||
|
dist--; /* dist is now the match distance - 1 */
|
||||||
|
code = d_code(dist);
|
||||||
|
Assert (code < D_CODES, "bad d_code");
|
||||||
|
|
||||||
|
send_code(s, code, dtree); /* send the distance code */
|
||||||
|
extra = extra_dbits[code];
|
||||||
|
if (extra != 0) {
|
||||||
|
dist -= (unsigned)base_dist[code];
|
||||||
|
send_bits(s, dist, extra); /* send the extra distance bits */
|
||||||
|
}
|
||||||
|
} /* literal or match pair ? */
|
||||||
|
|
||||||
|
/* Check that the overlay between pending_buf and sym_buf is ok: */
|
||||||
|
Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
|
||||||
|
|
||||||
|
} while (sx < s->sym_next);
|
||||||
|
|
||||||
|
send_code(s, END_BLOCK, ltree);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Check if the data type is TEXT or BINARY, using the following algorithm:
|
||||||
|
* - TEXT if the two conditions below are satisfied:
|
||||||
|
* a) There are no non-portable control characters belonging to the
|
||||||
|
* "block list" (0..6, 14..25, 28..31).
|
||||||
|
* b) There is at least one printable character belonging to the
|
||||||
|
* "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
|
||||||
|
* - BINARY otherwise.
|
||||||
|
* - The following partially-portable control characters form a
|
||||||
|
* "gray list" that is ignored in this detection algorithm:
|
||||||
|
* (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
|
||||||
|
* IN assertion: the fields Freq of dyn_ltree are set.
|
||||||
|
*/
|
||||||
|
local int detect_data_type(deflate_state *s) {
|
||||||
|
/* block_mask is the bit mask of block-listed bytes
|
||||||
|
* set bits 0..6, 14..25, and 28..31
|
||||||
|
* 0xf3ffc07f = binary 11110011111111111100000001111111
|
||||||
|
*/
|
||||||
|
unsigned long block_mask = 0xf3ffc07fUL;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
/* Check for non-textual ("block-listed") bytes. */
|
||||||
|
for (n = 0; n <= 31; n++, block_mask >>= 1)
|
||||||
|
if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
|
||||||
|
return Z_BINARY;
|
||||||
|
|
||||||
|
/* Check for textual ("allow-listed") bytes. */
|
||||||
|
if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
|
||||||
|
|| s->dyn_ltree[13].Freq != 0)
|
||||||
|
return Z_TEXT;
|
||||||
|
for (n = 32; n < LITERALS; n++)
|
||||||
|
if (s->dyn_ltree[n].Freq != 0)
|
||||||
|
return Z_TEXT;
|
||||||
|
|
||||||
|
/* There are no "block-listed" or "allow-listed" bytes:
|
||||||
|
* this stream either is empty or has tolerated ("gray-listed") bytes only.
|
||||||
|
*/
|
||||||
|
return Z_BINARY;
|
||||||
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Determine the best encoding for the current block: dynamic trees, static
|
* Determine the best encoding for the current block: dynamic trees, static
|
||||||
* trees or store, and write out the encoded block.
|
* trees or store, and write out the encoded block.
|
||||||
*/
|
*/
|
||||||
void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
|
void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
|
||||||
deflate_state *s;
|
ulg stored_len, int last) {
|
||||||
charf *buf; /* input block, or NULL if too old */
|
|
||||||
ulg stored_len; /* length of input block */
|
|
||||||
int last; /* one if this is the last block for a file */
|
|
||||||
{
|
|
||||||
ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
|
ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
|
||||||
int max_blindex = 0; /* index of last bit length code of non zero freq */
|
int max_blindex = 0; /* index of last bit length code of non zero freq */
|
||||||
|
|
||||||
|
@ -1011,11 +1081,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
|
||||||
* Save the match info and tally the frequency counts. Return true if
|
* Save the match info and tally the frequency counts. Return true if
|
||||||
* the current block must be flushed.
|
* the current block must be flushed.
|
||||||
*/
|
*/
|
||||||
int ZLIB_INTERNAL _tr_tally(s, dist, lc)
|
int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) {
|
||||||
deflate_state *s;
|
|
||||||
unsigned dist; /* distance of matched string */
|
|
||||||
unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */
|
|
||||||
{
|
|
||||||
s->sym_buf[s->sym_next++] = (uch)dist;
|
s->sym_buf[s->sym_next++] = (uch)dist;
|
||||||
s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
|
s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
|
||||||
s->sym_buf[s->sym_next++] = (uch)lc;
|
s->sym_buf[s->sym_next++] = (uch)lc;
|
||||||
|
@ -1035,147 +1101,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc)
|
||||||
}
|
}
|
||||||
return (s->sym_next == s->sym_end);
|
return (s->sym_next == s->sym_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Send the block data compressed using the given Huffman trees
|
|
||||||
*/
|
|
||||||
local void compress_block(s, ltree, dtree)
|
|
||||||
deflate_state *s;
|
|
||||||
const ct_data *ltree; /* literal tree */
|
|
||||||
const ct_data *dtree; /* distance tree */
|
|
||||||
{
|
|
||||||
unsigned dist; /* distance of matched string */
|
|
||||||
int lc; /* match length or unmatched char (if dist == 0) */
|
|
||||||
unsigned sx = 0; /* running index in sym_buf */
|
|
||||||
unsigned code; /* the code to send */
|
|
||||||
int extra; /* number of extra bits to send */
|
|
||||||
|
|
||||||
if (s->sym_next != 0) do {
|
|
||||||
dist = s->sym_buf[sx++] & 0xff;
|
|
||||||
dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
|
|
||||||
lc = s->sym_buf[sx++];
|
|
||||||
if (dist == 0) {
|
|
||||||
send_code(s, lc, ltree); /* send a literal byte */
|
|
||||||
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
|
|
||||||
} else {
|
|
||||||
/* Here, lc is the match length - MIN_MATCH */
|
|
||||||
code = _length_code[lc];
|
|
||||||
send_code(s, code + LITERALS + 1, ltree); /* send length code */
|
|
||||||
extra = extra_lbits[code];
|
|
||||||
if (extra != 0) {
|
|
||||||
lc -= base_length[code];
|
|
||||||
send_bits(s, lc, extra); /* send the extra length bits */
|
|
||||||
}
|
|
||||||
dist--; /* dist is now the match distance - 1 */
|
|
||||||
code = d_code(dist);
|
|
||||||
Assert (code < D_CODES, "bad d_code");
|
|
||||||
|
|
||||||
send_code(s, code, dtree); /* send the distance code */
|
|
||||||
extra = extra_dbits[code];
|
|
||||||
if (extra != 0) {
|
|
||||||
dist -= (unsigned)base_dist[code];
|
|
||||||
send_bits(s, dist, extra); /* send the extra distance bits */
|
|
||||||
}
|
|
||||||
} /* literal or match pair ? */
|
|
||||||
|
|
||||||
/* Check that the overlay between pending_buf and sym_buf is ok: */
|
|
||||||
Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
|
|
||||||
|
|
||||||
} while (sx < s->sym_next);
|
|
||||||
|
|
||||||
send_code(s, END_BLOCK, ltree);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Check if the data type is TEXT or BINARY, using the following algorithm:
|
|
||||||
* - TEXT if the two conditions below are satisfied:
|
|
||||||
* a) There are no non-portable control characters belonging to the
|
|
||||||
* "block list" (0..6, 14..25, 28..31).
|
|
||||||
* b) There is at least one printable character belonging to the
|
|
||||||
* "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
|
|
||||||
* - BINARY otherwise.
|
|
||||||
* - The following partially-portable control characters form a
|
|
||||||
* "gray list" that is ignored in this detection algorithm:
|
|
||||||
* (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
|
|
||||||
* IN assertion: the fields Freq of dyn_ltree are set.
|
|
||||||
*/
|
|
||||||
local int detect_data_type(s)
|
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
/* block_mask is the bit mask of block-listed bytes
|
|
||||||
* set bits 0..6, 14..25, and 28..31
|
|
||||||
* 0xf3ffc07f = binary 11110011111111111100000001111111
|
|
||||||
*/
|
|
||||||
unsigned long block_mask = 0xf3ffc07fUL;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
/* Check for non-textual ("block-listed") bytes. */
|
|
||||||
for (n = 0; n <= 31; n++, block_mask >>= 1)
|
|
||||||
if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
|
|
||||||
return Z_BINARY;
|
|
||||||
|
|
||||||
/* Check for textual ("allow-listed") bytes. */
|
|
||||||
if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
|
|
||||||
|| s->dyn_ltree[13].Freq != 0)
|
|
||||||
return Z_TEXT;
|
|
||||||
for (n = 32; n < LITERALS; n++)
|
|
||||||
if (s->dyn_ltree[n].Freq != 0)
|
|
||||||
return Z_TEXT;
|
|
||||||
|
|
||||||
/* There are no "block-listed" or "allow-listed" bytes:
|
|
||||||
* this stream either is empty or has tolerated ("gray-listed") bytes only.
|
|
||||||
*/
|
|
||||||
return Z_BINARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Reverse the first len bits of a code, using straightforward code (a faster
|
|
||||||
* method would use a table)
|
|
||||||
* IN assertion: 1 <= len <= 15
|
|
||||||
*/
|
|
||||||
local unsigned bi_reverse(code, len)
|
|
||||||
unsigned code; /* the value to invert */
|
|
||||||
int len; /* its bit length */
|
|
||||||
{
|
|
||||||
register unsigned res = 0;
|
|
||||||
do {
|
|
||||||
res |= code & 1;
|
|
||||||
code >>= 1, res <<= 1;
|
|
||||||
} while (--len > 0);
|
|
||||||
return res >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Flush the bit buffer, keeping at most 7 bits in it.
|
|
||||||
*/
|
|
||||||
local void bi_flush(s)
|
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
if (s->bi_valid == 16) {
|
|
||||||
put_short(s, s->bi_buf);
|
|
||||||
s->bi_buf = 0;
|
|
||||||
s->bi_valid = 0;
|
|
||||||
} else if (s->bi_valid >= 8) {
|
|
||||||
put_byte(s, (Byte)s->bi_buf);
|
|
||||||
s->bi_buf >>= 8;
|
|
||||||
s->bi_valid -= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Flush the bit buffer and align the output on a byte boundary
|
|
||||||
*/
|
|
||||||
local void bi_windup(s)
|
|
||||||
deflate_state *s;
|
|
||||||
{
|
|
||||||
if (s->bi_valid > 8) {
|
|
||||||
put_short(s, s->bi_buf);
|
|
||||||
} else if (s->bi_valid > 0) {
|
|
||||||
put_byte(s, (Byte)s->bi_buf);
|
|
||||||
}
|
|
||||||
s->bi_buf = 0;
|
|
||||||
s->bi_valid = 0;
|
|
||||||
#ifdef ZLIB_DEBUG
|
|
||||||
s->bits_sent = (s->bits_sent + 7) & ~7;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
16
thirdparty/zlib/uncompr.c
vendored
16
thirdparty/zlib/uncompr.c
vendored
|
@ -24,12 +24,8 @@
|
||||||
Z_DATA_ERROR if the input data was corrupted, including if the input data is
|
Z_DATA_ERROR if the input data was corrupted, including if the input data is
|
||||||
an incomplete zlib stream.
|
an incomplete zlib stream.
|
||||||
*/
|
*/
|
||||||
int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
|
int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||||
Bytef *dest;
|
uLong *sourceLen) {
|
||||||
uLongf *destLen;
|
|
||||||
const Bytef *source;
|
|
||||||
uLong *sourceLen;
|
|
||||||
{
|
|
||||||
z_stream stream;
|
z_stream stream;
|
||||||
int err;
|
int err;
|
||||||
const uInt max = (uInt)-1;
|
const uInt max = (uInt)-1;
|
||||||
|
@ -83,11 +79,7 @@ int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
|
||||||
err;
|
err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZEXPORT uncompress(dest, destLen, source, sourceLen)
|
int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
||||||
Bytef *dest;
|
uLong sourceLen) {
|
||||||
uLongf *destLen;
|
|
||||||
const Bytef *source;
|
|
||||||
uLong sourceLen;
|
|
||||||
{
|
|
||||||
return uncompress2(dest, destLen, source, &sourceLen);
|
return uncompress2(dest, destLen, source, &sourceLen);
|
||||||
}
|
}
|
||||||
|
|
8
thirdparty/zlib/zconf.h
vendored
8
thirdparty/zlib/zconf.h
vendored
|
@ -241,7 +241,11 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Z_SOLO
|
#ifdef Z_SOLO
|
||||||
typedef unsigned long z_size_t;
|
# ifdef _WIN64
|
||||||
|
typedef unsigned long long z_size_t;
|
||||||
|
# else
|
||||||
|
typedef unsigned long z_size_t;
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
# define z_longlong long long
|
# define z_longlong long long
|
||||||
# if defined(NO_SIZE_T)
|
# if defined(NO_SIZE_T)
|
||||||
|
@ -520,7 +524,7 @@ typedef uLong FAR uLongf;
|
||||||
#if !defined(_WIN32) && defined(Z_LARGE64)
|
#if !defined(_WIN32) && defined(Z_LARGE64)
|
||||||
# define z_off64_t off64_t
|
# define z_off64_t off64_t
|
||||||
#else
|
#else
|
||||||
# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
|
# if defined(_WIN32) && !defined(__GNUC__)
|
||||||
# define z_off64_t __int64
|
# define z_off64_t __int64
|
||||||
# else
|
# else
|
||||||
# define z_off64_t z_off_t
|
# define z_off64_t z_off_t
|
||||||
|
|
379
thirdparty/zlib/zlib.h
vendored
379
thirdparty/zlib/zlib.h
vendored
|
@ -1,7 +1,7 @@
|
||||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||||
version 1.2.13, October 13th, 2022
|
version 1.3, August 18th, 2023
|
||||||
|
|
||||||
Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
|
Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
@ -37,11 +37,11 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ZLIB_VERSION "1.2.13"
|
#define ZLIB_VERSION "1.3"
|
||||||
#define ZLIB_VERNUM 0x12d0
|
#define ZLIB_VERNUM 0x1300
|
||||||
#define ZLIB_VER_MAJOR 1
|
#define ZLIB_VER_MAJOR 1
|
||||||
#define ZLIB_VER_MINOR 2
|
#define ZLIB_VER_MINOR 3
|
||||||
#define ZLIB_VER_REVISION 13
|
#define ZLIB_VER_REVISION 0
|
||||||
#define ZLIB_VER_SUBREVISION 0
|
#define ZLIB_VER_SUBREVISION 0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -78,8 +78,8 @@ extern "C" {
|
||||||
even in the case of corrupted input.
|
even in the case of corrupted input.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
|
typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size);
|
||||||
typedef void (*free_func) OF((voidpf opaque, voidpf address));
|
typedef void (*free_func)(voidpf opaque, voidpf address);
|
||||||
|
|
||||||
struct internal_state;
|
struct internal_state;
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ typedef gz_header FAR *gz_headerp;
|
||||||
|
|
||||||
/* basic functions */
|
/* basic functions */
|
||||||
|
|
||||||
ZEXTERN const char * ZEXPORT zlibVersion OF((void));
|
ZEXTERN const char * ZEXPORT zlibVersion(void);
|
||||||
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
|
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
|
||||||
If the first character differs, the library code actually used is not
|
If the first character differs, the library code actually used is not
|
||||||
compatible with the zlib.h header file used by the application. This check
|
compatible with the zlib.h header file used by the application. This check
|
||||||
|
@ -225,12 +225,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
|
ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level);
|
||||||
|
|
||||||
Initializes the internal stream state for compression. The fields
|
Initializes the internal stream state for compression. The fields
|
||||||
zalloc, zfree and opaque must be initialized before by the caller. If
|
zalloc, zfree and opaque must be initialized before by the caller. If
|
||||||
zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
|
zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
|
||||||
allocation functions.
|
allocation functions. total_in, total_out, adler, and msg are initialized.
|
||||||
|
|
||||||
The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
|
The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
|
||||||
1 gives best speed, 9 gives best compression, 0 gives no compression at all
|
1 gives best speed, 9 gives best compression, 0 gives no compression at all
|
||||||
|
@ -247,7 +247,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
|
ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush);
|
||||||
/*
|
/*
|
||||||
deflate compresses as much data as possible, and stops when the input
|
deflate compresses as much data as possible, and stops when the input
|
||||||
buffer becomes empty or the output buffer becomes full. It may introduce
|
buffer becomes empty or the output buffer becomes full. It may introduce
|
||||||
|
@ -320,8 +320,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
|
||||||
with the same value of the flush parameter and more output space (updated
|
with the same value of the flush parameter and more output space (updated
|
||||||
avail_out), until the flush is complete (deflate returns with non-zero
|
avail_out), until the flush is complete (deflate returns with non-zero
|
||||||
avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
|
avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
|
||||||
avail_out is greater than six to avoid repeated flush markers due to
|
avail_out is greater than six when the flush marker begins, in order to avoid
|
||||||
avail_out == 0 on return.
|
repeated flush markers upon calling deflate() again when avail_out == 0.
|
||||||
|
|
||||||
If the parameter flush is set to Z_FINISH, pending input is processed,
|
If the parameter flush is set to Z_FINISH, pending input is processed,
|
||||||
pending output is flushed and deflate returns with Z_STREAM_END if there was
|
pending output is flushed and deflate returns with Z_STREAM_END if there was
|
||||||
|
@ -360,7 +360,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
|
ZEXTERN int ZEXPORT deflateEnd(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
All dynamically allocated data structures for this stream are freed.
|
All dynamically allocated data structures for this stream are freed.
|
||||||
This function discards any unprocessed input and does not flush any pending
|
This function discards any unprocessed input and does not flush any pending
|
||||||
|
@ -375,7 +375,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
|
ZEXTERN int ZEXPORT inflateInit(z_streamp strm);
|
||||||
|
|
||||||
Initializes the internal stream state for decompression. The fields
|
Initializes the internal stream state for decompression. The fields
|
||||||
next_in, avail_in, zalloc, zfree and opaque must be initialized before by
|
next_in, avail_in, zalloc, zfree and opaque must be initialized before by
|
||||||
|
@ -383,7 +383,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
|
||||||
read or consumed. The allocation of a sliding window will be deferred to
|
read or consumed. The allocation of a sliding window will be deferred to
|
||||||
the first call of inflate (if the decompression does not complete on the
|
the first call of inflate (if the decompression does not complete on the
|
||||||
first call). If zalloc and zfree are set to Z_NULL, inflateInit updates
|
first call). If zalloc and zfree are set to Z_NULL, inflateInit updates
|
||||||
them to use default allocation functions.
|
them to use default allocation functions. total_in, total_out, adler, and
|
||||||
|
msg are initialized.
|
||||||
|
|
||||||
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
|
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
|
||||||
|
@ -397,7 +398,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
|
ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush);
|
||||||
/*
|
/*
|
||||||
inflate decompresses as much data as possible, and stops when the input
|
inflate decompresses as much data as possible, and stops when the input
|
||||||
buffer becomes empty or the output buffer becomes full. It may introduce
|
buffer becomes empty or the output buffer becomes full. It may introduce
|
||||||
|
@ -517,7 +518,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
|
ZEXTERN int ZEXPORT inflateEnd(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
All dynamically allocated data structures for this stream are freed.
|
All dynamically allocated data structures for this stream are freed.
|
||||||
This function discards any unprocessed input and does not flush any pending
|
This function discards any unprocessed input and does not flush any pending
|
||||||
|
@ -535,12 +536,12 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateInit2(z_streamp strm,
|
||||||
int level,
|
int level,
|
||||||
int method,
|
int method,
|
||||||
int windowBits,
|
int windowBits,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy));
|
int strategy);
|
||||||
|
|
||||||
This is another version of deflateInit with more compression options. The
|
This is another version of deflateInit with more compression options. The
|
||||||
fields zalloc, zfree and opaque must be initialized before by the caller.
|
fields zalloc, zfree and opaque must be initialized before by the caller.
|
||||||
|
@ -607,9 +608,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
|
||||||
compression: this will be done by deflate().
|
compression: this will be done by deflate().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm,
|
||||||
const Bytef *dictionary,
|
const Bytef *dictionary,
|
||||||
uInt dictLength));
|
uInt dictLength);
|
||||||
/*
|
/*
|
||||||
Initializes the compression dictionary from the given byte sequence
|
Initializes the compression dictionary from the given byte sequence
|
||||||
without producing any compressed output. When using the zlib format, this
|
without producing any compressed output. When using the zlib format, this
|
||||||
|
@ -651,9 +652,9 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
|
||||||
not perform any compression: this will be done by deflate().
|
not perform any compression: this will be done by deflate().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm,
|
||||||
Bytef *dictionary,
|
Bytef *dictionary,
|
||||||
uInt *dictLength));
|
uInt *dictLength);
|
||||||
/*
|
/*
|
||||||
Returns the sliding dictionary being maintained by deflate. dictLength is
|
Returns the sliding dictionary being maintained by deflate. dictLength is
|
||||||
set to the number of bytes in the dictionary, and that many bytes are copied
|
set to the number of bytes in the dictionary, and that many bytes are copied
|
||||||
|
@ -673,8 +674,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
|
||||||
stream state is inconsistent.
|
stream state is inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
|
ZEXTERN int ZEXPORT deflateCopy(z_streamp dest,
|
||||||
z_streamp source));
|
z_streamp source);
|
||||||
/*
|
/*
|
||||||
Sets the destination stream as a complete copy of the source stream.
|
Sets the destination stream as a complete copy of the source stream.
|
||||||
|
|
||||||
|
@ -691,20 +692,20 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
|
||||||
destination.
|
destination.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
|
ZEXTERN int ZEXPORT deflateReset(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
This function is equivalent to deflateEnd followed by deflateInit, but
|
This function is equivalent to deflateEnd followed by deflateInit, but
|
||||||
does not free and reallocate the internal compression state. The stream
|
does not free and reallocate the internal compression state. The stream
|
||||||
will leave the compression level and any other attributes that may have been
|
will leave the compression level and any other attributes that may have been
|
||||||
set unchanged.
|
set unchanged. total_in, total_out, adler, and msg are initialized.
|
||||||
|
|
||||||
deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
|
deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
|
||||||
stream state was inconsistent (such as zalloc or state being Z_NULL).
|
stream state was inconsistent (such as zalloc or state being Z_NULL).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateParams(z_streamp strm,
|
||||||
int level,
|
int level,
|
||||||
int strategy));
|
int strategy);
|
||||||
/*
|
/*
|
||||||
Dynamically update the compression level and compression strategy. The
|
Dynamically update the compression level and compression strategy. The
|
||||||
interpretation of level and strategy is as in deflateInit2(). This can be
|
interpretation of level and strategy is as in deflateInit2(). This can be
|
||||||
|
@ -729,7 +730,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
|
||||||
Then no more input data should be provided before the deflateParams() call.
|
Then no more input data should be provided before the deflateParams() call.
|
||||||
If this is done, the old level and strategy will be applied to the data
|
If this is done, the old level and strategy will be applied to the data
|
||||||
compressed before deflateParams(), and the new level and strategy will be
|
compressed before deflateParams(), and the new level and strategy will be
|
||||||
applied to the the data compressed after deflateParams().
|
applied to the data compressed after deflateParams().
|
||||||
|
|
||||||
deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream
|
deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream
|
||||||
state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if
|
state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if
|
||||||
|
@ -740,11 +741,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
|
||||||
retried with more output space.
|
retried with more output space.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateTune(z_streamp strm,
|
||||||
int good_length,
|
int good_length,
|
||||||
int max_lazy,
|
int max_lazy,
|
||||||
int nice_length,
|
int nice_length,
|
||||||
int max_chain));
|
int max_chain);
|
||||||
/*
|
/*
|
||||||
Fine tune deflate's internal compression parameters. This should only be
|
Fine tune deflate's internal compression parameters. This should only be
|
||||||
used by someone who understands the algorithm used by zlib's deflate for
|
used by someone who understands the algorithm used by zlib's deflate for
|
||||||
|
@ -757,8 +758,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
|
||||||
returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
|
returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
|
ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm,
|
||||||
uLong sourceLen));
|
uLong sourceLen);
|
||||||
/*
|
/*
|
||||||
deflateBound() returns an upper bound on the compressed size after
|
deflateBound() returns an upper bound on the compressed size after
|
||||||
deflation of sourceLen bytes. It must be called after deflateInit() or
|
deflation of sourceLen bytes. It must be called after deflateInit() or
|
||||||
|
@ -772,9 +773,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
|
||||||
than Z_FINISH or Z_NO_FLUSH are used.
|
than Z_FINISH or Z_NO_FLUSH are used.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflatePending(z_streamp strm,
|
||||||
unsigned *pending,
|
unsigned *pending,
|
||||||
int *bits));
|
int *bits);
|
||||||
/*
|
/*
|
||||||
deflatePending() returns the number of bytes and bits of output that have
|
deflatePending() returns the number of bytes and bits of output that have
|
||||||
been generated, but not yet provided in the available output. The bytes not
|
been generated, but not yet provided in the available output. The bytes not
|
||||||
|
@ -787,9 +788,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
|
||||||
stream state was inconsistent.
|
stream state was inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflatePrime(z_streamp strm,
|
||||||
int bits,
|
int bits,
|
||||||
int value));
|
int value);
|
||||||
/*
|
/*
|
||||||
deflatePrime() inserts bits in the deflate output stream. The intent
|
deflatePrime() inserts bits in the deflate output stream. The intent
|
||||||
is that this function is used to start off the deflate output with the bits
|
is that this function is used to start off the deflate output with the bits
|
||||||
|
@ -804,8 +805,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
|
||||||
source stream state was inconsistent.
|
source stream state was inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
|
ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm,
|
||||||
gz_headerp head));
|
gz_headerp head);
|
||||||
/*
|
/*
|
||||||
deflateSetHeader() provides gzip header information for when a gzip
|
deflateSetHeader() provides gzip header information for when a gzip
|
||||||
stream is requested by deflateInit2(). deflateSetHeader() may be called
|
stream is requested by deflateInit2(). deflateSetHeader() may be called
|
||||||
|
@ -821,16 +822,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
|
||||||
gzip file" and give up.
|
gzip file" and give up.
|
||||||
|
|
||||||
If deflateSetHeader is not used, the default gzip header has text false,
|
If deflateSetHeader is not used, the default gzip header has text false,
|
||||||
the time set to zero, and os set to 255, with no extra, name, or comment
|
the time set to zero, and os set to the current operating system, with no
|
||||||
fields. The gzip header is returned to the default state by deflateReset().
|
extra, name, or comment fields. The gzip header is returned to the default
|
||||||
|
state by deflateReset().
|
||||||
|
|
||||||
deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
|
deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
|
||||||
stream state was inconsistent.
|
stream state was inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateInit2(z_streamp strm,
|
||||||
int windowBits));
|
int windowBits);
|
||||||
|
|
||||||
This is another version of inflateInit with an extra parameter. The
|
This is another version of inflateInit with an extra parameter. The
|
||||||
fields next_in, avail_in, zalloc, zfree and opaque must be initialized
|
fields next_in, avail_in, zalloc, zfree and opaque must be initialized
|
||||||
|
@ -883,9 +885,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
|
||||||
deferred until inflate() is called.
|
deferred until inflate() is called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm,
|
||||||
const Bytef *dictionary,
|
const Bytef *dictionary,
|
||||||
uInt dictLength));
|
uInt dictLength);
|
||||||
/*
|
/*
|
||||||
Initializes the decompression dictionary from the given uncompressed byte
|
Initializes the decompression dictionary from the given uncompressed byte
|
||||||
sequence. This function must be called immediately after a call of inflate,
|
sequence. This function must be called immediately after a call of inflate,
|
||||||
|
@ -906,9 +908,9 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
|
||||||
inflate().
|
inflate().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm,
|
||||||
Bytef *dictionary,
|
Bytef *dictionary,
|
||||||
uInt *dictLength));
|
uInt *dictLength);
|
||||||
/*
|
/*
|
||||||
Returns the sliding dictionary being maintained by inflate. dictLength is
|
Returns the sliding dictionary being maintained by inflate. dictLength is
|
||||||
set to the number of bytes in the dictionary, and that many bytes are copied
|
set to the number of bytes in the dictionary, and that many bytes are copied
|
||||||
|
@ -921,7 +923,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
|
||||||
stream state is inconsistent.
|
stream state is inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
|
ZEXTERN int ZEXPORT inflateSync(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
Skips invalid compressed data until a possible full flush point (see above
|
Skips invalid compressed data until a possible full flush point (see above
|
||||||
for the description of deflate with Z_FULL_FLUSH) can be found, or until all
|
for the description of deflate with Z_FULL_FLUSH) can be found, or until all
|
||||||
|
@ -940,8 +942,8 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
|
||||||
input each time, until success or end of the input data.
|
input each time, until success or end of the input data.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
|
ZEXTERN int ZEXPORT inflateCopy(z_streamp dest,
|
||||||
z_streamp source));
|
z_streamp source);
|
||||||
/*
|
/*
|
||||||
Sets the destination stream as a complete copy of the source stream.
|
Sets the destination stream as a complete copy of the source stream.
|
||||||
|
|
||||||
|
@ -956,18 +958,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
|
||||||
destination.
|
destination.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
|
ZEXTERN int ZEXPORT inflateReset(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
This function is equivalent to inflateEnd followed by inflateInit,
|
This function is equivalent to inflateEnd followed by inflateInit,
|
||||||
but does not free and reallocate the internal decompression state. The
|
but does not free and reallocate the internal decompression state. The
|
||||||
stream will keep attributes that may have been set by inflateInit2.
|
stream will keep attributes that may have been set by inflateInit2.
|
||||||
|
total_in, total_out, adler, and msg are initialized.
|
||||||
|
|
||||||
inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
|
inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
|
||||||
stream state was inconsistent (such as zalloc or state being Z_NULL).
|
stream state was inconsistent (such as zalloc or state being Z_NULL).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateReset2(z_streamp strm,
|
||||||
int windowBits));
|
int windowBits);
|
||||||
/*
|
/*
|
||||||
This function is the same as inflateReset, but it also permits changing
|
This function is the same as inflateReset, but it also permits changing
|
||||||
the wrap and window size requests. The windowBits parameter is interpreted
|
the wrap and window size requests. The windowBits parameter is interpreted
|
||||||
|
@ -980,9 +983,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
|
||||||
the windowBits parameter is invalid.
|
the windowBits parameter is invalid.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
|
||||||
int bits,
|
int bits,
|
||||||
int value));
|
int value);
|
||||||
/*
|
/*
|
||||||
This function inserts bits in the inflate input stream. The intent is
|
This function inserts bits in the inflate input stream. The intent is
|
||||||
that this function is used to start inflating at a bit position in the
|
that this function is used to start inflating at a bit position in the
|
||||||
|
@ -1001,7 +1004,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
|
||||||
stream state was inconsistent.
|
stream state was inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
|
ZEXTERN long ZEXPORT inflateMark(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
This function returns two values, one in the lower 16 bits of the return
|
This function returns two values, one in the lower 16 bits of the return
|
||||||
value, and the other in the remaining upper bits, obtained by shifting the
|
value, and the other in the remaining upper bits, obtained by shifting the
|
||||||
|
@ -1029,8 +1032,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
|
||||||
source stream state was inconsistent.
|
source stream state was inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm,
|
||||||
gz_headerp head));
|
gz_headerp head);
|
||||||
/*
|
/*
|
||||||
inflateGetHeader() requests that gzip header information be stored in the
|
inflateGetHeader() requests that gzip header information be stored in the
|
||||||
provided gz_header structure. inflateGetHeader() may be called after
|
provided gz_header structure. inflateGetHeader() may be called after
|
||||||
|
@ -1070,8 +1073,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
|
ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits,
|
||||||
unsigned char FAR *window));
|
unsigned char FAR *window);
|
||||||
|
|
||||||
Initialize the internal stream state for decompression using inflateBack()
|
Initialize the internal stream state for decompression using inflateBack()
|
||||||
calls. The fields zalloc, zfree and opaque in strm must be initialized
|
calls. The fields zalloc, zfree and opaque in strm must be initialized
|
||||||
|
@ -1091,13 +1094,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
|
||||||
the version of the header file.
|
the version of the header file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef unsigned (*in_func) OF((void FAR *,
|
typedef unsigned (*in_func)(void FAR *,
|
||||||
z_const unsigned char FAR * FAR *));
|
z_const unsigned char FAR * FAR *);
|
||||||
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
|
typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned);
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateBack(z_streamp strm,
|
||||||
in_func in, void FAR *in_desc,
|
in_func in, void FAR *in_desc,
|
||||||
out_func out, void FAR *out_desc));
|
out_func out, void FAR *out_desc);
|
||||||
/*
|
/*
|
||||||
inflateBack() does a raw inflate with a single call using a call-back
|
inflateBack() does a raw inflate with a single call using a call-back
|
||||||
interface for input and output. This is potentially more efficient than
|
interface for input and output. This is potentially more efficient than
|
||||||
|
@ -1165,7 +1168,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
|
||||||
cannot return Z_OK.
|
cannot return Z_OK.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
|
ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm);
|
||||||
/*
|
/*
|
||||||
All memory allocated by inflateBackInit() is freed.
|
All memory allocated by inflateBackInit() is freed.
|
||||||
|
|
||||||
|
@ -1173,7 +1176,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
|
||||||
state was inconsistent.
|
state was inconsistent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
|
ZEXTERN uLong ZEXPORT zlibCompileFlags(void);
|
||||||
/* Return flags indicating compile-time options.
|
/* Return flags indicating compile-time options.
|
||||||
|
|
||||||
Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
|
Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
|
||||||
|
@ -1226,8 +1229,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
|
||||||
you need special options.
|
you need special options.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
|
ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen,
|
||||||
const Bytef *source, uLong sourceLen));
|
const Bytef *source, uLong sourceLen);
|
||||||
/*
|
/*
|
||||||
Compresses the source buffer into the destination buffer. sourceLen is
|
Compresses the source buffer into the destination buffer. sourceLen is
|
||||||
the byte length of the source buffer. Upon entry, destLen is the total size
|
the byte length of the source buffer. Upon entry, destLen is the total size
|
||||||
|
@ -1241,9 +1244,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
|
||||||
buffer.
|
buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
|
ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen,
|
||||||
const Bytef *source, uLong sourceLen,
|
const Bytef *source, uLong sourceLen,
|
||||||
int level));
|
int level);
|
||||||
/*
|
/*
|
||||||
Compresses the source buffer into the destination buffer. The level
|
Compresses the source buffer into the destination buffer. The level
|
||||||
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
||||||
|
@ -1257,15 +1260,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
|
||||||
Z_STREAM_ERROR if the level parameter is invalid.
|
Z_STREAM_ERROR if the level parameter is invalid.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
|
ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen);
|
||||||
/*
|
/*
|
||||||
compressBound() returns an upper bound on the compressed size after
|
compressBound() returns an upper bound on the compressed size after
|
||||||
compress() or compress2() on sourceLen bytes. It would be used before a
|
compress() or compress2() on sourceLen bytes. It would be used before a
|
||||||
compress() or compress2() call to allocate the destination buffer.
|
compress() or compress2() call to allocate the destination buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen,
|
||||||
const Bytef *source, uLong sourceLen));
|
const Bytef *source, uLong sourceLen);
|
||||||
/*
|
/*
|
||||||
Decompresses the source buffer into the destination buffer. sourceLen is
|
Decompresses the source buffer into the destination buffer. sourceLen is
|
||||||
the byte length of the source buffer. Upon entry, destLen is the total size
|
the byte length of the source buffer. Upon entry, destLen is the total size
|
||||||
|
@ -1282,8 +1285,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
||||||
buffer with the uncompressed data up to that point.
|
buffer with the uncompressed data up to that point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
|
ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen,
|
||||||
const Bytef *source, uLong *sourceLen));
|
const Bytef *source, uLong *sourceLen);
|
||||||
/*
|
/*
|
||||||
Same as uncompress, except that sourceLen is a pointer, where the
|
Same as uncompress, except that sourceLen is a pointer, where the
|
||||||
length of the source is *sourceLen. On return, *sourceLen is the number of
|
length of the source is *sourceLen. On return, *sourceLen is the number of
|
||||||
|
@ -1302,7 +1305,7 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
|
||||||
typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
|
typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
|
ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode);
|
||||||
|
|
||||||
Open the gzip (.gz) file at path for reading and decompressing, or
|
Open the gzip (.gz) file at path for reading and decompressing, or
|
||||||
compressing and writing. The mode parameter is as in fopen ("rb" or "wb")
|
compressing and writing. The mode parameter is as in fopen ("rb" or "wb")
|
||||||
|
@ -1339,7 +1342,7 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
|
||||||
file could not be opened.
|
file could not be opened.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
|
ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode);
|
||||||
/*
|
/*
|
||||||
Associate a gzFile with the file descriptor fd. File descriptors are
|
Associate a gzFile with the file descriptor fd. File descriptors are
|
||||||
obtained from calls like open, dup, creat, pipe or fileno (if the file has
|
obtained from calls like open, dup, creat, pipe or fileno (if the file has
|
||||||
|
@ -1362,7 +1365,7 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
|
||||||
will not detect if fd is invalid (unless fd is -1).
|
will not detect if fd is invalid (unless fd is -1).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
|
ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size);
|
||||||
/*
|
/*
|
||||||
Set the internal buffer size used by this library's functions for file to
|
Set the internal buffer size used by this library's functions for file to
|
||||||
size. The default buffer size is 8192 bytes. This function must be called
|
size. The default buffer size is 8192 bytes. This function must be called
|
||||||
|
@ -1378,7 +1381,7 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
|
||||||
too late.
|
too late.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
|
ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy);
|
||||||
/*
|
/*
|
||||||
Dynamically update the compression level and strategy for file. See the
|
Dynamically update the compression level and strategy for file. See the
|
||||||
description of deflateInit2 for the meaning of these parameters. Previously
|
description of deflateInit2 for the meaning of these parameters. Previously
|
||||||
|
@ -1389,7 +1392,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
|
||||||
or Z_MEM_ERROR if there is a memory allocation error.
|
or Z_MEM_ERROR if there is a memory allocation error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
|
ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len);
|
||||||
/*
|
/*
|
||||||
Read and decompress up to len uncompressed bytes from file into buf. If
|
Read and decompress up to len uncompressed bytes from file into buf. If
|
||||||
the input file is not in gzip format, gzread copies the given number of
|
the input file is not in gzip format, gzread copies the given number of
|
||||||
|
@ -1419,8 +1422,8 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
|
||||||
Z_STREAM_ERROR.
|
Z_STREAM_ERROR.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
|
ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
|
||||||
gzFile file));
|
gzFile file);
|
||||||
/*
|
/*
|
||||||
Read and decompress up to nitems items of size size from file into buf,
|
Read and decompress up to nitems items of size size from file into buf,
|
||||||
otherwise operating as gzread() does. This duplicates the interface of
|
otherwise operating as gzread() does. This duplicates the interface of
|
||||||
|
@ -1445,14 +1448,14 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
|
||||||
file, resetting and retrying on end-of-file, when size is not 1.
|
file, resetting and retrying on end-of-file, when size is not 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len));
|
ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len);
|
||||||
/*
|
/*
|
||||||
Compress and write the len uncompressed bytes at buf to file. gzwrite
|
Compress and write the len uncompressed bytes at buf to file. gzwrite
|
||||||
returns the number of uncompressed bytes written or 0 in case of error.
|
returns the number of uncompressed bytes written or 0 in case of error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
|
ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,
|
||||||
z_size_t nitems, gzFile file));
|
z_size_t nitems, gzFile file);
|
||||||
/*
|
/*
|
||||||
Compress and write nitems items of size size from buf to file, duplicating
|
Compress and write nitems items of size size from buf to file, duplicating
|
||||||
the interface of stdio's fwrite(), with size_t request and return types. If
|
the interface of stdio's fwrite(), with size_t request and return types. If
|
||||||
|
@ -1465,7 +1468,7 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
|
||||||
is returned, and the error state is set to Z_STREAM_ERROR.
|
is returned, and the error state is set to Z_STREAM_ERROR.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
|
ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...);
|
||||||
/*
|
/*
|
||||||
Convert, format, compress, and write the arguments (...) to file under
|
Convert, format, compress, and write the arguments (...) to file under
|
||||||
control of the string format, as in fprintf. gzprintf returns the number of
|
control of the string format, as in fprintf. gzprintf returns the number of
|
||||||
|
@ -1480,7 +1483,7 @@ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
|
||||||
This can be determined using zlibCompileFlags().
|
This can be determined using zlibCompileFlags().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
|
ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s);
|
||||||
/*
|
/*
|
||||||
Compress and write the given null-terminated string s to file, excluding
|
Compress and write the given null-terminated string s to file, excluding
|
||||||
the terminating null character.
|
the terminating null character.
|
||||||
|
@ -1488,7 +1491,7 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
|
||||||
gzputs returns the number of characters written, or -1 in case of error.
|
gzputs returns the number of characters written, or -1 in case of error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
|
ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len);
|
||||||
/*
|
/*
|
||||||
Read and decompress bytes from file into buf, until len-1 characters are
|
Read and decompress bytes from file into buf, until len-1 characters are
|
||||||
read, or until a newline character is read and transferred to buf, or an
|
read, or until a newline character is read and transferred to buf, or an
|
||||||
|
@ -1502,13 +1505,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
|
||||||
buf are indeterminate.
|
buf are indeterminate.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
|
ZEXTERN int ZEXPORT gzputc(gzFile file, int c);
|
||||||
/*
|
/*
|
||||||
Compress and write c, converted to an unsigned char, into file. gzputc
|
Compress and write c, converted to an unsigned char, into file. gzputc
|
||||||
returns the value that was written, or -1 in case of error.
|
returns the value that was written, or -1 in case of error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
|
ZEXTERN int ZEXPORT gzgetc(gzFile file);
|
||||||
/*
|
/*
|
||||||
Read and decompress one byte from file. gzgetc returns this byte or -1
|
Read and decompress one byte from file. gzgetc returns this byte or -1
|
||||||
in case of end of file or error. This is implemented as a macro for speed.
|
in case of end of file or error. This is implemented as a macro for speed.
|
||||||
|
@ -1517,7 +1520,7 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
|
||||||
points to has been clobbered or not.
|
points to has been clobbered or not.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
|
ZEXTERN int ZEXPORT gzungetc(int c, gzFile file);
|
||||||
/*
|
/*
|
||||||
Push c back onto the stream for file to be read as the first character on
|
Push c back onto the stream for file to be read as the first character on
|
||||||
the next read. At least one character of push-back is always allowed.
|
the next read. At least one character of push-back is always allowed.
|
||||||
|
@ -1529,7 +1532,7 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
|
||||||
gzseek() or gzrewind().
|
gzseek() or gzrewind().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
|
ZEXTERN int ZEXPORT gzflush(gzFile file, int flush);
|
||||||
/*
|
/*
|
||||||
Flush all pending output to file. The parameter flush is as in the
|
Flush all pending output to file. The parameter flush is as in the
|
||||||
deflate() function. The return value is the zlib error number (see function
|
deflate() function. The return value is the zlib error number (see function
|
||||||
|
@ -1545,8 +1548,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
|
ZEXTERN z_off_t ZEXPORT gzseek(gzFile file,
|
||||||
z_off_t offset, int whence));
|
z_off_t offset, int whence);
|
||||||
|
|
||||||
Set the starting position to offset relative to whence for the next gzread
|
Set the starting position to offset relative to whence for the next gzread
|
||||||
or gzwrite on file. The offset represents a number of bytes in the
|
or gzwrite on file. The offset represents a number of bytes in the
|
||||||
|
@ -1564,7 +1567,7 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
|
||||||
would be before the current position.
|
would be before the current position.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
|
ZEXTERN int ZEXPORT gzrewind(gzFile file);
|
||||||
/*
|
/*
|
||||||
Rewind file. This function is supported only for reading.
|
Rewind file. This function is supported only for reading.
|
||||||
|
|
||||||
|
@ -1572,7 +1575,7 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
|
ZEXTERN z_off_t ZEXPORT gztell(gzFile file);
|
||||||
|
|
||||||
Return the starting position for the next gzread or gzwrite on file.
|
Return the starting position for the next gzread or gzwrite on file.
|
||||||
This position represents a number of bytes in the uncompressed data stream,
|
This position represents a number of bytes in the uncompressed data stream,
|
||||||
|
@ -1583,7 +1586,7 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
|
ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file);
|
||||||
|
|
||||||
Return the current compressed (actual) read or write offset of file. This
|
Return the current compressed (actual) read or write offset of file. This
|
||||||
offset includes the count of bytes that precede the gzip stream, for example
|
offset includes the count of bytes that precede the gzip stream, for example
|
||||||
|
@ -1592,7 +1595,7 @@ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
|
||||||
be used for a progress indicator. On error, gzoffset() returns -1.
|
be used for a progress indicator. On error, gzoffset() returns -1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzeof OF((gzFile file));
|
ZEXTERN int ZEXPORT gzeof(gzFile file);
|
||||||
/*
|
/*
|
||||||
Return true (1) if the end-of-file indicator for file has been set while
|
Return true (1) if the end-of-file indicator for file has been set while
|
||||||
reading, false (0) otherwise. Note that the end-of-file indicator is set
|
reading, false (0) otherwise. Note that the end-of-file indicator is set
|
||||||
|
@ -1607,7 +1610,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
|
||||||
has grown since the previous end of file was detected.
|
has grown since the previous end of file was detected.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
|
ZEXTERN int ZEXPORT gzdirect(gzFile file);
|
||||||
/*
|
/*
|
||||||
Return true (1) if file is being copied directly while reading, or false
|
Return true (1) if file is being copied directly while reading, or false
|
||||||
(0) if file is a gzip stream being decompressed.
|
(0) if file is a gzip stream being decompressed.
|
||||||
|
@ -1628,7 +1631,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
|
||||||
gzip file reading and decompression, which may not be desired.)
|
gzip file reading and decompression, which may not be desired.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzclose OF((gzFile file));
|
ZEXTERN int ZEXPORT gzclose(gzFile file);
|
||||||
/*
|
/*
|
||||||
Flush all pending output for file, if necessary, close file and
|
Flush all pending output for file, if necessary, close file and
|
||||||
deallocate the (de)compression state. Note that once file is closed, you
|
deallocate the (de)compression state. Note that once file is closed, you
|
||||||
|
@ -1641,8 +1644,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file));
|
||||||
last read ended in the middle of a gzip stream, or Z_OK on success.
|
last read ended in the middle of a gzip stream, or Z_OK on success.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
|
ZEXTERN int ZEXPORT gzclose_r(gzFile file);
|
||||||
ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
|
ZEXTERN int ZEXPORT gzclose_w(gzFile file);
|
||||||
/*
|
/*
|
||||||
Same as gzclose(), but gzclose_r() is only for use when reading, and
|
Same as gzclose(), but gzclose_r() is only for use when reading, and
|
||||||
gzclose_w() is only for use when writing or appending. The advantage to
|
gzclose_w() is only for use when writing or appending. The advantage to
|
||||||
|
@ -1653,7 +1656,7 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
|
||||||
zlib library.
|
zlib library.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
|
ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum);
|
||||||
/*
|
/*
|
||||||
Return the error message for the last error which occurred on file.
|
Return the error message for the last error which occurred on file.
|
||||||
errnum is set to zlib error number. If an error occurred in the file system
|
errnum is set to zlib error number. If an error occurred in the file system
|
||||||
|
@ -1669,7 +1672,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
|
||||||
functions above that do not distinguish those cases in their return values.
|
functions above that do not distinguish those cases in their return values.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
|
ZEXTERN void ZEXPORT gzclearerr(gzFile file);
|
||||||
/*
|
/*
|
||||||
Clear the error and end-of-file flags for file. This is analogous to the
|
Clear the error and end-of-file flags for file. This is analogous to the
|
||||||
clearerr() function in stdio. This is useful for continuing to read a gzip
|
clearerr() function in stdio. This is useful for continuing to read a gzip
|
||||||
|
@ -1686,7 +1689,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
|
||||||
library.
|
library.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
|
ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len);
|
||||||
/*
|
/*
|
||||||
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
|
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
|
||||||
return the updated checksum. An Adler-32 value is in the range of a 32-bit
|
return the updated checksum. An Adler-32 value is in the range of a 32-bit
|
||||||
|
@ -1706,15 +1709,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
|
||||||
if (adler != original_adler) error();
|
if (adler != original_adler) error();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf,
|
ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf,
|
||||||
z_size_t len));
|
z_size_t len);
|
||||||
/*
|
/*
|
||||||
Same as adler32(), but with a size_t length.
|
Same as adler32(), but with a size_t length.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
|
ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2,
|
||||||
z_off_t len2));
|
z_off_t len2);
|
||||||
|
|
||||||
Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
|
Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
|
||||||
and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
|
and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
|
||||||
|
@ -1724,7 +1727,7 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
|
||||||
negative, the result has no meaning or utility.
|
negative, the result has no meaning or utility.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len);
|
||||||
/*
|
/*
|
||||||
Update a running CRC-32 with the bytes buf[0..len-1] and return the
|
Update a running CRC-32 with the bytes buf[0..len-1] and return the
|
||||||
updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
|
updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
|
||||||
|
@ -1742,14 +1745,14 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
|
||||||
if (crc != original_crc) error();
|
if (crc != original_crc) error();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
|
ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf,
|
||||||
z_size_t len));
|
z_size_t len);
|
||||||
/*
|
/*
|
||||||
Same as crc32(), but with a size_t length.
|
Same as crc32(), but with a size_t length.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
|
ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2);
|
||||||
|
|
||||||
Combine two CRC-32 check values into one. For two sequences of bytes,
|
Combine two CRC-32 check values into one. For two sequences of bytes,
|
||||||
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
|
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
|
||||||
|
@ -1759,13 +1762,13 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2));
|
ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2);
|
||||||
|
|
||||||
Return the operator corresponding to length len2, to be used with
|
Return the operator corresponding to length len2, to be used with
|
||||||
crc32_combine_op().
|
crc32_combine_op().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
|
ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op);
|
||||||
/*
|
/*
|
||||||
Give the same result as crc32_combine(), using op in place of len2. op is
|
Give the same result as crc32_combine(), using op in place of len2. op is
|
||||||
is generated from len2 by crc32_combine_gen(). This will be faster than
|
is generated from len2 by crc32_combine_gen(). This will be faster than
|
||||||
|
@ -1778,20 +1781,20 @@ ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
|
||||||
/* deflateInit and inflateInit are macros to allow checking the zlib version
|
/* deflateInit and inflateInit are macros to allow checking the zlib version
|
||||||
* and the compiler's view of z_stream:
|
* and the compiler's view of z_stream:
|
||||||
*/
|
*/
|
||||||
ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
|
ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level,
|
||||||
const char *version, int stream_size));
|
const char *version, int stream_size);
|
||||||
ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
|
ZEXTERN int ZEXPORT inflateInit_(z_streamp strm,
|
||||||
const char *version, int stream_size));
|
const char *version, int stream_size);
|
||||||
ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
|
ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method,
|
||||||
int windowBits, int memLevel,
|
int windowBits, int memLevel,
|
||||||
int strategy, const char *version,
|
int strategy, const char *version,
|
||||||
int stream_size));
|
int stream_size);
|
||||||
ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
|
ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits,
|
||||||
const char *version, int stream_size));
|
const char *version, int stream_size);
|
||||||
ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
|
ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
|
||||||
unsigned char FAR *window,
|
unsigned char FAR *window,
|
||||||
const char *version,
|
const char *version,
|
||||||
int stream_size));
|
int stream_size);
|
||||||
#ifdef Z_PREFIX_SET
|
#ifdef Z_PREFIX_SET
|
||||||
# define z_deflateInit(strm, level) \
|
# define z_deflateInit(strm, level) \
|
||||||
deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
|
deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
|
||||||
|
@ -1836,7 +1839,7 @@ struct gzFile_s {
|
||||||
unsigned char *next;
|
unsigned char *next;
|
||||||
z_off64_t pos;
|
z_off64_t pos;
|
||||||
};
|
};
|
||||||
ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */
|
||||||
#ifdef Z_PREFIX_SET
|
#ifdef Z_PREFIX_SET
|
||||||
# undef z_gzgetc
|
# undef z_gzgetc
|
||||||
# define z_gzgetc(g) \
|
# define z_gzgetc(g) \
|
||||||
|
@ -1853,13 +1856,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
||||||
* without large file support, _LFS64_LARGEFILE must also be true
|
* without large file support, _LFS64_LARGEFILE must also be true
|
||||||
*/
|
*/
|
||||||
#ifdef Z_LARGE64
|
#ifdef Z_LARGE64
|
||||||
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
|
||||||
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
|
ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
|
||||||
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
|
ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
|
||||||
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
|
ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
|
ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
|
ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t));
|
ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
|
#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
|
||||||
|
@ -1881,50 +1884,50 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
|
||||||
# define crc32_combine_gen crc32_combine_gen64
|
# define crc32_combine_gen crc32_combine_gen64
|
||||||
# endif
|
# endif
|
||||||
# ifndef Z_LARGE64
|
# ifndef Z_LARGE64
|
||||||
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
|
||||||
ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
|
ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int);
|
||||||
ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
|
ZEXTERN z_off_t ZEXPORT gztell64(gzFile);
|
||||||
ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
|
ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile);
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
|
ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *);
|
||||||
ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
|
ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int);
|
||||||
ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
|
ZEXTERN z_off_t ZEXPORT gztell(gzFile);
|
||||||
ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
|
ZEXTERN z_off_t ZEXPORT gzoffset(gzFile);
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else /* Z_SOLO */
|
#else /* Z_SOLO */
|
||||||
|
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t);
|
||||||
|
|
||||||
#endif /* !Z_SOLO */
|
#endif /* !Z_SOLO */
|
||||||
|
|
||||||
/* undocumented functions */
|
/* undocumented functions */
|
||||||
ZEXTERN const char * ZEXPORT zError OF((int));
|
ZEXTERN const char * ZEXPORT zError(int);
|
||||||
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
|
ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp);
|
||||||
ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
|
ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void);
|
||||||
ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
|
ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int);
|
||||||
ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int));
|
ZEXTERN int ZEXPORT inflateValidate(z_streamp, int);
|
||||||
ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp));
|
ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp);
|
||||||
ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
|
ZEXTERN int ZEXPORT inflateResetKeep(z_streamp);
|
||||||
ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
|
ZEXTERN int ZEXPORT deflateResetKeep(z_streamp);
|
||||||
#if defined(_WIN32) && !defined(Z_SOLO)
|
#if defined(_WIN32) && !defined(Z_SOLO)
|
||||||
ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
|
ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path,
|
||||||
const char *mode));
|
const char *mode);
|
||||||
#endif
|
#endif
|
||||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||||
# ifndef Z_SOLO
|
# ifndef Z_SOLO
|
||||||
ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
|
ZEXTERN int ZEXPORTVA gzvprintf(gzFile file,
|
||||||
const char *format,
|
const char *format,
|
||||||
va_list va));
|
va_list va);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
60
thirdparty/zlib/zutil.c
vendored
60
thirdparty/zlib/zutil.c
vendored
|
@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const char * ZEXPORT zlibVersion()
|
const char * ZEXPORT zlibVersion(void) {
|
||||||
{
|
|
||||||
return ZLIB_VERSION;
|
return ZLIB_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
uLong ZEXPORT zlibCompileFlags()
|
uLong ZEXPORT zlibCompileFlags(void) {
|
||||||
{
|
|
||||||
uLong flags;
|
uLong flags;
|
||||||
|
|
||||||
flags = 0;
|
flags = 0;
|
||||||
|
@ -121,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags()
|
||||||
# endif
|
# endif
|
||||||
int ZLIB_INTERNAL z_verbose = verbose;
|
int ZLIB_INTERNAL z_verbose = verbose;
|
||||||
|
|
||||||
void ZLIB_INTERNAL z_error(m)
|
void ZLIB_INTERNAL z_error(char *m) {
|
||||||
char *m;
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s\n", m);
|
fprintf(stderr, "%s\n", m);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -132,9 +128,7 @@ void ZLIB_INTERNAL z_error(m)
|
||||||
/* exported to allow conversion of error code to string for compress() and
|
/* exported to allow conversion of error code to string for compress() and
|
||||||
* uncompress()
|
* uncompress()
|
||||||
*/
|
*/
|
||||||
const char * ZEXPORT zError(err)
|
const char * ZEXPORT zError(int err) {
|
||||||
int err;
|
|
||||||
{
|
|
||||||
return ERR_MSG(err);
|
return ERR_MSG(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,22 +142,14 @@ const char * ZEXPORT zError(err)
|
||||||
|
|
||||||
#ifndef HAVE_MEMCPY
|
#ifndef HAVE_MEMCPY
|
||||||
|
|
||||||
void ZLIB_INTERNAL zmemcpy(dest, source, len)
|
void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
|
||||||
Bytef* dest;
|
|
||||||
const Bytef* source;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
if (len == 0) return;
|
if (len == 0) return;
|
||||||
do {
|
do {
|
||||||
*dest++ = *source++; /* ??? to be unrolled */
|
*dest++ = *source++; /* ??? to be unrolled */
|
||||||
} while (--len != 0);
|
} while (--len != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZLIB_INTERNAL zmemcmp(s1, s2, len)
|
int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
|
||||||
const Bytef* s1;
|
|
||||||
const Bytef* s2;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
uInt j;
|
uInt j;
|
||||||
|
|
||||||
for (j = 0; j < len; j++) {
|
for (j = 0; j < len; j++) {
|
||||||
|
@ -172,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZLIB_INTERNAL zmemzero(dest, len)
|
void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
|
||||||
Bytef* dest;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
if (len == 0) return;
|
if (len == 0) return;
|
||||||
do {
|
do {
|
||||||
*dest++ = 0; /* ??? to be unrolled */
|
*dest++ = 0; /* ??? to be unrolled */
|
||||||
|
@ -216,8 +199,7 @@ local ptr_table table[MAX_PTR];
|
||||||
* a protected system like OS/2. Use Microsoft C instead.
|
* a protected system like OS/2. Use Microsoft C instead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
|
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
|
||||||
{
|
|
||||||
voidpf buf;
|
voidpf buf;
|
||||||
ulg bsize = (ulg)items*size;
|
ulg bsize = (ulg)items*size;
|
||||||
|
|
||||||
|
@ -242,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
|
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
|
||||||
{
|
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
|
@ -279,14 +260,12 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
|
||||||
# define _hfree hfree
|
# define _hfree hfree
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size)
|
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
|
||||||
{
|
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
return _halloc((long)items, size);
|
return _halloc((long)items, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
|
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
|
||||||
{
|
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
_hfree(ptr);
|
_hfree(ptr);
|
||||||
}
|
}
|
||||||
|
@ -299,25 +278,18 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
|
||||||
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
|
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
|
||||||
|
|
||||||
#ifndef STDC
|
#ifndef STDC
|
||||||
extern voidp malloc OF((uInt size));
|
extern voidp malloc(uInt size);
|
||||||
extern voidp calloc OF((uInt items, uInt size));
|
extern voidp calloc(uInt items, uInt size);
|
||||||
extern void free OF((voidpf ptr));
|
extern void free(voidpf ptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
|
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
|
||||||
voidpf opaque;
|
|
||||||
unsigned items;
|
|
||||||
unsigned size;
|
|
||||||
{
|
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
|
return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
|
||||||
(voidpf)calloc(items, size);
|
(voidpf)calloc(items, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZLIB_INTERNAL zcfree(opaque, ptr)
|
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
|
||||||
voidpf opaque;
|
|
||||||
voidpf ptr;
|
|
||||||
{
|
|
||||||
(void)opaque;
|
(void)opaque;
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
|
20
thirdparty/zlib/zutil.h
vendored
20
thirdparty/zlib/zutil.h
vendored
|
@ -191,9 +191,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||||
/* provide prototypes for these when building zlib without LFS */
|
/* provide prototypes for these when building zlib without LFS */
|
||||||
#if !defined(_WIN32) && \
|
#if !defined(_WIN32) && \
|
||||||
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
|
ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* common defaults */
|
/* common defaults */
|
||||||
|
@ -232,16 +232,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||||
# define zmemzero(dest, len) memset(dest, 0, len)
|
# define zmemzero(dest, len) memset(dest, 0, len)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
|
void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);
|
||||||
int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
|
int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);
|
||||||
void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
|
void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Diagnostic functions */
|
/* Diagnostic functions */
|
||||||
#ifdef ZLIB_DEBUG
|
#ifdef ZLIB_DEBUG
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
extern int ZLIB_INTERNAL z_verbose;
|
extern int ZLIB_INTERNAL z_verbose;
|
||||||
extern void ZLIB_INTERNAL z_error OF((char *m));
|
extern void ZLIB_INTERNAL z_error(char *m);
|
||||||
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
||||||
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
|
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
|
||||||
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
|
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
|
||||||
|
@ -258,9 +258,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef Z_SOLO
|
#ifndef Z_SOLO
|
||||||
voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
|
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items,
|
||||||
unsigned size));
|
unsigned size);
|
||||||
void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
|
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ZALLOC(strm, items, size) \
|
#define ZALLOC(strm, items, size) \
|
||||||
|
|
Loading…
Reference in a new issue