hlibgit2 0.1 → 0.2
raw patch · 140 files changed
+4964/−22324 lines, 140 filesdep ~bindings-DSLnew-uploader
Dependency ranges changed: bindings-DSL
Files
- Bindings/Libgit2.hs +28/−22
- Bindings/Libgit2/Blob.hsc +5/−5
- Bindings/Libgit2/Blob.hsc.helper.c +2/−1
- Bindings/Libgit2/Commit.hsc +5/−6
- Bindings/Libgit2/Commit.hsc.helper.c +2/−1
- Bindings/Libgit2/Common.hsc +3/−24
- Bindings/Libgit2/Config.hsc +36/−0
- Bindings/Libgit2/Errors.hsc +59/−0
- Bindings/Libgit2/Index.hsc +35/−5
- Bindings/Libgit2/Net.hsc +12/−0
- Bindings/Libgit2/Object.hsc +1/−2
- Bindings/Libgit2/Odb.hsc +14/−15
- Bindings/Libgit2/OdbBackend.hsc +8/−1
- Bindings/Libgit2/Oid.hsc +5/−2
- Bindings/Libgit2/Reflog.hsc +18/−0
- Bindings/Libgit2/Refs.hsc +5/−4
- Bindings/Libgit2/Refspec.hsc +6/−0
- Bindings/Libgit2/Repository.hsc +7/−1
- Bindings/Libgit2/Signature.hsc +1/−0
- Bindings/Libgit2/Tag.hsc +7/−5
- Bindings/Libgit2/Tag.hsc.helper.c +2/−1
- Bindings/Libgit2/ThreadUtils.hsc +0/−9
- Bindings/Libgit2/Tree.hsc +15/−11
- Bindings/Libgit2/Tree.hsc.helper.c +2/−1
- Bindings/Libgit2/Types.hsc +14/−3
- hlibgit2.cabal +57/−129
- libgit2/deps/zlib/adler32.c +0/−169
- libgit2/deps/zlib/deflate.c +0/−1834
- libgit2/deps/zlib/deflate.h +0/−342
- libgit2/deps/zlib/inffast.c +0/−340
- libgit2/deps/zlib/inffast.h +0/−11
- libgit2/deps/zlib/inffixed.h +0/−94
- libgit2/deps/zlib/inflate.c +0/−1480
- libgit2/deps/zlib/inflate.h +0/−122
- libgit2/deps/zlib/inftrees.c +0/−330
- libgit2/deps/zlib/inftrees.h +0/−62
- libgit2/deps/zlib/trees.c +0/−1244
- libgit2/deps/zlib/trees.h +0/−128
- libgit2/deps/zlib/zconf.h +0/−57
- libgit2/deps/zlib/zlib.h +0/−1613
- libgit2/deps/zlib/zutil.c +0/−318
- libgit2/deps/zlib/zutil.h +0/−274
- libgit2/include/git2.h +17/−26
- libgit2/include/git2/attr.h +224/−0
- libgit2/include/git2/blob.h +60/−56
- libgit2/include/git2/branch.h +122/−0
- libgit2/include/git2/commit.h +151/−69
- libgit2/include/git2/common.h +46/−114
- libgit2/include/git2/config.h +356/−0
- libgit2/include/git2/diff.h +362/−0
- libgit2/include/git2/errors.h +88/−25
- libgit2/include/git2/index.h +178/−56
- libgit2/include/git2/indexer.h +121/−0
- libgit2/include/git2/inttypes.h +305/−0
- libgit2/include/git2/merge.h +35/−0
- libgit2/include/git2/net.h +51/−0
- libgit2/include/git2/notes.h +139/−0
- libgit2/include/git2/object.h +46/−71
- libgit2/include/git2/odb.h +207/−77
- libgit2/include/git2/odb_backend.h +54/−31
- libgit2/include/git2/oid.h +79/−47
- libgit2/include/git2/reflog.h +128/−0
- libgit2/include/git2/refs.h +133/−50
- libgit2/include/git2/refspec.h +60/−0
- libgit2/include/git2/remote.h +234/−0
- libgit2/include/git2/repository.h +226/−113
- libgit2/include/git2/revwalk.h +84/−34
- libgit2/include/git2/signature.h +24/−29
- libgit2/include/git2/status.h +164/−0
- libgit2/include/git2/stdint.h +247/−0
- libgit2/include/git2/submodule.h +103/−0
- libgit2/include/git2/tag.h +200/−57
- libgit2/include/git2/thread-utils.h +0/−72
- libgit2/include/git2/threads.h +48/−0
- libgit2/include/git2/tree.h +188/−93
- libgit2/include/git2/types.h +61/−38
- libgit2/include/git2/version.h +15/−0
- libgit2/include/git2/windows.h +59/−0
- libgit2/include/git2/zlib.h +0/−58
- libgit2/src/blob.c +0/−136
- libgit2/src/blob.h +0/−17
- libgit2/src/block-sha1/sha1.c +0/−281
- libgit2/src/block-sha1/sha1.h +0/−22
- libgit2/src/bswap.h +0/−97
- libgit2/src/cc-compat.h +0/−73
- libgit2/src/commit.c +0/−299
- libgit2/src/commit.h +0/−29
- libgit2/src/common.h +0/−56
- libgit2/src/delta-apply.c +0/−109
- libgit2/src/delta-apply.h +0/−25
- libgit2/src/dir.h +0/−41
- libgit2/src/errors.c +0/−44
- libgit2/src/filebuf.c +0/−291
- libgit2/src/filebuf.h +0/−44
- libgit2/src/fileops.c +0/−553
- libgit2/src/fileops.h +0/−191
- libgit2/src/hash.c +0/−94
- libgit2/src/hash.h +0/−26
- libgit2/src/hashtable.c +0/−261
- libgit2/src/hashtable.h +0/−73
- libgit2/src/index.c +0/−768
- libgit2/src/index.h +0/−34
- libgit2/src/map.h +0/−31
- libgit2/src/mingw-compat.h +0/−13
- libgit2/src/msvc-compat.h +0/−42
- libgit2/src/object.c +0/−487
- libgit2/src/odb.c +0/−396
- libgit2/src/odb.h +0/−17
- libgit2/src/odb_loose.c +0/−658
- libgit2/src/odb_pack.c +0/−1406
- libgit2/src/oid.c +0/−346
- libgit2/src/pqueue.c +0/−157
- libgit2/src/pqueue.h +0/−97
- libgit2/src/refs.c +0/−1594
- libgit2/src/refs.h +0/−42
- libgit2/src/repository.c +0/−541
- libgit2/src/repository.h +0/−65
- libgit2/src/revwalk.c +0/−565
- libgit2/src/signature.c +0/−199
- libgit2/src/signature.h +0/−12
- libgit2/src/t03-data.h +0/−344
- libgit2/src/tag.c +0/−232
- libgit2/src/tag.h +0/−22
- libgit2/src/thread-utils.c +0/−49
- libgit2/src/thread-utils.h +0/−28
- libgit2/src/tree.c +0/−351
- libgit2/src/tree.h +0/−26
- libgit2/src/unix/map.c +0/−61
- libgit2/src/util.c +0/−406
- libgit2/src/util.h +0/−119
- libgit2/src/vector.c +0/−175
- libgit2/src/vector.h +0/−36
- libgit2/src/win32/dir.c +0/−98
- libgit2/src/win32/fileops.c +0/−41
- libgit2/src/win32/map.c +0/−125
- libgit2/src/win32/pthread.c +0/−120
- libgit2/src/win32/pthread.h +0/−67
- tests/Main.hi binary
- tests/Main.hs~ +0/−10
- tests/Main.o binary
Bindings/Libgit2.hs view
@@ -1,36 +1,42 @@ module Bindings.Libgit2 (- module Bindings.Libgit2.Refs,- module Bindings.Libgit2.Odb,+ module Bindings.Libgit2.Repository,+ module Bindings.Libgit2.Config, module Bindings.Libgit2.Types,- module Bindings.Libgit2.Index,- module Bindings.Libgit2.ThreadUtils,- module Bindings.Libgit2.Oid,+ module Bindings.Libgit2.Revwalk,+ module Bindings.Libgit2.OdbBackend, module Bindings.Libgit2.Tag,- module Bindings.Libgit2.Object,+ module Bindings.Libgit2.Net,+ module Bindings.Libgit2.Refs,+ module Bindings.Libgit2.Refspec,+ module Bindings.Libgit2.Reflog,+ module Bindings.Libgit2.Commit,+ module Bindings.Libgit2.Index, module Bindings.Libgit2.Signature, module Bindings.Libgit2.Blob,- module Bindings.Libgit2.OdbBackend,- module Bindings.Libgit2.Repository,- module Bindings.Libgit2.Common,- module Bindings.Libgit2.Commit, module Bindings.Libgit2.Errors,+ module Bindings.Libgit2.Oid, module Bindings.Libgit2.Tree,- module Bindings.Libgit2.Revwalk) where-import Bindings.Libgit2.Refs-import Bindings.Libgit2.Odb+ module Bindings.Libgit2.Odb,+ module Bindings.Libgit2.Common,+ module Bindings.Libgit2.Object) where+import Bindings.Libgit2.Repository+import Bindings.Libgit2.Config import Bindings.Libgit2.Types-import Bindings.Libgit2.Index-import Bindings.Libgit2.ThreadUtils-import Bindings.Libgit2.Oid+import Bindings.Libgit2.Revwalk+import Bindings.Libgit2.OdbBackend import Bindings.Libgit2.Tag-import Bindings.Libgit2.Object+import Bindings.Libgit2.Net+import Bindings.Libgit2.Refs+import Bindings.Libgit2.Refspec+import Bindings.Libgit2.Reflog+import Bindings.Libgit2.Commit+import Bindings.Libgit2.Index import Bindings.Libgit2.Signature import Bindings.Libgit2.Blob-import Bindings.Libgit2.OdbBackend-import Bindings.Libgit2.Repository-import Bindings.Libgit2.Common-import Bindings.Libgit2.Commit import Bindings.Libgit2.Errors+import Bindings.Libgit2.Oid import Bindings.Libgit2.Tree-import Bindings.Libgit2.Revwalk+import Bindings.Libgit2.Odb+import Bindings.Libgit2.Common+import Bindings.Libgit2.Object
Bindings/Libgit2/Blob.hsc view
@@ -8,10 +8,10 @@ import Bindings.Libgit2.Types import Bindings.Libgit2.Oid import Bindings.Libgit2.Object-#ccall git_blob_set_rawcontent_fromfile , Ptr <git_blob> -> CString -> IO (CInt)-#ccall git_blob_set_rawcontent , Ptr <git_blob> -> Ptr Word8 -> CSize -> IO (CInt)-#ccall git_blob_rawcontent , Ptr <git_blob> -> IO (Ptr Word8)+#ccall git_blob_rawcontent , Ptr <git_blob> -> IO (Ptr CChar) #ccall git_blob_rawsize , Ptr <git_blob> -> IO (CInt)-#ccall git_blob_writefile , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)+#ccall git_blob_create_fromfile , Ptr <git_oid> -> Ptr <git_repository> -> CString -> IO (CInt)+#ccall git_blob_create_frombuffer , Ptr <git_oid> -> Ptr <git_repository> -> Ptr CChar -> CSize -> IO (CInt) #cinline git_blob_lookup , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)-#cinline git_blob_new , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> IO (CInt)+#cinline git_blob_lookup_prefix , Ptr (Ptr <git_blob>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)+#cinline git_blob_close , Ptr <git_blob> -> IO ()
Bindings/Libgit2/Blob.hsc.helper.c view
@@ -3,4 +3,5 @@ #include <git2.h> BC_INLINE3(git_blob_lookup, git_blob **, git_repository *, const git_oid *,int)-BC_INLINE2(git_blob_new, git_blob **, git_repository *,int)+BC_INLINE4(git_blob_lookup_prefix, git_blob **, git_repository *, const git_oid *, unsigned int ,int)+BC_INLINE1VOID(git_blob_close, git_blob *)
Bindings/Libgit2/Commit.hsc view
@@ -16,12 +16,11 @@ #ccall git_commit_committer , Ptr <git_commit> -> IO (Ptr <git_signature>) #ccall git_commit_author , Ptr <git_commit> -> IO (Ptr <git_signature>) #ccall git_commit_tree , Ptr (Ptr <git_tree>) -> Ptr <git_commit> -> IO (CInt)+#ccall git_commit_tree_oid , Ptr <git_commit> -> IO (Ptr <git_oid>) #ccall git_commit_parentcount , Ptr <git_commit> -> IO (CUInt) #ccall git_commit_parent , Ptr (Ptr <git_commit>) -> Ptr <git_commit> -> CUInt -> IO (CInt)-#ccall git_commit_add_parent , Ptr <git_commit> -> Ptr <git_commit> -> IO (CInt)-#ccall git_commit_set_message , Ptr <git_commit> -> CString -> IO ()-#ccall git_commit_set_committer , Ptr <git_commit> -> Ptr <git_signature> -> IO ()-#ccall git_commit_set_author , Ptr <git_commit> -> Ptr <git_signature> -> IO ()-#ccall git_commit_set_tree , Ptr <git_commit> -> Ptr <git_tree> -> IO (CInt)+#ccall git_commit_parent_oid , Ptr <git_commit> -> CUInt -> IO (Ptr <git_oid>)+#ccall git_commit_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_signature> -> Ptr <git_signature> -> CString -> Ptr <git_tree> -> CInt -> Ptr (Ptr <git_commit>) -> IO (CInt) #cinline git_commit_lookup , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)-#cinline git_commit_new , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> IO (CInt)+#cinline git_commit_lookup_prefix , Ptr (Ptr <git_commit>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)+#cinline git_commit_close , Ptr <git_commit> -> IO ()
Bindings/Libgit2/Commit.hsc.helper.c view
@@ -3,4 +3,5 @@ #include <git2.h> BC_INLINE3(git_commit_lookup, git_commit **, git_repository *, const git_oid *,int)-BC_INLINE2(git_commit_new, git_commit **, git_repository *,int)+BC_INLINE4(git_commit_lookup_prefix, git_commit **, git_repository *, const git_oid *, unsigned ,int)+BC_INLINE1VOID(git_commit_close, git_commit *)
Bindings/Libgit2/Common.hsc view
@@ -4,30 +4,8 @@ module Bindings.Libgit2.Common where #strict_import -import Bindings.Libgit2.ThreadUtils-#num GIT_SUCCESS-#num GIT_ERROR-#num GIT_ENOTOID-#num GIT_ENOTFOUND-#num GIT_ENOMEM-#num GIT_EOSERR-#num GIT_EOBJTYPE-#num GIT_EOBJCORRUPTED-#num GIT_ENOTAREPO-#num GIT_EINVALIDTYPE-#num GIT_EMISSINGOBJDATA-#num GIT_EPACKCORRUPTED-#num GIT_EFLOCKFAIL-#num GIT_EZLIB-#num GIT_EBUSY-#num GIT_EBAREINDEX-#num GIT_EINVALIDREFNAME-#num GIT_EREFCORRUPTED-#num GIT_ETOONESTEDSYMREF-#num GIT_EPACKEDREFSCORRUPTED-#num GIT_EINVALIDPATH-#num GIT_EREVWALKOVER-#num GIT_EINVALIDREFSTATE+#num GIT_PATH_LIST_SEPARATOR+#num GIT_PATH_MAX {- typedef struct { char **strings; size_t count;@@ -37,3 +15,4 @@ #field count , CSize #stoptype #ccall git_strarray_free , Ptr <git_strarray> -> IO ()+#ccall git_libgit2_version , Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()
+ Bindings/Libgit2/Config.hsc view
@@ -0,0 +1,36 @@++#include <bindings.dsl.h>+#include <git2.h>+module Bindings.Libgit2.Config where+#strict_import++import Bindings.Libgit2.Common+import Bindings.Libgit2.Types++#starttype struct git_config_file+#field cfg, Ptr <git_config>+#field open, FunPtr (Ptr <git_config_file> -> IO CInt)+#field get, FunPtr (Ptr <git_config_file> -> CString -> Ptr CString -> IO CInt)+#field set, FunPtr (Ptr <git_config_file> -> CString -> CString -> IO CInt)+#field foreach, FunPtr (Ptr <git_config_file> -> FunPtr (CString -> CString -> Ptr () -> CInt) -> Ptr () -> IO CInt)+#field free, FunPtr (Ptr <git_config_file> -> IO ())+#stoptype++#ccall git_config_find_global , CString -> IO (CInt)+#ccall git_config_open_global , Ptr (Ptr <git_config>) -> IO (CInt)+#ccall git_config_file__ondisk , Ptr (Ptr <git_config_file>) -> CString -> IO (CInt)+#ccall git_config_new , Ptr (Ptr <git_config>) -> IO (CInt)+#ccall git_config_add_file , Ptr <git_config> -> Ptr <git_config_file> -> CInt -> IO (CInt)+#ccall git_config_add_file_ondisk , Ptr <git_config> -> CString -> CInt -> IO (CInt)+#ccall git_config_open_ondisk , Ptr (Ptr <git_config>) -> CString -> IO (CInt)+#ccall git_config_free , Ptr <git_config> -> IO ()+#ccall git_config_get_int , Ptr <git_config> -> CString -> Ptr CInt -> IO (CInt)+#ccall git_config_get_long , Ptr <git_config> -> CString -> CLong -> IO (CInt)+#ccall git_config_get_bool , Ptr <git_config> -> CString -> Ptr CInt -> IO (CInt)+#ccall git_config_get_string , Ptr <git_config> -> CString -> Ptr CString -> IO (CInt)+#ccall git_config_set_int , Ptr <git_config> -> CString -> CInt -> IO (CInt)+#ccall git_config_set_long , Ptr <git_config> -> CString -> CLong -> IO (CInt)+#ccall git_config_set_bool , Ptr <git_config> -> CString -> CInt -> IO (CInt)+#ccall git_config_set_string , Ptr <git_config> -> CString -> CString -> IO (CInt)+#ccall git_config_delete , Ptr <git_config> -> CString -> IO (CInt)+#ccall git_config_foreach , Ptr <git_config> -> CInt -> IO (CInt)
Bindings/Libgit2/Errors.hsc view
@@ -4,5 +4,64 @@ module Bindings.Libgit2.Errors where #strict_import +import Bindings.Libgit2.Common+{- typedef enum {+ GIT_OK = 0,+ GIT_ERROR = -1,+ GIT_ENOTFOUND = -3,+ GIT_EEXISTS = -4,+ GIT_EAMBIGUOUS = -5,+ GIT_EBUFS = -6, + GIT_PASSTHROUGH = -30,+ GIT_REVWALKOVER = -31,+}; -}+#num GIT_OK+#num GIT_ERROR+#num GIT_ENOTFOUND+#num GIT_EEXISTS+#num GIT_EAMBIGUOUS+#num GIT_EBUFS++#num GIT_PASSTHROUGH+#num GIT_REVWALKOVER+{- typedef struct git_error {+ char *message;+ int klass;+} git_error; -}+{- typedef enum {+ GITERR_NOMEMORY,+ GITERR_OS,+ GITERR_INVALID,+ GITERR_REFERENCE,+ GITERR_ZLIB,+ GITERR_REPOSITORY,+ GITERR_CONFIG,+ GITERR_REGEX,+ GITERR_ODB,+ GITERR_INDEX,+ GITERR_OBJECT,+ GITERR_NET,+ GITERR_TAG,+ GITERR_TREE,+ GITERR_INDEXER,+} git_error_t; -}+#integral_t git_error_t+#num GITERR_NOMEMORY+#num GITERR_OS+#num GITERR_INVALID+#num GITERR_REFERENCE+#num GITERR_ZLIB+#num GITERR_REPOSITORY+#num GITERR_CONFIG+#num GITERR_REGEX+#num GITERR_ODB+#num GITERR_INDEX+#num GITERR_OBJECT+#num GITERR_NET+#num GITERR_TAG+#num GITERR_TREE+#num GITERR_INDEXER+#ccall git_lasterror , IO (CString) #ccall git_strerror , CInt -> IO (CString)+#ccall git_clearerror , IO ()
Bindings/Libgit2/Index.hsc view
@@ -12,6 +12,20 @@ #num GIT_IDXENTRY_EXTENDED #num GIT_IDXENTRY_VALID #num GIT_IDXENTRY_STAGESHIFT+#num GIT_IDXENTRY_UPDATE+#num GIT_IDXENTRY_REMOVE+#num GIT_IDXENTRY_UPTODATE+#num GIT_IDXENTRY_ADDED+#num GIT_IDXENTRY_HASHED+#num GIT_IDXENTRY_UNHASHED+#num GIT_IDXENTRY_WT_REMOVE+#num GIT_IDXENTRY_CONFLICTED+#num GIT_IDXENTRY_UNPACKED+#num GIT_IDXENTRY_NEW_SKIP_WORKTREE+#num GIT_IDXENTRY_INTENT_TO_ADD+#num GIT_IDXENTRY_SKIP_WORKTREE+#num GIT_IDXENTRY_EXTENDED2+#num GIT_IDXENTRY_EXTENDED_FLAGS {- typedef struct { git_time_t seconds; @@ -37,7 +51,7 @@ unsigned short flags; unsigned short flags_extended; - char *path;+ const char *path; } git_index_entry; -} #starttype git_index_entry #field ctime , <git_index_time>@@ -53,15 +67,31 @@ #field flags_extended , CUShort #field path , CString #stoptype-#ccall git_index_open_bare , Ptr (Ptr <git_index>) -> CString -> IO (CInt)-#ccall git_index_open_inrepo , Ptr (Ptr <git_index>) -> Ptr <git_repository> -> IO (CInt)+{- typedef struct git_index_entry_unmerged {+ unsigned int mode[3];+ git_oid oid[3];+ const char *path;+} git_index_entry_unmerged; -}+#starttype git_index_entry_unmerged+#array_field mode , CUInt+#array_field oid , <git_oid>+#field path , CString+#stoptype+#ccall git_index_open , Ptr (Ptr <git_index>) -> CString -> IO (CInt) #ccall git_index_clear , Ptr <git_index> -> IO () #ccall git_index_free , Ptr <git_index> -> IO () #ccall git_index_read , Ptr <git_index> -> IO (CInt) #ccall git_index_write , Ptr <git_index> -> IO (CInt) #ccall git_index_find , Ptr <git_index> -> CString -> IO (CInt)+#ccall git_index_uniq , Ptr <git_index> -> IO () #ccall git_index_add , Ptr <git_index> -> CString -> CInt -> IO (CInt)+#ccall git_index_add2 , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt)+#ccall git_index_append , Ptr <git_index> -> CString -> CInt -> IO (CInt)+#ccall git_index_append2 , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt) #ccall git_index_remove , Ptr <git_index> -> CInt -> IO (CInt)-#ccall git_index_insert , Ptr <git_index> -> Ptr <git_index_entry> -> IO (CInt)-#ccall git_index_get , Ptr <git_index> -> CInt -> IO (Ptr <git_index_entry>)+#ccall git_index_get , Ptr <git_index> -> CUInt -> IO (Ptr <git_index_entry>) #ccall git_index_entrycount , Ptr <git_index> -> IO (CUInt)+#ccall git_index_entrycount_unmerged , Ptr <git_index> -> IO (CUInt)+#ccall git_index_get_unmerged_bypath , Ptr <git_index> -> CString -> IO (Ptr <git_index_entry_unmerged>)+#ccall git_index_get_unmerged_byindex , Ptr <git_index> -> CUInt -> IO (Ptr <git_index_entry_unmerged>)+#ccall git_index_entry_stage , Ptr <git_index_entry> -> IO (CInt)
+ Bindings/Libgit2/Net.hsc view
@@ -0,0 +1,12 @@++#include <bindings.dsl.h>+#include <git2.h>+module Bindings.Libgit2.Net where+#strict_import++import Bindings.Libgit2.Common+import Bindings.Libgit2.Oid+import Bindings.Libgit2.Types+#num GIT_DEFAULT_PORT+#num GIT_DIR_FETCH+#num GIT_DIR_PUSH
Bindings/Libgit2/Object.hsc view
@@ -8,8 +8,7 @@ import Bindings.Libgit2.Types import Bindings.Libgit2.Oid #ccall git_object_lookup , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_oid> -> <git_otype> -> IO (CInt)-#ccall git_object_new , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> <git_otype> -> IO (CInt)-#ccall git_object_write , Ptr <git_object> -> IO (CInt)+#ccall git_object_lookup_prefix , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> <git_otype> -> IO (CInt) #ccall git_object_id , Ptr <git_object> -> IO (Ptr <git_oid>) #ccall git_object_type , Ptr <git_object> -> IO (<git_otype>) #ccall git_object_owner , Ptr <git_object> -> IO (Ptr <git_repository>)
Bindings/Libgit2/Odb.hsc view
@@ -7,24 +7,23 @@ import Bindings.Libgit2.Common import Bindings.Libgit2.Types import Bindings.Libgit2.Oid-{- typedef struct {- void *data; - size_t len; - git_otype type; -} git_rawobj; -}-#starttype git_rawobj-#field data , Ptr Word8-#field len , CSize-#field type , <git_otype>-#stoptype+import Bindings.Libgit2.OdbBackend #ccall git_odb_new , Ptr (Ptr <git_odb>) -> IO (CInt) #ccall git_odb_open , Ptr (Ptr <git_odb>) -> CString -> IO (CInt) #ccall git_odb_add_backend , Ptr <git_odb> -> Ptr <git_odb_backend> -> CInt -> IO (CInt) #ccall git_odb_add_alternate , Ptr <git_odb> -> Ptr <git_odb_backend> -> CInt -> IO (CInt) #ccall git_odb_close , Ptr <git_odb> -> IO ()-#ccall git_odb_read , Ptr <git_rawobj> -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)-#ccall git_odb_read_header , Ptr <git_rawobj> -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)-#ccall git_odb_write , Ptr <git_oid> -> Ptr <git_odb> -> Ptr <git_rawobj> -> IO (CInt)+#ccall git_odb_read , Ptr (Ptr <git_odb_object>) -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)+#ccall git_odb_read_prefix , Ptr (Ptr <git_odb_object>) -> Ptr <git_odb> -> Ptr <git_oid> -> CUInt -> IO (CInt)+#ccall git_odb_read_header , Ptr CSize -> Ptr <git_otype> -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt) #ccall git_odb_exists , Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)-#ccall git_rawobj_hash , Ptr <git_oid> -> Ptr <git_rawobj> -> IO (CInt)-#ccall git_rawobj_close , Ptr <git_rawobj> -> IO ()+#ccall git_odb_write , Ptr <git_oid> -> Ptr <git_odb> -> Ptr CChar -> CSize -> <git_otype> -> IO (CInt)+#ccall git_odb_open_wstream , Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb> -> CSize -> <git_otype> -> IO (CInt)+#ccall git_odb_open_rstream , Ptr (Ptr <git_odb_stream>) -> Ptr <git_odb> -> Ptr <git_oid> -> IO (CInt)+#ccall git_odb_hash , Ptr <git_oid> -> Ptr CChar -> CSize -> <git_otype> -> IO (CInt)+#ccall git_odb_hashfile , Ptr <git_oid> -> CString -> <git_otype> -> IO (CInt)+#ccall git_odb_object_close , Ptr <git_odb_object> -> IO ()+#ccall git_odb_object_id , Ptr <git_odb_object> -> IO (Ptr <git_oid>)+#ccall git_odb_object_data , Ptr <git_odb_object> -> IO (Ptr CChar)+#ccall git_odb_object_size , Ptr <git_odb_object> -> IO (CSize)+#ccall git_odb_object_type , Ptr <git_odb_object> -> IO (<git_otype>)
Bindings/Libgit2/OdbBackend.hsc view
@@ -7,6 +7,13 @@ import Bindings.Libgit2.Common import Bindings.Libgit2.Types import Bindings.Libgit2.Oid-import Bindings.Libgit2.Odb+{- typedef enum {+ GIT_STREAM_RDONLY = (1 << 1),+ GIT_STREAM_WRONLY = (1 << 2),+ GIT_STREAM_RW = (GIT_STREAM_RDONLY | GIT_STREAM_WRONLY),+} git_odb_streammode; -}+#num GIT_STREAM_RDONLY+#num GIT_STREAM_WRONLY+#num GIT_STREAM_RW #ccall git_odb_backend_pack , Ptr (Ptr <git_odb_backend>) -> CString -> IO (CInt) #ccall git_odb_backend_loose , Ptr (Ptr <git_odb_backend>) -> CString -> IO (CInt)
Bindings/Libgit2/Oid.hsc view
@@ -8,6 +8,7 @@ import Bindings.Libgit2.Types #num GIT_OID_RAWSZ #num GIT_OID_HEXSZ+#num GIT_OID_MINPREFIXLEN #opaque_t git_oid_shorten {- typedef struct { @@ -16,11 +17,13 @@ #starttype git_oid #array_field id , Word8 #stoptype-#ccall git_oid_mkstr , Ptr <git_oid> -> CString -> IO (CInt)-#ccall git_oid_mkraw , Ptr <git_oid> -> Ptr Word8 -> IO ()+#ccall git_oid_fromstr , Ptr <git_oid> -> CString -> IO (CInt)+#ccall git_oid_fromstrn , Ptr <git_oid> -> CString -> CSize -> IO (CInt)+#ccall git_oid_fromraw , Ptr <git_oid> -> Ptr Word8 -> IO () #ccall git_oid_fmt , CString -> Ptr <git_oid> -> IO () #ccall git_oid_pathfmt , CString -> Ptr <git_oid> -> IO () #ccall git_oid_allocfmt , Ptr <git_oid> -> IO (CString) #ccall git_oid_to_string , CString -> CSize -> Ptr <git_oid> -> IO (CString) #ccall git_oid_cpy , Ptr <git_oid> -> Ptr <git_oid> -> IO () #ccall git_oid_cmp , Ptr <git_oid> -> Ptr <git_oid> -> IO (CInt)+#ccall git_oid_ncmp , Ptr <git_oid> -> Ptr <git_oid> -> CUInt -> IO (CInt)
+ Bindings/Libgit2/Reflog.hsc view
@@ -0,0 +1,18 @@++#include <bindings.dsl.h>+#include <git2.h>+module Bindings.Libgit2.Reflog where+#strict_import++import Bindings.Libgit2.Common+import Bindings.Libgit2.Types+import Bindings.Libgit2.Oid+#ccall git_reflog_read , Ptr (Ptr <git_reflog>) -> Ptr <git_reference> -> IO (CInt)+#ccall git_reflog_write , Ptr <git_reference> -> Ptr <git_oid> -> Ptr <git_signature> -> CString -> IO (CInt)+#ccall git_reflog_entrycount , Ptr <git_reflog> -> IO (CUInt)+#ccall git_reflog_entry_byindex , Ptr <git_reflog> -> CUInt -> IO (Ptr <git_reflog_entry>)+#ccall git_reflog_entry_oidold , Ptr <git_reflog_entry> -> IO (CString)+#ccall git_reflog_entry_oidnew , Ptr <git_reflog_entry> -> IO (CString)+#ccall git_reflog_entry_committer , Ptr <git_reflog_entry> -> IO (Ptr <git_signature>)+#ccall git_reflog_entry_msg , Ptr <git_reflog_entry> -> IO (CString)+#ccall git_reflog_free , Ptr <git_reflog> -> IO ()
Bindings/Libgit2/Refs.hsc view
@@ -8,17 +8,18 @@ import Bindings.Libgit2.Types import Bindings.Libgit2.Oid #ccall git_reference_lookup , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> IO (CInt)-#ccall git_reference_create_symbolic , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> CString -> IO (CInt)-#ccall git_reference_create_oid , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> Ptr <git_oid> -> IO (CInt)+#ccall git_reference_create_symbolic , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> CString -> CInt -> IO (CInt)+#ccall git_reference_create_oid , Ptr (Ptr <git_reference>) -> Ptr <git_repository> -> CString -> Ptr <git_oid> -> CInt -> IO (CInt) #ccall git_reference_oid , Ptr <git_reference> -> IO (Ptr <git_oid>) #ccall git_reference_target , Ptr <git_reference> -> IO (CString)-#ccall git_reference_type , Ptr <git_reference> -> IO (<git_rtype>)+#ccall git_reference_type , Ptr <git_reference> -> IO (<git_ref_t>) #ccall git_reference_name , Ptr <git_reference> -> IO (CString) #ccall git_reference_resolve , Ptr (Ptr <git_reference>) -> Ptr <git_reference> -> IO (CInt) #ccall git_reference_owner , Ptr <git_reference> -> IO (Ptr <git_repository>) #ccall git_reference_set_target , Ptr <git_reference> -> CString -> IO (CInt) #ccall git_reference_set_oid , Ptr <git_reference> -> Ptr <git_oid> -> IO (CInt)-#ccall git_reference_rename , Ptr <git_reference> -> CString -> IO (CInt)+#ccall git_reference_rename , Ptr <git_reference> -> CString -> CInt -> IO (CInt) #ccall git_reference_delete , Ptr <git_reference> -> IO (CInt) #ccall git_reference_packall , Ptr <git_repository> -> IO (CInt) #ccall git_reference_listall , Ptr <git_strarray> -> Ptr <git_repository> -> CUInt -> IO (CInt)+#ccall git_reference_foreach , Ptr <git_repository> -> CUInt -> CInt -> IO (CInt)
+ Bindings/Libgit2/Refspec.hsc view
@@ -0,0 +1,6 @@++#include <bindings.dsl.h>+#include <git2.h>++module Bindings.Libgit2.Refspec where+#strict_import
Bindings/Libgit2/Repository.hsc view
@@ -10,8 +10,14 @@ #ccall git_repository_open , Ptr (Ptr <git_repository>) -> CString -> IO (CInt) #ccall git_repository_open2 , Ptr (Ptr <git_repository>) -> CString -> CString -> CString -> CString -> IO (CInt) #ccall git_repository_open3 , Ptr (Ptr <git_repository>) -> CString -> Ptr <git_odb> -> CString -> CString -> IO (CInt)+#ccall git_repository_discover , CString -> CSize -> CString -> CInt -> CString -> IO (CInt) #ccall git_repository_database , Ptr <git_repository> -> IO (Ptr <git_odb>) #ccall git_repository_index , Ptr (Ptr <git_index>) -> Ptr <git_repository> -> IO (CInt) #ccall git_repository_free , Ptr <git_repository> -> IO ()-#ccall git_repository_gc , Ptr <git_repository> -> IO (CInt) #ccall git_repository_init , Ptr (Ptr <git_repository>) -> CString -> CUInt -> IO (CInt)+#ccall git_repository_head_detached , Ptr <git_repository> -> IO (CInt)+#ccall git_repository_head_orphan , Ptr <git_repository> -> IO (CInt)+#ccall git_repository_is_empty , Ptr <git_repository> -> IO (CInt)+#ccall git_repository_path , Ptr <git_repository> -> IO (CString)+#ccall git_repository_is_bare , Ptr <git_repository> -> IO (CInt)+#ccall git_repository_config , Ptr (Ptr <git_config>) -> Ptr <git_repository> -> CString -> CString -> IO (CInt)
Bindings/Libgit2/Signature.hsc view
@@ -7,5 +7,6 @@ import Bindings.Libgit2.Common import Bindings.Libgit2.Types #ccall git_signature_new , CString -> CString -> CTime -> CInt -> IO (Ptr <git_signature>)+#ccall git_signature_now , CString -> CString -> IO (Ptr <git_signature>) #ccall git_signature_dup , Ptr <git_signature> -> IO (Ptr <git_signature>) #ccall git_signature_free , Ptr <git_signature> -> IO ()
Bindings/Libgit2/Tag.hsc view
@@ -15,9 +15,11 @@ #ccall git_tag_name , Ptr <git_tag> -> IO (CString) #ccall git_tag_tagger , Ptr <git_tag> -> IO (Ptr <git_signature>) #ccall git_tag_message , Ptr <git_tag> -> IO (CString)-#ccall git_tag_set_target , Ptr <git_tag> -> Ptr <git_object> -> IO (CInt)-#ccall git_tag_set_name , Ptr <git_tag> -> CString -> IO ()-#ccall git_tag_set_tagger , Ptr <git_tag> -> Ptr <git_signature> -> IO ()-#ccall git_tag_set_message , Ptr <git_tag> -> CString -> IO ()+#ccall git_tag_create , Ptr <git_oid> -> Ptr <git_repository> -> CString -> Ptr <git_object> -> Ptr <git_signature> -> CString -> CInt -> IO (CInt)+#ccall git_tag_create_frombuffer , Ptr <git_oid> -> Ptr <git_repository> -> CString -> CInt -> IO (CInt)+#ccall git_tag_delete , Ptr <git_repository> -> CString -> IO (CInt)+#ccall git_tag_list , Ptr <git_strarray> -> Ptr <git_repository> -> IO (CInt)+#ccall git_tag_list_match , Ptr <git_strarray> -> CString -> Ptr <git_repository> -> IO (CInt) #cinline git_tag_lookup , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)-#cinline git_tag_new , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> IO (CInt)+#cinline git_tag_lookup_prefix , Ptr (Ptr <git_tag>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)+#cinline git_tag_close , Ptr <git_tag> -> IO ()
Bindings/Libgit2/Tag.hsc.helper.c view
@@ -3,4 +3,5 @@ #include <git2.h> BC_INLINE3(git_tag_lookup, git_tag **, git_repository *, const git_oid *,int)-BC_INLINE2(git_tag_new, git_tag **, git_repository *,int)+BC_INLINE4(git_tag_lookup_prefix, git_tag **, git_repository *, const git_oid *, unsigned int ,int)+BC_INLINE1VOID(git_tag_close, git_tag *)
− Bindings/Libgit2/ThreadUtils.hsc
@@ -1,9 +0,0 @@--#include <bindings.dsl.h>-#include <git2.h>-module Bindings.Libgit2.ThreadUtils where-#strict_import---#num GIT_HAS_TLS-#num GIT_THREADS
Bindings/Libgit2/Tree.hsc view
@@ -9,19 +9,23 @@ import Bindings.Libgit2.Oid import Bindings.Libgit2.Object #ccall git_tree_id , Ptr <git_tree> -> IO (Ptr <git_oid>)-#ccall git_tree_entrycount , Ptr <git_tree> -> IO (CSize)+#ccall git_tree_entrycount , Ptr <git_tree> -> IO (CUInt) #ccall git_tree_entry_byname , Ptr <git_tree> -> CString -> IO (Ptr <git_tree_entry>)-#ccall git_tree_entry_byindex , Ptr <git_tree> -> CInt -> IO (Ptr <git_tree_entry>)+#ccall git_tree_entry_byindex , Ptr <git_tree> -> CUInt -> IO (Ptr <git_tree_entry>) #ccall git_tree_entry_attributes , Ptr <git_tree_entry> -> IO (CUInt) #ccall git_tree_entry_name , Ptr <git_tree_entry> -> IO (CString) #ccall git_tree_entry_id , Ptr <git_tree_entry> -> IO (Ptr <git_oid>)-#ccall git_tree_entry_2object , Ptr (Ptr <git_object>) -> Ptr <git_tree_entry> -> IO (CInt)-#ccall git_tree_add_entry , Ptr (Ptr <git_tree_entry>) -> Ptr <git_tree> -> Ptr <git_oid> -> CString -> CInt -> IO (CInt)-#ccall git_tree_remove_entry_byindex , Ptr <git_tree> -> CInt -> IO (CInt)-#ccall git_tree_remove_entry_byname , Ptr <git_tree> -> CString -> IO (CInt)-#ccall git_tree_clear_entries , Ptr <git_tree> -> IO ()-#ccall git_tree_entry_set_id , Ptr <git_tree_entry> -> Ptr <git_oid> -> IO ()-#ccall git_tree_entry_set_name , Ptr <git_tree_entry> -> CString -> IO ()-#ccall git_tree_entry_set_attributes , Ptr <git_tree_entry> -> CUInt -> IO (CInt)+#ccall git_tree_entry_type , Ptr <git_tree_entry> -> IO (<git_otype>)+#ccall git_tree_entry_2object , Ptr (Ptr <git_object>) -> Ptr <git_repository> -> Ptr <git_tree_entry> -> IO (CInt)+#ccall git_tree_create_fromindex , Ptr <git_oid> -> Ptr <git_index> -> IO (CInt)+#ccall git_treebuilder_create , Ptr (Ptr <git_treebuilder>) -> Ptr <git_tree> -> IO (CInt)+#ccall git_treebuilder_clear , Ptr <git_treebuilder> -> IO ()+#ccall git_treebuilder_free , Ptr <git_treebuilder> -> IO ()+#ccall git_treebuilder_get , Ptr <git_treebuilder> -> CString -> IO (Ptr <git_tree_entry>)+#ccall git_treebuilder_insert , Ptr (Ptr <git_tree_entry>) -> Ptr <git_treebuilder> -> CString -> Ptr <git_oid> -> CUInt -> IO (CInt)+#ccall git_treebuilder_remove , Ptr <git_treebuilder> -> CString -> IO (CInt)+#ccall git_treebuilder_filter , Ptr <git_treebuilder> -> CInt -> IO ()+#ccall git_treebuilder_write , Ptr <git_oid> -> Ptr <git_repository> -> Ptr <git_treebuilder> -> IO (CInt) #cinline git_tree_lookup , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> Ptr <git_oid> -> IO (CInt)-#cinline git_tree_new , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> IO (CInt)+#cinline git_tree_lookup_prefix , Ptr (Ptr <git_tree>) -> Ptr <git_repository> -> Ptr <git_oid> -> CUInt -> IO (CInt)+#cinline git_tree_close , Ptr <git_tree> -> IO ()
Bindings/Libgit2/Tree.hsc.helper.c view
@@ -3,4 +3,5 @@ #include <git2.h> BC_INLINE3(git_tree_lookup, git_tree **, git_repository *, const git_oid *,int)-BC_INLINE2(git_tree_new, git_tree **, git_repository *,int)+BC_INLINE4(git_tree_lookup_prefix, git_tree **, git_repository *, const git_oid *, unsigned int ,int)+BC_INLINE1VOID(git_tree_close, git_tree *)
Bindings/Libgit2/Types.hsc view
@@ -36,8 +36,8 @@ GIT_REF_PACKED = 4, GIT_REF_HAS_PEEL = 8, GIT_REF_LISTALL = GIT_REF_OID|GIT_REF_SYMBOLIC|GIT_REF_PACKED,-} git_rtype; -}-#integral_t git_rtype+} git_ref_t; -}+#integral_t git_ref_t #num GIT_REF_INVALID #num GIT_REF_OID #num GIT_REF_SYMBOLIC@@ -46,6 +46,8 @@ #num GIT_REF_LISTALL #opaque_t git_odb #opaque_t git_odb_backend+#opaque_t git_odb_object+#opaque_t git_odb_stream #opaque_t git_repository #opaque_t git_object #opaque_t git_revwalk@@ -54,10 +56,19 @@ #opaque_t git_commit #opaque_t git_tree_entry #opaque_t git_tree+#opaque_t git_treebuilder #opaque_t git_index+#opaque_t git_config+#opaque_t git_reflog_entry+#opaque_t git_reflog #opaque_t git_reference+#opaque_t git_refspec+#opaque_t git_remote+#opaque_t git_transport+#opaque_t git_remote_head+#opaque_t git_headarray {- typedef struct git_time {- time_t time; + git_time_t time; int offset; } git_time; -} #starttype git_time
hlibgit2.cabal view
@@ -1,86 +1,60 @@- Name: hlibgit2-Version: 0.1-Synopsis: Bindings to libgit2 v0.1.0-265-gb5c5f0f-Description: Generated bindings to libgit2.+Version: 0.2+Synopsis: Low-level bindings to libgit2.+Description: Bindings to libgit2 v0.16.0-471-g5b9fac3 License-file: LICENSE License: MIT-Author: Sakari Jokinen, Jacob Stanley-Maintainer: sakariij@gmail.com+Author: Sakari Jokinen, Jacob Stanley, John Wiegley+Maintainer: johnw@newartisans.com Build-Type: Simple Cabal-Version: >=1.10 Category: FFI -extra-source-files:- tests/Main.hs~- tests/Main.hs- tests/Main.o- tests/Main.hi- libgit2/include/git2.h- libgit2/include/git2/refs.h- libgit2/include/git2/odb.h- libgit2/include/git2/types.h+Extra-source-files:+ libgit2/include/git2/attr.h+ libgit2/include/git2/blob.h+ libgit2/include/git2/branch.h+ libgit2/include/git2/commit.h+ libgit2/include/git2/common.h+ libgit2/include/git2/config.h+ libgit2/include/git2/diff.h+ libgit2/include/git2/errors.h libgit2/include/git2/index.h- libgit2/include/git2/thread-utils.h- libgit2/include/git2/oid.h- libgit2/include/git2/tag.h- libgit2/include/git2/zlib.h+ libgit2/include/git2/indexer.h+ libgit2/include/git2/inttypes.h+ libgit2/include/git2/merge.h+ libgit2/include/git2/net.h+ libgit2/include/git2/notes.h libgit2/include/git2/object.h- libgit2/include/git2/signature.h- libgit2/include/git2/blob.h+ libgit2/include/git2/odb.h libgit2/include/git2/odb_backend.h+ libgit2/include/git2/oid.h+ libgit2/include/git2/reflog.h+ libgit2/include/git2/refs.h+ libgit2/include/git2/refspec.h+ libgit2/include/git2/remote.h libgit2/include/git2/repository.h- libgit2/include/git2/common.h- libgit2/include/git2/commit.h- libgit2/include/git2/errors.h- libgit2/include/git2/tree.h libgit2/include/git2/revwalk.h- libgit2/src/cc-compat.h- libgit2/src/refs.h- libgit2/src/odb.h- libgit2/src/delta-apply.h- libgit2/src/index.h- libgit2/src/thread-utils.h- libgit2/src/vector.h- libgit2/src/tag.h- libgit2/src/dir.h- libgit2/src/map.h- libgit2/src/signature.h- libgit2/src/blob.h- libgit2/src/hash.h- libgit2/src/fileops.h- libgit2/src/repository.h- libgit2/src/hashtable.h- libgit2/src/common.h- libgit2/src/util.h- libgit2/src/bswap.h- libgit2/src/t03-data.h- libgit2/src/filebuf.h- libgit2/src/mingw-compat.h- libgit2/src/commit.h- libgit2/src/pqueue.h- libgit2/src/msvc-compat.h- libgit2/src/tree.h- libgit2/src/block-sha1/sha1.h- libgit2/deps/zlib/inffixed.h- libgit2/deps/zlib/zconf.h- libgit2/deps/zlib/inflate.h- libgit2/deps/zlib/inftrees.h- libgit2/deps/zlib/zlib.h- libgit2/deps/zlib/trees.h- libgit2/deps/zlib/zutil.h- libgit2/deps/zlib/inffast.h- libgit2/deps/zlib/deflate.h- libgit2/src/win32/pthread.h+ libgit2/include/git2/signature.h+ libgit2/include/git2/status.h+ libgit2/include/git2/stdint.h+ libgit2/include/git2/submodule.h+ libgit2/include/git2/tag.h+ libgit2/include/git2/threads.h+ libgit2/include/git2/tree.h+ libgit2/include/git2/types.h+ libgit2/include/git2/version.h+ libgit2/include/git2/windows.h+ libgit2/include/git2.h Source-repository head type: git- location: git://github.com/sakari/hlibgit2.git+ location: git://github.com/jwiegley/hlibgit2.git Source-repository this type: git- location: git://github.com/sakari/hlibgit2.git- tag: hlibgit2-0.1+ location: git://github.com/jwiegley/hlibgit2.git+ tag: hlibgit2-0.1-17-gd7b22d6 test-suite smoke default-language: Haskell98@@ -98,82 +72,36 @@ ForeignFunctionInterface build-depends: base >= 3 && < 5,- bindings-DSL >= 1.0.9 && < 1.1+ bindings-DSL >= 1.0.11 exposed-modules: Bindings.Libgit2- Bindings.Libgit2.Refs- Bindings.Libgit2.Odb+ Bindings.Libgit2.Repository+ Bindings.Libgit2.Config Bindings.Libgit2.Types- Bindings.Libgit2.Index- Bindings.Libgit2.ThreadUtils- Bindings.Libgit2.Oid+ Bindings.Libgit2.Revwalk+ Bindings.Libgit2.OdbBackend Bindings.Libgit2.Tag- Bindings.Libgit2.Object+ Bindings.Libgit2.Net+ Bindings.Libgit2.Refs+ Bindings.Libgit2.Refspec+ Bindings.Libgit2.Reflog+ Bindings.Libgit2.Commit+ Bindings.Libgit2.Index Bindings.Libgit2.Signature Bindings.Libgit2.Blob- Bindings.Libgit2.OdbBackend- Bindings.Libgit2.Repository- Bindings.Libgit2.Common- Bindings.Libgit2.Commit Bindings.Libgit2.Errors+ Bindings.Libgit2.Oid Bindings.Libgit2.Tree- Bindings.Libgit2.Revwalk+ Bindings.Libgit2.Odb+ Bindings.Libgit2.Common+ Bindings.Libgit2.Object c-sources: Bindings/Libgit2/Tag.hsc.helper.c- Bindings/Libgit2/Blob.hsc.helper.c Bindings/Libgit2/Commit.hsc.helper.c+ Bindings/Libgit2/Blob.hsc.helper.c Bindings/Libgit2/Tree.hsc.helper.c - include-dirs:- libgit2/include- libgit2/src- libgit2/src/block-sha1- libgit2/deps/zlib- c-sources:- libgit2/src/hash.c- libgit2/src/index.c- libgit2/src/pqueue.c- libgit2/src/filebuf.c- libgit2/src/hashtable.c- libgit2/src/util.c- libgit2/src/errors.c- libgit2/src/odb.c- libgit2/src/delta-apply.c- libgit2/src/odb_loose.c- libgit2/src/tree.c- libgit2/src/thread-utils.c- libgit2/src/revwalk.c- libgit2/src/oid.c- libgit2/src/odb_pack.c- libgit2/src/tag.c- libgit2/src/signature.c- libgit2/src/vector.c- libgit2/src/blob.c- libgit2/src/refs.c- libgit2/src/repository.c- libgit2/src/fileops.c- libgit2/src/object.c- libgit2/src/commit.c- libgit2/src/block-sha1/sha1.c- libgit2/deps/zlib/trees.c- libgit2/deps/zlib/zutil.c- libgit2/deps/zlib/inffast.c- libgit2/deps/zlib/adler32.c- libgit2/deps/zlib/deflate.c- libgit2/deps/zlib/inflate.c- libgit2/deps/zlib/inftrees.c-+ include-dirs: libgit2/include+ extra-libraries: git2 if os(windows) cc-options: -DGIT_WIN32 -DNO_VIZ- include-dirs:- libgit2/src/win32- c-sources:- libgit2/src/win32/pthread.c- libgit2/src/win32/dir.c- libgit2/src/win32/fileops.c- libgit2/src/win32/map.c- else- include-dirs:- libgit2/src/unix- c-sources:- libgit2/src/unix/map.c
− libgit2/deps/zlib/adler32.c
@@ -1,169 +0,0 @@-/* adler32.c -- compute the Adler-32 checksum of a data stream- * Copyright (C) 1995-2007 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* @(#) $Id$ */--#include "zutil.h"--#define local static--local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2);--#define BASE 65521UL /* largest prime smaller than 65536 */-#define NMAX 5552-/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */--#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}-#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);-#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);-#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);-#define DO16(buf) DO8(buf,0); DO8(buf,8);--/* use NO_DIVIDE if your processor does not do division in hardware */-#ifdef NO_DIVIDE-# define MOD(a) \- do { \- if (a >= (BASE << 16)) a -= (BASE << 16); \- if (a >= (BASE << 15)) a -= (BASE << 15); \- if (a >= (BASE << 14)) a -= (BASE << 14); \- if (a >= (BASE << 13)) a -= (BASE << 13); \- if (a >= (BASE << 12)) a -= (BASE << 12); \- if (a >= (BASE << 11)) a -= (BASE << 11); \- if (a >= (BASE << 10)) a -= (BASE << 10); \- if (a >= (BASE << 9)) a -= (BASE << 9); \- if (a >= (BASE << 8)) a -= (BASE << 8); \- if (a >= (BASE << 7)) a -= (BASE << 7); \- if (a >= (BASE << 6)) a -= (BASE << 6); \- if (a >= (BASE << 5)) a -= (BASE << 5); \- if (a >= (BASE << 4)) a -= (BASE << 4); \- if (a >= (BASE << 3)) a -= (BASE << 3); \- if (a >= (BASE << 2)) a -= (BASE << 2); \- if (a >= (BASE << 1)) a -= (BASE << 1); \- if (a >= BASE) a -= BASE; \- } while (0)-# define MOD4(a) \- do { \- if (a >= (BASE << 4)) a -= (BASE << 4); \- if (a >= (BASE << 3)) a -= (BASE << 3); \- if (a >= (BASE << 2)) a -= (BASE << 2); \- if (a >= (BASE << 1)) a -= (BASE << 1); \- if (a >= BASE) a -= BASE; \- } while (0)-#else-# define MOD(a) a %= BASE-# define MOD4(a) a %= BASE-#endif--/* ========================================================================= */-uLong ZEXPORT adler32(adler, buf, len)- uLong adler;- const Bytef *buf;- uInt len;-{- unsigned long sum2;- unsigned n;-- /* split Adler-32 into component sums */- sum2 = (adler >> 16) & 0xffff;- adler &= 0xffff;-- /* in case user likes doing a byte at a time, keep it fast */- if (len == 1) {- adler += buf[0];- if (adler >= BASE)- adler -= BASE;- sum2 += adler;- if (sum2 >= BASE)- sum2 -= BASE;- return adler | (sum2 << 16);- }-- /* initial Adler-32 value (deferred check for len == 1 speed) */- if (buf == Z_NULL)- return 1L;-- /* in case short lengths are provided, keep it somewhat fast */- if (len < 16) {- while (len--) {- adler += *buf++;- sum2 += adler;- }- if (adler >= BASE)- adler -= BASE;- MOD4(sum2); /* only added so many BASE's */- return adler | (sum2 << 16);- }-- /* do length NMAX blocks -- requires just one modulo operation */- while (len >= NMAX) {- len -= NMAX;- n = NMAX / 16; /* NMAX is divisible by 16 */- do {- DO16(buf); /* 16 sums unrolled */- buf += 16;- } while (--n);- MOD(adler);- MOD(sum2);- }-- /* do remaining bytes (less than NMAX, still just one modulo) */- if (len) { /* avoid modulos if none remaining */- while (len >= 16) {- len -= 16;- DO16(buf);- buf += 16;- }- while (len--) {- adler += *buf++;- sum2 += adler;- }- MOD(adler);- MOD(sum2);- }-- /* return recombined sums */- return adler | (sum2 << 16);-}--/* ========================================================================= */-local uLong adler32_combine_(adler1, adler2, len2)- uLong adler1;- uLong adler2;- z_off64_t len2;-{- unsigned long sum1;- unsigned long sum2;- unsigned rem;-- /* the derivation of this formula is left as an exercise for the reader */- rem = (unsigned)(len2 % BASE);- sum1 = adler1 & 0xffff;- sum2 = rem * sum1;- MOD(sum2);- sum1 += (adler2 & 0xffff) + BASE - 1;- sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;- if (sum1 >= BASE) sum1 -= BASE;- if (sum1 >= BASE) sum1 -= BASE;- if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);- if (sum2 >= BASE) sum2 -= BASE;- return sum1 | (sum2 << 16);-}--/* ========================================================================= */-uLong ZEXPORT adler32_combine(adler1, adler2, len2)- uLong adler1;- uLong adler2;- z_off_t len2;-{- return adler32_combine_(adler1, adler2, len2);-}--uLong ZEXPORT adler32_combine64(adler1, adler2, len2)- uLong adler1;- uLong adler2;- z_off64_t len2;-{- return adler32_combine_(adler1, adler2, len2);-}
− libgit2/deps/zlib/deflate.c
@@ -1,1834 +0,0 @@-/* deflate.c -- compress data using the deflation algorithm- * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--/*- * ALGORITHM- *- * The "deflation" process depends on being able to identify portions- * of the input text which are identical to earlier input (within a- * sliding window trailing behind the input currently being processed).- *- * The most straightforward technique turns out to be the fastest for- * most input files: try all possible matches and select the longest.- * The key feature of this algorithm is that insertions into the string- * dictionary are very simple and thus fast, and deletions are avoided- * completely. Insertions are performed at each input character, whereas- * string matches are performed only when the previous match ends. So it- * is preferable to spend more time in matches to allow very fast string- * insertions and avoid deletions. The matching algorithm for small- * strings is inspired from that of Rabin & Karp. A brute force approach- * is used to find longer strings when a small match has been found.- * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze- * (by Leonid Broukhis).- * A previous version of this file used a more sophisticated algorithm- * (by Fiala and Greene) which is guaranteed to run in linear amortized- * time, but has a larger average cost, uses more memory and is patented.- * However the F&G algorithm may be faster for some highly redundant- * files if the parameter max_chain_length (described below) is too large.- *- * ACKNOWLEDGEMENTS- *- * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and- * I found it in 'freeze' written by Leonid Broukhis.- * Thanks to many people for bug reports and testing.- *- * REFERENCES- *- * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".- * Available in http://www.ietf.org/rfc/rfc1951.txt- *- * A description of the Rabin and Karp algorithm is given in the book- * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.- *- * Fiala,E.R., and Greene,D.H.- * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595- *- */--/* @(#) $Id$ */--#include "deflate.h"--const char deflate_copyright[] =- " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler ";-/*- 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- include such an acknowledgment, I would appreciate that you keep this- copyright string in the executable of your product.- */--/* ===========================================================================- * Function prototypes.- */-typedef enum {- need_more, /* block not completed, need more input or more output */- block_done, /* block flush performed */- finish_started, /* finish started, need only more output at next deflate */- finish_done /* finish done, accept no more input or output */-} block_state;--typedef block_state (*compress_func) OF((deflate_state *s, int flush));-/* Compression function. Returns the block state after the call. */--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-local block_state deflate_slow OF((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 int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));-#ifdef ASMV- void match_init OF((void)); /* asm code initialization */- uInt longest_match OF((deflate_state *s, IPos cur_match));-#else-local uInt longest_match OF((deflate_state *s, IPos cur_match));-#endif--#ifdef DEBUG-local void check_match OF((deflate_state *s, IPos start, IPos match,- int length));-#endif--/* ===========================================================================- * Local data- */--#define NIL 0-/* Tail of hash chains */--#ifndef TOO_FAR-# define TOO_FAR 4096-#endif-/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */--/* Values for max_lazy_match, good_match and max_chain_length, depending on- * the desired pack level (0..9). The values given below have been tuned to- * exclude worst case performance for pathological files. Better values may be- * found for specific files.- */-typedef struct config_s {- ush good_length; /* reduce lazy search above this match length */- ush max_lazy; /* do not perform lazy search above this match length */- ush nice_length; /* quit search above this match length */- ush max_chain;- compress_func func;-} config;--#ifdef FASTEST-local const config configuration_table[2] = {-/* good lazy nice chain */-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */-/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */-#else-local const config configuration_table[10] = {-/* good lazy nice chain */-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */-/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */-/* 2 */ {4, 5, 16, 8, deflate_fast},-/* 3 */ {4, 6, 32, 32, deflate_fast},--/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */-/* 5 */ {8, 16, 32, 32, deflate_slow},-/* 6 */ {8, 16, 128, 128, deflate_slow},-/* 7 */ {8, 32, 128, 256, deflate_slow},-/* 8 */ {32, 128, 258, 1024, deflate_slow},-/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */-#endif--/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4- * For deflate_fast() (levels <= 3) good is ignored and lazy has a different- * meaning.- */--#define EQUAL 0-/* result of memcmp for equal strings */--#ifndef NO_DUMMY_DECL-struct static_tree_desc_s {int dummy;}; /* for buggy compilers */-#endif--/* ===========================================================================- * Update a hash value with the given input byte- * IN assertion: all calls to to UPDATE_HASH are made with consecutive- * input characters, so that a running hash key can be computed from the- * previous key instead of complete recalculation each time.- */-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)---/* ===========================================================================- * Insert string str in the dictionary and set match_head to the previous head- * of the hash chain (the most recent string with same hash key). Return- * the previous length of the hash chain.- * If this file is compiled with -DFASTEST, the compression level is forced- * to 1, and no hash chains are maintained.- * IN assertion: all calls to to INSERT_STRING are made with consecutive- * input characters and the first MIN_MATCH bytes of str are valid- * (except for the last MIN_MATCH-1 bytes of the input file).- */-#ifdef FASTEST-#define INSERT_STRING(s, str, match_head) \- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \- match_head = s->head[s->ins_h], \- s->head[s->ins_h] = (Pos)(str))-#else-#define INSERT_STRING(s, str, match_head) \- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \- match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \- s->head[s->ins_h] = (Pos)(str))-#endif--/* ===========================================================================- * Initialize the hash table (avoiding 64K overflow for 16 bit systems).- * prev[] will be initialized on the fly.- */-#define CLEAR_HASH(s) \- s->head[s->hash_size-1] = NIL; \- zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));--/* ========================================================================= */-int ZEXPORT deflateInit_(strm, level, version, stream_size)- z_streamp strm;- int level;- const char *version;- int stream_size;-{- return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,- Z_DEFAULT_STRATEGY, version, stream_size);- /* To do: ignore strm->next_in if we use it as window */-}--/* ========================================================================= */-int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,- version, stream_size)- z_streamp strm;- int level;- int method;- int windowBits;- int memLevel;- int strategy;- const char *version;- int stream_size;-{- deflate_state *s;- int wrap = 1;- static const char my_version[] = ZLIB_VERSION;-- ushf *overlay;- /* We overlay pending_buf and d_buf+l_buf. This works since the average- * output size for (length,distance) codes is <= 24 bits.- */-- if (version == Z_NULL || version[0] != my_version[0] ||- stream_size != sizeof(z_stream)) {- return Z_VERSION_ERROR;- }- if (strm == Z_NULL) return Z_STREAM_ERROR;-- strm->msg = Z_NULL;- if (strm->zalloc == (alloc_func)0) {- strm->zalloc = zcalloc;- strm->opaque = (voidpf)0;- }- if (strm->zfree == (free_func)0) strm->zfree = zcfree;--#ifdef FASTEST- if (level != 0) level = 1;-#else- if (level == Z_DEFAULT_COMPRESSION) level = 6;-#endif-- if (windowBits < 0) { /* suppress zlib wrapper */- wrap = 0;- windowBits = -windowBits;- }-#ifdef GZIP- else if (windowBits > 15) {- wrap = 2; /* write gzip wrapper instead */- windowBits -= 16;- }-#endif- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||- windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||- strategy < 0 || strategy > Z_FIXED) {- return Z_STREAM_ERROR;- }- if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */- s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));- if (s == Z_NULL) return Z_MEM_ERROR;- strm->state = (struct internal_state FAR *)s;- s->strm = strm;-- s->wrap = wrap;- s->gzhead = Z_NULL;- s->w_bits = windowBits;- s->w_size = 1 << s->w_bits;- s->w_mask = s->w_size - 1;-- s->hash_bits = memLevel + 7;- s->hash_size = 1 << s->hash_bits;- s->hash_mask = s->hash_size - 1;- s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);-- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));- s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));- s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));-- s->high_water = 0; /* nothing written to s->window yet */-- s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */-- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);- s->pending_buf = (uchf *) overlay;- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);-- if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||- s->pending_buf == Z_NULL) {- s->status = FINISH_STATE;- strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);- deflateEnd (strm);- return Z_MEM_ERROR;- }- s->d_buf = overlay + s->lit_bufsize/sizeof(ush);- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;-- s->level = level;- s->strategy = strategy;- s->method = (Byte)method;-- return deflateReset(strm);-}--/* ========================================================================= */-int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)- z_streamp strm;- const Bytef *dictionary;- uInt dictLength;-{- deflate_state *s;- uInt length = dictLength;- uInt n;- IPos hash_head = 0;-- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||- strm->state->wrap == 2 ||- (strm->state->wrap == 1 && strm->state->status != INIT_STATE))- return Z_STREAM_ERROR;-- s = strm->state;- if (s->wrap)- strm->adler = adler32(strm->adler, dictionary, dictLength);-- if (length < MIN_MATCH) return Z_OK;- if (length > s->w_size) {- length = s->w_size;- dictionary += dictLength - length; /* use the tail of the dictionary */- }- zmemcpy(s->window, dictionary, length);- s->strstart = length;- s->block_start = (long)length;-- /* Insert all strings in the hash table (except for the last two bytes).- * s->lookahead stays null, so s->ins_h will be recomputed at the next- * call of fill_window.- */- s->ins_h = s->window[0];- UPDATE_HASH(s, s->ins_h, s->window[1]);- for (n = 0; n <= length - MIN_MATCH; n++) {- INSERT_STRING(s, n, hash_head);- }- if (hash_head) hash_head = 0; /* to make compiler happy */- return Z_OK;-}--/* ========================================================================= */-int ZEXPORT deflateReset (strm)- z_streamp strm;-{- deflate_state *s;-- if (strm == Z_NULL || strm->state == Z_NULL ||- strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {- return Z_STREAM_ERROR;- }-- strm->total_in = strm->total_out = 0;- strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */- strm->data_type = Z_UNKNOWN;-- s = (deflate_state *)strm->state;- s->pending = 0;- s->pending_out = s->pending_buf;-- if (s->wrap < 0) {- s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */- }- s->status = s->wrap ? INIT_STATE : BUSY_STATE;- strm->adler =-#ifdef GZIP- s->wrap == 2 ? crc32(0L, Z_NULL, 0) :-#endif- adler32(0L, Z_NULL, 0);- s->last_flush = Z_NO_FLUSH;-- _tr_init(s);- lm_init(s);-- return Z_OK;-}--/* ========================================================================= */-int ZEXPORT deflateSetHeader (strm, head)- z_streamp strm;- gz_headerp head;-{- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- if (strm->state->wrap != 2) return Z_STREAM_ERROR;- strm->state->gzhead = head;- return Z_OK;-}--/* ========================================================================= */-int ZEXPORT deflatePrime (strm, bits, value)- z_streamp strm;- int bits;- int value;-{- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- strm->state->bi_valid = bits;- strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));- return Z_OK;-}--/* ========================================================================= */-int ZEXPORT deflateParams(strm, level, strategy)- z_streamp strm;- int level;- int strategy;-{- deflate_state *s;- compress_func func;- int err = Z_OK;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- s = strm->state;--#ifdef FASTEST- if (level != 0) level = 1;-#else- if (level == Z_DEFAULT_COMPRESSION) level = 6;-#endif- if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {- return Z_STREAM_ERROR;- }- func = configuration_table[s->level].func;-- if ((strategy != s->strategy || func != configuration_table[level].func) &&- strm->total_in != 0) {- /* Flush the last buffer: */- err = deflate(strm, Z_BLOCK);- }- if (s->level != level) {- s->level = level;- s->max_lazy_match = configuration_table[level].max_lazy;- s->good_match = configuration_table[level].good_length;- s->nice_match = configuration_table[level].nice_length;- s->max_chain_length = configuration_table[level].max_chain;- }- s->strategy = strategy;- return err;-}--/* ========================================================================= */-int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)- z_streamp strm;- int good_length;- int max_lazy;- int nice_length;- int max_chain;-{- deflate_state *s;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- s = strm->state;- s->good_match = good_length;- s->max_lazy_match = max_lazy;- s->nice_match = nice_length;- s->max_chain_length = max_chain;- return Z_OK;-}--/* =========================================================================- * For the default windowBits of 15 and memLevel of 8, this function returns- * a close to exact, as well as small, upper bound on the compressed size.- * They are coded as constants here for a reason--if the #define's are- * changed, then this function needs to be changed as well. The return- * value for 15 and 8 only works for those exact settings.- *- * For any setting other than those defaults for windowBits and memLevel,- * the value returned is a conservative worst case for the maximum expansion- * resulting from using fixed blocks instead of stored blocks, which deflate- * can emit on compressed data for some combinations of the parameters.- *- * This function could be more sophisticated to provide closer upper bounds for- * every combination of windowBits and memLevel. But even the conservative- * upper bound of about 14% expansion does not seem onerous for output buffer- * allocation.- */-uLong ZEXPORT deflateBound(strm, sourceLen)- z_streamp strm;- uLong sourceLen;-{- deflate_state *s;- uLong complen, wraplen;- Bytef *str;-- /* conservative upper bound for compressed data */- complen = sourceLen +- ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;-- /* if can't get parameters, return conservative bound plus zlib wrapper */- if (strm == Z_NULL || strm->state == Z_NULL)- return complen + 6;-- /* compute wrapper length */- s = strm->state;- switch (s->wrap) {- case 0: /* raw deflate */- wraplen = 0;- break;- case 1: /* zlib wrapper */- wraplen = 6 + (s->strstart ? 4 : 0);- break;- case 2: /* gzip wrapper */- wraplen = 18;- if (s->gzhead != Z_NULL) { /* user-supplied gzip header */- if (s->gzhead->extra != Z_NULL)- wraplen += 2 + s->gzhead->extra_len;- str = s->gzhead->name;- if (str != Z_NULL)- do {- wraplen++;- } while (*str++);- str = s->gzhead->comment;- if (str != Z_NULL)- do {- wraplen++;- } while (*str++);- if (s->gzhead->hcrc)- wraplen += 2;- }- break;- default: /* for compiler happiness */- wraplen = 6;- }-- /* if not default parameters, return conservative bound */- if (s->w_bits != 15 || s->hash_bits != 8 + 7)- return complen + wraplen;-- /* default settings: return tight bound for that case */- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +- (sourceLen >> 25) + 13 - 6 + wraplen;-}--/* =========================================================================- * Put a short in the pending buffer. The 16-bit value is put in MSB order.- * IN assertion: the stream state is correct and there is enough room in- * pending_buf.- */-local void putShortMSB (s, b)- deflate_state *s;- uInt b;-{- put_byte(s, (Byte)(b >> 8));- put_byte(s, (Byte)(b & 0xff));-}--/* =========================================================================- * Flush as much pending output as possible. All deflate() output goes- * through this function so some applications may wish to modify it- * to avoid allocating a large strm->next_out buffer and copying into it.- * (See also read_buf()).- */-local void flush_pending(strm)- z_streamp strm;-{- unsigned len = strm->state->pending;-- if (len > strm->avail_out) len = strm->avail_out;- if (len == 0) return;-- zmemcpy(strm->next_out, strm->state->pending_out, len);- strm->next_out += len;- strm->state->pending_out += len;- strm->total_out += len;- strm->avail_out -= len;- strm->state->pending -= len;- if (strm->state->pending == 0) {- strm->state->pending_out = strm->state->pending_buf;- }-}--/* ========================================================================= */-int ZEXPORT deflate (strm, flush)- z_streamp strm;- int flush;-{- int old_flush; /* value of flush param for previous deflate call */- deflate_state *s;-- if (strm == Z_NULL || strm->state == Z_NULL ||- flush > Z_BLOCK || flush < 0) {- return Z_STREAM_ERROR;- }- s = strm->state;-- if (strm->next_out == Z_NULL ||- (strm->next_in == Z_NULL && strm->avail_in != 0) ||- (s->status == FINISH_STATE && flush != Z_FINISH)) {- ERR_RETURN(strm, Z_STREAM_ERROR);- }- if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);-- s->strm = strm; /* just in case */- old_flush = s->last_flush;- s->last_flush = flush;-- /* Write the header */- if (s->status == INIT_STATE) {-#ifdef GZIP- if (s->wrap == 2) {- strm->adler = crc32(0L, Z_NULL, 0);- put_byte(s, 31);- put_byte(s, 139);- put_byte(s, 8);- if (s->gzhead == Z_NULL) {- put_byte(s, 0);- put_byte(s, 0);- put_byte(s, 0);- put_byte(s, 0);- put_byte(s, 0);- put_byte(s, s->level == 9 ? 2 :- (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?- 4 : 0));- put_byte(s, OS_CODE);- s->status = BUSY_STATE;- }- else {- put_byte(s, (s->gzhead->text ? 1 : 0) +- (s->gzhead->hcrc ? 2 : 0) +- (s->gzhead->extra == Z_NULL ? 0 : 4) +- (s->gzhead->name == Z_NULL ? 0 : 8) +- (s->gzhead->comment == Z_NULL ? 0 : 16)- );- put_byte(s, (Byte)(s->gzhead->time & 0xff));- put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));- put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));- put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));- put_byte(s, s->level == 9 ? 2 :- (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?- 4 : 0));- put_byte(s, s->gzhead->os & 0xff);- if (s->gzhead->extra != Z_NULL) {- put_byte(s, s->gzhead->extra_len & 0xff);- put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);- }- if (s->gzhead->hcrc)- strm->adler = crc32(strm->adler, s->pending_buf,- s->pending);- s->gzindex = 0;- s->status = EXTRA_STATE;- }- }- else-#endif- {- uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;- uInt level_flags;-- if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)- level_flags = 0;- else if (s->level < 6)- level_flags = 1;- else if (s->level == 6)- level_flags = 2;- else- level_flags = 3;- header |= (level_flags << 6);- if (s->strstart != 0) header |= PRESET_DICT;- header += 31 - (header % 31);-- s->status = BUSY_STATE;- putShortMSB(s, header);-- /* Save the adler32 of the preset dictionary: */- if (s->strstart != 0) {- putShortMSB(s, (uInt)(strm->adler >> 16));- putShortMSB(s, (uInt)(strm->adler & 0xffff));- }- strm->adler = adler32(0L, Z_NULL, 0);- }- }-#ifdef GZIP- if (s->status == EXTRA_STATE) {- if (s->gzhead->extra != Z_NULL) {- uInt beg = s->pending; /* start of bytes to update crc */-- while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {- if (s->pending == s->pending_buf_size) {- if (s->gzhead->hcrc && s->pending > beg)- strm->adler = crc32(strm->adler, s->pending_buf + beg,- s->pending - beg);- flush_pending(strm);- beg = s->pending;- if (s->pending == s->pending_buf_size)- break;- }- put_byte(s, s->gzhead->extra[s->gzindex]);- s->gzindex++;- }- if (s->gzhead->hcrc && s->pending > beg)- strm->adler = crc32(strm->adler, s->pending_buf + beg,- s->pending - beg);- if (s->gzindex == s->gzhead->extra_len) {- s->gzindex = 0;- s->status = NAME_STATE;- }- }- else- s->status = NAME_STATE;- }- if (s->status == NAME_STATE) {- if (s->gzhead->name != Z_NULL) {- uInt beg = s->pending; /* start of bytes to update crc */- int val;-- do {- if (s->pending == s->pending_buf_size) {- if (s->gzhead->hcrc && s->pending > beg)- strm->adler = crc32(strm->adler, s->pending_buf + beg,- s->pending - beg);- flush_pending(strm);- beg = s->pending;- if (s->pending == s->pending_buf_size) {- val = 1;- break;- }- }- val = s->gzhead->name[s->gzindex++];- put_byte(s, val);- } while (val != 0);- if (s->gzhead->hcrc && s->pending > beg)- strm->adler = crc32(strm->adler, s->pending_buf + beg,- s->pending - beg);- if (val == 0) {- s->gzindex = 0;- s->status = COMMENT_STATE;- }- }- else- s->status = COMMENT_STATE;- }- if (s->status == COMMENT_STATE) {- if (s->gzhead->comment != Z_NULL) {- uInt beg = s->pending; /* start of bytes to update crc */- int val;-- do {- if (s->pending == s->pending_buf_size) {- if (s->gzhead->hcrc && s->pending > beg)- strm->adler = crc32(strm->adler, s->pending_buf + beg,- s->pending - beg);- flush_pending(strm);- beg = s->pending;- if (s->pending == s->pending_buf_size) {- val = 1;- break;- }- }- val = s->gzhead->comment[s->gzindex++];- put_byte(s, val);- } while (val != 0);- if (s->gzhead->hcrc && s->pending > beg)- strm->adler = crc32(strm->adler, s->pending_buf + beg,- s->pending - beg);- if (val == 0)- s->status = HCRC_STATE;- }- else- s->status = HCRC_STATE;- }- if (s->status == HCRC_STATE) {- if (s->gzhead->hcrc) {- if (s->pending + 2 > s->pending_buf_size)- flush_pending(strm);- if (s->pending + 2 <= s->pending_buf_size) {- put_byte(s, (Byte)(strm->adler & 0xff));- put_byte(s, (Byte)((strm->adler >> 8) & 0xff));- strm->adler = crc32(0L, Z_NULL, 0);- s->status = BUSY_STATE;- }- }- else- s->status = BUSY_STATE;- }-#endif-- /* Flush as much pending output as possible */- if (s->pending != 0) {- flush_pending(strm);- if (strm->avail_out == 0) {- /* Since avail_out is 0, deflate will be called again with- * more output space, but possibly with both pending and- * avail_in equal to zero. There won't be anything to do,- * but this is not an error situation so make sure we- * return OK instead of BUF_ERROR at next call of deflate:- */- s->last_flush = -1;- return Z_OK;- }-- /* Make sure there is something to do and avoid duplicate consecutive- * flushes. For repeated and useless calls with Z_FINISH, we keep- * returning Z_STREAM_END instead of Z_BUF_ERROR.- */- } else if (strm->avail_in == 0 && flush <= old_flush &&- flush != Z_FINISH) {- ERR_RETURN(strm, Z_BUF_ERROR);- }-- /* User must not provide more input after the first FINISH: */- if (s->status == FINISH_STATE && strm->avail_in != 0) {- ERR_RETURN(strm, Z_BUF_ERROR);- }-- /* Start a new block or continue the current one.- */- if (strm->avail_in != 0 || s->lookahead != 0 ||- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {- block_state bstate;-- bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :- (s->strategy == Z_RLE ? deflate_rle(s, flush) :- (*(configuration_table[s->level].func))(s, flush));-- if (bstate == finish_started || bstate == finish_done) {- s->status = FINISH_STATE;- }- if (bstate == need_more || bstate == finish_started) {- if (strm->avail_out == 0) {- s->last_flush = -1; /* avoid BUF_ERROR next call, see above */- }- return Z_OK;- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call- * of deflate should use the same flush parameter to make sure- * that the flush is complete. So we don't have to output an- * empty block here, this will be done at next call. This also- * ensures that for a very small output buffer, we emit at most- * one empty block.- */- }- if (bstate == block_done) {- if (flush == Z_PARTIAL_FLUSH) {- _tr_align(s);- } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */- _tr_stored_block(s, (char*)0, 0L, 0);- /* For a full flush, this empty block will be recognized- * as a special marker by inflate_sync().- */- if (flush == Z_FULL_FLUSH) {- CLEAR_HASH(s); /* forget history */- if (s->lookahead == 0) {- s->strstart = 0;- s->block_start = 0L;- }- }- }- flush_pending(strm);- if (strm->avail_out == 0) {- s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */- return Z_OK;- }- }- }- Assert(strm->avail_out > 0, "bug2");-- if (flush != Z_FINISH) return Z_OK;- if (s->wrap <= 0) return Z_STREAM_END;-- /* Write the trailer */-#ifdef GZIP- if (s->wrap == 2) {- put_byte(s, (Byte)(strm->adler & 0xff));- put_byte(s, (Byte)((strm->adler >> 8) & 0xff));- put_byte(s, (Byte)((strm->adler >> 16) & 0xff));- put_byte(s, (Byte)((strm->adler >> 24) & 0xff));- put_byte(s, (Byte)(strm->total_in & 0xff));- put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));- put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));- put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));- }- else-#endif- {- putShortMSB(s, (uInt)(strm->adler >> 16));- putShortMSB(s, (uInt)(strm->adler & 0xffff));- }- flush_pending(strm);- /* If avail_out is zero, the application will call deflate again- * to flush the rest.- */- if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */- return s->pending != 0 ? Z_OK : Z_STREAM_END;-}--/* ========================================================================= */-int ZEXPORT deflateEnd (strm)- z_streamp strm;-{- int status;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;-- status = strm->state->status;- if (status != INIT_STATE &&- status != EXTRA_STATE &&- status != NAME_STATE &&- status != COMMENT_STATE &&- status != HCRC_STATE &&- status != BUSY_STATE &&- status != FINISH_STATE) {- return Z_STREAM_ERROR;- }-- /* Deallocate in reverse order of allocations: */- TRY_FREE(strm, strm->state->pending_buf);- TRY_FREE(strm, strm->state->head);- TRY_FREE(strm, strm->state->prev);- TRY_FREE(strm, strm->state->window);-- ZFREE(strm, strm->state);- strm->state = Z_NULL;-- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;-}--/* =========================================================================- * Copy the source state to the destination state.- * To simplify the source, this is not supported for 16-bit MSDOS (which- * doesn't have enough memory anyway to duplicate compression states).- */-int ZEXPORT deflateCopy (dest, source)- z_streamp dest;- z_streamp source;-{-#ifdef MAXSEG_64K- return Z_STREAM_ERROR;-#else- deflate_state *ds;- deflate_state *ss;- ushf *overlay;--- if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {- return Z_STREAM_ERROR;- }-- ss = source->state;-- zmemcpy(dest, source, sizeof(z_stream));-- ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));- if (ds == Z_NULL) return Z_MEM_ERROR;- dest->state = (struct internal_state FAR *) ds;- zmemcpy(ds, ss, sizeof(deflate_state));- ds->strm = dest;-- ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));- ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));- ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);- ds->pending_buf = (uchf *) overlay;-- if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||- ds->pending_buf == Z_NULL) {- deflateEnd (dest);- return Z_MEM_ERROR;- }- /* following zmemcpy do not work for 16-bit MSDOS */- zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));- zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));- zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));- zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);-- ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;-- ds->l_desc.dyn_tree = ds->dyn_ltree;- ds->d_desc.dyn_tree = ds->dyn_dtree;- ds->bl_desc.dyn_tree = ds->bl_tree;-- return Z_OK;-#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 int 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;-- if (strm->state->wrap == 1) {- strm->adler = adler32(strm->adler, strm->next_in, len);- }-#ifdef GZIP- else if (strm->state->wrap == 2) {- strm->adler = crc32(strm->adler, strm->next_in, len);- }-#endif- zmemcpy(buf, strm->next_in, len);- strm->next_in += len;- strm->total_in += len;-- return (int)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->match_length = s->prev_length = MIN_MATCH-1;- s->match_available = 0;- s->ins_h = 0;-#ifndef FASTEST-#ifdef ASMV- match_init(); /* initialize the asm code */-#endif-#endif-}--#ifndef FASTEST-/* ===========================================================================- * Set match_start to the longest match starting at the given string and- * return its length. Matches shorter or equal to prev_length are discarded,- * in which case the result is equal to prev_length and match_start is- * garbage.- * IN assertions: cur_match is the head of the hash chain for the current- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1- * OUT assertion: the match length is not greater than s->lookahead.- */-#ifndef ASMV-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or- * match.S. The code will be functionally equivalent.- */-local uInt longest_match(s, cur_match)- deflate_state *s;- IPos cur_match; /* current match */-{- unsigned chain_length = s->max_chain_length;/* max hash chain length */- register Bytef *scan = s->window + s->strstart; /* current string */- register Bytef *match; /* matched string */- register int len; /* length of current match */- int best_len = s->prev_length; /* best match length so far */- int nice_match = s->nice_match; /* stop if match long enough */- IPos limit = s->strstart > (IPos)MAX_DIST(s) ?- s->strstart - (IPos)MAX_DIST(s) : NIL;- /* Stop when cur_match becomes <= limit. To simplify the code,- * we prevent matches with the string of window index 0.- */- Posf *prev = s->prev;- uInt wmask = s->w_mask;--#ifdef UNALIGNED_OK- /* Compare two bytes at a time. Note: this is not always beneficial.- * Try with and without -DUNALIGNED_OK to check.- */- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;- register ush scan_start = *(ushf*)scan;- register ush scan_end = *(ushf*)(scan+best_len-1);-#else- register Bytef *strend = s->window + s->strstart + MAX_MATCH;- register Byte scan_end1 = scan[best_len-1];- register Byte scan_end = scan[best_len];-#endif-- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.- * It is easy to get rid of this optimization if necessary.- */- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");-- /* Do not waste too much time if we already have a good match: */- if (s->prev_length >= s->good_match) {- chain_length >>= 2;- }- /* Do not look for matches beyond the end of the input. This is necessary- * to make deflate deterministic.- */- if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;-- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");-- do {- Assert(cur_match < s->strstart, "no future");- match = s->window + cur_match;-- /* Skip to next match if the match length cannot increase- * or if the match length is less than 2. Note that the checks below- * for insufficient lookahead only occur occasionally for performance- * reasons. Therefore uninitialized memory will be accessed, and- * conditional jumps will be made that depend on those values.- * However the length of the match is limited to the lookahead, so- * the output of deflate is not affected by the uninitialized values.- */-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)- /* This code assumes sizeof(unsigned short) == 2. Do not use- * UNALIGNED_OK if your compiler uses a different size.- */- if (*(ushf*)(match+best_len-1) != scan_end ||- *(ushf*)match != scan_start) continue;-- /* It is not necessary to compare scan[2] and match[2] since they are- * always equal when the other bytes match, given that the hash keys- * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at- * strstart+3, +5, ... up to strstart+257. We check for insufficient- * lookahead only every 4th comparison; the 128th check will be made- * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is- * necessary to put more guard bytes at the end of the window, or- * to check more often for insufficient lookahead.- */- Assert(scan[2] == match[2], "scan[2]?");- scan++, match++;- do {- } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&- scan < strend);- /* The funny "do {}" generates better code on most compilers */-- /* Here, scan <= window+strstart+257 */- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");- if (*scan == *match) scan++;-- len = (MAX_MATCH - 1) - (int)(strend-scan);- scan = strend - (MAX_MATCH-1);--#else /* UNALIGNED_OK */-- if (match[best_len] != scan_end ||- match[best_len-1] != scan_end1 ||- *match != *scan ||- *++match != scan[1]) continue;-- /* The check at best_len-1 can be removed because it will be made- * again later. (This heuristic is not always a win.)- * It is not necessary to compare scan[2] and match[2] since they- * are always equal when the other bytes match, given that- * the hash keys are equal and that HASH_BITS >= 8.- */- scan += 2, match++;- Assert(*scan == *match, "match[2]?");-- /* We check for insufficient lookahead only every 8th comparison;- * the 256th check will be made at strstart+258.- */- do {- } while (*++scan == *++match && *++scan == *++match &&- *++scan == *++match && *++scan == *++match &&- *++scan == *++match && *++scan == *++match &&- *++scan == *++match && *++scan == *++match &&- scan < strend);-- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");-- len = MAX_MATCH - (int)(strend - scan);- scan = strend - MAX_MATCH;--#endif /* UNALIGNED_OK */-- if (len > best_len) {- s->match_start = cur_match;- best_len = len;- if (len >= nice_match) break;-#ifdef UNALIGNED_OK- scan_end = *(ushf*)(scan+best_len-1);-#else- scan_end1 = scan[best_len-1];- scan_end = scan[best_len];-#endif- }- } while ((cur_match = prev[cur_match & wmask]) > limit- && --chain_length != 0);-- if ((uInt)best_len <= s->lookahead) return (uInt)best_len;- return s->lookahead;-}-#endif /* ASMV */--#else /* FASTEST */--/* ---------------------------------------------------------------------------- * Optimized version for FASTEST only- */-local uInt longest_match(s, cur_match)- deflate_state *s;- IPos cur_match; /* current match */-{- register Bytef *scan = s->window + s->strstart; /* current string */- register Bytef *match; /* matched string */- register int len; /* length of current match */- register Bytef *strend = s->window + s->strstart + MAX_MATCH;-- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.- * It is easy to get rid of this optimization if necessary.- */- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");-- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");-- Assert(cur_match < s->strstart, "no future");-- match = s->window + cur_match;-- /* Return failure if the match length is less than 2:- */- if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;-- /* The check at best_len-1 can be removed because it will be made- * again later. (This heuristic is not always a win.)- * It is not necessary to compare scan[2] and match[2] since they- * are always equal when the other bytes match, given that- * the hash keys are equal and that HASH_BITS >= 8.- */- scan += 2, match += 2;- Assert(*scan == *match, "match[2]?");-- /* We check for insufficient lookahead only every 8th comparison;- * the 256th check will be made at strstart+258.- */- do {- } while (*++scan == *++match && *++scan == *++match &&- *++scan == *++match && *++scan == *++match &&- *++scan == *++match && *++scan == *++match &&- *++scan == *++match && *++scan == *++match &&- scan < strend);-- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");-- len = MAX_MATCH - (int)(strend - scan);-- if (len < MIN_MATCH) return MIN_MATCH - 1;-- s->match_start = cur_match;- return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;-}--#endif /* FASTEST */--#ifdef DEBUG-/* ===========================================================================- * Check that the match at match_start is indeed a match.- */-local void check_match(s, start, match, length)- deflate_state *s;- IPos start, match;- int length;-{- /* check that the match is indeed a match */- if (zmemcmp(s->window + match,- s->window + start, length) != EQUAL) {- fprintf(stderr, " start %u, match %u, length %d\n",- start, match, length);- do {- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);- } while (--length != 0);- z_error("invalid match");- }- if (z_verbose > 1) {- fprintf(stderr,"\\[%d,%d]", start-match, length);- do { putc(s->window[start++], stderr); } while (--length != 0);- }-}-#else-# define check_match(s, start, match, length)-#endif /* 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;-{- register unsigned n, m;- register Posf *p;- unsigned more; /* Amount of free space at the end of the window. */- uInt wsize = s->w_size;-- 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);- s->match_start -= wsize;- s->strstart -= wsize; /* we now have strstart >= MAX_DIST */- s->block_start -= (long) wsize;-- /* Slide the hash table (could be avoided with 32 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. (Using level 0 permanently is not an optimal usage of- zlib, so we don't care about this pathological case.)- */- n = s->hash_size;- p = &s->head[n];- do {- m = *--p;- *p = (Pos)(m >= wsize ? m-wsize : NIL);- } while (--n);-- n = wsize;-#ifndef FASTEST- p = &s->prev[n];- do {- m = *--p;- *p = (Pos)(m >= wsize ? m-wsize : NIL);- /* If n is not on any hash chain, prev[n] is garbage but- * its value will never be used.- */- } while (--n);-#endif- more += wsize;- }- if (s->strm->avail_in == 0) return;-- /* 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 >= MIN_MATCH) {- s->ins_h = s->window[s->strstart];- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);-#if MIN_MATCH != 3- Call UPDATE_HASH() MIN_MATCH-3 more times-#endif- }- /* 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;- }- }-}--/* ===========================================================================- * Flush the current block, with given end-of-file flag.- * IN assertion: strstart is set to the end of the current match.- */-#define FLUSH_BLOCK_ONLY(s, last) { \- _tr_flush_block(s, (s->block_start >= 0L ? \- (charf *)&s->window[(unsigned)s->block_start] : \- (charf *)Z_NULL), \- (ulg)((long)s->strstart - s->block_start), \- (last)); \- s->block_start = s->strstart; \- flush_pending(s->strm); \- Tracev((stderr,"[FLUSH]")); \-}--/* Same but force premature exit if necessary. */-#define FLUSH_BLOCK(s, last) { \- FLUSH_BLOCK_ONLY(s, last); \- if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \-}--/* ===========================================================================- * Copy without compression as much as possible from the input stream, return- * the current block state.- * This function does not insert new strings in the dictionary since- * uncompressible data is probably not useful. This function is used- * only for the level=0 compression option.- * NOTE: this function should be optimized to avoid extra copying from- * window to pending_buf.- */-local block_state deflate_stored(s, flush)- deflate_state *s;- int flush;-{- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited- * to pending_buf_size, and each stored block has a 5 byte header:- */- ulg max_block_size = 0xffff;- ulg max_start;-- if (max_block_size > s->pending_buf_size - 5) {- max_block_size = s->pending_buf_size - 5;- }-- /* Copy as much as possible from input to output: */- for (;;) {- /* Fill the window as much as possible: */- if (s->lookahead <= 1) {-- Assert(s->strstart < s->w_size+MAX_DIST(s) ||- s->block_start >= (long)s->w_size, "slide too late");-- fill_window(s);- if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;-- if (s->lookahead == 0) break; /* flush the current block */- }- Assert(s->block_start >= 0L, "block gone");-- s->strstart += s->lookahead;- s->lookahead = 0;-- /* Emit a stored block if pending_buf will be full: */- max_start = s->block_start + max_block_size;- if (s->strstart == 0 || (ulg)s->strstart >= max_start) {- /* strstart == 0 is possible when wraparound on 16-bit machine */- s->lookahead = (uInt)(s->strstart - max_start);- s->strstart = (uInt)max_start;- FLUSH_BLOCK(s, 0);- }- /* Flush if we may have to slide, otherwise block_start may become- * negative and the data will be gone:- */- if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {- FLUSH_BLOCK(s, 0);- }- }- FLUSH_BLOCK(s, flush == Z_FINISH);- return flush == Z_FINISH ? finish_done : block_done;-}--/* ===========================================================================- * Compress as much as possible from the input stream, return the current- * block state.- * This function does not perform lazy evaluation of matches and inserts- * new strings in the dictionary only for unmatched strings or for short- * matches. It is used only for the fast compression options.- */-local block_state deflate_fast(s, flush)- deflate_state *s;- int flush;-{- IPos hash_head; /* head of the hash chain */- int bflush; /* set if current block must be flushed */-- for (;;) {- /* Make sure that we always have enough lookahead, except- * at the end of the input file. We need MAX_MATCH bytes- * for the next match, plus MIN_MATCH bytes to insert the- * string following the next match.- */- if (s->lookahead < MIN_LOOKAHEAD) {- fill_window(s);- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {- return need_more;- }- if (s->lookahead == 0) break; /* flush the current block */- }-- /* Insert the string window[strstart .. strstart+2] in the- * dictionary, and set hash_head to the head of the hash chain:- */- hash_head = NIL;- if (s->lookahead >= MIN_MATCH) {- INSERT_STRING(s, s->strstart, hash_head);- }-- /* Find the longest match, discarding those <= prev_length.- * At this point we have always match_length < MIN_MATCH- */- if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {- /* To simplify the code, we prevent matches with the string- * of window index 0 (in particular we have to avoid a match- * of the string with itself at the start of the input file).- */- s->match_length = longest_match (s, hash_head);- /* longest_match() sets match_start */- }- if (s->match_length >= MIN_MATCH) {- check_match(s, s->strstart, s->match_start, s->match_length);-- _tr_tally_dist(s, s->strstart - s->match_start,- s->match_length - MIN_MATCH, bflush);-- s->lookahead -= s->match_length;-- /* Insert new strings in the hash table only if the match length- * is not too large. This saves time but degrades compression.- */-#ifndef FASTEST- if (s->match_length <= s->max_insert_length &&- s->lookahead >= MIN_MATCH) {- s->match_length--; /* string at strstart already in table */- do {- s->strstart++;- INSERT_STRING(s, s->strstart, hash_head);- /* strstart never exceeds WSIZE-MAX_MATCH, so there are- * always MIN_MATCH bytes ahead.- */- } while (--s->match_length != 0);- s->strstart++;- } else-#endif- {- s->strstart += s->match_length;- s->match_length = 0;- s->ins_h = s->window[s->strstart];- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);-#if MIN_MATCH != 3- Call UPDATE_HASH() MIN_MATCH-3 more times-#endif- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not- * matter since it will be recomputed at next deflate call.- */- }- } else {- /* No match, output a literal byte */- Tracevv((stderr,"%c", s->window[s->strstart]));- _tr_tally_lit (s, s->window[s->strstart], bflush);- s->lookahead--;- s->strstart++;- }- if (bflush) FLUSH_BLOCK(s, 0);- }- FLUSH_BLOCK(s, flush == Z_FINISH);- return flush == Z_FINISH ? finish_done : block_done;-}--#ifndef FASTEST-/* ===========================================================================- * Same as above, but achieves better compression. We use a lazy- * evaluation for matches: a match is finally adopted only if there is- * no better match at the next window position.- */-local block_state deflate_slow(s, flush)- deflate_state *s;- int flush;-{- IPos hash_head; /* head of hash chain */- int bflush; /* set if current block must be flushed */-- /* Process the input block. */- for (;;) {- /* Make sure that we always have enough lookahead, except- * at the end of the input file. We need MAX_MATCH bytes- * for the next match, plus MIN_MATCH bytes to insert the- * string following the next match.- */- if (s->lookahead < MIN_LOOKAHEAD) {- fill_window(s);- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {- return need_more;- }- if (s->lookahead == 0) break; /* flush the current block */- }-- /* Insert the string window[strstart .. strstart+2] in the- * dictionary, and set hash_head to the head of the hash chain:- */- hash_head = NIL;- if (s->lookahead >= MIN_MATCH) {- INSERT_STRING(s, s->strstart, hash_head);- }-- /* Find the longest match, discarding those <= prev_length.- */- s->prev_length = s->match_length, s->prev_match = s->match_start;- s->match_length = MIN_MATCH-1;-- if (hash_head != NIL && s->prev_length < s->max_lazy_match &&- s->strstart - hash_head <= MAX_DIST(s)) {- /* To simplify the code, we prevent matches with the string- * of window index 0 (in particular we have to avoid a match- * of the string with itself at the start of the input file).- */- s->match_length = longest_match (s, hash_head);- /* longest_match() sets match_start */-- if (s->match_length <= 5 && (s->strategy == Z_FILTERED-#if TOO_FAR <= 32767- || (s->match_length == MIN_MATCH &&- s->strstart - s->match_start > TOO_FAR)-#endif- )) {-- /* If prev_match is also MIN_MATCH, match_start is garbage- * but we will ignore the current match anyway.- */- s->match_length = MIN_MATCH-1;- }- }- /* If there was a match at the previous step and the current- * match is not better, output the previous match:- */- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;- /* Do not insert strings in hash table beyond this. */-- check_match(s, s->strstart-1, s->prev_match, s->prev_length);-- _tr_tally_dist(s, s->strstart -1 - s->prev_match,- s->prev_length - MIN_MATCH, bflush);-- /* Insert in hash table all strings up to the end of the match.- * strstart-1 and strstart are already inserted. If there is not- * enough lookahead, the last two strings are not inserted in- * the hash table.- */- s->lookahead -= s->prev_length-1;- s->prev_length -= 2;- do {- if (++s->strstart <= max_insert) {- INSERT_STRING(s, s->strstart, hash_head);- }- } while (--s->prev_length != 0);- s->match_available = 0;- s->match_length = MIN_MATCH-1;- s->strstart++;-- if (bflush) FLUSH_BLOCK(s, 0);-- } else if (s->match_available) {- /* If there was no match at the previous position, output a- * single literal. If there was a match but the current match- * is longer, truncate the previous match to a single literal.- */- Tracevv((stderr,"%c", s->window[s->strstart-1]));- _tr_tally_lit(s, s->window[s->strstart-1], bflush);- if (bflush) {- FLUSH_BLOCK_ONLY(s, 0);- }- s->strstart++;- s->lookahead--;- if (s->strm->avail_out == 0) return need_more;- } else {- /* There is no previous match to compare with, wait for- * the next step to decide.- */- s->match_available = 1;- s->strstart++;- s->lookahead--;- }- }- Assert (flush != Z_NO_FLUSH, "no flush?");- if (s->match_available) {- Tracevv((stderr,"%c", s->window[s->strstart-1]));- _tr_tally_lit(s, s->window[s->strstart-1], bflush);- s->match_available = 0;- }- FLUSH_BLOCK(s, flush == Z_FINISH);- return flush == Z_FINISH ? finish_done : block_done;-}-#endif /* FASTEST */--/* ===========================================================================- * For Z_RLE, simply look for runs of bytes, generate matches only of distance- * one. Do not maintain a hash table. (It will be regenerated if this run of- * deflate switches away from Z_RLE.)- */-local block_state deflate_rle(s, flush)- deflate_state *s;- int flush;-{- int bflush; /* set if current block must be flushed */- uInt prev; /* byte at distance one to match */- Bytef *scan, *strend; /* scan goes up to strend for length of run */-- for (;;) {- /* Make sure that we always have enough lookahead, except- * at the end of the input file. We need MAX_MATCH bytes- * for the longest encodable run.- */- if (s->lookahead < MAX_MATCH) {- fill_window(s);- if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) {- return need_more;- }- if (s->lookahead == 0) break; /* flush the current block */- }-- /* See how many times the previous byte repeats */- s->match_length = 0;- if (s->lookahead >= MIN_MATCH && s->strstart > 0) {- scan = s->window + s->strstart - 1;- prev = *scan;- if (prev == *++scan && prev == *++scan && prev == *++scan) {- strend = s->window + s->strstart + MAX_MATCH;- do {- } while (prev == *++scan && prev == *++scan &&- prev == *++scan && prev == *++scan &&- prev == *++scan && prev == *++scan &&- prev == *++scan && prev == *++scan &&- scan < strend);- s->match_length = MAX_MATCH - (int)(strend - scan);- if (s->match_length > s->lookahead)- s->match_length = s->lookahead;- }- }-- /* Emit match if have run of MIN_MATCH or longer, else emit literal */- if (s->match_length >= MIN_MATCH) {- check_match(s, s->strstart, s->strstart - 1, s->match_length);-- _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);-- s->lookahead -= s->match_length;- s->strstart += s->match_length;- s->match_length = 0;- } else {- /* No match, output a literal byte */- Tracevv((stderr,"%c", s->window[s->strstart]));- _tr_tally_lit (s, s->window[s->strstart], bflush);- s->lookahead--;- s->strstart++;- }- if (bflush) FLUSH_BLOCK(s, 0);- }- FLUSH_BLOCK(s, flush == Z_FINISH);- return flush == Z_FINISH ? finish_done : block_done;-}--/* ===========================================================================- * 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.)- */-local block_state deflate_huff(s, flush)- deflate_state *s;- int flush;-{- int bflush; /* set if current block must be flushed */-- for (;;) {- /* Make sure that we have a literal to write. */- if (s->lookahead == 0) {- fill_window(s);- if (s->lookahead == 0) {- if (flush == Z_NO_FLUSH)- return need_more;- break; /* flush the current block */- }- }-- /* Output a literal byte */- s->match_length = 0;- Tracevv((stderr,"%c", s->window[s->strstart]));- _tr_tally_lit (s, s->window[s->strstart], bflush);- s->lookahead--;- s->strstart++;- if (bflush) FLUSH_BLOCK(s, 0);- }- FLUSH_BLOCK(s, flush == Z_FINISH);- return flush == Z_FINISH ? finish_done : block_done;-}
− libgit2/deps/zlib/deflate.h
@@ -1,342 +0,0 @@-/* deflate.h -- internal compression state- * Copyright (C) 1995-2010 Jean-loup Gailly- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* WARNING: this file should *not* be used by applications. It is- part of the implementation of the compression library and is- subject to change. Applications should only use zlib.h.- */--/* @(#) $Id$ */--#ifndef DEFLATE_H-#define DEFLATE_H--#include "zutil.h"--/* define NO_GZIP when compiling if you want to disable gzip header and- trailer creation by deflate(). NO_GZIP would be used to avoid linking in- the crc code when it is not needed. For shared libraries, gzip encoding- should be left enabled. */-#ifndef NO_GZIP-# define GZIP-#endif--/* ===========================================================================- * Internal compression state.- */--#define LENGTH_CODES 29-/* number of length codes, not counting the special END_BLOCK code */--#define LITERALS 256-/* number of literal bytes 0..255 */--#define L_CODES (LITERALS+1+LENGTH_CODES)-/* number of Literal or Length codes, including the END_BLOCK code */--#define D_CODES 30-/* number of distance codes */--#define BL_CODES 19-/* number of codes used to transfer the bit lengths */--#define HEAP_SIZE (2*L_CODES+1)-/* maximum heap size */--#define MAX_BITS 15-/* All codes must not exceed MAX_BITS bits */--#define INIT_STATE 42-#define EXTRA_STATE 69-#define NAME_STATE 73-#define COMMENT_STATE 91-#define HCRC_STATE 103-#define BUSY_STATE 113-#define FINISH_STATE 666-/* Stream status */---/* Data structure describing a single value and its code string. */-typedef struct ct_data_s {- union {- ush freq; /* frequency count */- ush code; /* bit string */- } fc;- union {- ush dad; /* father node in Huffman tree */- ush len; /* length of bit string */- } dl;-} FAR ct_data;--#define Freq fc.freq-#define Code fc.code-#define Dad dl.dad-#define Len dl.len--typedef struct static_tree_desc_s static_tree_desc;--typedef struct tree_desc_s {- ct_data *dyn_tree; /* the dynamic tree */- int max_code; /* largest code with non zero frequency */- static_tree_desc *stat_desc; /* the corresponding static tree */-} FAR tree_desc;--typedef ush Pos;-typedef Pos FAR Posf;-typedef unsigned IPos;--/* A Pos is an index in the character window. We use short instead of int to- * save space in the various tables. IPos is used only for parameter passing.- */--typedef struct internal_state {- z_streamp strm; /* pointer back to this zlib stream */- int status; /* as the name implies */- Bytef *pending_buf; /* output still pending */- ulg pending_buf_size; /* size of pending_buf */- Bytef *pending_out; /* next pending byte to output to the stream */- uInt pending; /* nb of bytes in the pending buffer */- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */- gz_headerp gzhead; /* gzip header information to write */- uInt gzindex; /* where in extra, name, or comment */- Byte method; /* STORED (for zip only) or DEFLATED */- int last_flush; /* value of flush param for previous deflate call */-- /* used by deflate.c: */-- uInt w_size; /* LZ77 window size (32K by default) */- uInt w_bits; /* log2(w_size) (8..16) */- uInt w_mask; /* w_size - 1 */-- Bytef *window;- /* Sliding window. Input bytes are read into the second half of the window,- * and move to the first half later to keep a dictionary of at least wSize- * bytes. With this organization, matches are limited to a distance of- * wSize-MAX_MATCH bytes, but this ensures that IO is always- * performed with a length multiple of the block size. Also, it limits- * the window size to 64K, which is quite useful on MSDOS.- * To do: use the user input buffer as sliding window.- */-- ulg window_size;- /* Actual size of window: 2*wSize, except when the user input buffer- * is directly used as sliding window.- */-- Posf *prev;- /* Link to older string with same hash index. To limit the size of this- * array to 64K, this link is maintained only for the last 32K strings.- * An index in this array is thus a window index modulo 32K.- */-- Posf *head; /* Heads of the hash chains or NIL. */-- uInt ins_h; /* hash index of string to be inserted */- uInt hash_size; /* number of elements in hash table */- uInt hash_bits; /* log2(hash_size) */- uInt hash_mask; /* hash_size-1 */-- uInt hash_shift;- /* Number of bits by which ins_h must be shifted at each input- * step. It must be such that after MIN_MATCH steps, the oldest- * byte no longer takes part in the hash key, that is:- * hash_shift * MIN_MATCH >= hash_bits- */-- long block_start;- /* Window position at the beginning of the current output block. Gets- * negative when the window is moved backwards.- */-- uInt match_length; /* length of best match */- IPos prev_match; /* previous match */- int match_available; /* set if previous match exists */- uInt strstart; /* start of string to insert */- uInt match_start; /* start of matching string */- uInt lookahead; /* number of valid bytes ahead in window */-- uInt prev_length;- /* Length of the best match at previous step. Matches not greater than this- * are discarded. This is used in the lazy match evaluation.- */-- uInt max_chain_length;- /* To speed up deflation, hash chains are never searched beyond this- * length. A higher limit improves compression ratio but degrades the- * speed.- */-- uInt max_lazy_match;- /* Attempt to find a better match only when the current match is strictly- * smaller than this value. This mechanism is used only for compression- * levels >= 4.- */-# define max_insert_length max_lazy_match- /* Insert new strings in the hash table only if the match length is not- * greater than this length. This saves time but degrades compression.- * max_insert_length is used only for compression levels <= 3.- */-- int level; /* compression level (1..9) */- int strategy; /* favor or force Huffman coding*/-- uInt good_match;- /* Use a faster search when the previous match is longer than this */-- int nice_match; /* Stop searching when current match exceeds this */-- /* used by trees.c: */- /* Didn't use ct_data typedef below to supress compiler warning */- struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */- struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */- struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */-- struct tree_desc_s l_desc; /* desc. for literal tree */- struct tree_desc_s d_desc; /* desc. for distance tree */- struct tree_desc_s bl_desc; /* desc. for bit length tree */-- ush bl_count[MAX_BITS+1];- /* number of codes at each bit length for an optimal tree */-- int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */- int heap_len; /* number of elements in the heap */- int heap_max; /* element of largest frequency */- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.- * The same heap array is used to build all trees.- */-- uch depth[2*L_CODES+1];- /* Depth of each subtree used as tie breaker for trees of equal frequency- */-- uchf *l_buf; /* buffer for literals or lengths */-- uInt lit_bufsize;- /* Size of match buffer for literals/lengths. There are 4 reasons for- * limiting lit_bufsize to 64K:- * - frequencies can be kept in 16 bit counters- * - if compression is not successful for the first block, all input- * data is still in the window so we can still emit a stored block even- * when input comes from standard input. (This can also be done for- * all blocks if lit_bufsize is not greater than 32K.)- * - if compression is not successful for a file smaller than 64K, we can- * even emit a stored file instead of a stored block (saving 5 bytes).- * This is applicable only for zip (not gzip or zlib).- * - creating new Huffman trees less frequently may not provide fast- * adaptation to changes in the input data statistics. (Take for- * example a binary file with poorly compressible code followed by- * a highly compressible string table.) Smaller buffer sizes give- * fast adaptation but have of course the overhead of transmitting- * trees more frequently.- * - I can't count above 4- */-- uInt last_lit; /* running index in l_buf */-- ushf *d_buf;- /* Buffer for distances. To simplify the code, d_buf and l_buf have- * the same number of elements. To use different lengths, an extra flag- * array would be necessary.- */-- ulg opt_len; /* bit length of current block with optimal trees */- ulg static_len; /* bit length of current block with static trees */- uInt matches; /* number of string matches in current block */- int last_eob_len; /* bit length of EOB code for last block */--#ifdef DEBUG- ulg compressed_len; /* total bit length of compressed file mod 2^32 */- ulg bits_sent; /* bit length of compressed data sent mod 2^32 */-#endif-- ush bi_buf;- /* Output buffer. bits are inserted starting at the bottom (least- * significant bits).- */- int bi_valid;- /* Number of valid bits in bi_buf. All bits above the last valid bit- * are always zero.- */-- ulg high_water;- /* High water mark offset in window for initialized bytes -- bytes above- * this are set to zero in order to avoid memory check warnings when- * longest match routines access bytes past the input. This is then- * updated to the new high water mark.- */--} FAR deflate_state;--/* Output a byte on the stream.- * IN assertion: there is enough room in pending_buf.- */-#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}---#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)-/* Minimum amount of lookahead, except at the end of the input file.- * See deflate.c for comments about the MIN_MATCH+1.- */--#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)-/* In order to simplify the code, particularly on 16 bit machines, match- * distances are limited to MAX_DIST instead of WSIZE.- */--#define WIN_INIT MAX_MATCH-/* Number of bytes after end of data in window to initialize in order to avoid- memory checker errors from longest match routines */-- /* in trees.c */-void ZLIB_INTERNAL _tr_init OF((deflate_state *s));-int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));-void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,- ulg stored_len, int last));-void ZLIB_INTERNAL _tr_align OF((deflate_state *s));-void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,- ulg stored_len, int last));--#define d_code(dist) \- ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])-/* Mapping from a distance to a distance code. dist is the distance - 1 and- * must not have side effects. _dist_code[256] and _dist_code[257] are never- * used.- */--#ifndef DEBUG-/* Inline versions of _tr_tally for speed: */--#if defined(GEN_TREES_H) || !defined(STDC)- extern uch ZLIB_INTERNAL _length_code[];- extern uch ZLIB_INTERNAL _dist_code[];-#else- extern const uch ZLIB_INTERNAL _length_code[];- extern const uch ZLIB_INTERNAL _dist_code[];-#endif--# define _tr_tally_lit(s, c, flush) \- { uch cc = (uch)(c); \- s->d_buf[s->last_lit] = 0; \- s->l_buf[s->last_lit++] = cc; \- s->dyn_ltree[cc].Freq++; \- flush = (s->last_lit == s->lit_bufsize-1); \- }-# define _tr_tally_dist(s, distance, length, flush) \- { uch len = (uch)(length); \- ush dist = (ush)(distance); \- s->d_buf[s->last_lit] = dist; \- s->l_buf[s->last_lit++] = len; \- dist--; \- s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \- s->dyn_dtree[d_code(dist)].Freq++; \- flush = (s->last_lit == s->lit_bufsize-1); \- }-#else-# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)-# define _tr_tally_dist(s, distance, length, flush) \- flush = _tr_tally(s, distance, length)-#endif--#endif /* DEFLATE_H */
− libgit2/deps/zlib/inffast.c
@@ -1,340 +0,0 @@-/* inffast.c -- fast decoding- * Copyright (C) 1995-2008, 2010 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--#include "zutil.h"-#include "inftrees.h"-#include "inflate.h"-#include "inffast.h"--#ifndef ASMINF--/* Allow machine dependent optimization for post-increment or pre-increment.- Based on testing to date,- Pre-increment preferred for:- - PowerPC G3 (Adler)- - MIPS R5000 (Randers-Pehrson)- Post-increment preferred for:- - none- No measurable difference:- - Pentium III (Anderson)- - M68060 (Nikl)- */-#ifdef POSTINC-# define OFF 0-# define PUP(a) *(a)++-#else-# define OFF 1-# define PUP(a) *++(a)-#endif--/*- Decode literal, length, and distance codes and write out the resulting- literal and match bytes until either not enough input or output is- available, an end-of-block is encountered, or a data error is encountered.- When large enough input and output buffers are supplied to inflate(), for- example, a 16K input buffer and a 64K output buffer, more than 95% of the- inflate execution time is spent in this routine.-- Entry assumptions:-- state->mode == LEN- strm->avail_in >= 6- strm->avail_out >= 258- start >= strm->avail_out- state->bits < 8-- On return, state->mode is one of:-- LEN -- ran out of enough output space or enough available input- TYPE -- reached end of block code, inflate() to interpret next block- BAD -- error in block data-- Notes:-- - The maximum input bits used by a length/distance pair is 15 bits for the- length code, 5 bits for the length extra, 15 bits for the distance code,- and 13 bits for the distance extra. This totals 48 bits, or six bytes.- Therefore if strm->avail_in >= 6, then there is enough input to avoid- checking for available input while decoding.-- - The maximum bytes that a single length/distance pair can output is 258- bytes, which is the maximum length that can be coded. inflate_fast()- requires strm->avail_out >= 258 for each loop to avoid checking for- output space.- */-void ZLIB_INTERNAL inflate_fast(strm, start)-z_streamp strm;-unsigned start; /* inflate()'s starting value for strm->avail_out */-{- struct inflate_state FAR *state;- unsigned char FAR *in; /* local strm->next_in */- unsigned char FAR *last; /* while in < last, enough input available */- unsigned char FAR *out; /* local strm->next_out */- unsigned char FAR *beg; /* inflate()'s initial strm->next_out */- unsigned char FAR *end; /* while out < end, enough space available */-#ifdef INFLATE_STRICT- unsigned dmax; /* maximum distance from zlib header */-#endif- unsigned wsize; /* window size or zero if not using window */- unsigned whave; /* valid bytes in the window */- unsigned wnext; /* window write index */- unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */- unsigned long hold; /* local strm->hold */- unsigned bits; /* local strm->bits */- code const FAR *lcode; /* local strm->lencode */- code const FAR *dcode; /* local strm->distcode */- unsigned lmask; /* mask for first level of length codes */- unsigned dmask; /* mask for first level of distance codes */- code here; /* retrieved table entry */- unsigned op; /* code bits, operation, extra bits, or */- /* window position, window bytes to copy */- unsigned len; /* match length, unused bytes */- unsigned dist; /* match distance */- unsigned char FAR *from; /* where to copy match from */-- /* copy state to local variables */- state = (struct inflate_state FAR *)strm->state;- in = strm->next_in - OFF;- last = in + (strm->avail_in - 5);- out = strm->next_out - OFF;- beg = out - (start - strm->avail_out);- end = out + (strm->avail_out - 257);-#ifdef INFLATE_STRICT- dmax = state->dmax;-#endif- wsize = state->wsize;- whave = state->whave;- wnext = state->wnext;- window = state->window;- hold = state->hold;- bits = state->bits;- lcode = state->lencode;- dcode = state->distcode;- lmask = (1U << state->lenbits) - 1;- dmask = (1U << state->distbits) - 1;-- /* decode literals and length/distances until end-of-block or not enough- input data or output space */- do {- if (bits < 15) {- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- }- here = lcode[hold & lmask];- dolen:- op = (unsigned)(here.bits);- hold >>= op;- bits -= op;- op = (unsigned)(here.op);- if (op == 0) { /* literal */- Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?- "inflate: literal '%c'\n" :- "inflate: literal 0x%02x\n", here.val));- PUP(out) = (unsigned char)(here.val);- }- else if (op & 16) { /* length base */- len = (unsigned)(here.val);- op &= 15; /* number of extra bits */- if (op) {- if (bits < op) {- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- }- len += (unsigned)hold & ((1U << op) - 1);- hold >>= op;- bits -= op;- }- Tracevv((stderr, "inflate: length %u\n", len));- if (bits < 15) {- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- }- here = dcode[hold & dmask];- dodist:- op = (unsigned)(here.bits);- hold >>= op;- bits -= op;- op = (unsigned)(here.op);- if (op & 16) { /* distance base */- dist = (unsigned)(here.val);- op &= 15; /* number of extra bits */- if (bits < op) {- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- if (bits < op) {- hold += (unsigned long)(PUP(in)) << bits;- bits += 8;- }- }- dist += (unsigned)hold & ((1U << op) - 1);-#ifdef INFLATE_STRICT- if (dist > dmax) {- strm->msg = (char *)"invalid distance too far back";- state->mode = BAD;- break;- }-#endif- hold >>= op;- bits -= op;- Tracevv((stderr, "inflate: distance %u\n", dist));- op = (unsigned)(out - beg); /* max distance in output */- if (dist > op) { /* see if copy from window */- op = dist - op; /* distance back in window */- if (op > whave) {- if (state->sane) {- strm->msg =- (char *)"invalid distance too far back";- state->mode = BAD;- break;- }-#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR- if (len <= op - whave) {- do {- PUP(out) = 0;- } while (--len);- continue;- }- len -= op - whave;- do {- PUP(out) = 0;- } while (--op > whave);- if (op == 0) {- from = out - dist;- do {- PUP(out) = PUP(from);- } while (--len);- continue;- }-#endif- }- from = window - OFF;- if (wnext == 0) { /* very common case */- from += wsize - op;- if (op < len) { /* some from window */- len -= op;- do {- PUP(out) = PUP(from);- } while (--op);- from = out - dist; /* rest from output */- }- }- else if (wnext < op) { /* wrap around window */- from += wsize + wnext - op;- op -= wnext;- if (op < len) { /* some from end of window */- len -= op;- do {- PUP(out) = PUP(from);- } while (--op);- from = window - OFF;- if (wnext < len) { /* some from start of window */- op = wnext;- len -= op;- do {- PUP(out) = PUP(from);- } while (--op);- from = out - dist; /* rest from output */- }- }- }- else { /* contiguous in window */- from += wnext - op;- if (op < len) { /* some from window */- len -= op;- do {- PUP(out) = PUP(from);- } while (--op);- from = out - dist; /* rest from output */- }- }- while (len > 2) {- PUP(out) = PUP(from);- PUP(out) = PUP(from);- PUP(out) = PUP(from);- len -= 3;- }- if (len) {- PUP(out) = PUP(from);- if (len > 1)- PUP(out) = PUP(from);- }- }- else {- from = out - dist; /* copy direct from output */- do { /* minimum length is three */- PUP(out) = PUP(from);- PUP(out) = PUP(from);- PUP(out) = PUP(from);- len -= 3;- } while (len > 2);- if (len) {- PUP(out) = PUP(from);- if (len > 1)- PUP(out) = PUP(from);- }- }- }- else if ((op & 64) == 0) { /* 2nd level distance code */- here = dcode[here.val + (hold & ((1U << op) - 1))];- goto dodist;- }- else {- strm->msg = (char *)"invalid distance code";- state->mode = BAD;- break;- }- }- else if ((op & 64) == 0) { /* 2nd level length code */- here = lcode[here.val + (hold & ((1U << op) - 1))];- goto dolen;- }- else if (op & 32) { /* end-of-block */- Tracevv((stderr, "inflate: end of block\n"));- state->mode = TYPE;- break;- }- else {- strm->msg = (char *)"invalid literal/length code";- state->mode = BAD;- break;- }- } while (in < last && out < end);-- /* return unused bytes (on entry, bits < 8, so in won't go too far back) */- len = bits >> 3;- in -= len;- bits -= len << 3;- hold &= (1U << bits) - 1;-- /* update state and return */- strm->next_in = in + OFF;- strm->next_out = out + OFF;- strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));- strm->avail_out = (unsigned)(out < end ?- 257 + (end - out) : 257 - (out - end));- state->hold = hold;- state->bits = bits;- return;-}--/*- inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):- - Using bit fields for code structure- - Different op definition to avoid & for extra bits (do & for table bits)- - Three separate decoding do-loops for direct, window, and wnext == 0- - Special case for distance > 1 copies to do overlapped load and store copy- - Explicit branch predictions (based on measured branch probabilities)- - Deferring match copy and interspersed it with decoding subsequent codes- - Swapping literal/length else- - Swapping window/direct else- - Larger unrolled copy loops (three is about right)- - Moving len -= 3 statement into middle of loop- */--#endif /* !ASMINF */
− libgit2/deps/zlib/inffast.h
@@ -1,11 +0,0 @@-/* inffast.h -- header to use inffast.c- * Copyright (C) 1995-2003, 2010 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* WARNING: this file should *not* be used by applications. It is- part of the implementation of the compression library and is- subject to change. Applications should only use zlib.h.- */--void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
− libgit2/deps/zlib/inffixed.h
@@ -1,94 +0,0 @@- /* inffixed.h -- table for decoding fixed codes- * Generated automatically by makefixed().- */-- /* WARNING: this file should *not* be used by applications. It- is part of the implementation of the compression library and- is subject to change. Applications should only use zlib.h.- */-- static const code lenfix[512] = {- {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},- {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},- {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},- {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},- {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},- {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},- {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},- {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},- {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},- {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},- {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},- {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},- {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},- {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},- {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},- {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},- {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},- {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},- {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},- {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},- {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},- {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},- {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},- {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},- {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},- {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},- {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},- {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},- {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},- {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},- {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},- {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},- {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},- {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},- {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},- {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},- {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},- {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},- {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},- {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},- {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},- {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},- {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},- {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},- {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},- {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},- {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},- {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},- {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},- {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},- {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},- {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},- {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},- {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},- {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},- {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},- {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},- {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},- {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},- {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},- {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},- {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},- {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},- {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},- {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},- {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},- {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},- {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},- {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},- {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},- {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},- {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},- {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},- {0,9,255}- };-- static const code distfix[32] = {- {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},- {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},- {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},- {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},- {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},- {22,5,193},{64,5,0}- };
− libgit2/deps/zlib/inflate.c
@@ -1,1480 +0,0 @@-/* inflate.c -- zlib decompression- * Copyright (C) 1995-2010 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--/*- * Change history:- *- * 1.2.beta0 24 Nov 2002- * - First version -- complete rewrite of inflate to simplify code, avoid- * creation of window when not needed, minimize use of window when it is- * needed, make inffast.c even faster, implement gzip decoding, and to- * improve code readability and style over the previous zlib inflate code- *- * 1.2.beta1 25 Nov 2002- * - Use pointers for available input and output checking in inffast.c- * - Remove input and output counters in inffast.c- * - Change inffast.c entry and loop from avail_in >= 7 to >= 6- * - Remove unnecessary second byte pull from length extra in inffast.c- * - Unroll direct copy to three copies per loop in inffast.c- *- * 1.2.beta2 4 Dec 2002- * - Change external routine names to reduce potential conflicts- * - Correct filename to inffixed.h for fixed tables in inflate.c- * - Make hbuf[] unsigned char to match parameter type in inflate.c- * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)- * to avoid negation problem on Alphas (64 bit) in inflate.c- *- * 1.2.beta3 22 Dec 2002- * - Add comments on state->bits assertion in inffast.c- * - Add comments on op field in inftrees.h- * - Fix bug in reuse of allocated window after inflateReset()- * - Remove bit fields--back to byte structure for speed- * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths- * - Change post-increments to pre-increments in inflate_fast(), PPC biased?- * - Add compile time option, POSTINC, to use post-increments instead (Intel?)- * - Make MATCH copy in inflate() much faster for when inflate_fast() not used- * - Use local copies of stream next and avail values, as well as local bit- * buffer and bit count in inflate()--for speed when inflate_fast() not used- *- * 1.2.beta4 1 Jan 2003- * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings- * - Move a comment on output buffer sizes from inffast.c to inflate.c- * - Add comments in inffast.c to introduce the inflate_fast() routine- * - Rearrange window copies in inflate_fast() for speed and simplification- * - Unroll last copy for window match in inflate_fast()- * - Use local copies of window variables in inflate_fast() for speed- * - Pull out common wnext == 0 case for speed in inflate_fast()- * - Make op and len in inflate_fast() unsigned for consistency- * - Add FAR to lcode and dcode declarations in inflate_fast()- * - Simplified bad distance check in inflate_fast()- * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new- * source file infback.c to provide a call-back interface to inflate for- * programs like gzip and unzip -- uses window as output buffer to avoid- * window copying- *- * 1.2.beta5 1 Jan 2003- * - Improved inflateBack() interface to allow the caller to provide initial- * input in strm.- * - Fixed stored blocks bug in inflateBack()- *- * 1.2.beta6 4 Jan 2003- * - Added comments in inffast.c on effectiveness of POSTINC- * - Typecasting all around to reduce compiler warnings- * - Changed loops from while (1) or do {} while (1) to for (;;), again to- * make compilers happy- * - Changed type of window in inflateBackInit() to unsigned char *- *- * 1.2.beta7 27 Jan 2003- * - Changed many types to unsigned or unsigned short to avoid warnings- * - Added inflateCopy() function- *- * 1.2.0 9 Mar 2003- * - Changed inflateBack() interface to provide separate opaque descriptors- * for the in() and out() functions- * - Changed inflateBack() argument and in_func typedef to swap the length- * and buffer address return values for the input function- * - Check next_in and next_out for Z_NULL on entry to inflate()- *- * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.- */--#include "zutil.h"-#include "inftrees.h"-#include "inflate.h"-#include "inffast.h"--#ifdef MAKEFIXED-# ifndef BUILDFIXED-# define BUILDFIXED-# endif-#endif--/* function prototypes */-local void fixedtables OF((struct inflate_state FAR *state));-local int updatewindow OF((z_streamp strm, unsigned out));-#ifdef BUILDFIXED- void makefixed OF((void));-#endif-local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,- unsigned len));--int ZEXPORT inflateReset(strm)-z_streamp strm;-{- struct inflate_state FAR *state;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- strm->total_in = strm->total_out = state->total = 0;- strm->msg = Z_NULL;- strm->adler = 1; /* to support ill-conceived Java test suite */- state->mode = HEAD;- state->last = 0;- state->havedict = 0;- state->dmax = 32768U;- state->head = Z_NULL;- state->wsize = 0;- state->whave = 0;- state->wnext = 0;- state->hold = 0;- state->bits = 0;- state->lencode = state->distcode = state->next = state->codes;- state->sane = 1;- state->back = -1;- Tracev((stderr, "inflate: reset\n"));- return Z_OK;-}--int ZEXPORT inflateReset2(strm, windowBits)-z_streamp strm;-int windowBits;-{- int wrap;- struct inflate_state FAR *state;-- /* get the state */- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;-- /* extract wrap request from windowBits parameter */- if (windowBits < 0) {- wrap = 0;- windowBits = -windowBits;- }- else {- wrap = (windowBits >> 4) + 1;-#ifdef GUNZIP- if (windowBits < 48)- windowBits &= 15;-#endif- }-- /* set number of window bits, free window if different */- if (windowBits && (windowBits < 8 || windowBits > 15))- return Z_STREAM_ERROR;- if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {- ZFREE(strm, state->window);- state->window = Z_NULL;- }-- /* update state and reset the rest of it */- state->wrap = wrap;- state->wbits = (unsigned)windowBits;- return inflateReset(strm);-}--int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)-z_streamp strm;-int windowBits;-const char *version;-int stream_size;-{- int ret;- 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) return Z_STREAM_ERROR;- strm->msg = Z_NULL; /* in case we return an error */- if (strm->zalloc == (alloc_func)0) {- strm->zalloc = zcalloc;- strm->opaque = (voidpf)0;- }- if (strm->zfree == (free_func)0) strm->zfree = zcfree;- 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->window = Z_NULL;- ret = inflateReset2(strm, windowBits);- if (ret != Z_OK) {- ZFREE(strm, state);- strm->state = Z_NULL;- }- return ret;-}--int ZEXPORT inflateInit_(strm, version, stream_size)-z_streamp strm;-const char *version;-int stream_size;-{- return inflateInit2_(strm, DEF_WBITS, version, stream_size);-}--int ZEXPORT inflatePrime(strm, bits, value)-z_streamp strm;-int bits;-int value;-{- struct inflate_state FAR *state;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- if (bits < 0) {- state->hold = 0;- state->bits = 0;- return Z_OK;- }- if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;- value &= (1L << bits) - 1;- state->hold += value << state->bits;- state->bits += bits;- 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;-}--#ifdef MAKEFIXED-#include <stdio.h>--/*- Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also- defines BUILDFIXED, so the tables are built on the fly. makefixed() writes- those tables to stdout, which would be piped to inffixed.h. A small program- can simply call makefixed to do this:-- void makefixed(void);-- int main(void)- {- makefixed();- return 0;- }-- Then that can be linked with zlib built with MAKEFIXED defined and run:-- a.out > inffixed.h- */-void makefixed()-{- unsigned low, size;- struct inflate_state state;-- fixedtables(&state);- puts(" /* inffixed.h -- table for decoding fixed codes");- puts(" * Generated automatically by makefixed().");- puts(" */");- puts("");- puts(" /* WARNING: this file should *not* be used by applications.");- puts(" It is part of the implementation of this library and is");- puts(" subject to change. Applications should only use zlib.h.");- puts(" */");- puts("");- size = 1U << 9;- printf(" static const code lenfix[%u] = {", size);- low = 0;- for (;;) {- if ((low % 7) == 0) printf("\n ");- printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,- state.lencode[low].val);- if (++low == size) break;- putchar(',');- }- puts("\n };");- size = 1U << 5;- printf("\n static const code distfix[%u] = {", size);- low = 0;- for (;;) {- if ((low % 6) == 0) printf("\n ");- printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,- state.distcode[low].val);- if (++low == size) break;- putchar(',');- }- puts("\n };");-}-#endif /* MAKEFIXED */--/*- Update the window with the last wsize (normally 32K) bytes written before- returning. If window does not exist yet, create it. This is only called- when a window is already in use, or when output has been written during this- inflate call, but the end of the deflate stream has not been reached yet.- It is also called to create a window for dictionary data when a dictionary- is loaded.-- Providing output buffers larger than 32K to inflate() should provide a speed- advantage, since only the last 32K of output is copied to the sliding window- upon return from inflate(), and since all distances after the first 32K of- 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.- */-local int updatewindow(strm, out)-z_streamp strm;-unsigned out;-{- struct inflate_state FAR *state;- unsigned copy, dist;-- state = (struct inflate_state FAR *)strm->state;-- /* if it hasn't been done already, allocate space for the window */- if (state->window == Z_NULL) {- state->window = (unsigned char FAR *)- ZALLOC(strm, 1U << state->wbits,- sizeof(unsigned char));- if (state->window == Z_NULL) return 1;- }-- /* if window not in use yet, initialize */- if (state->wsize == 0) {- state->wsize = 1U << state->wbits;- state->wnext = 0;- state->whave = 0;- }-- /* copy state->wsize or less output bytes into the circular window */- copy = out - strm->avail_out;- if (copy >= state->wsize) {- zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);- state->wnext = 0;- state->whave = state->wsize;- }- else {- dist = state->wsize - state->wnext;- if (dist > copy) dist = copy;- zmemcpy(state->window + state->wnext, strm->next_out - copy, dist);- copy -= dist;- if (copy) {- zmemcpy(state->window, strm->next_out - copy, copy);- state->wnext = copy;- state->whave = state->wsize;- }- else {- state->wnext += dist;- if (state->wnext == state->wsize) state->wnext = 0;- if (state->whave < state->wsize) state->whave += dist;- }- }- return 0;-}--/* Macros for inflate(): */--/* check function to use adler32() for zlib or crc32() for gzip */-#ifdef GUNZIP-# define UPDATE(check, buf, len) \- (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))-#else-# define UPDATE(check, buf, len) adler32(check, buf, len)-#endif--/* check macros for header crc */-#ifdef GUNZIP-# define CRC2(check, word) \- do { \- hbuf[0] = (unsigned char)(word); \- hbuf[1] = (unsigned char)((word) >> 8); \- check = crc32(check, hbuf, 2); \- } while (0)--# define CRC4(check, word) \- do { \- hbuf[0] = (unsigned char)(word); \- hbuf[1] = (unsigned char)((word) >> 8); \- hbuf[2] = (unsigned char)((word) >> 16); \- hbuf[3] = (unsigned char)((word) >> 24); \- check = crc32(check, hbuf, 4); \- } while (0)-#endif--/* Load registers with state in inflate() for speed */-#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)--/* Restore state from registers in inflate() */-#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)--/* Get a byte of input into the bit accumulator, or return from inflate()- if there is no input available. */-#define PULLBYTE() \- do { \- if (have == 0) goto inf_leave; \- 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 inflate(). */-#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)--/* Reverse the bytes in a 32-bit value */-#define REVERSE(q) \- ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \- (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))--/*- inflate() uses a state machine to process as much input data and generate as- much output data as possible before returning. The state machine is- structured roughly as follows:-- for (;;) switch (state) {- ...- case STATEn:- if (not enough input data or output space to make progress)- return;- ... make progress ...- state = STATEm;- break;- ...- }-- so when inflate() is called again, the same case is attempted again, and- if the appropriate resources are provided, the machine proceeds to the- next state. The NEEDBITS() macro is usually the way the state evaluates- whether it can proceed or should return. NEEDBITS() does the return if- the requested bits are not available. The typical use of the BITS macros- is:-- NEEDBITS(n);- ... do something with BITS(n) ...- DROPBITS(n);-- where NEEDBITS(n) either returns from inflate() if there isn't enough- input left to load n bits into the accumulator, or it continues. BITS(n)- gives the low n bits in the accumulator. When done, DROPBITS(n) drops- the low n bits off the accumulator. INITBITS() clears the accumulator- and sets the number of available bits to zero. BYTEBITS() discards just- enough bits to put the accumulator on a byte boundary. After BYTEBITS()- and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.-- NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return- if there is no input available. The decoding of variable length codes uses- PULLBYTE() directly in order to pull just enough bytes to decode the next- code, and no more.-- Some states loop until they get enough input, making sure that enough- state information is maintained to continue the loop where it left off- if NEEDBITS() returns in the loop. For example, want, need, and keep- would all have to actually be part of the saved state in case NEEDBITS()- returns:-- case STATEw:- while (want < need) {- NEEDBITS(n);- keep[want++] = BITS(n);- DROPBITS(n);- }- state = STATEx;- case STATEx:-- As shown above, if the next state is also the next case, then the break- is omitted.-- A state may also return if there is not enough output space available to- complete that state. Those states are copying stored data, writing a- literal byte, and copying a matching string.-- When returning, a "goto inf_leave" is used to update the total counters,- update the check value, and determine whether any progress has been made- during that inflate() call in order to return the proper return code.- Progress is defined as a change in either strm->avail_in or strm->avail_out.- When there is a window, goto inf_leave will update the window with the last- output written. If a goto inf_leave occurs in the middle of decompression- and there is no window currently, goto inf_leave will create one and copy- output to the window for the next call of inflate().-- In this implementation, the flush parameter of inflate() only affects the- return code (per zlib.h). inflate() always writes as much as possible to- strm->next_out, given the space available and the provided input--the effect- documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers- the allocation of and copying into a sliding window until necessary, which- provides the effect documented in zlib.h for Z_FINISH when the entire input- stream available. So the only thing the flush parameter actually does is:- when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it- will return Z_BUF_ERROR if it has not reached the end of the stream.- */--int ZEXPORT inflate(strm, flush)-z_streamp strm;-int flush;-{- struct inflate_state FAR *state;- 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 in, out; /* save starting available input and output */- 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 */-#ifdef GUNZIP- unsigned char hbuf[4]; /* buffer for gzip header crc calculation */-#endif- 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};-- if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||- (strm->next_in == Z_NULL && strm->avail_in != 0))- return Z_STREAM_ERROR;-- state = (struct inflate_state FAR *)strm->state;- if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */- LOAD();- in = have;- out = left;- ret = Z_OK;- for (;;)- switch (state->mode) {- case HEAD:- if (state->wrap == 0) {- state->mode = TYPEDO;- break;- }- NEEDBITS(16);-#ifdef GUNZIP- if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */- state->check = crc32(0L, Z_NULL, 0);- CRC2(state->check, hold);- INITBITS();- state->mode = FLAGS;- break;- }- state->flags = 0; /* expect zlib header */- if (state->head != Z_NULL)- state->head->done = -1;- if (!(state->wrap & 1) || /* check if zlib header allowed */-#else- if (-#endif- ((BITS(8) << 8) + (hold >> 8)) % 31) {- strm->msg = (char *)"incorrect header check";- state->mode = BAD;- break;- }- if (BITS(4) != Z_DEFLATED) {- strm->msg = (char *)"unknown compression method";- state->mode = BAD;- break;- }- DROPBITS(4);- len = BITS(4) + 8;- if (state->wbits == 0)- state->wbits = len;- else if (len > state->wbits) {- strm->msg = (char *)"invalid window size";- state->mode = BAD;- break;- }- state->dmax = 1U << len;- Tracev((stderr, "inflate: zlib header ok\n"));- strm->adler = state->check = adler32(0L, Z_NULL, 0);- state->mode = hold & 0x200 ? DICTID : TYPE;- INITBITS();- break;-#ifdef GUNZIP- case FLAGS:- NEEDBITS(16);- state->flags = (int)(hold);- if ((state->flags & 0xff) != Z_DEFLATED) {- strm->msg = (char *)"unknown compression method";- state->mode = BAD;- break;- }- if (state->flags & 0xe000) {- strm->msg = (char *)"unknown header flags set";- state->mode = BAD;- break;- }- if (state->head != Z_NULL)- state->head->text = (int)((hold >> 8) & 1);- if (state->flags & 0x0200) CRC2(state->check, hold);- INITBITS();- state->mode = TIME;- case TIME:- NEEDBITS(32);- if (state->head != Z_NULL)- state->head->time = hold;- if (state->flags & 0x0200) CRC4(state->check, hold);- INITBITS();- state->mode = OS;- case OS:- NEEDBITS(16);- if (state->head != Z_NULL) {- state->head->xflags = (int)(hold & 0xff);- state->head->os = (int)(hold >> 8);- }- if (state->flags & 0x0200) CRC2(state->check, hold);- INITBITS();- state->mode = EXLEN;- case EXLEN:- if (state->flags & 0x0400) {- NEEDBITS(16);- state->length = (unsigned)(hold);- if (state->head != Z_NULL)- state->head->extra_len = (unsigned)hold;- if (state->flags & 0x0200) CRC2(state->check, hold);- INITBITS();- }- else if (state->head != Z_NULL)- state->head->extra = Z_NULL;- state->mode = EXTRA;- case EXTRA:- if (state->flags & 0x0400) {- copy = state->length;- if (copy > have) copy = have;- if (copy) {- if (state->head != Z_NULL &&- state->head->extra != Z_NULL) {- len = state->head->extra_len - state->length;- zmemcpy(state->head->extra + len, next,- len + copy > state->head->extra_max ?- state->head->extra_max - len : copy);- }- if (state->flags & 0x0200)- state->check = crc32(state->check, next, copy);- have -= copy;- next += copy;- state->length -= copy;- }- if (state->length) goto inf_leave;- }- state->length = 0;- state->mode = NAME;- case NAME:- if (state->flags & 0x0800) {- if (have == 0) goto inf_leave;- copy = 0;- do {- len = (unsigned)(next[copy++]);- if (state->head != Z_NULL &&- state->head->name != Z_NULL &&- state->length < state->head->name_max)- state->head->name[state->length++] = len;- } while (len && copy < have);- if (state->flags & 0x0200)- state->check = crc32(state->check, next, copy);- have -= copy;- next += copy;- if (len) goto inf_leave;- }- else if (state->head != Z_NULL)- state->head->name = Z_NULL;- state->length = 0;- state->mode = COMMENT;- case COMMENT:- if (state->flags & 0x1000) {- if (have == 0) goto inf_leave;- copy = 0;- do {- len = (unsigned)(next[copy++]);- if (state->head != Z_NULL &&- state->head->comment != Z_NULL &&- state->length < state->head->comm_max)- state->head->comment[state->length++] = len;- } while (len && copy < have);- if (state->flags & 0x0200)- state->check = crc32(state->check, next, copy);- have -= copy;- next += copy;- if (len) goto inf_leave;- }- else if (state->head != Z_NULL)- state->head->comment = Z_NULL;- state->mode = HCRC;- case HCRC:- if (state->flags & 0x0200) {- NEEDBITS(16);- if (hold != (state->check & 0xffff)) {- strm->msg = (char *)"header crc mismatch";- state->mode = BAD;- break;- }- INITBITS();- }- if (state->head != Z_NULL) {- state->head->hcrc = (int)((state->flags >> 9) & 1);- state->head->done = 1;- }- strm->adler = state->check = crc32(0L, Z_NULL, 0);- state->mode = TYPE;- break;-#endif- case DICTID:- NEEDBITS(32);- strm->adler = state->check = REVERSE(hold);- INITBITS();- state->mode = DICT;- case DICT:- if (state->havedict == 0) {- RESTORE();- return Z_NEED_DICT;- }- strm->adler = state->check = adler32(0L, Z_NULL, 0);- state->mode = TYPE;- case TYPE:- if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;- case TYPEDO:- if (state->last) {- BYTEBITS();- state->mode = CHECK;- 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 */- if (flush == Z_TREES) {- DROPBITS(2);- goto inf_leave;- }- 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:- 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();- state->mode = COPY_;- if (flush == Z_TREES) goto inf_leave;- case COPY_:- state->mode = COPY;- case COPY:- copy = state->length;- if (copy) {- if (copy > have) copy = have;- if (copy > left) copy = left;- if (copy == 0) goto inf_leave;- zmemcpy(put, next, copy);- have -= copy;- next += copy;- left -= copy;- put += copy;- state->length -= copy;- break;- }- Tracev((stderr, "inflate: stored end\n"));- state->mode = TYPE;- break;- case TABLE:- 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"));- state->have = 0;- state->mode = LENLENS;- case LENLENS:- 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"));- state->have = 0;- state->mode = CODELENS;- case CODELENS:- 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) {- NEEDBITS(here.bits);- 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 = 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_;- if (flush == Z_TREES) goto inf_leave;- case LEN_:- state->mode = LEN;- case LEN:- if (have >= 6 && left >= 258) {- RESTORE();- inflate_fast(strm, out);- LOAD();- if (state->mode == TYPE)- state->back = -1;- break;- }- state->back = 0;- 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);- state->back += last.bits;- }- DROPBITS(here.bits);- state->back += here.bits;- state->length = (unsigned)here.val;- if ((int)(here.op) == 0) {- Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?- "inflate: literal '%c'\n" :- "inflate: literal 0x%02x\n", here.val));- state->mode = LIT;- break;- }- if (here.op & 32) {- Tracevv((stderr, "inflate: end of block\n"));- state->back = -1;- state->mode = TYPE;- break;- }- if (here.op & 64) {- strm->msg = (char *)"invalid literal/length code";- state->mode = BAD;- break;- }- state->extra = (unsigned)(here.op) & 15;- state->mode = LENEXT;- case LENEXT:- if (state->extra) {- NEEDBITS(state->extra);- state->length += BITS(state->extra);- DROPBITS(state->extra);- state->back += state->extra;- }- Tracevv((stderr, "inflate: length %u\n", state->length));- state->was = state->length;- state->mode = DIST;- case DIST:- 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);- state->back += last.bits;- }- DROPBITS(here.bits);- state->back += here.bits;- if (here.op & 64) {- strm->msg = (char *)"invalid distance code";- state->mode = BAD;- break;- }- state->offset = (unsigned)here.val;- state->extra = (unsigned)(here.op) & 15;- state->mode = DISTEXT;- case DISTEXT:- if (state->extra) {- NEEDBITS(state->extra);- state->offset += BITS(state->extra);- DROPBITS(state->extra);- state->back += state->extra;- }-#ifdef INFLATE_STRICT- if (state->offset > state->dmax) {- strm->msg = (char *)"invalid distance too far back";- state->mode = BAD;- break;- }-#endif- Tracevv((stderr, "inflate: distance %u\n", state->offset));- state->mode = MATCH;- case MATCH:- if (left == 0) goto inf_leave;- copy = out - left;- if (state->offset > copy) { /* copy from window */- copy = state->offset - copy;- if (copy > state->whave) {- if (state->sane) {- strm->msg = (char *)"invalid distance too far back";- state->mode = BAD;- break;- }-#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR- Trace((stderr, "inflate.c too far\n"));- copy -= state->whave;- if (copy > state->length) copy = state->length;- if (copy > left) copy = left;- left -= copy;- state->length -= copy;- do {- *put++ = 0;- } while (--copy);- if (state->length == 0) state->mode = LEN;- break;-#endif- }- if (copy > state->wnext) {- copy -= state->wnext;- from = state->window + (state->wsize - copy);- }- else- from = state->window + (state->wnext - copy);- if (copy > state->length) copy = state->length;- }- else { /* copy from output */- from = put - state->offset;- copy = state->length;- }- if (copy > left) copy = left;- left -= copy;- state->length -= copy;- do {- *put++ = *from++;- } while (--copy);- if (state->length == 0) state->mode = LEN;- break;- case LIT:- if (left == 0) goto inf_leave;- *put++ = (unsigned char)(state->length);- left--;- state->mode = LEN;- break;- case CHECK:- if (state->wrap) {- NEEDBITS(32);- out -= left;- strm->total_out += out;- state->total += out;- if (out)- strm->adler = state->check =- UPDATE(state->check, put - out, out);- out = left;- if ((-#ifdef GUNZIP- state->flags ? hold :-#endif- REVERSE(hold)) != state->check) {- strm->msg = (char *)"incorrect data check";- state->mode = BAD;- break;- }- INITBITS();- Tracev((stderr, "inflate: check matches trailer\n"));- }-#ifdef GUNZIP- state->mode = LENGTH;- case LENGTH:- if (state->wrap && state->flags) {- NEEDBITS(32);- if (hold != (state->total & 0xffffffffUL)) {- strm->msg = (char *)"incorrect length check";- state->mode = BAD;- break;- }- INITBITS();- Tracev((stderr, "inflate: length matches trailer\n"));- }-#endif- state->mode = DONE;- case DONE:- ret = Z_STREAM_END;- goto inf_leave;- case BAD:- ret = Z_DATA_ERROR;- goto inf_leave;- case MEM:- return Z_MEM_ERROR;- case SYNC:- default:- return Z_STREAM_ERROR;- }-- /*- Return from inflate(), updating the total counts and the check value.- If there was no progress during the inflate() call, return a buffer- error. Call updatewindow() to create and/or update the window state.- Note: a memory error from inflate() is non-recoverable.- */- inf_leave:- RESTORE();- if (state->wsize || (state->mode < CHECK && out != strm->avail_out))- if (updatewindow(strm, out)) {- state->mode = MEM;- return Z_MEM_ERROR;- }- in -= strm->avail_in;- out -= strm->avail_out;- strm->total_in += in;- strm->total_out += out;- state->total += out;- if (state->wrap && out)- strm->adler = state->check =- UPDATE(state->check, strm->next_out - out, out);- strm->data_type = state->bits + (state->last ? 64 : 0) +- (state->mode == TYPE ? 128 : 0) +- (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);- if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)- ret = Z_BUF_ERROR;- return ret;-}--int ZEXPORT inflateEnd(strm)-z_streamp strm;-{- struct inflate_state FAR *state;- if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)- return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- if (state->window != Z_NULL) ZFREE(strm, state->window);- ZFREE(strm, strm->state);- strm->state = Z_NULL;- Tracev((stderr, "inflate: end\n"));- return Z_OK;-}--int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)-z_streamp strm;-const Bytef *dictionary;-uInt dictLength;-{- struct inflate_state FAR *state;- unsigned long id;-- /* check state */- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- if (state->wrap != 0 && state->mode != DICT)- return Z_STREAM_ERROR;-- /* check for correct dictionary id */- if (state->mode == DICT) {- id = adler32(0L, Z_NULL, 0);- id = adler32(id, dictionary, dictLength);- if (id != state->check)- return Z_DATA_ERROR;- }-- /* copy dictionary to window */- if (updatewindow(strm, strm->avail_out)) {- state->mode = MEM;- return Z_MEM_ERROR;- }- if (dictLength > state->wsize) {- zmemcpy(state->window, dictionary + dictLength - state->wsize,- state->wsize);- state->whave = state->wsize;- }- else {- zmemcpy(state->window + state->wsize - dictLength, dictionary,- dictLength);- state->whave = dictLength;- }- state->havedict = 1;- Tracev((stderr, "inflate: dictionary set\n"));- return Z_OK;-}--int ZEXPORT inflateGetHeader(strm, head)-z_streamp strm;-gz_headerp head;-{- struct inflate_state FAR *state;-- /* check state */- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;-- /* save header structure */- state->head = head;- head->done = 0;- return Z_OK;-}--/*- Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found- or when out of input. When called, *have is the number of pattern bytes- found in order so far, in 0..3. On return *have is updated to the new- state. If on return *have equals four, then the pattern was found and the- return value is how many bytes were read including the last byte of the- pattern. If *have is less than four, then the pattern has not been found- yet and the return value is len. In the latter case, syncsearch() can be- called again with more data and the *have state. *have is initialized to- zero for the first call.- */-local unsigned syncsearch(have, buf, len)-unsigned FAR *have;-unsigned char FAR *buf;-unsigned len;-{- unsigned got;- unsigned next;-- got = *have;- next = 0;- while (next < len && got < 4) {- if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))- got++;- else if (buf[next])- got = 0;- else- got = 4 - got;- next++;- }- *have = got;- return next;-}--int ZEXPORT inflateSync(strm)-z_streamp strm;-{- unsigned len; /* number of bytes to look at or looked at */- unsigned long in, out; /* temporary to save total_in and total_out */- unsigned char buf[4]; /* to restore bit buffer to byte string */- struct inflate_state FAR *state;-- /* check parameters */- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;-- /* if first time, start search in bit buffer */- if (state->mode != SYNC) {- state->mode = SYNC;- state->hold <<= state->bits & 7;- state->bits -= state->bits & 7;- len = 0;- while (state->bits >= 8) {- buf[len++] = (unsigned char)(state->hold);- state->hold >>= 8;- state->bits -= 8;- }- state->have = 0;- syncsearch(&(state->have), buf, len);- }-- /* search available input */- len = syncsearch(&(state->have), strm->next_in, strm->avail_in);- strm->avail_in -= len;- strm->next_in += len;- strm->total_in += len;-- /* return no joy or set up to restart inflate() on a new block */- if (state->have != 4) return Z_DATA_ERROR;- in = strm->total_in; out = strm->total_out;- inflateReset(strm);- strm->total_in = in; strm->total_out = out;- state->mode = TYPE;- return Z_OK;-}--/*- Returns true if inflate is currently at the end of a block generated by- Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP- implementation to provide an additional safety check. PPP uses- Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored- block. When decompressing, PPP checks that at the end of input packet,- inflate is waiting for these length bytes.- */-int ZEXPORT inflateSyncPoint(strm)-z_streamp strm;-{- struct inflate_state FAR *state;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- return state->mode == STORED && state->bits == 0;-}--int ZEXPORT inflateCopy(dest, source)-z_streamp dest;-z_streamp source;-{- struct inflate_state FAR *state;- struct inflate_state FAR *copy;- unsigned char FAR *window;- unsigned wsize;-- /* check input */- if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||- source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)- return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)source->state;-- /* allocate space */- copy = (struct inflate_state FAR *)- ZALLOC(source, 1, sizeof(struct inflate_state));- if (copy == Z_NULL) return Z_MEM_ERROR;- window = Z_NULL;- if (state->window != Z_NULL) {- window = (unsigned char FAR *)- ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));- if (window == Z_NULL) {- ZFREE(source, copy);- return Z_MEM_ERROR;- }- }-- /* copy state */- zmemcpy(dest, source, sizeof(z_stream));- zmemcpy(copy, state, sizeof(struct inflate_state));- if (state->lencode >= state->codes &&- state->lencode <= state->codes + ENOUGH - 1) {- copy->lencode = copy->codes + (state->lencode - state->codes);- copy->distcode = copy->codes + (state->distcode - state->codes);- }- copy->next = copy->codes + (state->next - state->codes);- if (window != Z_NULL) {- wsize = 1U << state->wbits;- zmemcpy(window, state->window, wsize);- }- copy->window = window;- dest->state = (struct internal_state FAR *)copy;- return Z_OK;-}--int ZEXPORT inflateUndermine(strm, subvert)-z_streamp strm;-int subvert;-{- struct inflate_state FAR *state;-- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;- state = (struct inflate_state FAR *)strm->state;- state->sane = !subvert;-#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR- return Z_OK;-#else- state->sane = 1;- return Z_DATA_ERROR;-#endif-}--long ZEXPORT inflateMark(strm)-z_streamp strm;-{- struct inflate_state FAR *state;-- if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;- state = (struct inflate_state FAR *)strm->state;- return ((long)(state->back) << 16) +- (state->mode == COPY ? state->length :- (state->mode == MATCH ? state->was - state->length : 0));-}
− libgit2/deps/zlib/inflate.h
@@ -1,122 +0,0 @@-/* inflate.h -- internal inflate state definition- * Copyright (C) 1995-2009 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* WARNING: this file should *not* be used by applications. It is- part of the implementation of the compression library and is- subject to change. Applications should only use zlib.h.- */--/* define NO_GZIP when compiling if you want to disable gzip header and- trailer decoding by inflate(). NO_GZIP would be used to avoid linking in- the crc code when it is not needed. For shared libraries, gzip decoding- should be left enabled. */-#ifndef NO_GZIP-# define GUNZIP-#endif--/* Possible inflate modes between inflate() calls */-typedef enum {- HEAD, /* i: waiting for magic header */- FLAGS, /* i: waiting for method and flags (gzip) */- TIME, /* i: waiting for modification time (gzip) */- OS, /* i: waiting for extra flags and operating system (gzip) */- EXLEN, /* i: waiting for extra length (gzip) */- EXTRA, /* i: waiting for extra bytes (gzip) */- NAME, /* i: waiting for end of file name (gzip) */- COMMENT, /* i: waiting for end of comment (gzip) */- HCRC, /* i: waiting for header crc (gzip) */- DICTID, /* i: waiting for dictionary check value */- DICT, /* waiting for inflateSetDictionary() call */- TYPE, /* i: waiting for type bits, including last-flag bit */- TYPEDO, /* i: same, but skip check to exit inflate on new block */- STORED, /* i: waiting for stored size (length and complement) */- COPY_, /* i/o: same as COPY below, but only first time in */- COPY, /* i/o: waiting for input or output to copy stored block */- TABLE, /* i: waiting for dynamic block table lengths */- LENLENS, /* i: waiting for code length code lengths */- CODELENS, /* i: waiting for length/lit and distance code lengths */- LEN_, /* i: same as LEN below, but only first time in */- LEN, /* i: waiting for length/lit/eob code */- LENEXT, /* i: waiting for length extra bits */- DIST, /* i: waiting for distance code */- DISTEXT, /* i: waiting for distance extra bits */- MATCH, /* o: waiting for output space to copy string */- LIT, /* o: waiting for output space to write literal */- CHECK, /* i: waiting for 32-bit check value */- LENGTH, /* i: waiting for 32-bit length (gzip) */- DONE, /* finished check, done -- remain here until reset */- BAD, /* got a data error -- remain here until reset */- MEM, /* got an inflate() memory error -- remain here until reset */- SYNC /* looking for synchronization bytes to restart inflate() */-} inflate_mode;--/*- State transitions between above modes --- (most modes can go to BAD or MEM on error -- not shown for clarity)-- Process header:- HEAD -> (gzip) or (zlib) or (raw)- (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->- HCRC -> TYPE- (zlib) -> DICTID or TYPE- DICTID -> DICT -> TYPE- (raw) -> TYPEDO- Read deflate blocks:- TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK- STORED -> COPY_ -> COPY -> TYPE- TABLE -> LENLENS -> CODELENS -> LEN_- LEN_ -> LEN- Read deflate codes in fixed or dynamic block:- LEN -> LENEXT or LIT or TYPE- LENEXT -> DIST -> DISTEXT -> MATCH -> LEN- LIT -> LEN- Process trailer:- CHECK -> LENGTH -> DONE- */--/* state maintained between inflate() calls. Approximately 10K bytes. */-struct inflate_state {- inflate_mode mode; /* current inflate mode */- int last; /* true if processing last block */- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */- int havedict; /* true if dictionary provided */- int flags; /* gzip header method and flags (0 if zlib) */- unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */- unsigned long check; /* protected copy of check value */- unsigned long total; /* protected copy of output count */- gz_headerp head; /* where to save gzip header information */- /* sliding window */- unsigned wbits; /* log base 2 of requested window size */- unsigned wsize; /* window size or zero if not using window */- unsigned whave; /* valid bytes in the window */- unsigned wnext; /* window write index */- unsigned char FAR *window; /* allocated sliding window, if needed */- /* bit accumulator */- unsigned long hold; /* input bit accumulator */- unsigned bits; /* number of bits in "in" */- /* for string and stored block copying */- unsigned length; /* literal or length of data to copy */- unsigned offset; /* distance back to copy string from */- /* for table and code decoding */- unsigned extra; /* extra bits needed */- /* fixed and dynamic code tables */- code const FAR *lencode; /* starting table for length/literal codes */- code const FAR *distcode; /* starting table for distance codes */- unsigned lenbits; /* index bits for lencode */- unsigned distbits; /* index bits for distcode */- /* dynamic table building */- unsigned ncode; /* number of code length code lengths */- unsigned nlen; /* number of length code lengths */- unsigned ndist; /* number of distance code lengths */- unsigned have; /* number of code lengths in lens[] */- code FAR *next; /* next available space in codes[] */- unsigned short lens[320]; /* temporary storage for code lengths */- unsigned short work[288]; /* work area for code table building */- code codes[ENOUGH]; /* space for code tables */- int sane; /* if false, allow invalid distance too far */- int back; /* bits back of last unprocessed length/lit */- unsigned was; /* initial length of match */-};
− libgit2/deps/zlib/inftrees.c
@@ -1,330 +0,0 @@-/* inftrees.c -- generate Huffman trees for efficient decoding- * Copyright (C) 1995-2010 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--#include "zutil.h"-#include "inftrees.h"--#define MAXBITS 15--const char inflate_copyright[] =- " inflate 1.2.5 Copyright 1995-2010 Mark Adler ";-/*- 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- include such an acknowledgment, I would appreciate that you keep this- copyright string in the executable of your product.- */--/*- Build a set of tables to decode the provided canonical Huffman code.- The code lengths are lens[0..codes-1]. The result starts at *table,- whose indices are 0..2^bits-1. work is a writable array of at least- lens shorts, which is used as a work area. type is the type of code- to be generated, CODES, LENS, or DISTS. On return, zero is success,- -1 is an invalid code, and +1 means that ENOUGH isn't enough. table- on return points to the next available entry's address. bits is the- requested root table index bits, and on return it is the actual root- table index bits. It will differ if the request is greater than the- longest code or if it is less than the shortest code.- */-int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)-codetype type;-unsigned short FAR *lens;-unsigned codes;-code FAR * FAR *table;-unsigned FAR *bits;-unsigned short FAR *work;-{- unsigned len; /* a code's length in bits */- unsigned sym; /* index of code symbols */- unsigned min, max; /* minimum and maximum code lengths */- unsigned root; /* number of index bits for root table */- unsigned curr; /* number of index bits for current table */- unsigned drop; /* code bits to drop for sub-table */- int left; /* number of prefix codes available */- unsigned used; /* code entries in table used */- unsigned huff; /* Huffman code */- unsigned incr; /* for incrementing code, index */- unsigned fill; /* index for replicating entries */- unsigned low; /* low bits for current root entry */- unsigned mask; /* mask for low root bits */- code here; /* table entry for duplication */- code FAR *next; /* next available space in table */- const unsigned short FAR *base; /* base value table to use */- const unsigned short FAR *extra; /* extra bits table to use */- int end; /* use base and extra for symbol > end */- unsigned short count[MAXBITS+1]; /* number of codes of each length */- unsigned short offs[MAXBITS+1]; /* offsets in table for each length */- static const unsigned short lbase[31] = { /* Length codes 257..285 base */- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,- 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 */- 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, 73, 195};- 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,- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,- 8193, 12289, 16385, 24577, 0, 0};- static const unsigned short dext[32] = { /* Distance codes 0..29 extra */- 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,- 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,- 28, 28, 29, 29, 64, 64};-- /*- Process a set of code lengths to create a canonical Huffman code. The- code lengths are lens[0..codes-1]. Each length corresponds to the- symbols 0..codes-1. The Huffman code is generated by first sorting the- symbols by length from short to long, and retaining the symbol order- for codes with equal lengths. Then the code starts with all zero bits- for the first code of the shortest length, and the codes are integer- increments for the same length, and zeros are appended as the length- increases. For the deflate format, these bits are stored backwards- from their more natural integer increment ordering, and so when the- decoding tables are built in the large loop below, the integer codes- are incremented backwards.-- This routine assumes, but does not check, that all of the entries in- lens[] are in the range 0..MAXBITS. The caller must assure this.- 1..MAXBITS is interpreted as that code length. zero means that that- symbol does not occur in this code.-- The codes are sorted by computing a count of codes for each length,- creating from that a table of starting indices for each length in the- sorted table, and then entering the symbols in order in the sorted- table. The sorted table is work[], with that space being provided by- the caller.-- The length counts are used for other purposes as well, i.e. finding- the minimum and maximum length codes, determining if there are any- codes at all, checking for a valid set of lengths, and looking ahead- at length counts to determine sub-table sizes when building the- decoding tables.- */-- /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */- for (len = 0; len <= MAXBITS; len++)- count[len] = 0;- for (sym = 0; sym < codes; sym++)- count[lens[sym]]++;-- /* bound code lengths, force root to be within code lengths */- root = *bits;- for (max = MAXBITS; max >= 1; max--)- if (count[max] != 0) break;- if (root > max) root = max;- if (max == 0) { /* no symbols to code at all */- here.op = (unsigned char)64; /* invalid code marker */- here.bits = (unsigned char)1;- here.val = (unsigned short)0;- *(*table)++ = here; /* make a table to force an error */- *(*table)++ = here;- *bits = 1;- return 0; /* no symbols, but wait for decoding to report error */- }- for (min = 1; min < max; min++)- if (count[min] != 0) break;- if (root < min) root = min;-- /* check for an over-subscribed or incomplete set of lengths */- left = 1;- for (len = 1; len <= MAXBITS; len++) {- left <<= 1;- left -= count[len];- if (left < 0) return -1; /* over-subscribed */- }- if (left > 0 && (type == CODES || max != 1))- return -1; /* incomplete set */-- /* generate offsets into symbol table for each length for sorting */- offs[1] = 0;- for (len = 1; len < MAXBITS; len++)- offs[len + 1] = offs[len] + count[len];-- /* sort symbols by length, by symbol order within each length */- for (sym = 0; sym < codes; sym++)- if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;-- /*- Create and fill in decoding tables. In this loop, the table being- filled is at next and has curr index bits. The code being used is huff- with length len. That code is converted to an index by dropping drop- bits off of the bottom. For codes where len is less than drop + curr,- those top drop + curr - len bits are incremented through all values to- fill the table with replicated entries.-- root is the number of index bits for the root table. When len exceeds- root, sub-tables are created pointed to by the root entry with an index- of the low root bits of huff. This is saved in low to check for when a- new sub-table should be started. drop is zero when the root table is- being filled, and drop is root when sub-tables are being filled.-- When a new sub-table is needed, it is necessary to look ahead in the- code lengths to determine what size sub-table is needed. The length- counts are used for this, and so count[] is decremented as codes are- entered in the tables.-- used keeps track of how many table entries have been allocated from the- provided *table space. It is checked for LENS and DIST tables against- the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in- the initial root table size constants. See the comments in inftrees.h- for more information.-- sym increments through all symbols, and the loop terminates when- all codes of length max, i.e. all codes, have been processed. This- routine permits incomplete codes, so another loop after this one fills- in the rest of the decoding tables with invalid code markers.- */-- /* set up for code type */- switch (type) {- case CODES:- base = extra = work; /* dummy value--not used */- end = 19;- break;- case LENS:- base = lbase;- base -= 257;- extra = lext;- extra -= 257;- end = 256;- break;- default: /* DISTS */- base = dbase;- extra = dext;- end = -1;- }-- /* initialize state for loop */- huff = 0; /* starting code */- sym = 0; /* starting code symbol */- len = min; /* starting code length */- next = *table; /* current table to fill in */- curr = root; /* current table index bits */- drop = 0; /* current bits to drop from code for index */- low = (unsigned)(-1); /* trigger new sub-table when len > root */- used = 1U << root; /* use root table entries */- mask = used - 1; /* mask for comparing low */-- /* check available table space */- if ((type == LENS && used >= ENOUGH_LENS) ||- (type == DISTS && used >= ENOUGH_DISTS))- return 1;-- /* process all codes and make table entries */- for (;;) {- /* create table entry */- here.bits = (unsigned char)(len - drop);- if ((int)(work[sym]) < end) {- here.op = (unsigned char)0;- here.val = work[sym];- }- else if ((int)(work[sym]) > end) {- here.op = (unsigned char)(extra[work[sym]]);- here.val = base[work[sym]];- }- else {- here.op = (unsigned char)(32 + 64); /* end of block */- here.val = 0;- }-- /* replicate for those indices with low len bits equal to huff */- incr = 1U << (len - drop);- fill = 1U << curr;- min = fill; /* save offset to next table */- do {- fill -= incr;- next[(huff >> drop) + fill] = here;- } while (fill != 0);-- /* backwards increment the len-bit code huff */- incr = 1U << (len - 1);- while (huff & incr)- incr >>= 1;- if (incr != 0) {- huff &= incr - 1;- huff += incr;- }- else- huff = 0;-- /* go to next symbol, update count, len */- sym++;- if (--(count[len]) == 0) {- if (len == max) break;- len = lens[work[sym]];- }-- /* create new sub-table if needed */- if (len > root && (huff & mask) != low) {- /* if first time, transition to sub-tables */- if (drop == 0)- drop = root;-- /* increment past last table */- next += min; /* here min is 1 << curr */-- /* determine length of next table */- curr = len - drop;- left = (int)(1 << curr);- while (curr + drop < max) {- left -= count[curr + drop];- if (left <= 0) break;- curr++;- left <<= 1;- }-- /* check for enough space */- used += 1U << curr;- if ((type == LENS && used >= ENOUGH_LENS) ||- (type == DISTS && used >= ENOUGH_DISTS))- return 1;-- /* point entry in root table to sub-table */- low = huff & mask;- (*table)[low].op = (unsigned char)curr;- (*table)[low].bits = (unsigned char)root;- (*table)[low].val = (unsigned short)(next - *table);- }- }-- /*- Fill in rest of table for incomplete codes. This loop is similar to the- loop above in incrementing huff for table indices. It is assumed that- len is equal to curr + drop, so there is no loop needed to increment- through high index bits. When the current sub-table is filled, the loop- drops back to the root table to fill in any remaining entries there.- */- here.op = (unsigned char)64; /* invalid code marker */- here.bits = (unsigned char)(len - drop);- here.val = (unsigned short)0;- while (huff != 0) {- /* when done with sub-table, drop back to root table */- if (drop != 0 && (huff & mask) != low) {- drop = 0;- len = root;- next = *table;- here.bits = (unsigned char)len;- }-- /* put invalid code marker in table */- next[huff >> drop] = here;-- /* backwards increment the len-bit code huff */- incr = 1U << (len - 1);- while (huff & incr)- incr >>= 1;- if (incr != 0) {- huff &= incr - 1;- huff += incr;- }- else- huff = 0;- }-- /* set return parameters */- *table += used;- *bits = root;- return 0;-}
− libgit2/deps/zlib/inftrees.h
@@ -1,62 +0,0 @@-/* inftrees.h -- header to use inftrees.c- * Copyright (C) 1995-2005, 2010 Mark Adler- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* WARNING: this file should *not* be used by applications. It is- part of the implementation of the compression library and is- subject to change. Applications should only use zlib.h.- */--/* Structure for decoding tables. Each entry provides either the- information needed to do the operation requested by the code that- indexed that table entry, or it provides a pointer to another- table that indexes more bits of the code. op indicates whether- the entry is a pointer to another table, a literal, a length or- distance, an end-of-block, or an invalid code. For a table- pointer, the low four bits of op is the number of index bits of- that table. For a length or distance, the low four bits of op- is the number of extra bits to get after the code. bits is- the number of bits in this code or part of the code to drop off- of the bit buffer. val is the actual byte to output in the case- of a literal, the base length or distance, or the offset from- the current table to the next table. Each entry is four bytes. */-typedef struct {- unsigned char op; /* operation, extra bits, table bits */- unsigned char bits; /* bits in this part of the code */- unsigned short val; /* offset in table or code value */-} code;--/* op values as set by inflate_table():- 00000000 - literal- 0000tttt - table link, tttt != 0 is the number of table index bits- 0001eeee - length or distance, eeee is the number of extra bits- 01100000 - end of block- 01000000 - invalid code- */--/* Maximum size of the dynamic table. The maximum number of code structures is- 1444, which is the sum of 852 for literal/length codes and 592 for distance- codes. These values were found by exhaustive searches using the program- examples/enough.c found in the zlib distribtution. The arguments to that- program are the number of symbols, the initial root table size, and the- maximum bit length of a code. "enough 286 9 15" for literal/length codes- returns returns 852, and "enough 30 6 15" for distance codes returns 592.- The initial root table size (9 or 6) is found in the fifth argument of the- inflate_table() calls in inflate.c and infback.c. If the root table size is- changed, then these maximum sizes would be need to be recalculated and- updated. */-#define ENOUGH_LENS 852-#define ENOUGH_DISTS 592-#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)--/* Type of code to build for inflate_table() */-typedef enum {- CODES,- LENS,- DISTS-} codetype;--int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,- unsigned codes, code FAR * FAR *table,- unsigned FAR *bits, unsigned short FAR *work));
− libgit2/deps/zlib/trees.c
@@ -1,1244 +0,0 @@-/* trees.c -- output deflated data using Huffman coding- * Copyright (C) 1995-2010 Jean-loup Gailly- * detect_data_type() function provided freely by Cosmin Truta, 2006- * For conditions of distribution and use, see copyright notice in zlib.h- */--/*- * ALGORITHM- *- * The "deflation" process uses several Huffman trees. The more- * common source values are represented by shorter bit sequences.- *- * Each code tree is stored in a compressed form which is itself- * a Huffman encoding of the lengths of all the code strings (in- * ascending order by source values). The actual code strings are- * reconstructed from the lengths in the inflate process, as described- * in the deflate specification.- *- * REFERENCES- *- * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".- * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc- *- * Storer, James A.- * Data Compression: Methods and Theory, pp. 49-50.- * Computer Science Press, 1988. ISBN 0-7167-8156-5.- *- * Sedgewick, R.- * Algorithms, p290.- * Addison-Wesley, 1983. ISBN 0-201-06672-6.- */--/* @(#) $Id$ */--/* #define GEN_TREES_H */--#include "deflate.h"--#ifdef DEBUG-# include <ctype.h>-#endif--/* ===========================================================================- * Constants- */--#define MAX_BL_BITS 7-/* Bit length codes must not exceed MAX_BL_BITS bits */--#define END_BLOCK 256-/* end of block literal code */--#define REP_3_6 16-/* repeat previous bit length 3-6 times (2 bits of repeat count) */--#define REPZ_3_10 17-/* repeat a zero length 3-10 times (3 bits of repeat count) */--#define REPZ_11_138 18-/* repeat a zero length 11-138 times (7 bits of repeat count) */--local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */- = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};--local const int extra_dbits[D_CODES] /* extra bits for each distance code */- = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};--local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */- = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};--local const uch bl_order[BL_CODES]- = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};-/* The lengths of the bit length codes are sent in order of decreasing- * probability, to avoid transmitting the lengths for unused bit length codes.- */--#define Buf_size (8 * 2*sizeof(char))-/* Number of bits used within bi_buf. (bi_buf might be implemented on- * more than 16 bits on some systems.)- */--/* ===========================================================================- * Local data. These are initialized only once.- */--#define DIST_CODE_LEN 512 /* see definition of array dist_code below */--#if defined(GEN_TREES_H) || !defined(STDC)-/* non ANSI compilers may not accept trees.h */--local ct_data static_ltree[L_CODES+2];-/* The static literal tree. Since the bit lengths are imposed, there is no- * need for the L_CODES extra codes used during heap construction. However- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init- * below).- */--local ct_data static_dtree[D_CODES];-/* The static distance tree. (Actually a trivial tree since all codes use- * 5 bits.)- */--uch _dist_code[DIST_CODE_LEN];-/* Distance codes. The first 256 values correspond to the distances- * 3 .. 258, the last 256 values correspond to the top 8 bits of- * the 15 bit distances.- */--uch _length_code[MAX_MATCH-MIN_MATCH+1];-/* length code for each normalized match length (0 == MIN_MATCH) */--local int base_length[LENGTH_CODES];-/* First normalized length for each code (0 = MIN_MATCH) */--local int base_dist[D_CODES];-/* First normalized distance for each code (0 = distance of 1) */--#else-# include "trees.h"-#endif /* GEN_TREES_H */--struct static_tree_desc_s {- const ct_data *static_tree; /* static tree or NULL */- const intf *extra_bits; /* extra bits for each code or NULL */- int extra_base; /* base index for extra_bits */- int elems; /* max number of elements in the tree */- int max_length; /* max bit length for the codes */-};--local static_tree_desc static_l_desc =-{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};--local static_tree_desc static_d_desc =-{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};--local static_tree_desc static_bl_desc =-{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};--/* ===========================================================================- * Local (static) routines in this file.- */--local void tr_static_init OF((void));-local void init_block OF((deflate_state *s));-local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));-local void gen_bitlen OF((deflate_state *s, tree_desc *desc));-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 void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));-local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));-local int build_bl_tree OF((deflate_state *s));-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,- int blcodes));-local void compress_block OF((deflate_state *s, ct_data *ltree,- ct_data *dtree));-local int detect_data_type OF((deflate_state *s));-local unsigned bi_reverse OF((unsigned value, int length));-local void bi_windup OF((deflate_state *s));-local void bi_flush OF((deflate_state *s));-local void copy_block OF((deflate_state *s, charf *buf, unsigned len,- int header));--#ifdef GEN_TREES_H-local void gen_trees_header OF((void));-#endif--#ifndef DEBUG-# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)- /* Send a code of the given tree. c and tree must not have side effects */--#else /* DEBUG */-# define send_code(s, c, tree) \- { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \- send_bits(s, tree[c].Code, tree[c].Len); }-#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.- * IN assertion: length <= 16 and value fits in length bits.- */-#ifdef DEBUG-local void send_bits OF((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));- Assert(length > 0 && length <= 15, "invalid length");- s->bits_sent += (ulg)length;-- /* If not enough room in bi_buf, use (valid) bits from bi_buf and- * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))- * unused bits in value.- */- if (s->bi_valid > (int)Buf_size - length) {- s->bi_buf |= (ush)value << s->bi_valid;- put_short(s, s->bi_buf);- s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);- s->bi_valid += length - Buf_size;- } else {- s->bi_buf |= (ush)value << s->bi_valid;- s->bi_valid += length;- }-}-#else /* !DEBUG */--#define send_bits(s, value, length) \-{ int len = length;\- if (s->bi_valid > (int)Buf_size - len) {\- int val = value;\- s->bi_buf |= (ush)val << s->bi_valid;\- put_short(s, s->bi_buf);\- s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\- s->bi_valid += len - Buf_size;\- } else {\- s->bi_buf |= (ush)(value) << s->bi_valid;\- s->bi_valid += len;\- }\-}-#endif /* DEBUG */---/* the arguments must not have side effects */--/* ===========================================================================- * Initialize the various 'constant' tables.- */-local void tr_static_init()-{-#if defined(GEN_TREES_H) || !defined(STDC)- static int static_init_done = 0;- int n; /* iterates over tree elements */- int bits; /* bit counter */- int length; /* length value */- int code; /* code value */- int dist; /* distance index */- ush bl_count[MAX_BITS+1];- /* number of codes at each bit length for an optimal tree */-- if (static_init_done) return;-- /* For some embedded targets, global variables are not initialized: */-#ifdef NO_INIT_GLOBAL_POINTERS- static_l_desc.static_tree = static_ltree;- static_l_desc.extra_bits = extra_lbits;- static_d_desc.static_tree = static_dtree;- static_d_desc.extra_bits = extra_dbits;- static_bl_desc.extra_bits = extra_blbits;-#endif-- /* Initialize the mapping length (0..255) -> length code (0..28) */- length = 0;- for (code = 0; code < LENGTH_CODES-1; code++) {- base_length[code] = length;- for (n = 0; n < (1<<extra_lbits[code]); n++) {- _length_code[length++] = (uch)code;- }- }- Assert (length == 256, "tr_static_init: length != 256");- /* Note that the length 255 (match length 258) can be represented- * in two different ways: code 284 + 5 bits or code 285, so we- * overwrite length_code[255] to use the best encoding:- */- _length_code[length-1] = (uch)code;-- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */- dist = 0;- for (code = 0 ; code < 16; code++) {- base_dist[code] = dist;- for (n = 0; n < (1<<extra_dbits[code]); n++) {- _dist_code[dist++] = (uch)code;- }- }- Assert (dist == 256, "tr_static_init: dist != 256");- dist >>= 7; /* from now on, all distances are divided by 128 */- for ( ; code < D_CODES; code++) {- base_dist[code] = dist << 7;- for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {- _dist_code[256 + dist++] = (uch)code;- }- }- Assert (dist == 256, "tr_static_init: 256+dist != 512");-- /* Construct the codes of the static literal tree */- for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;- n = 0;- while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;- while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;- while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;- while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;- /* Codes 286 and 287 do not exist, but we must include them in the- * tree construction to get a canonical Huffman tree (longest code- * all ones)- */- gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);-- /* The static distance tree is trivial: */- for (n = 0; n < D_CODES; n++) {- static_dtree[n].Len = 5;- static_dtree[n].Code = bi_reverse((unsigned)n, 5);- }- static_init_done = 1;--# ifdef GEN_TREES_H- gen_trees_header();-# endif-#endif /* defined(GEN_TREES_H) || !defined(STDC) */-}--/* ===========================================================================- * Genererate the file trees.h describing the static trees.- */-#ifdef GEN_TREES_H-# ifndef DEBUG-# include <stdio.h>-# endif--# define SEPARATOR(i, last, width) \- ((i) == (last)? "\n};\n\n" : \- ((i) % (width) == (width)-1 ? ",\n" : ", "))--void gen_trees_header()-{- FILE *header = fopen("trees.h", "w");- int i;-- Assert (header != NULL, "Can't open trees.h");- fprintf(header,- "/* header created automatically with -DGEN_TREES_H */\n\n");-- fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");- for (i = 0; i < L_CODES+2; i++) {- fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,- static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));- }-- fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");- for (i = 0; i < D_CODES; i++) {- fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,- static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));- }-- fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");- for (i = 0; i < DIST_CODE_LEN; i++) {- fprintf(header, "%2u%s", _dist_code[i],- SEPARATOR(i, DIST_CODE_LEN-1, 20));- }-- fprintf(header,- "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");- for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {- fprintf(header, "%2u%s", _length_code[i],- SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));- }-- fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");- for (i = 0; i < LENGTH_CODES; i++) {- fprintf(header, "%1u%s", base_length[i],- SEPARATOR(i, LENGTH_CODES-1, 20));- }-- fprintf(header, "local const int base_dist[D_CODES] = {\n");- for (i = 0; i < D_CODES; i++) {- fprintf(header, "%5u%s", base_dist[i],- SEPARATOR(i, D_CODES-1, 10));- }-- fclose(header);-}-#endif /* GEN_TREES_H */--/* ===========================================================================- * Initialize the tree data structures for a new zlib stream.- */-void ZLIB_INTERNAL _tr_init(s)- deflate_state *s;-{- tr_static_init();-- s->l_desc.dyn_tree = s->dyn_ltree;- s->l_desc.stat_desc = &static_l_desc;-- s->d_desc.dyn_tree = s->dyn_dtree;- s->d_desc.stat_desc = &static_d_desc;-- s->bl_desc.dyn_tree = s->bl_tree;- s->bl_desc.stat_desc = &static_bl_desc;-- s->bi_buf = 0;- s->bi_valid = 0;- s->last_eob_len = 8; /* enough lookahead for inflate */-#ifdef DEBUG- s->compressed_len = 0L;- s->bits_sent = 0L;-#endif-- /* Initialize the first block of the first file: */- 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->last_lit = s->matches = 0;-}--#define SMALLEST 1-/* Index within the heap array of least frequent node in the Huffman tree */---/* ===========================================================================- * Remove the smallest element from the heap and recreate the heap with- * one less element. Updates heap and heap_len.- */-#define pqremove(s, tree, top) \-{\- top = s->heap[SMALLEST]; \- s->heap[SMALLEST] = s->heap[s->heap_len--]; \- pqdownheap(s, tree, SMALLEST); \-}--/* ===========================================================================- * Compares to subtrees, using the tree depth as tie breaker when- * the subtrees have equal frequency. This minimizes the worst case length.- */-#define smaller(tree, n, m, depth) \- (tree[n].Freq < tree[m].Freq || \- (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))--/* ===========================================================================- * Restore the heap property by moving down the tree starting at node k,- * exchanging a node with the smallest of its two sons if necessary, stopping- * when the heap property is re-established (each father smaller than its- * two sons).- */-local void pqdownheap(s, tree, k)- deflate_state *s;- ct_data *tree; /* the tree to restore */- int k; /* node to move down */-{- int v = s->heap[k];- int j = k << 1; /* left son of k */- while (j <= s->heap_len) {- /* Set j to the smallest of the two sons: */- if (j < s->heap_len &&- smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {- j++;- }- /* Exit if v is smaller than both sons */- if (smaller(tree, v, s->heap[j], s->depth)) break;-- /* Exchange v with the smallest son */- s->heap[k] = s->heap[j]; k = j;-- /* And continue down the tree, setting j to the left son of k */- j <<= 1;- }- s->heap[k] = v;-}--/* ===========================================================================- * Compute the optimal bit lengths for a tree and update the total bit length- * for the current block.- * IN assertion: the fields freq and dad are set, heap[heap_max] and- * above are the tree nodes sorted by increasing frequency.- * OUT assertions: the field len is set to the optimal bit length, the- * array bl_count contains the frequencies for each bit length.- * The length opt_len is updated; static_len is also updated if stree is- * not null.- */-local void gen_bitlen(s, desc)- deflate_state *s;- tree_desc *desc; /* the tree descriptor */-{- ct_data *tree = desc->dyn_tree;- int max_code = desc->max_code;- const ct_data *stree = desc->stat_desc->static_tree;- const intf *extra = desc->stat_desc->extra_bits;- int base = desc->stat_desc->extra_base;- int max_length = desc->stat_desc->max_length;- int h; /* heap index */- int n, m; /* iterate over the tree elements */- int bits; /* bit length */- int xbits; /* extra bits */- ush f; /* frequency */- int overflow = 0; /* number of elements with bit length too large */-- for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;-- /* In a first pass, compute the optimal bit lengths (which may- * overflow in the case of the bit length tree).- */- tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */-- for (h = s->heap_max+1; h < HEAP_SIZE; h++) {- n = s->heap[h];- bits = tree[tree[n].Dad].Len + 1;- if (bits > max_length) bits = max_length, overflow++;- tree[n].Len = (ush)bits;- /* We overwrite tree[n].Dad which is no longer needed */-- if (n > max_code) continue; /* not a leaf node */-- s->bl_count[bits]++;- xbits = 0;- if (n >= base) xbits = extra[n-base];- f = tree[n].Freq;- s->opt_len += (ulg)f * (bits + xbits);- if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);- }- if (overflow == 0) return;-- Trace((stderr,"\nbit length overflow\n"));- /* This happens for example on obj2 and pic of the Calgary corpus */-- /* Find the first bit length which could increase: */- do {- bits = max_length-1;- while (s->bl_count[bits] == 0) bits--;- s->bl_count[bits]--; /* move one leaf down the tree */- s->bl_count[bits+1] += 2; /* move one overflow item as its brother */- s->bl_count[max_length]--;- /* The brother of the overflow item also moves one step up,- * but this does not affect bl_count[max_length]- */- overflow -= 2;- } while (overflow > 0);-- /* Now recompute all bit lengths, scanning in increasing frequency.- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all- * lengths instead of fixing only the wrong ones. This idea is taken- * from 'ar' written by Haruhiko Okumura.)- */- for (bits = max_length; bits != 0; bits--) {- n = s->bl_count[bits];- while (n != 0) {- m = s->heap[--h];- if (m > max_code) continue;- if ((unsigned) tree[m].Len != (unsigned) bits) {- Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));- s->opt_len += ((long)bits - (long)tree[m].Len)- *(long)tree[m].Freq;- tree[m].Len = (ush)bits;- }- n--;- }- }-}--/* ===========================================================================- * 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 (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 */- ush 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++) {- next_code[bits] = code = (code + bl_count[bits-1]) << 1;- }- /* 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.- * Update the total bit length for the current block.- * IN assertion: the field freq is set for all tree elements.- * OUT assertions: the fields len and code are set to the optimal bit length- * 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.- */-local void build_tree(s, desc)- deflate_state *s;- tree_desc *desc; /* the tree descriptor */-{- ct_data *tree = desc->dyn_tree;- const ct_data *stree = desc->stat_desc->static_tree;- int elems = desc->stat_desc->elems;- int n, m; /* iterate over heap elements */- int max_code = -1; /* largest code with non zero frequency */- int node; /* new node being created */-- /* Construct the initial heap, with least frequent element in- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].- * heap[0] is not used.- */- s->heap_len = 0, s->heap_max = HEAP_SIZE;-- for (n = 0; n < elems; n++) {- if (tree[n].Freq != 0) {- s->heap[++(s->heap_len)] = max_code = n;- s->depth[n] = 0;- } else {- tree[n].Len = 0;- }- }-- /* The pkzip format requires that at least one distance code exists,- * and that at least one bit should be sent even if there is only one- * possible code. So to avoid special checks later on we force at least- * two codes of non zero frequency.- */- while (s->heap_len < 2) {- node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);- tree[node].Freq = 1;- s->depth[node] = 0;- s->opt_len--; if (stree) s->static_len -= stree[node].Len;- /* node is 0 or 1 so it does not have extra bits */- }- desc->max_code = max_code;-- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,- * establish sub-heaps of increasing lengths:- */- for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);-- /* Construct the Huffman tree by repeatedly combining the least two- * frequent nodes.- */- node = elems; /* next internal node of the tree */- do {- pqremove(s, tree, n); /* n = node of least frequency */- m = s->heap[SMALLEST]; /* m = node of next least frequency */-- s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */- s->heap[--(s->heap_max)] = m;-- /* Create a new node father of n and m */- tree[node].Freq = tree[n].Freq + tree[m].Freq;- s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?- s->depth[n] : s->depth[m]) + 1);- tree[n].Dad = tree[m].Dad = (ush)node;-#ifdef DUMP_BL_TREE- if (tree == s->bl_tree) {- fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",- node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);- }-#endif- /* and insert the new node in the heap */- s->heap[SMALLEST] = node++;- pqdownheap(s, tree, SMALLEST);-- } while (s->heap_len >= 2);-- s->heap[--(s->heap_max)] = s->heap[SMALLEST];-- /* At this point, the fields freq and dad are set. We can now- * generate the bit lengths.- */- gen_bitlen(s, (tree_desc *)desc);-- /* The field len is now set, we can generate the bit codes */- gen_codes ((ct_data *)tree, max_code, s->bl_count);-}--/* ===========================================================================- * Scan a literal or distance tree to determine the frequencies of the codes- * in the bit length tree.- */-local void scan_tree (s, tree, 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 prevlen = -1; /* last emitted length */- int curlen; /* length of current code */- int nextlen = tree[0].Len; /* length of next code */- int count = 0; /* repeat count of the current code */- int max_count = 7; /* max repeat count */- int min_count = 4; /* min repeat count */-- if (nextlen == 0) max_count = 138, min_count = 3;- tree[max_code+1].Len = (ush)0xffff; /* guard */-- for (n = 0; n <= max_code; n++) {- curlen = nextlen; nextlen = tree[n+1].Len;- if (++count < max_count && curlen == nextlen) {- continue;- } else if (count < min_count) {- s->bl_tree[curlen].Freq += (ush)count;- } else if (curlen != 0) {- if (curlen != prevlen) s->bl_tree[curlen].Freq++;- s->bl_tree[REP_3_6].Freq++;- } else if (count <= 10) {- s->bl_tree[REPZ_3_10].Freq++;- } else {- s->bl_tree[REPZ_11_138].Freq++;- }- count = 0; prevlen = curlen;- if (nextlen == 0) {- max_count = 138, min_count = 3;- } else if (curlen == nextlen) {- max_count = 6, min_count = 3;- } else {- max_count = 7, min_count = 4;- }- }-}--/* ===========================================================================- * Send a literal or distance tree in compressed form, using the codes in- * bl_tree.- */-local void send_tree (s, tree, 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 prevlen = -1; /* last emitted length */- int curlen; /* length of current code */- int nextlen = tree[0].Len; /* length of next code */- int count = 0; /* repeat count of the current code */- int max_count = 7; /* max repeat count */- int min_count = 4; /* min repeat count */-- /* tree[max_code+1].Len = -1; */ /* guard already set */- if (nextlen == 0) max_count = 138, min_count = 3;-- for (n = 0; n <= max_code; n++) {- curlen = nextlen; nextlen = tree[n+1].Len;- if (++count < max_count && curlen == nextlen) {- continue;- } else if (count < min_count) {- do { send_code(s, curlen, s->bl_tree); } while (--count != 0);-- } else if (curlen != 0) {- if (curlen != prevlen) {- send_code(s, curlen, s->bl_tree); count--;- }- Assert(count >= 3 && count <= 6, " 3_6?");- send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);-- } else if (count <= 10) {- send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);-- } else {- send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);- }- count = 0; prevlen = curlen;- if (nextlen == 0) {- max_count = 138, min_count = 3;- } else if (curlen == nextlen) {- max_count = 6, min_count = 3;- } else {- max_count = 7, min_count = 4;- }- }-}--/* ===========================================================================- * Construct the Huffman tree for the bit lengths and return the index in- * bl_order of the last bit length code to send.- */-local int build_bl_tree(s)- deflate_state *s;-{- int max_blindex; /* index of last bit length code of non zero freq */-- /* Determine the bit length frequencies for literal and distance trees */- scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);- scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);-- /* Build the bit length tree: */- build_tree(s, (tree_desc *)(&(s->bl_desc)));- /* opt_len now includes the length of the tree representations, except- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.- */-- /* Determine the number of bit length codes to send. The pkzip format- * requires that at least 4 bit length codes be sent. (appnote.txt says- * 3 but the actual value used is 4.)- */- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {- if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;- }- /* Update opt_len to include the bit length tree and counts */- s->opt_len += 3*(max_blindex+1) + 5+5+4;- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",- s->opt_len, s->static_len));-- return max_blindex;-}--/* ===========================================================================- * Send the header for a block using dynamic Huffman trees: the counts, the- * lengths of the bit length codes, the literal tree and the distance tree.- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.- */-local void send_all_trees(s, lcodes, dcodes, blcodes)- deflate_state *s;- int lcodes, dcodes, blcodes; /* number of codes for each tree */-{- int rank; /* index in bl_order */-- Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");- Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,- "too many codes");- Tracev((stderr, "\nbl counts: "));- send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */- send_bits(s, dcodes-1, 5);- send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */- for (rank = 0; rank < blcodes; rank++) {- Tracev((stderr, "\nbl code %2d ", bl_order[rank]));- send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);- }- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));-- send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));-- send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));-}--/* ===========================================================================- * Send a stored block- */-void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)- deflate_state *s;- 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 */-#ifdef DEBUG- s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;- s->compressed_len += (stored_len + 4) << 3;-#endif- copy_block(s, buf, (unsigned)stored_len, 1); /* with header */-}--/* ===========================================================================- * Send one empty static block to give enough lookahead for inflate.- * This takes 10 bits, of which 7 may remain in the bit buffer.- * The current inflate code requires 9 bits of lookahead. If the- * last two codes for the previous block (real code plus EOB) were coded- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode- * the last real code. In this case we send two empty static blocks instead- * of one. (There are no problems if the previous block is stored or fixed.)- * To simplify the code, we assume the worst case of last real code encoded- * on one bit only.- */-void ZLIB_INTERNAL _tr_align(s)- deflate_state *s;-{- send_bits(s, STATIC_TREES<<1, 3);- send_code(s, END_BLOCK, static_ltree);-#ifdef DEBUG- s->compressed_len += 10L; /* 3 for block type, 7 for EOB */-#endif- bi_flush(s);- /* Of the 10 bits for the empty block, we have already sent- * (10 - bi_valid) bits. The lookahead for the last real code (before- * the EOB of the previous block) was thus at least one plus the length- * of the EOB plus what we have just sent of the empty static block.- */- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {- send_bits(s, STATIC_TREES<<1, 3);- send_code(s, END_BLOCK, static_ltree);-#ifdef DEBUG- s->compressed_len += 10L;-#endif- bi_flush(s);- }- s->last_eob_len = 7;-}--/* ===========================================================================- * Determine the best encoding for the current block: dynamic trees, static- * trees or store, and output the encoded block to the zip file.- */-void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)- deflate_state *s;- 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 */- int max_blindex = 0; /* index of last bit length code of non zero freq */-- /* Build the Huffman trees unless a stored block is forced */- if (s->level > 0) {-- /* Check if the file is binary or text */- if (s->strm->data_type == Z_UNKNOWN)- s->strm->data_type = detect_data_type(s);-- /* Construct the literal and distance trees */- build_tree(s, (tree_desc *)(&(s->l_desc)));- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,- s->static_len));-- build_tree(s, (tree_desc *)(&(s->d_desc)));- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,- s->static_len));- /* At this point, opt_len and static_len are the total bit lengths of- * the compressed block data, excluding the tree representations.- */-- /* Build the bit length tree for the above two trees, and get the index- * in bl_order of the last bit length code to send.- */- max_blindex = build_bl_tree(s);-- /* Determine the best encoding. Compute the block lengths in bytes. */- opt_lenb = (s->opt_len+3+7)>>3;- static_lenb = (s->static_len+3+7)>>3;-- Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",- opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,- s->last_lit));-- if (static_lenb <= opt_lenb) opt_lenb = static_lenb;-- } else {- Assert(buf != (char*)0, "lost buf");- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */- }--#ifdef FORCE_STORED- if (buf != (char*)0) { /* force stored block */-#else- if (stored_len+4 <= opt_lenb && buf != (char*)0) {- /* 4: two words for the lengths */-#endif- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.- * Otherwise we can't have processed more than WSIZE input bytes since- * the last block flush, because compression would have been- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to- * transform a block into a stored block.- */- _tr_stored_block(s, buf, stored_len, last);--#ifdef FORCE_STATIC- } else if (static_lenb >= 0) { /* force static trees */-#else- } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {-#endif- send_bits(s, (STATIC_TREES<<1)+last, 3);- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);-#ifdef DEBUG- s->compressed_len += 3 + s->static_len;-#endif- } else {- send_bits(s, (DYN_TREES<<1)+last, 3);- send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,- max_blindex+1);- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);-#ifdef DEBUG- s->compressed_len += 3 + s->opt_len;-#endif- }- Assert (s->compressed_len == s->bits_sent, "bad compressed size");- /* The above check is made mod 2^32, for files larger than 512 MB- * and uLong implemented on 32 bits.- */- init_block(s);-- if (last) {- bi_windup(s);-#ifdef DEBUG- s->compressed_len += 7; /* align on byte boundary */-#endif- }- Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,- s->compressed_len-7*last));-}--/* ===========================================================================- * Save the match info and tally the frequency counts. Return true if- * the current block must be flushed.- */-int ZLIB_INTERNAL _tr_tally (s, dist, lc)- deflate_state *s;- unsigned dist; /* distance of matched string */- unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */-{- s->d_buf[s->last_lit] = (ush)dist;- s->l_buf[s->last_lit++] = (uch)lc;- if (dist == 0) {- /* lc is the unmatched char */- s->dyn_ltree[lc].Freq++;- } else {- s->matches++;- /* Here, lc is the match length - MIN_MATCH */- dist--; /* dist = match distance - 1 */- Assert((ush)dist < (ush)MAX_DIST(s) &&- (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&- (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");-- s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;- s->dyn_dtree[d_code(dist)].Freq++;- }--#ifdef TRUNCATE_BLOCK- /* Try to guess if it is profitable to stop the current block here */- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {- /* Compute an upper bound for the compressed length */- ulg out_length = (ulg)s->last_lit*8L;- ulg in_length = (ulg)((long)s->strstart - s->block_start);- int dcode;- for (dcode = 0; dcode < D_CODES; dcode++) {- out_length += (ulg)s->dyn_dtree[dcode].Freq *- (5L+extra_dbits[dcode]);- }- out_length >>= 3;- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",- s->last_lit, in_length, out_length,- 100L - out_length*100L/in_length));- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;- }-#endif- return (s->last_lit == s->lit_bufsize-1);- /* We avoid equality with lit_bufsize because of wraparound at 64K- * on 16 bit machines and because stored blocks are restricted to- * 64K-1 bytes.- */-}--/* ===========================================================================- * Send the block data compressed using the given Huffman trees- */-local void compress_block(s, ltree, dtree)- deflate_state *s;- ct_data *ltree; /* literal tree */- ct_data *dtree; /* distance tree */-{- unsigned dist; /* distance of matched string */- int lc; /* match length or unmatched char (if dist == 0) */- unsigned lx = 0; /* running index in l_buf */- unsigned code; /* the code to send */- int extra; /* number of extra bits to send */-- if (s->last_lit != 0) do {- dist = s->d_buf[lx];- lc = s->l_buf[lx++];- 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 the 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 -= 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 d_buf+l_buf is ok: */- Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,- "pendingBuf overflow");-- } while (lx < s->last_lit);-- send_code(s, END_BLOCK, ltree);- s->last_eob_len = ltree[END_BLOCK].Len;-}--/* ===========================================================================- * 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- * "black list" (0..6, 14..25, 28..31).- * b) There is at least one printable character belonging to the- * "white 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;-{- /* black_mask is the bit mask of black-listed bytes- * set bits 0..6, 14..25, and 28..31- * 0xf3ffc07f = binary 11110011111111111100000001111111- */- unsigned long black_mask = 0xf3ffc07fUL;- int n;-- /* Check for non-textual ("black-listed") bytes. */- for (n = 0; n <= 31; n++, black_mask >>= 1)- if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))- return Z_BINARY;-- /* Check for textual ("white-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 "black-listed" or "white-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 DEBUG- s->bits_sent = (s->bits_sent+7) & ~7;-#endif-}--/* ===========================================================================- * Copy a stored block, storing first the length and its- * one's complement if requested.- */-local void copy_block(s, buf, len, header)- deflate_state *s;- charf *buf; /* the input data */- unsigned len; /* its length */- int header; /* true if block header must be written */-{- bi_windup(s); /* align on byte boundary */- s->last_eob_len = 8; /* enough lookahead for inflate */-- if (header) {- put_short(s, (ush)len);- put_short(s, (ush)~len);-#ifdef DEBUG- s->bits_sent += 2*16;-#endif- }-#ifdef DEBUG- s->bits_sent += (ulg)len<<3;-#endif- while (len--) {- put_byte(s, *buf++);- }-}
− libgit2/deps/zlib/trees.h
@@ -1,128 +0,0 @@-/* header created automatically with -DGEN_TREES_H */--local const ct_data static_ltree[L_CODES+2] = {-{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},-{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},-{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},-{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},-{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},-{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},-{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},-{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},-{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},-{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},-{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},-{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},-{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},-{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},-{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},-{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},-{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},-{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},-{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},-{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},-{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},-{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},-{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},-{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},-{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},-{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},-{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},-{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},-{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},-{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},-{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},-{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},-{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},-{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},-{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},-{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},-{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},-{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},-{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},-{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},-{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},-{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},-{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},-{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},-{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},-{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},-{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},-{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},-{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},-{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},-{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},-{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},-{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},-{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},-{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},-{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},-{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},-{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}-};--local const ct_data static_dtree[D_CODES] = {-{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},-{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},-{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},-{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},-{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},-{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}-};--const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,- 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,-10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,-11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,-12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,-13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,-13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,-18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,-24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,-27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,-28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29-};--const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {- 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,-13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,-17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,-19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,-21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,-22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,-24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,-26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28-};--local const int base_length[LENGTH_CODES] = {-0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,-64, 80, 96, 112, 128, 160, 192, 224, 0-};--local const int base_dist[D_CODES] = {- 0, 1, 2, 3, 4, 6, 8, 12, 16, 24,- 32, 48, 64, 96, 128, 192, 256, 384, 512, 768,- 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576-};-
− libgit2/deps/zlib/zconf.h
@@ -1,57 +0,0 @@-/* zconf.h -- configuration of the zlib compression library- * Copyright (C) 1995-2010 Jean-loup Gailly.- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* @(#) $Id$ */--#ifndef ZCONF_H-#define ZCONF_H--#include "../../src/common.h"--#define NO_GZIP-#define STDC--/* Jeez, don't complain about non-prototype- * forms, we didn't write zlib */-#if defined(_MSC_VER)-# pragma warning( disable : 4131 )-#endif--/* Maximum value for memLevel in deflateInit2 */-#define MAX_MEM_LEVEL 9--/* Maximum value for windowBits in deflateInit2 and inflateInit2.- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files- * created by gzip. (Files created by minigzip can still be extracted by- * gzip.)- */-#define MAX_WBITS 15 /* 32K LZ77 window */--#define ZEXTERN extern-#define ZEXPORT-#define ZEXPORTVA-#ifndef FAR-# define FAR-#endif-#define OF(args) args--typedef unsigned char Byte; /* 8 bits */-typedef unsigned int uInt; /* 16 bits or more */-typedef unsigned long uLong; /* 32 bits or more */--typedef Byte FAR Bytef;-typedef char FAR charf;-typedef int FAR intf;-typedef uInt FAR uIntf;-typedef uLong FAR uLongf;--typedef void const *voidpc;-typedef void FAR *voidpf;-typedef void *voidp;--#define z_off_t git_off_t-#define z_off64_t z_off_t--#endif /* ZCONF_H */
− libgit2/deps/zlib/zlib.h
@@ -1,1613 +0,0 @@-/* zlib.h -- interface of the 'zlib' general purpose compression library- version 1.2.5, April 19th, 2010-- Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler-- This software is provided 'as-is', without any express or implied- warranty. In no event will the authors be held liable for any damages- arising from the use of this software.-- Permission is granted to anyone to use this software for any purpose,- including commercial applications, and to alter it and redistribute it- freely, subject to the following restrictions:-- 1. The origin of this software must not be misrepresented; you must not- claim that you wrote the original software. If you use this software- in a product, an acknowledgment in the product documentation would be- appreciated but is not required.- 2. Altered source versions must be plainly marked as such, and must not be- misrepresented as being the original software.- 3. This notice may not be removed or altered from any source distribution.-- Jean-loup Gailly Mark Adler- jloup@gzip.org madler@alumni.caltech.edu--- The data format used by the zlib library is described by RFCs (Request for- Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).-*/--#ifndef ZLIB_H-#define ZLIB_H--#include "zconf.h"--#ifdef __cplusplus-extern "C" {-#endif--#define ZLIB_VERSION "1.2.5"-#define ZLIB_VERNUM 0x1250-#define ZLIB_VER_MAJOR 1-#define ZLIB_VER_MINOR 2-#define ZLIB_VER_REVISION 5-#define ZLIB_VER_SUBREVISION 0--/*- The 'zlib' compression library provides in-memory compression and- decompression functions, including integrity checks of the uncompressed data.- This version of the library supports only one compression method (deflation)- but other algorithms will be added later and will have the same stream- interface.-- Compression can be done in a single step if the buffers are large enough,- or can be done by repeated calls of the compression function. In the latter- case, the application must provide more input and/or consume the output- (providing more output space) before each call.-- The compressed data format used by default by the in-memory functions is- the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped- around a deflate stream, which is itself documented in RFC 1951.-- The library also supports reading and writing files in gzip (.gz) format- with an interface similar to that of stdio using the functions that start- with "gz". The gzip format is different from the zlib format. gzip is a- gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.-- This library can optionally read and write gzip streams in memory as well.-- The zlib format was designed to be compact and fast for use in memory- and on communications channels. The gzip format was designed for single-- file compression on file systems, has a larger header than zlib to maintain- directory information, and uses a different, slower check method than zlib.-- The library does not install any signal handler. The decoder checks- the consistency of the compressed data, so the library should never crash- even in case of corrupted input.-*/--typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));-typedef void (*free_func) OF((voidpf opaque, voidpf address));--struct internal_state;--typedef struct z_stream_s {- Bytef *next_in; /* next input byte */- uInt avail_in; /* number of bytes available at next_in */- uLong total_in; /* total nb of input bytes read so far */-- Bytef *next_out; /* next output byte should be put there */- uInt avail_out; /* remaining free space at next_out */- uLong total_out; /* total nb of bytes output so far */-- char *msg; /* last error message, NULL if no error */- struct internal_state FAR *state; /* not visible by applications */-- alloc_func zalloc; /* used to allocate the internal state */- free_func zfree; /* used to free the internal state */- voidpf opaque; /* private data object passed to zalloc and zfree */-- int data_type; /* best guess about the data type: binary or text */- uLong adler; /* adler32 value of the uncompressed data */- uLong reserved; /* reserved for future use */-} z_stream;--typedef z_stream FAR *z_streamp;--/*- gzip header information passed to and from zlib routines. See RFC 1952- for more details on the meanings of these fields.-*/-typedef struct gz_header_s {- int text; /* true if compressed data believed to be text */- uLong time; /* modification time */- int xflags; /* extra flags (not used when writing a gzip file) */- int os; /* operating system */- Bytef *extra; /* pointer to extra field or Z_NULL if none */- uInt extra_len; /* extra field length (valid if extra != Z_NULL) */- uInt extra_max; /* space at extra (only when reading header) */- Bytef *name; /* pointer to zero-terminated file name or Z_NULL */- uInt name_max; /* space at name (only when reading header) */- Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */- uInt comm_max; /* space at comment (only when reading header) */- int hcrc; /* true if there was or will be a header crc */- int done; /* true when done reading gzip header (not used- when writing a gzip file) */-} gz_header;--typedef gz_header FAR *gz_headerp;--/*- The application must update next_in and avail_in when avail_in has dropped- to zero. It must update next_out and avail_out when avail_out has dropped- to zero. The application must initialize zalloc, zfree and opaque before- calling the init function. All other fields are set by the compression- library and must not be updated by the application.-- The opaque value provided by the application will be passed as the first- parameter for calls of zalloc and zfree. This can be useful for custom- memory management. The compression library attaches no meaning to the- opaque value.-- zalloc must return Z_NULL if there is not enough memory for the object.- If zlib is used in a multi-threaded application, zalloc and zfree must be- thread safe.-- On 16-bit systems, the functions zalloc and zfree must be able to allocate- exactly 65536 bytes, but will not be required to allocate more than this if- the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers- returned by zalloc for objects of exactly 65536 bytes *must* have their- offset normalized to zero. The default allocation function provided by this- library ensures this (see zutil.c). To reduce memory requirements and avoid- any allocation of 64K objects, at the expense of compression ratio, compile- the library with -DMAX_WBITS=14 (see zconf.h).-- The fields total_in and total_out can be used for statistics or progress- reports. After compression, total_in holds the total size of the- uncompressed data and may be saved for use in the decompressor (particularly- if the decompressor wants to decompress everything in a single step).-*/-- /* constants */--#define Z_NO_FLUSH 0-#define Z_PARTIAL_FLUSH 1-#define Z_SYNC_FLUSH 2-#define Z_FULL_FLUSH 3-#define Z_FINISH 4-#define Z_BLOCK 5-#define Z_TREES 6-/* Allowed flush values; see deflate() and inflate() below for details */--#define Z_OK 0-#define Z_STREAM_END 1-#define Z_NEED_DICT 2-#define Z_ERRNO (-1)-#define Z_STREAM_ERROR (-2)-#define Z_DATA_ERROR (-3)-#define Z_MEM_ERROR (-4)-#define Z_BUF_ERROR (-5)-#define Z_VERSION_ERROR (-6)-/* Return codes for the compression/decompression functions. Negative values- * are errors, positive values are used for special but normal events.- */--#define Z_NO_COMPRESSION 0-#define Z_BEST_SPEED 1-#define Z_BEST_COMPRESSION 9-#define Z_DEFAULT_COMPRESSION (-1)-/* compression levels */--#define Z_FILTERED 1-#define Z_HUFFMAN_ONLY 2-#define Z_RLE 3-#define Z_FIXED 4-#define Z_DEFAULT_STRATEGY 0-/* compression strategy; see deflateInit2() below for details */--#define Z_BINARY 0-#define Z_TEXT 1-#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */-#define Z_UNKNOWN 2-/* Possible values of the data_type field (though see inflate()) */--#define Z_DEFLATED 8-/* The deflate compression method (the only one supported in this version) */--#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */--#define zlib_version zlibVersion()-/* for compatibility with versions < 1.0.2 */--- /* basic functions */--ZEXTERN const char * ZEXPORT zlibVersion OF((void));-/* The application can compare zlibVersion and ZLIB_VERSION for consistency.- 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- is automatically made by deflateInit and inflateInit.- */--/*-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));-- Initializes the internal stream state for compression. The fields- 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- allocation functions.-- 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- (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION- requests a default compromise between speed and compression (currently- equivalent to level 6).-- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough- memory, Z_STREAM_ERROR if level is not a valid compression level, or- Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible- with the version assumed by the caller (ZLIB_VERSION). msg is set to null- if there is no error message. deflateInit does not perform any compression:- this will be done by deflate().-*/---ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));-/*- deflate compresses as much data as possible, and stops when the input- buffer becomes empty or the output buffer becomes full. It may introduce- some output latency (reading input without producing any output) except when- forced to flush.-- The detailed semantics are as follows. deflate performs one or both of the- following actions:-- - Compress more input starting at next_in and update next_in and avail_in- accordingly. If not all input can be processed (because there is not- enough room in the output buffer), next_in and avail_in are updated and- processing will resume at this point for the next call of deflate().-- - Provide more output starting at next_out and update next_out and avail_out- accordingly. This action is forced if the parameter flush is non zero.- Forcing flush frequently degrades the compression ratio, so this parameter- should be set only when necessary (in interactive applications). Some- output may be provided even if flush is not set.-- Before the call of deflate(), the application should ensure that at least- one of the actions is possible, by providing more input and/or consuming more- output, and updating avail_in or avail_out accordingly; avail_out should- never be zero before the call. The application can consume the compressed- output when it wants, for example when the output buffer is full (avail_out- == 0), or after each call of deflate(). If deflate returns Z_OK and with- zero avail_out, it must be called again after making room in the output- buffer because there might be more output pending.-- Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to- decide how much data to accumulate before producing output, in order to- maximize compression.-- If the parameter flush is set to Z_SYNC_FLUSH, all pending output is- flushed to the output buffer and the output is aligned on a byte boundary, so- that the decompressor can get all input data available so far. (In- particular avail_in is zero after the call if enough output space has been- provided before the call.) Flushing may degrade compression for some- compression algorithms and so it should be used only when necessary. This- completes the current deflate block and follows it with an empty stored block- that is three bits plus filler bits to the next byte, followed by four bytes- (00 00 ff ff).-- If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the- output buffer, but the output is not aligned to a byte boundary. All of the- input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.- This completes the current deflate block and follows it with an empty fixed- codes block that is 10 bits long. This assures that enough bytes are output- in order for the decompressor to finish the block before the empty fixed code- block.-- If flush is set to Z_BLOCK, a deflate block is completed and emitted, as- for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to- seven bits of the current block are held to be written as the next byte after- the next deflate block is completed. In this case, the decompressor may not- be provided enough bits at this point in order to complete decompression of- the data provided so far to the compressor. It may need to wait for the next- block to be emitted. This is for advanced applications that need to control- the emission of deflate blocks.-- If flush is set to Z_FULL_FLUSH, all output is flushed as with- Z_SYNC_FLUSH, and the compression state is reset so that decompression can- restart from this point if previous compressed data has been damaged or if- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade- compression.-- If deflate returns with avail_out == 0, this function must be called again- 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). 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 == 0 on return.-- 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- enough output space; if deflate returns with Z_OK, this function must be- called again with Z_FINISH and more output space (updated avail_out) but no- more input data, until it returns with Z_STREAM_END or an error. After- deflate has returned Z_STREAM_END, the only possible operations on the stream- are deflateReset or deflateEnd.-- Z_FINISH can be used immediately after deflateInit if all the compression- is to be done in a single step. In this case, avail_out must be at least the- value returned by deflateBound (see below). If deflate does not return- Z_STREAM_END, then it must be called again as described above.-- deflate() sets strm->adler to the adler32 checksum of all input read- so far (that is, total_in bytes).-- deflate() may update strm->data_type if it can make a good guess about- the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered- binary. This field is only for information purposes and does not affect the- compression algorithm in any manner.-- deflate() returns Z_OK if some progress has been made (more input- processed or more output produced), Z_STREAM_END if all input has been- consumed and all output has been produced (only when flush is set to- Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example- if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible- (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not- fatal, and deflate() can be called again with more input and more output- space to continue compressing.-*/---ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));-/*- All dynamically allocated data structures for this stream are freed.- This function discards any unprocessed input and does not flush any pending- output.-- deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the- stream state was inconsistent, Z_DATA_ERROR if the stream was freed- prematurely (some input or output was discarded). In the error case, msg- may be set but then points to a static string (which must not be- deallocated).-*/---/*-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));-- Initializes the internal stream state for decompression. The fields- next_in, avail_in, zalloc, zfree and opaque must be initialized before by- the caller. If next_in is not Z_NULL and avail_in is large enough (the- exact value depends on the compression method), inflateInit determines the- compression method from the zlib header and allocates all data structures- accordingly; otherwise the allocation will be deferred to the first call of- inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to- use default allocation functions.-- 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- version assumed by the caller, or Z_STREAM_ERROR if the parameters are- invalid, such as a null pointer to the structure. msg is set to null if- there is no error message. inflateInit does not perform any decompression- apart from possibly reading the zlib header if present: actual decompression- will be done by inflate(). (So next_in and avail_in may be modified, but- next_out and avail_out are unused and unchanged.) The current implementation- of inflateInit() does not process any header information -- that is deferred- until inflate() is called.-*/---ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));-/*- inflate decompresses as much data as possible, and stops when the input- buffer becomes empty or the output buffer becomes full. It may introduce- some output latency (reading input without producing any output) except when- forced to flush.-- The detailed semantics are as follows. inflate performs one or both of the- following actions:-- - Decompress more input starting at next_in and update next_in and avail_in- accordingly. If not all input can be processed (because there is not- enough room in the output buffer), next_in is updated and processing will- resume at this point for the next call of inflate().-- - Provide more output starting at next_out and update next_out and avail_out- accordingly. inflate() provides as much output as possible, until there is- no more input data or no more space in the output buffer (see below about- the flush parameter).-- Before the call of inflate(), the application should ensure that at least- one of the actions is possible, by providing more input and/or consuming more- output, and updating the next_* and avail_* values accordingly. The- application can consume the uncompressed output when it wants, for example- when the output buffer is full (avail_out == 0), or after each call of- inflate(). If inflate returns Z_OK and with zero avail_out, it must be- called again after making room in the output buffer because there might be- more output pending.-- The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,- Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much- output as possible to the output buffer. Z_BLOCK requests that inflate()- stop if and when it gets to the next deflate block boundary. When decoding- the zlib or gzip format, this will cause inflate() to return immediately- after the header and before the first block. When doing a raw inflate,- inflate() will go ahead and process the first block, and will return when it- gets to the end of that block, or when it runs out of data.-- The Z_BLOCK option assists in appending to or combining deflate streams.- Also to assist in this, on return inflate() will set strm->data_type to the- number of unused bits in the last byte taken from strm->next_in, plus 64 if- inflate() is currently decoding the last block in the deflate stream, plus- 128 if inflate() returned immediately after decoding an end-of-block code or- decoding the complete header up to just before the first byte of the deflate- stream. The end-of-block will not be indicated until all of the uncompressed- data from that block has been written to strm->next_out. The number of- unused bits may in general be greater than seven, except when bit 7 of- data_type is set, in which case the number of unused bits will be less than- eight. data_type is set as noted here every time inflate() returns for all- flush options, and so can be used to determine the amount of currently- consumed input in bits.-- The Z_TREES option behaves as Z_BLOCK does, but it also returns when the- end of each deflate block header is reached, before any actual data in that- block is decoded. This allows the caller to determine the length of the- deflate block header for later use in random access within a deflate block.- 256 is added to the value of strm->data_type when inflate() returns- immediately after reaching the end of the deflate block header.-- inflate() should normally be called until it returns Z_STREAM_END or an- error. However if all decompression is to be performed in a single step (a- single call of inflate), the parameter flush should be set to Z_FINISH. In- this case all pending input is processed and all pending output is flushed;- avail_out must be large enough to hold all the uncompressed data. (The size- of the uncompressed data may have been saved by the compressor for this- purpose.) The next operation on this stream must be inflateEnd to deallocate- the decompression state. The use of Z_FINISH is never required, but can be- used to inform inflate that a faster approach may be used for the single- inflate() call.-- In this implementation, inflate() always flushes as much output as- possible to the output buffer, and always uses the faster approach on the- first call. So the only effect of the flush parameter in this implementation- is on the return value of inflate(), as noted below, or when it returns early- because Z_BLOCK or Z_TREES is used.-- If a preset dictionary is needed after this call (see inflateSetDictionary- below), inflate sets strm->adler to the adler32 checksum of the dictionary- chosen by the compressor and returns Z_NEED_DICT; otherwise it sets- strm->adler to the adler32 checksum of all output produced so far (that is,- total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described- below. At the end of the stream, inflate() checks that its computed adler32- checksum is equal to that saved by the compressor and returns Z_STREAM_END- only if the checksum is correct.-- inflate() can decompress and check either zlib-wrapped or gzip-wrapped- deflate data. The header type is detected automatically, if requested when- initializing with inflateInit2(). Any information contained in the gzip- header is not retained, so applications that need that information should- instead use raw inflate, see inflateInit2() below, or inflateBack() and- perform their own processing of the gzip header and trailer.-- inflate() returns Z_OK if some progress has been made (more input processed- or more output produced), Z_STREAM_END if the end of the compressed data has- been reached and all uncompressed output has been produced, Z_NEED_DICT if a- preset dictionary is needed at this point, Z_DATA_ERROR if the input data was- corrupted (input stream not conforming to the zlib format or incorrect check- value), Z_STREAM_ERROR if the stream structure was inconsistent (for example- next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,- Z_BUF_ERROR if no progress is possible or if there was not enough room in the- output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and- inflate() can be called again with more input and more output space to- continue decompressing. If Z_DATA_ERROR is returned, the application may- then call inflateSync() to look for a good compression block if a partial- recovery of the data is desired.-*/---ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));-/*- All dynamically allocated data structures for this stream are freed.- This function discards any unprocessed input and does not flush any pending- output.-- inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state- was inconsistent. In the error case, msg may be set but then points to a- static string (which must not be deallocated).-*/--- /* Advanced functions */--/*- The following functions are needed only in some special applications.-*/--/*-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,- int level,- int method,- int windowBits,- int memLevel,- int strategy));-- This is another version of deflateInit with more compression options. The- fields next_in, zalloc, zfree and opaque must be initialized before by the- caller.-- The method parameter is the compression method. It must be Z_DEFLATED in- this version of the library.-- The windowBits parameter is the base two logarithm of the window size- (the size of the history buffer). It should be in the range 8..15 for this- version of the library. Larger values of this parameter result in better- compression at the expense of memory usage. The default value is 15 if- deflateInit is used instead.-- windowBits can also be -8..-15 for raw deflate. In this case, -windowBits- determines the window size. deflate() will then generate raw deflate data- with no zlib header or trailer, and will not compute an adler32 check value.-- windowBits can also be greater than 15 for optional gzip encoding. Add- 16 to windowBits to write a simple gzip header and trailer around the- compressed data instead of a zlib wrapper. The gzip header will have no- file name, no extra data, no comment, no modification time (set to zero), no- header crc, and the operating system will be set to 255 (unknown). If a- gzip stream is being written, strm->adler is a crc32 instead of an adler32.-- The memLevel parameter specifies how much memory should be allocated- for the internal compression state. memLevel=1 uses minimum memory but is- slow and reduces compression ratio; memLevel=9 uses maximum memory for- optimal speed. The default value is 8. See zconf.h for total memory usage- as a function of windowBits and memLevel.-- The strategy parameter is used to tune the compression algorithm. Use the- value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a- filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no- string match), or Z_RLE to limit match distances to one (run-length- encoding). Filtered data consists mostly of small values with a somewhat- random distribution. In this case, the compression algorithm is tuned to- compress them better. The effect of Z_FILTERED is to force more Huffman- coding and less string matching; it is somewhat intermediate between- Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as- fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The- strategy parameter only affects the compression ratio but not the- correctness of the compressed output even if it is not set appropriately.- Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler- decoder for special applications.-- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough- memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid- method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is- incompatible with the version assumed by the caller (ZLIB_VERSION). msg is- set to null if there is no error message. deflateInit2 does not perform any- compression: this will be done by deflate().-*/--ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,- const Bytef *dictionary,- uInt dictLength));-/*- Initializes the compression dictionary from the given byte sequence- without producing any compressed output. This function must be called- immediately after deflateInit, deflateInit2 or deflateReset, before any call- of deflate. The compressor and decompressor must use exactly the same- dictionary (see inflateSetDictionary).-- The dictionary should consist of strings (byte sequences) that are likely- to be encountered later in the data to be compressed, with the most commonly- used strings preferably put towards the end of the dictionary. Using a- dictionary is most useful when the data to be compressed is short and can be- predicted with good accuracy; the data can then be compressed better than- with the default empty dictionary.-- Depending on the size of the compression data structures selected by- deflateInit or deflateInit2, a part of the dictionary may in effect be- discarded, for example if the dictionary is larger than the window size- provided in deflateInit or deflateInit2. Thus the strings most likely to be- useful should be put at the end of the dictionary, not at the front. In- addition, the current implementation of deflate will use at most the window- size minus 262 bytes of the provided dictionary.-- Upon return of this function, strm->adler is set to the adler32 value- of the dictionary; the decompressor may later use this value to determine- which dictionary has been used by the compressor. (The adler32 value- applies to the whole dictionary even if only a subset of the dictionary is- actually used by the compressor.) If a raw deflate was requested, then the- adler32 value is not computed and strm->adler is not set.-- deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a- parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is- inconsistent (for example if deflate has already been called for this stream- or if the compression method is bsort). deflateSetDictionary does not- perform any compression: this will be done by deflate().-*/--ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,- z_streamp source));-/*- Sets the destination stream as a complete copy of the source stream.-- This function can be useful when several compression strategies will be- tried, for example when there are several ways of pre-processing the input- data with a filter. The streams that will be discarded should then be freed- by calling deflateEnd. Note that deflateCopy duplicates the internal- compression state which can be quite large, so this strategy is slow and can- consume lots of memory.-- deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent- (such as zalloc being Z_NULL). msg is left unchanged in both source and- destination.-*/--ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));-/*- This function is equivalent to deflateEnd followed by deflateInit,- but does not free and reallocate all the internal compression state. The- stream will keep the same compression level and any other attributes that- may have been set by deflateInit2.-- 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).-*/--ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,- int level,- int strategy));-/*- Dynamically update the compression level and compression strategy. The- interpretation of level and strategy is as in deflateInit2. This can be- used to switch between compression and straight copy of the input data, or- to switch to a different kind of input data requiring a different strategy.- If the compression level is changed, the input available so far is- compressed with the old level (and may be flushed); the new level will take- effect only at the next call of deflate().-- Before the call of deflateParams, the stream state must be set as for- a call of deflate(), since the currently available input may have to be- compressed and flushed. In particular, strm->avail_out must be non-zero.-- deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if- strm->avail_out was zero.-*/--ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,- int good_length,- int max_lazy,- int nice_length,- int max_chain));-/*- Fine tune deflate's internal compression parameters. This should only be- used by someone who understands the algorithm used by zlib's deflate for- searching for the best matching string, and even then only by the most- fanatic optimizer trying to squeeze out the last compressed bit for their- specific input data. Read the deflate.c source code for the meaning of the- max_lazy, good_length, nice_length, and max_chain parameters.-- deflateTune() can be called after deflateInit() or deflateInit2(), and- returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.- */--ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,- uLong sourceLen));-/*- deflateBound() returns an upper bound on the compressed size after- deflation of sourceLen bytes. It must be called after deflateInit() or- deflateInit2(), and after deflateSetHeader(), if used. This would be used- to allocate an output buffer for deflation in a single pass, and so would be- called before deflate().-*/--ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,- int bits,- int value));-/*- 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- leftover from a previous deflate stream when appending to it. As such, this- function can only be used for raw deflate, and must be used before the first- deflate() call after a deflateInit2() or deflateReset(). bits must be less- than or equal to 16, and that many of the least significant bits of value- will be inserted in the output.-- deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source- stream state was inconsistent.-*/--ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,- gz_headerp head));-/*- deflateSetHeader() provides gzip header information for when a gzip- stream is requested by deflateInit2(). deflateSetHeader() may be called- after deflateInit2() or deflateReset() and before the first call of- deflate(). The text, time, os, extra field, name, and comment information- in the provided gz_header structure are written to the gzip header (xflag is- ignored -- the extra flags are set according to the compression level). The- caller must assure that, if not Z_NULL, name and comment are terminated with- a zero byte, and that if extra is not Z_NULL, that extra_len bytes are- available there. If hcrc is true, a gzip header crc is included. Note that- the current versions of the command-line version of gzip (up through version- 1.3.x) do not support header crc's, and will report that it is a "multi-part- gzip file" and give up.-- 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- 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- stream state was inconsistent.-*/--/*-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,- int windowBits));-- This is another version of inflateInit with an extra parameter. The- fields next_in, avail_in, zalloc, zfree and opaque must be initialized- before by the caller.-- The windowBits parameter is the base two logarithm of the maximum window- size (the size of the history buffer). It should be in the range 8..15 for- this version of the library. The default value is 15 if inflateInit is used- instead. windowBits must be greater than or equal to the windowBits value- provided to deflateInit2() while compressing, or it must be equal to 15 if- deflateInit2() was not used. If a compressed stream with a larger window- size is given as input, inflate() will return with the error code- Z_DATA_ERROR instead of trying to allocate a larger window.-- windowBits can also be zero to request that inflate use the window size in- the zlib header of the compressed stream.-- windowBits can also be -8..-15 for raw inflate. In this case, -windowBits- determines the window size. inflate() will then process raw deflate data,- not looking for a zlib or gzip header, not generating a check value, and not- looking for any check values for comparison at the end of the stream. This- is for use with other formats that use the deflate compressed data format- such as zip. Those formats provide their own check values. If a custom- format is developed using the raw deflate format for compressed data, it is- recommended that a check value such as an adler32 or a crc32 be applied to- the uncompressed data as is done in the zlib, gzip, and zip formats. For- most applications, the zlib format should be used as is. Note that comments- above on the use in deflateInit2() applies to the magnitude of windowBits.-- windowBits can also be greater than 15 for optional gzip decoding. Add- 32 to windowBits to enable zlib and gzip decoding with automatic header- detection, or add 16 to decode only the gzip format (the zlib format will- return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a- crc32 instead of an adler32.-- inflateInit2 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- version assumed by the caller, or Z_STREAM_ERROR if the parameters are- invalid, such as a null pointer to the structure. msg is set to null if- there is no error message. inflateInit2 does not perform any decompression- apart from possibly reading the zlib header if present: actual decompression- will be done by inflate(). (So next_in and avail_in may be modified, but- next_out and avail_out are unused and unchanged.) The current implementation- of inflateInit2() does not process any header information -- that is- deferred until inflate() is called.-*/--ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,- const Bytef *dictionary,- uInt dictLength));-/*- Initializes the decompression dictionary from the given uncompressed byte- sequence. This function must be called immediately after a call of inflate,- if that call returned Z_NEED_DICT. The dictionary chosen by the compressor- can be determined from the adler32 value returned by that call of inflate.- The compressor and decompressor must use exactly the same dictionary (see- deflateSetDictionary). For raw inflate, this function can be called- immediately after inflateInit2() or inflateReset() and before any call of- inflate() to set the dictionary. The application must insure that the- dictionary that was used for compression is provided.-- inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a- parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is- inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the- expected one (incorrect adler32 value). inflateSetDictionary does not- perform any decompression: this will be done by subsequent calls of- inflate().-*/--ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));-/*- Skips invalid compressed data until a full flush point (see above the- description of deflate with Z_FULL_FLUSH) can be found, or until all- available input is skipped. No output is provided.-- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR- if no more input was provided, Z_DATA_ERROR if no flush point has been- found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the- success case, the application may save the current current value of total_in- which indicates where valid compressed data was found. In the error case,- the application may repeatedly call inflateSync, providing more input each- time, until success or end of the input data.-*/--ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,- z_streamp source));-/*- Sets the destination stream as a complete copy of the source stream.-- This function can be useful when randomly accessing a large stream. The- first pass through the stream can periodically record the inflate state,- allowing restarting inflate at those points when randomly accessing the- stream.-- inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent- (such as zalloc being Z_NULL). msg is left unchanged in both source and- destination.-*/--ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));-/*- This function is equivalent to inflateEnd followed by inflateInit,- but does not free and reallocate all the internal decompression state. The- stream will keep attributes that may have been set by inflateInit2.-- 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).-*/--ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,- int windowBits));-/*- This function is the same as inflateReset, but it also permits changing- the wrap and window size requests. The windowBits parameter is interpreted- the same as it is for inflateInit2.-- inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source- stream state was inconsistent (such as zalloc or state being Z_NULL), or if- the windowBits parameter is invalid.-*/--ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,- int bits,- int value));-/*- 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- middle of a byte. The provided bits will be used before any bytes are used- from next_in. This function should only be used with raw inflate, and- should be used before the first inflate() call after inflateInit2() or- inflateReset(). bits must be less than or equal to 16, and that many of the- least significant bits of value will be inserted in the input.-- If bits is negative, then the input stream bit buffer is emptied. Then- inflatePrime() can be called again to put bits in the buffer. This is used- to clear out bits leftover after feeding inflate a block description prior- to feeding inflate codes.-- inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source- stream state was inconsistent.-*/--ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));-/*- 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- return value down 16 bits. If the upper value is -1 and the lower value is- zero, then inflate() is currently decoding information outside of a block.- If the upper value is -1 and the lower value is non-zero, then inflate is in- the middle of a stored block, with the lower value equaling the number of- bytes from the input remaining to copy. If the upper value is not -1, then- it is the number of bits back from the current bit position in the input of- the code (literal or length/distance pair) currently being processed. In- that case the lower value is the number of bytes already emitted for that- code.-- A code is being processed if inflate is waiting for more input to complete- decoding of the code, or if it has completed decoding but is waiting for- more output space to write the literal or match data.-- inflateMark() is used to mark locations in the input data for random- access, which may be at bit positions, and to note those cases where the- output of a code may span boundaries of random access blocks. The current- location in the input stream can be determined from avail_in and data_type- as noted in the description for the Z_BLOCK flush parameter for inflate.-- inflateMark returns the value noted above or -1 << 16 if the provided- source stream state was inconsistent.-*/--ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,- gz_headerp head));-/*- inflateGetHeader() requests that gzip header information be stored in the- provided gz_header structure. inflateGetHeader() may be called after- inflateInit2() or inflateReset(), and before the first call of inflate().- As inflate() processes the gzip stream, head->done is zero until the header- is completed, at which time head->done is set to one. If a zlib stream is- being decoded, then head->done is set to -1 to indicate that there will be- no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be- used to force inflate() to return immediately after header processing is- complete and before any actual data is decompressed.-- The text, time, xflags, and os fields are filled in with the gzip header- contents. hcrc is set to true if there is a header CRC. (The header CRC- was valid if done is set to one.) If extra is not Z_NULL, then extra_max- contains the maximum number of bytes to write to extra. Once done is true,- extra_len contains the actual extra field length, and extra contains the- extra field, or that field truncated if extra_max is less than extra_len.- If name is not Z_NULL, then up to name_max characters are written there,- terminated with a zero unless the length is greater than name_max. If- comment is not Z_NULL, then up to comm_max characters are written there,- terminated with a zero unless the length is greater than comm_max. When any- of extra, name, or comment are not Z_NULL and the respective field is not- present in the header, then that field is set to Z_NULL to signal its- absence. This allows the use of deflateSetHeader() with the returned- structure to duplicate the header. However if those fields are set to- allocated memory, then the application will need to save those pointers- elsewhere so that they can be eventually freed.-- If inflateGetHeader is not used, then the header information is simply- discarded. The header is always checked for validity, including the header- CRC if present. inflateReset() will reset the process to discard the header- information. The application would need to call inflateGetHeader() again to- retrieve the header from the next gzip stream.-- inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source- stream state was inconsistent.-*/--/*-ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,- unsigned char FAR *window));-- Initialize the internal stream state for decompression using inflateBack()- calls. The fields zalloc, zfree and opaque in strm must be initialized- before the call. If zalloc and zfree are Z_NULL, then the default library-- derived memory allocation routines are used. windowBits is the base two- logarithm of the window size, in the range 8..15. window is a caller- supplied buffer of that size. Except for special applications where it is- assured that deflate was used with small window sizes, windowBits must be 15- and a 32K byte window must be supplied to be able to decompress general- deflate streams.-- See inflateBack() for the usage of these routines.-- inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of- the paramaters are invalid, Z_MEM_ERROR if the internal state could not be- allocated, or Z_VERSION_ERROR if the version of the library does not match- the version of the header file.-*/--typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));-typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));--ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,- in_func in, void FAR *in_desc,- out_func out, void FAR *out_desc));-/*- inflateBack() does a raw inflate with a single call using a call-back- interface for input and output. This is more efficient than inflate() for- file i/o applications in that it avoids copying between the output and the- sliding window by simply making the window itself the output buffer. This- function trusts the application to not change the output buffer passed by- the output function, at least until inflateBack() returns.-- inflateBackInit() must be called first to allocate the internal state- and to initialize the state with the user-provided window buffer.- inflateBack() may then be used multiple times to inflate a complete, raw- deflate stream with each call. inflateBackEnd() is then called to free the- allocated state.-- A raw deflate stream is one with no zlib or gzip header or trailer.- This routine would normally be used in a utility that reads zip or gzip- files and writes out uncompressed files. The utility would decode the- header and process the trailer on its own, hence this routine expects only- the raw deflate stream to decompress. This is different from the normal- behavior of inflate(), which expects either a zlib or gzip header and- trailer around the deflate stream.-- inflateBack() uses two subroutines supplied by the caller that are then- called by inflateBack() for input and output. inflateBack() calls those- routines until it reads a complete deflate stream and writes out all of the- uncompressed data, or until it encounters an error. The function's- parameters and return types are defined above in the in_func and out_func- typedefs. inflateBack() will call in(in_desc, &buf) which should return the- number of bytes of provided input, and a pointer to that input in buf. If- there is no input available, in() must return zero--buf is ignored in that- case--and inflateBack() will return a buffer error. inflateBack() will call- out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()- should return zero on success, or non-zero on failure. If out() returns- non-zero, inflateBack() will return with an error. Neither in() nor out()- are permitted to change the contents of the window provided to- inflateBackInit(), which is also the buffer that out() uses to write from.- The length written by out() will be at most the window size. Any non-zero- amount of input may be provided by in().-- For convenience, inflateBack() can be provided input on the first call by- setting strm->next_in and strm->avail_in. If that input is exhausted, then- in() will be called. Therefore strm->next_in must be initialized before- calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called- immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in- must also be initialized, and then if strm->avail_in is not zero, input will- initially be taken from strm->next_in[0 .. strm->avail_in - 1].-- The in_desc and out_desc parameters of inflateBack() is passed as the- first parameter of in() and out() respectively when they are called. These- descriptors can be optionally used to pass any information that the caller-- supplied in() and out() functions need to do their job.-- On return, inflateBack() will set strm->next_in and strm->avail_in to- pass back any unused input that was provided by the last in() call. The- return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR- if in() or out() returned an error, Z_DATA_ERROR if there was a format error- in the deflate stream (in which case strm->msg is set to indicate the nature- of the error), or Z_STREAM_ERROR if the stream was not properly initialized.- In the case of Z_BUF_ERROR, an input or output error can be distinguished- using strm->next_in which will be Z_NULL only if in() returned an error. If- strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning- non-zero. (in() will always be called before out(), so strm->next_in is- assured to be defined if out() returns non-zero.) Note that inflateBack()- cannot return Z_OK.-*/--ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));-/*- All memory allocated by inflateBackInit() is freed.-- inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream- state was inconsistent.-*/--ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));-/* Return flags indicating compile-time options.-- Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:- 1.0: size of uInt- 3.2: size of uLong- 5.4: size of voidpf (pointer)- 7.6: size of z_off_t-- Compiler, assembler, and debug options:- 8: DEBUG- 9: ASMV or ASMINF -- use ASM code- 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention- 11: 0 (reserved)-- One-time table building (smaller code, but not thread-safe if true):- 12: BUILDFIXED -- build static block decoding tables when needed- 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed- 14,15: 0 (reserved)-- Library content (indicates missing functionality):- 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking- deflate code when not needed)- 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect- and decode gzip streams (to avoid linking crc code)- 18-19: 0 (reserved)-- Operation variations (changes in library functionality):- 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate- 21: FASTEST -- deflate algorithm with only one, lowest compression level- 22,23: 0 (reserved)-- The sprintf variant used by gzprintf (zero is best):- 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format- 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!- 26: 0 = returns value, 1 = void -- 1 means inferred string length returned-- Remainder:- 27-31: 0 (reserved)- */--- /* utility functions */--/*- The following utility functions are implemented on top of the basic- stream-oriented functions. To simplify the interface, some default options- are assumed (compression level and memory usage, standard memory allocation- functions). The source code of these utility functions can be modified if- you need special options.-*/--ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,- const Bytef *source, uLong sourceLen));-/*- Compresses the source buffer into the destination buffer. sourceLen is- the byte length of the source buffer. Upon entry, destLen is the total size- of the destination buffer, which must be at least the value returned by- compressBound(sourceLen). Upon exit, destLen is the actual size of the- compressed buffer.-- compress returns Z_OK if success, Z_MEM_ERROR if there was not- enough memory, Z_BUF_ERROR if there was not enough room in the output- buffer.-*/--ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,- const Bytef *source, uLong sourceLen,- int level));-/*- Compresses the source buffer into the destination buffer. The level- parameter has the same meaning as in deflateInit. sourceLen is the byte- length of the source buffer. Upon entry, destLen is the total size of the- destination buffer, which must be at least the value returned by- compressBound(sourceLen). Upon exit, destLen is the actual size of the- compressed buffer.-- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough- memory, Z_BUF_ERROR if there was not enough room in the output buffer,- Z_STREAM_ERROR if the level parameter is invalid.-*/--ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));-/*- 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() call to allocate the destination buffer.-*/--ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,- const Bytef *source, uLong sourceLen));-/*- Decompresses the source buffer into the destination buffer. sourceLen is- the byte length of the source buffer. Upon entry, destLen is the total size- of the destination buffer, which must be large enough to hold the entire- uncompressed data. (The size of the uncompressed data must have been saved- previously by the compressor and transmitted to the decompressor by some- mechanism outside the scope of this compression library.) Upon exit, destLen- is the actual size of the uncompressed buffer.-- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not- enough memory, Z_BUF_ERROR if there was not enough room in the output- buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.-*/--- /* gzip file access functions */--/*- This library supports reading and writing files in gzip (.gz) format with- an interface similar to that of stdio, using the functions that start with- "gz". The gzip format is different from the zlib format. gzip is a gzip- wrapper, documented in RFC 1952, wrapped around a deflate stream.-*/--typedef voidp gzFile; /* opaque gzip file descriptor */--/*-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));-- Opens a gzip (.gz) file for reading or writing. The mode parameter is as- in fopen ("rb" or "wb") but can also include a compression level ("wb9") or- a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only- compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'- for fixed code compression as in "wb9F". (See the description of- deflateInit2 for more information about the strategy parameter.) Also "a"- can be used instead of "w" to request that the gzip stream that will be- written be appended to the file. "+" will result in an error, since reading- and writing to the same gzip file is not supported.-- gzopen can be used to read a file which is not in gzip format; in this- case gzread will directly read from the file without decompression.-- gzopen returns NULL if the file could not be opened, if there was- insufficient memory to allocate the gzFile state, or if an invalid mode was- specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).- errno can be checked to determine if the reason gzopen failed was that the- file could not be opened.-*/--ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));-/*- gzdopen associates a gzFile with the file descriptor fd. File descriptors- are obtained from calls like open, dup, creat, pipe or fileno (if the file- has been previously opened with fopen). The mode parameter is as in gzopen.-- The next call of gzclose on the returned gzFile will also close the file- descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor- fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,- mode);. The duplicated descriptor should be saved to avoid a leak, since- gzdopen does not close fd if it fails.-- gzdopen returns NULL if there was insufficient memory to allocate the- gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not- provided, or '+' was provided), or if fd is -1. The file descriptor is not- used until the next gz* read, write, seek, or close operation, so gzdopen- will not detect if fd is invalid (unless fd is -1).-*/--ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));-/*- Set the internal buffer size used by this library's functions. The- default buffer size is 8192 bytes. This function must be called after- gzopen() or gzdopen(), and before any other calls that read or write the- file. The buffer memory allocation is always deferred to the first read or- write. Two buffers are allocated, either both of the specified size when- writing, or one of the specified size and the other twice that size when- reading. A larger buffer size of, for example, 64K or 128K bytes will- noticeably increase the speed of decompression (reading).-- The new buffer size also affects the maximum length for gzprintf().-- gzbuffer() returns 0 on success, or -1 on failure, such as being called- too late.-*/--ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));-/*- Dynamically update the compression level or strategy. See the description- of deflateInit2 for the meaning of these parameters.-- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not- opened for writing.-*/--ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));-/*- Reads the given number of uncompressed bytes from the compressed file. If- the input file was not in gzip format, gzread copies the given number of- bytes into the buffer.-- After reaching the end of a gzip stream in the input, gzread will continue- to read, looking for another gzip stream, or failing that, reading the rest- of the input file directly without decompression. The entire input file- will be read if gzread is called until it returns less than the requested- len.-- gzread returns the number of uncompressed bytes actually read, less than- len for end of file, or -1 for error.-*/--ZEXTERN int ZEXPORT gzwrite OF((gzFile file,- voidpc buf, unsigned len));-/*- Writes the given number of uncompressed bytes into the compressed file.- gzwrite returns the number of uncompressed bytes written or 0 in case of- error.-*/--ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));-/*- Converts, formats, and writes the arguments to the compressed file under- control of the format string, as in fprintf. gzprintf returns the number of- uncompressed bytes actually written, or 0 in case of error. The number of- uncompressed bytes written is limited to 8191, or one less than the buffer- size given to gzbuffer(). The caller should assure that this limit is not- exceeded. If it is exceeded, then gzprintf() will return an error (0) with- nothing written. In this case, there may also be a buffer overflow with- unpredictable consequences, which is possible only if zlib was compiled with- the insecure functions sprintf() or vsprintf() because the secure snprintf()- or vsnprintf() functions were not available. This can be determined using- zlibCompileFlags().-*/--ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));-/*- Writes the given null-terminated string to the compressed file, excluding- the terminating null character.-- gzputs returns the number of characters written, or -1 in case of error.-*/--ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));-/*- Reads bytes from the compressed file until len-1 characters are read, or a- newline character is read and transferred to buf, or an end-of-file- condition is encountered. If any characters are read or if len == 1, the- string is terminated with a null character. If no characters are read due- to an end-of-file or len < 1, then the buffer is left untouched.-- gzgets returns buf which is a null-terminated string, or it returns NULL- for end-of-file or in case of error. If there was an error, the contents at- buf are indeterminate.-*/--ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));-/*- Writes c, converted to an unsigned char, into the compressed file. gzputc- returns the value that was written, or -1 in case of error.-*/--ZEXTERN int ZEXPORT gzgetc OF((gzFile file));-/*- Reads one byte from the compressed file. gzgetc returns this byte or -1- in case of end of file or error.-*/--ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));-/*- Push one character back onto the stream to be read as the first character- on the next read. At least one character of push-back is allowed.- gzungetc() returns the character pushed, or -1 on failure. gzungetc() will- fail if c is -1, and may fail if a character has been pushed but not read- yet. If gzungetc is used immediately after gzopen or gzdopen, at least the- output buffer size of pushed characters is allowed. (See gzbuffer above.)- The pushed character will be discarded if the stream is repositioned with- gzseek() or gzrewind().-*/--ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));-/*- Flushes all pending output into the compressed file. The parameter flush- is as in the deflate() function. The return value is the zlib error number- (see function gzerror below). gzflush is only permitted when writing.-- If the flush parameter is Z_FINISH, the remaining data is written and the- gzip stream is completed in the output. If gzwrite() is called again, a new- gzip stream will be started in the output. gzread() is able to read such- concatented gzip streams.-- gzflush should be called only when strictly necessary because it will- degrade compression if called too often.-*/--/*-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,- z_off_t offset, int whence));-- Sets the starting position for the next gzread or gzwrite on the given- compressed file. The offset represents a number of bytes in the- uncompressed data stream. The whence parameter is defined as in lseek(2);- the value SEEK_END is not supported.-- If the file is opened for reading, this function is emulated but can be- extremely slow. If the file is opened for writing, only forward seeks are- supported; gzseek then compresses a sequence of zeroes up to the new- starting position.-- gzseek returns the resulting offset location as measured in bytes from- the beginning of the uncompressed stream, or -1 in case of error, in- particular if the file is opened for writing and the new starting position- would be before the current position.-*/--ZEXTERN int ZEXPORT gzrewind OF((gzFile file));-/*- Rewinds the given file. This function is supported only for reading.-- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)-*/--/*-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));-- Returns the starting position for the next gzread or gzwrite on the given- compressed file. This position represents a number of bytes in the- uncompressed data stream, and is zero when starting, even if appending or- reading a gzip stream from the middle of a file using gzdopen().-- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)-*/--/*-ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));-- Returns the current offset in the file being read or written. This offset- includes the count of bytes that precede the gzip stream, for example when- appending or when using gzdopen() for reading. When reading, the offset- does not include as yet unused buffered input. This information can be used- for a progress indicator. On error, gzoffset() returns -1.-*/--ZEXTERN int ZEXPORT gzeof OF((gzFile file));-/*- Returns true (1) if the end-of-file indicator has been set while reading,- false (0) otherwise. Note that the end-of-file indicator is set only if the- read tried to go past the end of the input, but came up short. Therefore,- just like feof(), gzeof() may return false even if there is no more data to- read, in the event that the last read request was for the exact number of- bytes remaining in the input file. This will happen if the input file size- is an exact multiple of the buffer size.-- If gzeof() returns true, then the read functions will return no more data,- unless the end-of-file indicator is reset by gzclearerr() and the input file- has grown since the previous end of file was detected.-*/--ZEXTERN int ZEXPORT gzdirect OF((gzFile file));-/*- Returns true (1) if file is being copied directly while reading, or false- (0) if file is a gzip stream being decompressed. This state can change from- false to true while reading the input file if the end of a gzip stream is- reached, but is followed by data that is not another gzip stream.-- If the input file is empty, gzdirect() will return true, since the input- does not contain a gzip stream.-- If gzdirect() is used immediately after gzopen() or gzdopen() it will- cause buffers to be allocated to allow reading the file to determine if it- is a gzip file. Therefore if gzbuffer() is used, it should be called before- gzdirect().-*/--ZEXTERN int ZEXPORT gzclose OF((gzFile file));-/*- Flushes all pending output if necessary, closes the compressed file and- deallocates the (de)compression state. Note that once file is closed, you- cannot call gzerror with file, since its structures have been deallocated.- gzclose must not be called more than once on the same file, just as free- must not be called more than once on the same allocation.-- gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a- file operation error, or Z_OK on success.-*/--ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));-ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));-/*- 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- using these instead of gzclose() is that they avoid linking in zlib- compression or decompression code that is not used when only reading or only- writing respectively. If gzclose() is used, then both compression and- decompression code will be included the application when linking to a static- zlib library.-*/--ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));-/*- Returns the error message for the last error which occurred on the given- compressed file. errnum is set to zlib error number. If an error occurred- in the file system and not in the compression library, errnum is set to- Z_ERRNO and the application may consult errno to get the exact error code.-- The application must not modify the returned string. Future calls to- this function may invalidate the previously returned string. If file is- closed, then the string previously returned by gzerror will no longer be- available.-- gzerror() should be used to distinguish errors from end-of-file for those- functions above that do not distinguish those cases in their return values.-*/--ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));-/*- Clears 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- file that is being written concurrently.-*/--- /* checksum functions */--/*- These functions are not related to compression but are exported- anyway because they might be useful in applications using the compression- library.-*/--ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));-/*- Update a running Adler-32 checksum with the bytes buf[0..len-1] and- return the updated checksum. If buf is Z_NULL, this function returns the- required initial value for the checksum.-- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed- much faster.-- Usage example:-- uLong adler = adler32(0L, Z_NULL, 0);-- while (read_buffer(buffer, length) != EOF) {- adler = adler32(adler, buffer, length);- }- if (adler != original_adler) error();-*/--/*-ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,- z_off_t len2));-- 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- each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of- seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.-*/--ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));-/*- Update a running CRC-32 with the bytes buf[0..len-1] and return the- updated CRC-32. If buf is Z_NULL, this function returns the required- initial value for the for the crc. Pre- and post-conditioning (one's- complement) is performed within this function so it shouldn't be done by the- application.-- Usage example:-- uLong crc = crc32(0L, Z_NULL, 0);-- while (read_buffer(buffer, length) != EOF) {- crc = crc32(crc, buffer, length);- }- if (crc != original_crc) error();-*/--/*-ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));-- 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- calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32- check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and- len2.-*/--- /* various hacks, don't look :) */--/* deflateInit and inflateInit are macros to allow checking the zlib version- * and the compiler's view of z_stream:- */-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,- const char *version, int stream_size));-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,- const char *version, int stream_size));-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,- int windowBits, int memLevel,- int strategy, const char *version,- int stream_size));-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,- const char *version, int stream_size));-ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,- unsigned char FAR *window,- const char *version,- int stream_size));-#define deflateInit(strm, level) \- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))-#define inflateInit(strm) \- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \- deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\- (strategy), ZLIB_VERSION, sizeof(z_stream))-#define inflateInit2(strm, windowBits) \- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))-#define inflateBackInit(strm, windowBits, window) \- inflateBackInit_((strm), (windowBits), (window), \- ZLIB_VERSION, sizeof(z_stream))--/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or- * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if- * both are true, the application gets the *64 functions, and the regular- * functions are changed to 64 bits) -- in case these are set on systems- * without large file support, _LFS64_LARGEFILE must also be true- */-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));- ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));- ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));- ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));-#endif--#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0-# define gzopen gzopen64-# define gzseek gzseek64-# define gztell gztell64-# define gzoffset gzoffset64-# define adler32_combine adler32_combine64-# define crc32_combine crc32_combine64-# ifdef _LARGEFILE64_SOURCE- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));- ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));- ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));- ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));-# endif-#else- ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));- ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));- ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));- ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));- ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));- ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));-#endif--/* hack for buggy compilers */-#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)- struct internal_state {int dummy;};-#endif--/* undocumented functions */-ZEXTERN const char * ZEXPORT zError OF((int));-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));-ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));--#ifdef __cplusplus-}-#endif--#endif /* ZLIB_H */
− libgit2/deps/zlib/zutil.c
@@ -1,318 +0,0 @@-/* zutil.c -- target dependent utility functions for the compression library- * Copyright (C) 1995-2005, 2010 Jean-loup Gailly.- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* @(#) $Id$ */--#include "zutil.h"--#ifndef NO_DUMMY_DECL-struct internal_state {int dummy;}; /* for buggy compilers */-#endif--const char * const z_errmsg[10] = {-"need dictionary", /* Z_NEED_DICT 2 */-"stream end", /* Z_STREAM_END 1 */-"", /* Z_OK 0 */-"file error", /* Z_ERRNO (-1) */-"stream error", /* Z_STREAM_ERROR (-2) */-"data error", /* Z_DATA_ERROR (-3) */-"insufficient memory", /* Z_MEM_ERROR (-4) */-"buffer error", /* Z_BUF_ERROR (-5) */-"incompatible version",/* Z_VERSION_ERROR (-6) */-""};---const char * ZEXPORT zlibVersion()-{- return ZLIB_VERSION;-}--uLong ZEXPORT zlibCompileFlags()-{- uLong flags;-- flags = 0;- switch ((int)(sizeof(uInt))) {- case 2: break;- case 4: flags += 1; break;- case 8: flags += 2; break;- default: flags += 3;- }- switch ((int)(sizeof(uLong))) {- case 2: break;- case 4: flags += 1 << 2; break;- case 8: flags += 2 << 2; break;- default: flags += 3 << 2;- }- switch ((int)(sizeof(voidpf))) {- case 2: break;- case 4: flags += 1 << 4; break;- case 8: flags += 2 << 4; break;- default: flags += 3 << 4;- }- switch ((int)(sizeof(z_off_t))) {- case 2: break;- case 4: flags += 1 << 6; break;- case 8: flags += 2 << 6; break;- default: flags += 3 << 6;- }-#ifdef DEBUG- flags += 1 << 8;-#endif-#if defined(ASMV) || defined(ASMINF)- flags += 1 << 9;-#endif-#ifdef ZLIB_WINAPI- flags += 1 << 10;-#endif-#ifdef BUILDFIXED- flags += 1 << 12;-#endif-#ifdef DYNAMIC_CRC_TABLE- flags += 1 << 13;-#endif-#ifdef NO_GZCOMPRESS- flags += 1L << 16;-#endif-#ifdef NO_GZIP- flags += 1L << 17;-#endif-#ifdef PKZIP_BUG_WORKAROUND- flags += 1L << 20;-#endif-#ifdef FASTEST- flags += 1L << 21;-#endif-#ifdef STDC-# ifdef NO_vsnprintf- flags += 1L << 25;-# ifdef HAS_vsprintf_void- flags += 1L << 26;-# endif-# else-# ifdef HAS_vsnprintf_void- flags += 1L << 26;-# endif-# endif-#else- flags += 1L << 24;-# ifdef NO_snprintf- flags += 1L << 25;-# ifdef HAS_sprintf_void- flags += 1L << 26;-# endif-# else-# ifdef HAS_snprintf_void- flags += 1L << 26;-# endif-# endif-#endif- return flags;-}--#ifdef DEBUG--# ifndef verbose-# define verbose 0-# endif-int ZLIB_INTERNAL z_verbose = verbose;--void ZLIB_INTERNAL z_error (m)- char *m;-{- fprintf(stderr, "%s\n", m);- exit(1);-}-#endif--/* exported to allow conversion of error code to string for compress() and- * uncompress()- */-const char * ZEXPORT zError(err)- int err;-{- return ERR_MSG(err);-}--#if defined(_WIN32_WCE)- /* The Microsoft C Run-Time Library for Windows CE doesn't have- * errno. We define it as a global variable to simplify porting.- * Its value is always 0 and should not be used.- */- int errno = 0;-#endif--#ifndef HAVE_MEMCPY--void ZLIB_INTERNAL zmemcpy(dest, source, len)- Bytef* dest;- const Bytef* source;- uInt len;-{- if (len == 0) return;- do {- *dest++ = *source++; /* ??? to be unrolled */- } while (--len != 0);-}--int ZLIB_INTERNAL zmemcmp(s1, s2, len)- const Bytef* s1;- const Bytef* s2;- uInt len;-{- uInt j;-- for (j = 0; j < len; j++) {- if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;- }- return 0;-}--void ZLIB_INTERNAL zmemzero(dest, len)- Bytef* dest;- uInt len;-{- if (len == 0) return;- do {- *dest++ = 0; /* ??? to be unrolled */- } while (--len != 0);-}-#endif---#ifdef SYS16BIT--#ifdef __TURBOC__-/* Turbo C in 16-bit mode */--# define MY_ZCALLOC--/* Turbo C malloc() does not allow dynamic allocation of 64K bytes- * and farmalloc(64K) returns a pointer with an offset of 8, so we- * must fix the pointer. Warning: the pointer must be put back to its- * original form in order to free it, use zcfree().- */--#define MAX_PTR 10-/* 10*64K = 640K */--local int next_ptr = 0;--typedef struct ptr_table_s {- voidpf org_ptr;- voidpf new_ptr;-} ptr_table;--local ptr_table table[MAX_PTR];-/* This table is used to remember the original form of pointers- * to large buffers (64K). Such pointers are normalized with a zero offset.- * Since MSDOS is not a preemptive multitasking OS, this table is not- * protected from concurrent access. This hack doesn't work anyway on- * a protected system like OS/2. Use Microsoft C instead.- */--voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)-{- voidpf buf = opaque; /* just to make some compilers happy */- ulg bsize = (ulg)items*size;-- /* If we allocate less than 65520 bytes, we assume that farmalloc- * will return a usable pointer which doesn't have to be normalized.- */- if (bsize < 65520L) {- buf = farmalloc(bsize);- if (*(ush*)&buf != 0) return buf;- } else {- buf = farmalloc(bsize + 16L);- }- if (buf == NULL || next_ptr >= MAX_PTR) return NULL;- table[next_ptr].org_ptr = buf;-- /* Normalize the pointer to seg:0 */- *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;- *(ush*)&buf = 0;- table[next_ptr++].new_ptr = buf;- return buf;-}--void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)-{- int n;- if (*(ush*)&ptr != 0) { /* object < 64K */- farfree(ptr);- return;- }- /* Find the original pointer */- for (n = 0; n < next_ptr; n++) {- if (ptr != table[n].new_ptr) continue;-- farfree(table[n].org_ptr);- while (++n < next_ptr) {- table[n-1] = table[n];- }- next_ptr--;- return;- }- ptr = opaque; /* just to make some compilers happy */- Assert(0, "zcfree: ptr not found");-}--#endif /* __TURBOC__ */---#ifdef M_I86-/* Microsoft C in 16-bit mode */--# define MY_ZCALLOC--#if (!defined(_MSC_VER) || (_MSC_VER <= 600))-# define _halloc halloc-# define _hfree hfree-#endif--voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)-{- if (opaque) opaque = 0; /* to make compiler happy */- return _halloc((long)items, size);-}--void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)-{- if (opaque) opaque = 0; /* to make compiler happy */- _hfree(ptr);-}--#endif /* M_I86 */--#endif /* SYS16BIT */---#ifndef MY_ZCALLOC /* Any system without a special alloc function */--#ifndef STDC-extern voidp malloc OF((uInt size));-extern voidp calloc OF((uInt items, uInt size));-extern void free OF((voidpf ptr));-#endif--voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)- voidpf opaque;- unsigned items;- unsigned size;-{- if (opaque) items += size - size; /* make compiler happy */- return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :- (voidpf)calloc(items, size);-}--void ZLIB_INTERNAL zcfree (opaque, ptr)- voidpf opaque;- voidpf ptr;-{- free(ptr);- if (opaque) return; /* make compiler happy */-}--#endif /* MY_ZCALLOC */
− libgit2/deps/zlib/zutil.h
@@ -1,274 +0,0 @@-/* zutil.h -- internal interface and configuration of the compression library- * Copyright (C) 1995-2010 Jean-loup Gailly.- * For conditions of distribution and use, see copyright notice in zlib.h- */--/* WARNING: this file should *not* be used by applications. It is- part of the implementation of the compression library and is- subject to change. Applications should only use zlib.h.- */--/* @(#) $Id$ */--#ifndef ZUTIL_H-#define ZUTIL_H--#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ)-# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))-#else-# define ZLIB_INTERNAL-#endif--#include "zlib.h"--#ifdef STDC-# if !(defined(_WIN32_WCE) && defined(_MSC_VER))-# include <stddef.h>-# endif-# include <string.h>-# include <stdlib.h>-#endif--#ifndef local-# define local static-#endif-/* compile with -Dlocal if your debugger can't find static symbols */--typedef unsigned char uch;-typedef uch FAR uchf;-typedef unsigned short ush;-typedef ush FAR ushf;-typedef unsigned long ulg;--extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */-/* (size given to avoid silly warnings with Visual C++) */--#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]--#define ERR_RETURN(strm,err) \- return (strm->msg = (char*)ERR_MSG(err), (err))-/* To be used only when the state is known to be valid */-- /* common constants */--#ifndef DEF_WBITS-# define DEF_WBITS MAX_WBITS-#endif-/* default windowBits for decompression. MAX_WBITS is for compression only */--#if MAX_MEM_LEVEL >= 8-# define DEF_MEM_LEVEL 8-#else-# define DEF_MEM_LEVEL MAX_MEM_LEVEL-#endif-/* default memLevel */--#define STORED_BLOCK 0-#define STATIC_TREES 1-#define DYN_TREES 2-/* The three kinds of block type */--#define MIN_MATCH 3-#define MAX_MATCH 258-/* The minimum and maximum match lengths */--#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */-- /* target dependencies */--#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))-# define OS_CODE 0x00-# if defined(__TURBOC__) || defined(__BORLANDC__)-# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))- /* Allow compilation with ANSI keywords only enabled */- void _Cdecl farfree( void *block );- void *_Cdecl farmalloc( unsigned long nbytes );-# else-# include <alloc.h>-# endif-# else /* MSC or DJGPP */-# include <malloc.h>-# endif-#endif--#ifdef AMIGA-# define OS_CODE 0x01-#endif--#if defined(VAXC) || defined(VMS)-# define OS_CODE 0x02-# define F_OPEN(name, mode) \- fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")-#endif--#if defined(ATARI) || defined(atarist)-# define OS_CODE 0x05-#endif--#ifdef OS2-# define OS_CODE 0x06-# ifdef M_I86-# include <malloc.h>-# endif-#endif--#if defined(MACOS) || defined(TARGET_OS_MAC)-# define OS_CODE 0x07-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os-# include <unix.h> /* for fdopen */-# else-# ifndef fdopen-# define fdopen(fd,mode) NULL /* No fdopen() */-# endif-# endif-#endif--#ifdef TOPS20-# define OS_CODE 0x0a-#endif--#ifdef WIN32-# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */-# define OS_CODE 0x0b-# endif-#endif--#ifdef __50SERIES /* Prime/PRIMOS */-# define OS_CODE 0x0f-#endif--#if defined(_BEOS_) || defined(RISCOS)-# define fdopen(fd,mode) NULL /* No fdopen() */-#endif--#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX-# if defined(_WIN32_WCE)-# define fdopen(fd,mode) NULL /* No fdopen() */-# ifndef _PTRDIFF_T_DEFINED- typedef int ptrdiff_t;-# define _PTRDIFF_T_DEFINED-# endif-# else-# define fdopen(fd,type) _fdopen(fd,type)-# endif-#endif--#if defined(__BORLANDC__)- #pragma warn -8004- #pragma warn -8008- #pragma warn -8066-#endif--/* provide prototypes for these when building zlib without LFS */-#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));-#endif-- /* common defaults */--#ifndef OS_CODE-# define OS_CODE 0x03 /* assume Unix */-#endif--#ifndef F_OPEN-# define F_OPEN(name, mode) fopen((name), (mode))-#endif-- /* functions */--#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)-# ifndef HAVE_VSNPRINTF-# define HAVE_VSNPRINTF-# endif-#endif-#if defined(__CYGWIN__)-# ifndef HAVE_VSNPRINTF-# define HAVE_VSNPRINTF-# endif-#endif-#ifndef HAVE_VSNPRINTF-# ifdef MSDOS- /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),- but for now we just assume it doesn't. */-# define NO_vsnprintf-# endif-# ifdef __TURBOC__-# define NO_vsnprintf-# endif-# ifdef WIN32- /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */-# if !defined(vsnprintf) && !defined(NO_vsnprintf)-# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )-# define vsnprintf _vsnprintf-# endif-# endif-# endif-# ifdef __SASC-# define NO_vsnprintf-# endif-#endif-#ifdef VMS-# define NO_vsnprintf-#endif--#if defined(pyr)-# define NO_MEMCPY-#endif-#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)- /* Use our own functions for small and medium model with MSC <= 5.0.- * You may have to use the same strategy for Borland C (untested).- * The __SC__ check is for Symantec.- */-# define NO_MEMCPY-#endif-#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)-# define HAVE_MEMCPY-#endif-#ifdef HAVE_MEMCPY-# ifdef SMALL_MEDIUM /* MSDOS small or medium model */-# define zmemcpy _fmemcpy-# define zmemcmp _fmemcmp-# define zmemzero(dest, len) _fmemset(dest, 0, len)-# else-# define zmemcpy memcpy-# define zmemcmp memcmp-# define zmemzero(dest, len) memset(dest, 0, len)-# endif-#else- void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));- int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));- void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));-#endif--/* Diagnostic functions */-#ifdef DEBUG-# include <stdio.h>- extern int ZLIB_INTERNAL z_verbose;- extern void ZLIB_INTERNAL z_error OF((char *m));-# define Assert(cond,msg) {if(!(cond)) z_error(msg);}-# define Trace(x) {if (z_verbose>=0) fprintf x ;}-# define Tracev(x) {if (z_verbose>0) fprintf x ;}-# define Tracevv(x) {if (z_verbose>1) fprintf x ;}-# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}-# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}-#else-# define Assert(cond,msg)-# define Trace(x)-# define Tracev(x)-# define Tracevv(x)-# define Tracec(c,x)-# define Tracecv(c,x)-#endif---voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,- unsigned size));-void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));--#define ZALLOC(strm, items, size) \- (*((strm)->zalloc))((strm)->opaque, (items), (size))-#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))-#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}--#endif /* ZUTIL_H */
libgit2/include/git2.h view
@@ -1,39 +1,18 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_git_h__ #define INCLUDE_git_git_h__ -#define LIBGIT2_VERSION "0.10.0"-#define LIBGIT2_VER_MAJOR 0-#define LIBGIT2_VER_MINOR 10-#define LIBGIT2_VER_REVISION 0+#include "git2/version.h" #include "git2/common.h"+#include "git2/threads.h" #include "git2/errors.h"-#include "git2/zlib.h" #include "git2/types.h" @@ -43,14 +22,26 @@ #include "git2/repository.h" #include "git2/revwalk.h"+#include "git2/merge.h" #include "git2/refs.h"+#include "git2/reflog.h" #include "git2/object.h" #include "git2/blob.h" #include "git2/commit.h" #include "git2/tag.h" #include "git2/tree.h"+#include "git2/diff.h" #include "git2/index.h"+#include "git2/config.h"+#include "git2/remote.h"++#include "git2/refspec.h"+#include "git2/net.h"+#include "git2/status.h"+#include "git2/indexer.h"+#include "git2/submodule.h"+#include "git2/notes.h" #endif
+ libgit2/include/git2/attr.h view
@@ -0,0 +1,224 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_attr_h__+#define INCLUDE_git_attr_h__++#include "common.h"+#include "types.h"++/**+ * @file git2/attr.h+ * @brief Git attribute management routines+ * @defgroup git_attr Git attribute management routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * GIT_ATTR_TRUE checks if an attribute is set on. In core git+ * parlance, this the value for "Set" attributes.+ *+ * For example, if the attribute file contains:+ *+ * *.c foo+ *+ * Then for file `xyz.c` looking up attribute "foo" gives a value for+ * which `GIT_ATTR_TRUE(value)` is true.+ */+#define GIT_ATTR_TRUE(attr) ((attr) == git_attr__true)++/**+ * GIT_ATTR_FALSE checks if an attribute is set off. In core git+ * parlance, this is the value for attributes that are "Unset" (not to+ * be confused with values that a "Unspecified").+ *+ * For example, if the attribute file contains:+ *+ * *.h -foo+ *+ * Then for file `zyx.h` looking up attribute "foo" gives a value for+ * which `GIT_ATTR_FALSE(value)` is true.+ */+#define GIT_ATTR_FALSE(attr) ((attr) == git_attr__false)++/**+ * GIT_ATTR_UNSPECIFIED checks if an attribute is unspecified. This+ * may be due to the attribute not being mentioned at all or because+ * the attribute was explicitly set unspecified via the `!` operator.+ *+ * For example, if the attribute file contains:+ *+ * *.c foo+ * *.h -foo+ * onefile.c !foo+ *+ * Then for `onefile.c` looking up attribute "foo" yields a value with+ * `GIT_ATTR_UNSPECIFIED(value)` of true. Also, looking up "foo" on+ * file `onefile.rb` or looking up "bar" on any file will all give+ * `GIT_ATTR_UNSPECIFIED(value)` of true.+ */+#define GIT_ATTR_UNSPECIFIED(attr) (!(attr) || (attr) == git_attr__unset)++/**+ * GIT_ATTR_HAS_VALUE checks if an attribute is set to a value (as+ * opposied to TRUE, FALSE or UNSPECIFIED). This would be the case if+ * for a file with something like:+ *+ * *.txt eol=lf+ *+ * Given this, looking up "eol" for `onefile.txt` will give back the+ * string "lf" and `GIT_ATTR_SET_TO_VALUE(attr)` will return true.+ */+#define GIT_ATTR_HAS_VALUE(attr) \+ ((attr) && (attr) != git_attr__unset && \+ (attr) != git_attr__true && (attr) != git_attr__false)++GIT_EXTERN(const char *) git_attr__true;+GIT_EXTERN(const char *) git_attr__false;+GIT_EXTERN(const char *) git_attr__unset;++/**+ * Check attribute flags: Reading values from index and working directory.+ *+ * When checking attributes, it is possible to check attribute files+ * in both the working directory (if there is one) and the index (if+ * there is one). You can explicitly choose where to check and in+ * which order using the following flags.+ *+ * Core git usually checks the working directory then the index,+ * except during a checkout when it checks the index first. It will+ * use index only for creating archives or for a bare repo (if an+ * index has been specified for the bare repo).+ */+#define GIT_ATTR_CHECK_FILE_THEN_INDEX 0+#define GIT_ATTR_CHECK_INDEX_THEN_FILE 1+#define GIT_ATTR_CHECK_INDEX_ONLY 2++/**+ * Check attribute flags: Using the system attributes file.+ *+ * Normally, attribute checks include looking in the /etc (or system+ * equivalent) directory for a `gitattributes` file. Passing this+ * flag will cause attribute checks to ignore that file.+ */+#define GIT_ATTR_CHECK_NO_SYSTEM (1 << 2)++/**+ * Look up the value of one git attribute for path.+ *+ * @param value_out Output of the value of the attribute. Use the GIT_ATTR_...+ * macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just+ * use the string value for attributes set to a value. You+ * should NOT modify or free this value.+ * @param repo The repository containing the path.+ * @param flags A combination of GIT_ATTR_CHECK... flags.+ * @param path The path to check for attributes. Relative paths are+ * interpreted relative to the repo root. The file does+ * not have to exist, but if it does not, then it will be+ * treated as a plain file (not a directory).+ * @param name The name of the attribute to look up.+ */+GIT_EXTERN(int) git_attr_get(+ const char **value_out,+ git_repository *repo,+ uint32_t flags,+ const char *path,+ const char *name);++/**+ * Look up a list of git attributes for path.+ *+ * Use this if you have a known list of attributes that you want to+ * look up in a single call. This is somewhat more efficient than+ * calling `git_attr_get()` multiple times.+ *+ * For example, you might write:+ *+ * const char *attrs[] = { "crlf", "diff", "foo" };+ * const char **values[3];+ * git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);+ *+ * Then you could loop through the 3 values to get the settings for+ * the three attributes you asked about.+ *+ * @param values An array of num_attr entries that will have string+ * pointers written into it for the values of the attributes.+ * You should not modify or free the values that are written+ * into this array (although of course, you should free the+ * array itself if you allocated it).+ * @param repo The repository containing the path.+ * @param flags A combination of GIT_ATTR_CHECK... flags.+ * @param path The path inside the repo to check attributes. This+ * does not have to exist, but if it does not, then+ * it will be treated as a plain file (i.e. not a directory).+ * @param num_attr The number of attributes being looked up+ * @param names An array of num_attr strings containing attribute names.+ */+GIT_EXTERN(int) git_attr_get_many(+ const char **values_out,+ git_repository *repo,+ uint32_t flags,+ const char *path,+ size_t num_attr,+ const char **names);++/**+ * Loop over all the git attributes for a path.+ *+ * @param repo The repository containing the path.+ * @param flags A combination of GIT_ATTR_CHECK... flags.+ * @param path The path inside the repo to check attributes. This+ * does not have to exist, but if it does not, then+ * it will be treated as a plain file (i.e. not a directory).+ * @param callback The function that will be invoked on each attribute+ * and attribute value. The name parameter will be the name+ * of the attribute and the value will be the value it is+ * set to, including possibly NULL if the attribute is+ * explicitly set to UNSPECIFIED using the ! sign. This+ * will be invoked only once per attribute name, even if+ * there are multiple rules for a given file. The highest+ * priority rule will be used.+ * @param payload Passed on as extra parameter to callback function.+ */+GIT_EXTERN(int) git_attr_foreach(+ git_repository *repo,+ uint32_t flags,+ const char *path,+ int (*callback)(const char *name, const char *value, void *payload),+ void *payload);++/**+ * Flush the gitattributes cache.+ *+ * Call this if you have reason to believe that the attributes files on+ * disk no longer match the cached contents of memory. This will cause+ * the attributes files to be reloaded the next time that an attribute+ * access function is called.+ */+GIT_EXTERN(void) git_attr_cache_flush(+ git_repository *repo);++/**+ * Add a macro definition.+ *+ * Macros will automatically be loaded from the top level `.gitattributes`+ * file of the repository (plus the build-in "binary" macro). This+ * function allows you to add others. For example, to add the default+ * macro, you would call:+ *+ * git_attr_add_macro(repo, "binary", "-diff -crlf");+ */+GIT_EXTERN(int) git_attr_add_macro(+ git_repository *repo,+ const char *name,+ const char *values);++/** @} */+GIT_END_DECL+#endif+
libgit2/include/git2/blob.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_blob_h__ #define INCLUDE_git_blob_h__@@ -41,13 +23,11 @@ /** * Lookup a blob object from a repository.- * The generated blob object is owned by the revision- * repo and shall not be freed by the user. * * @param blob pointer to the looked up blob * @param repo the repo to use when locating the blob. * @param id identity of the blob to locate.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_INLINE(int) git_blob_lookup(git_blob **blob, git_repository *repo, const git_oid *id) {@@ -55,49 +35,47 @@ } /**- * Create a new in-memory git_blob.+ * Lookup a blob object from a repository,+ * given a prefix of its identifier (short id). *- * The blob object must be manually filled using- * the 'set_rawcontent' methods before it can- * be written back to disk.+ * @see git_object_lookup_prefix *- * @param blob pointer to the new blob- * @param repo The repository where the object will reside- * @return 0 on success; error code otherwise+ * @param blob pointer to the looked up blob+ * @param repo the repo to use when locating the blob.+ * @param id identity of the blob to locate.+ * @param len the length of the short identifier+ * @return 0 or an error code */-GIT_INLINE(int) git_blob_new(git_blob **blob, git_repository *repo)+GIT_INLINE(int) git_blob_lookup_prefix(git_blob **blob, git_repository *repo, const git_oid *id, unsigned int len) {- return git_object_new((git_object **)blob, repo, GIT_OBJ_BLOB);+ return git_object_lookup_prefix((git_object **)blob, repo, id, len, GIT_OBJ_BLOB); } /**- * Fill a blob with the contents inside- * the pointed file.+ * Close an open blob *- * @param blob pointer to the new blob- * @param filename name of the file to read- * @return 0 on success; error code otherwise- */-GIT_EXTERN(int) git_blob_set_rawcontent_fromfile(git_blob *blob, const char *filename);--/**- * Fill a blob with the contents inside- * the pointed buffer+ * This is a wrapper around git_object_free() *- * @param blob pointer to the blob- * @param buffer buffer with the contents for the blob- * @param len size of the buffer- * @return 0 on success; error code otherwise+ * IMPORTANT:+ * It *is* necessary to call this method when you stop+ * using a blob. Failure to do so will cause a memory leak.+ *+ * @param blob the blob to close */-GIT_EXTERN(int) git_blob_set_rawcontent(git_blob *blob, const void *buffer, size_t len); +GIT_INLINE(void) git_blob_free(git_blob *blob)+{+ git_object_free((git_object *) blob);+}++ /** * Get a read-only buffer with the raw content of a blob. * * A pointer to the raw content of a blob is returned; * this pointer is owned internally by the object and shall * not be free'd. The pointer may be invalidated at a later- * time (e.g. when changing the contents of the blob).+ * time. * * @param blob pointer to the blob * @return the pointer; NULL if the blob has no contents@@ -110,18 +88,44 @@ * @param blob pointer to the blob * @return size on bytes */-GIT_EXTERN(int) git_blob_rawsize(git_blob *blob);+GIT_EXTERN(size_t) git_blob_rawsize(git_blob *blob); /** * Read a file from the working folder of a repository- * and write it to the Object Database as a loose blob,- * if such doesn't exist yet.+ * and write it to the Object Database as a loose blob *- * @param written_id return the id of the written blob- * @param repo repository where the blob will be written+ * @param oid return the id of the written blob+ * @param repo repository where the blob will be written.+ * this repository cannot be bare+ * @param path file from which the blob will be created,+ * relative to the repository's working dir+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_blob_create_fromfile(git_oid *oid, git_repository *repo, const char *path);++/**+ * Read a file from the filesystem and write its content+ * to the Object Database as a loose blob+ *+ * @param oid return the id of the written blob+ * @param repo repository where the blob will be written.+ * this repository can be bare or not * @param path file from which the blob will be created+ * @return 0 or an error code */-GIT_EXTERN(int) git_blob_writefile(git_oid *written_id, git_repository *repo, const char *path);+GIT_EXTERN(int) git_blob_create_fromdisk(git_oid *oid, git_repository *repo, const char *path);+++/**+ * Write an in-memory buffer to the ODB as a blob+ *+ * @param oid return the oid of the written blob+ * @param repo repository where to blob will be written+ * @param buffer data to be written into the blob+ * @param len length of the data+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_blob_create_frombuffer(git_oid *oid, git_repository *repo, const void *buffer, size_t len); /** @} */ GIT_END_DECL
+ libgit2/include/git2/branch.h view
@@ -0,0 +1,122 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_branch_h__+#define INCLUDE_git_branch_h__++#include "common.h"+#include "types.h"++/**+ * @file git2/branch.h+ * @brief Git branch parsing routines+ * @defgroup git_branch Git branch management+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Create a new branch pointing at a target commit+ *+ * A new direct reference will be created pointing to+ * this target commit. If `force` is true and a reference+ * already exists with the given name, it'll be replaced.+ *+ * @param oid_out Pointer where to store the OID of the target commit.+ *+ * @param repo Repository where to store the branch.+ *+ * @param branch_name Name for the branch; this name is+ * validated for consistency. It should also not conflict with+ * an already existing branch name.+ *+ * @param target Object to which this branch should point. This object+ * must belong to the given `repo` and can either be a git_commit or a+ * git_tag. When a git_tag is being passed, it should be dereferencable+ * to a git_commit which oid will be used as the target of the branch.+ *+ * @param force Overwrite existing branch.+ *+ * @return 0 or an error code.+ * A proper reference is written in the refs/heads namespace+ * pointing to the provided target commit.+ */+GIT_EXTERN(int) git_branch_create(+ git_oid *oid_out,+ git_repository *repo,+ const char *branch_name,+ const git_object *target,+ int force);++/**+ * Delete an existing branch reference.+ *+ * @param repo Repository where lives the branch.+ *+ * @param branch_name Name of the branch to be deleted;+ * this name is validated for consistency.+ *+ * @param branch_type Type of the considered branch. This should+ * be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE.+ *+ * @return 0 on success, GIT_ENOTFOUND if the branch+ * doesn't exist or an error code.+ */+GIT_EXTERN(int) git_branch_delete(+ git_repository *repo,+ const char *branch_name,+ git_branch_t branch_type);++/**+ * Fill a list with all the branches in the Repository+ *+ * The string array will be filled with the names of the+ * matching branches; these values are owned by the user and+ * should be free'd manually when no longer needed, using+ * `git_strarray_free`.+ *+ * @param branch_names Pointer to a git_strarray structure+ * where the branch names will be stored.+ *+ * @param repo Repository where to find the branches.+ *+ * @param list_flags Filtering flags for the branch+ * listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE+ * or a combination of the two.+ *+ * @return 0 or an error code.+ */+GIT_EXTERN(int) git_branch_list(+ git_strarray *branch_names,+ git_repository *repo,+ unsigned int list_flags);++/**+ * Move/rename an existing branch reference.+ *+ * @param repo Repository where lives the branch.+ *+ * @param old_branch_name Current name of the branch to be moved;+ * this name is validated for consistency.+ *+ * @param new_branch_name Target name of the branch once the move+ * is performed; this name is validated for consistency.+ *+ * @param force Overwrite existing branch.+ *+ * @return 0 on success, GIT_ENOTFOUND if the branch+ * doesn't exist or an error code.+ */+GIT_EXTERN(int) git_branch_move(+ git_repository *repo,+ const char *old_branch_name,+ const char *new_branch_name,+ int force);++/** @} */+GIT_END_DECL+#endif
libgit2/include/git2/commit.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_commit_h__ #define INCLUDE_git_commit_h__@@ -41,14 +23,12 @@ /** * Lookup a commit object from a repository.- * The generated commit object is owned by the revision- * repo and shall not be freed by the user. * * @param commit pointer to the looked up commit * @param repo the repo to use when locating the commit.- * @param id identity of the commit to locate. If the object is- * an annotated tag it will be peeled back to the commit.- * @return 0 on success; error code otherwise+ * @param id identity of the commit to locate. If the object is+ * an annotated tag it will be peeled back to the commit.+ * @return 0 or an error code */ GIT_INLINE(int) git_commit_lookup(git_commit **commit, git_repository *repo, const git_oid *id) {@@ -56,37 +36,63 @@ } /**- * Create a new in-memory git_commit.+ * Lookup a commit object from a repository,+ * given a prefix of its identifier (short id). *- * The commit object must be manually filled using- * setter methods before it can be written to its- * repository.+ * @see git_object_lookup_prefix *- * @param commit pointer to the new commit- * @param repo The repository where the object will reside- * @return 0 on success; error code otherwise+ * @param commit pointer to the looked up commit+ * @param repo the repo to use when locating the commit.+ * @param id identity of the commit to locate. If the object is+ * an annotated tag it will be peeled back to the commit.+ * @param len the length of the short identifier+ * @return 0 or an error code */-GIT_INLINE(int) git_commit_new(git_commit **commit, git_repository *repo)+GIT_INLINE(int) git_commit_lookup_prefix(git_commit **commit, git_repository *repo, const git_oid *id, unsigned len) {- return git_object_new((git_object **)commit, repo, GIT_OBJ_COMMIT);+ return git_object_lookup_prefix((git_object **)commit, repo, id, len, GIT_OBJ_COMMIT); } /**+ * Close an open commit+ *+ * This is a wrapper around git_object_free()+ *+ * IMPORTANT:+ * It *is* necessary to call this method when you stop+ * using a commit. Failure to do so will cause a memory leak.+ *+ * @param commit the commit to close+ */++GIT_INLINE(void) git_commit_free(git_commit *commit)+{+ git_object_free((git_object *) commit);+}++/** * Get the id of a commit.+ * * @param commit a previously loaded commit. * @return object identity for the commit. */ GIT_EXTERN(const git_oid *) git_commit_id(git_commit *commit); /**- * Get the short (one line) message of a commit.+ * Get the encoding for the message of a commit,+ * as a string representing a standard encoding name.+ *+ * The encoding may be NULL if the `encoding` header+ * in the commit is missing; in that case UTF-8 is assumed.+ * * @param commit a previously loaded commit.- * @return the short message of a commit+ * @return NULL, or the encoding */-GIT_EXTERN(const char *) git_commit_message_short(git_commit *commit);+GIT_EXTERN(const char *) git_commit_message_encoding(git_commit *commit); /** * Get the full message of a commit.+ * * @param commit a previously loaded commit. * @return the message of a commit */@@ -94,13 +100,15 @@ /** * Get the commit time (i.e. committer time) of a commit.+ * * @param commit a previously loaded commit. * @return the time of a commit */-GIT_EXTERN(time_t) git_commit_time(git_commit *commit);+GIT_EXTERN(git_time_t) git_commit_time(git_commit *commit); /** * Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.+ * * @param commit a previously loaded commit. * @return positive or negative timezone offset, in minutes from UTC */@@ -108,6 +116,7 @@ /** * Get the committer of a commit.+ * * @param commit a previously loaded commit. * @return the committer of a commit */@@ -115,6 +124,7 @@ /** * Get the author of a commit.+ * * @param commit a previously loaded commit. * @return the author of a commit */@@ -122,13 +132,24 @@ /** * Get the tree pointed to by a commit.+ * * @param tree_out pointer where to store the tree object * @param commit a previously loaded commit.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_commit_tree(git_tree **tree_out, git_commit *commit); /**+ * Get the id of the tree pointed to by a commit. This differs from+ * `git_commit_tree` in that no attempts are made to fetch an object+ * from the ODB.+ *+ * @param commit a previously loaded commit.+ * @return the id of tree pointed to by commit.+ */+GIT_EXTERN(const git_oid *) git_commit_tree_oid(git_commit *commit);++/** * Get the number of parents of this commit * * @param commit a previously loaded commit.@@ -142,46 +163,107 @@ * @param parent Pointer where to store the parent commit * @param commit a previously loaded commit. * @param n the position of the parent (from 0 to `parentcount`)- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_commit_parent(git_commit **parent, git_commit *commit, unsigned int n); /**- * Add a new parent commit to an existing commit- * @param commit the commit object- * @param new_parent the new commit which will be a parent- * @return 0 on success; error code otherwise- */-GIT_EXTERN(int) git_commit_add_parent(git_commit *commit, git_commit *new_parent);--/**- * Set the message of a commit- * @param commit the commit object- * @param message the new message- */-GIT_EXTERN(void) git_commit_set_message(git_commit *commit, const char *message);--/**- * Set the committer of a commit- * @param commit the commit object- * @param author_sig signature of the committer+ * Get the oid of a specified parent for a commit. This is different from+ * `git_commit_parent`, which will attempt to load the parent commit from+ * the ODB.+ *+ * @param commit a previously loaded commit.+ * @param n the position of the parent (from 0 to `parentcount`)+ * @return the id of the parent, NULL on error. */-GIT_EXTERN(void) git_commit_set_committer(git_commit *commit, const git_signature *committer_sig);+GIT_EXTERN(const git_oid *) git_commit_parent_oid(git_commit *commit, unsigned int n); /**- * Set the author of a commit- * @param commit the commit object- * @param author_sig signature of the author+ * Create a new commit in the repository using `git_object`+ * instances as parameters.+ *+ * The message will be cleaned up from excess whitespace+ * it will be made sure that the last line ends with a '\n'.+ *+ * @param oid Pointer where to store the OID of the+ * newly created commit+ *+ * @param repo Repository where to store the commit+ *+ * @param update_ref If not NULL, name of the reference that+ * will be updated to point to this commit. If the reference+ * is not direct, it will be resolved to a direct reference.+ * Use "HEAD" to update the HEAD of the current branch and+ * make it point to this commit. If the reference doesn't+ * exist yet, it will be created.+ *+ * @param author Signature representing the author and the authory+ * time of this commit+ *+ * @param committer Signature representing the committer and the+ * commit time of this commit+ *+ * @param message_encoding The encoding for the message in the+ * commit, represented with a standard encoding name.+ * E.g. "UTF-8". If NULL, no encoding header is written and+ * UTF-8 is assumed.+ *+ * @param message Full message for this commit+ *+ * @param tree An instance of a `git_tree` object that will+ * be used as the tree for the commit. This tree object must+ * also be owned by the given `repo`.+ *+ * @param parent_count Number of parents for this commit+ *+ * @param parents[] Array of `parent_count` pointers to `git_commit`+ * objects that will be used as the parents for this commit. This+ * array may be NULL if `parent_count` is 0 (root commit). All the+ * given commits must be owned by the `repo`.+ *+ * @return 0 or an error code+ * The created commit will be written to the Object Database and+ * the given reference will be updated to point to it */-GIT_EXTERN(void) git_commit_set_author(git_commit *commit, const git_signature *author_sig);+GIT_EXTERN(int) git_commit_create(+ git_oid *oid,+ git_repository *repo,+ const char *update_ref,+ const git_signature *author,+ const git_signature *committer,+ const char *message_encoding,+ const char *message,+ const git_tree *tree,+ int parent_count,+ const git_commit *parents[]); /**- * Set the tree which is pointed to by a commit- * @param commit the commit object- * @param tree the new tree- * @param 0 on success; error code otherwise+ * Create a new commit in the repository using a variable+ * argument list.+ *+ * The message will be cleaned up from excess whitespace+ * it will be made sure that the last line ends with a '\n'.+ *+ * The parents for the commit are specified as a variable+ * list of pointers to `const git_commit *`. Note that this+ * is a convenience method which may not be safe to export+ * for certain languages or compilers+ *+ * All other parameters remain the same+ *+ * @see git_commit_create */-GIT_EXTERN(int) git_commit_set_tree(git_commit *commit, git_tree *tree);+GIT_EXTERN(int) git_commit_create_v(+ git_oid *oid,+ git_repository *repo,+ const char *update_ref,+ const git_signature *author,+ const git_signature *committer,+ const char *message_encoding,+ const char *message,+ const git_tree *tree,+ int parent_count,+ ...); /** @} */ GIT_END_DECL
libgit2/include/git2/common.h view
@@ -1,67 +1,42 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_common_h__ #define INCLUDE_git_common_h__ -#include "thread-utils.h" #include <time.h> #include <stdlib.h> +#ifdef _MSC_VER+# include "inttypes.h"+#else+# include <inttypes.h>+#endif+ #ifdef __cplusplus-# define GIT_BEGIN_DECL extern "C" {-# define GIT_END_DECL }+# define GIT_BEGIN_DECL extern "C" {+# define GIT_END_DECL } #else- /** Start declarations in C mode */-# define GIT_BEGIN_DECL /* empty */- /** End declarations in C mode */-# define GIT_END_DECL /* empty */+ /** Start declarations in C mode */+# define GIT_BEGIN_DECL /* empty */+ /** End declarations in C mode */+# define GIT_END_DECL /* empty */ #endif /** Declare a public function exported for application use. */-#ifdef __GNUC__+#if __GNUC__ >= 4 # define GIT_EXTERN(type) extern \- __attribute__((visibility("default"))) \- type+ __attribute__((visibility("default"))) \+ type #elif defined(_MSC_VER) # define GIT_EXTERN(type) __declspec(dllexport) type #else # define GIT_EXTERN(type) extern type #endif -/** Declare a public TLS symbol exported for application use. */-#ifdef __GNUC__-# define GIT_EXTERN_TLS(type) extern \- __attribute__((visibility("default"))) \- GIT_TLS \- type-#elif defined(_MSC_VER)-# define GIT_EXTERN_TLS(type) __declspec(dllexport) GIT_TLS type-#else-# define GIT_EXTERN_TLS(type) extern GIT_TLS type-#endif- /** Declare a function as always inlined. */ #if defined(_MSC_VER) # define GIT_INLINE(type) static __inline type@@ -76,6 +51,10 @@ # define GIT_FORMAT_PRINTF(a,b) /* empty */ #endif +#if (defined(_WIN32)) && !defined(__CYGWIN__)+#define GIT_WIN32 1+#endif+ /** * @file git2/common.h * @brief Git common platform definitions@@ -84,81 +63,23 @@ * @{ */ -/** Operation completed successfully. */-#define GIT_SUCCESS 0+GIT_BEGIN_DECL /**- * Operation failed, with unspecified reason.- * This value also serves as the base error code; all other- * error codes are subtracted from it such that all errors- * are < 0, in typical POSIX C tradition.+ * The separator used in path list strings (ie like in the PATH+ * environment variable). A semi-colon ";" is used on Windows, and+ * a colon ":" for all other systems. */-#define GIT_ERROR -1--/** Input was not a properly formatted Git object id. */-#define GIT_ENOTOID (GIT_ERROR - 1)--/** Input does not exist in the scope searched. */-#define GIT_ENOTFOUND (GIT_ERROR - 2)--/** Not enough space available. */-#define GIT_ENOMEM (GIT_ERROR - 3)--/** Consult the OS error information. */-#define GIT_EOSERR (GIT_ERROR - 4)--/** The specified object is of invalid type */-#define GIT_EOBJTYPE (GIT_ERROR - 5)--/** The specified object has its data corrupted */-#define GIT_EOBJCORRUPTED (GIT_ERROR - 6)--/** The specified repository is invalid */-#define GIT_ENOTAREPO (GIT_ERROR - 7)--/** The object type is invalid or doesn't match */-#define GIT_EINVALIDTYPE (GIT_ERROR - 8)--/** The object cannot be written that because it's missing internal data */-#define GIT_EMISSINGOBJDATA (GIT_ERROR - 9)--/** The packfile for the ODB is corrupted */-#define GIT_EPACKCORRUPTED (GIT_ERROR - 10)--/** Failed to adquire or release a file lock */-#define GIT_EFLOCKFAIL (GIT_ERROR - 11)--/** The Z library failed to inflate/deflate an object's data */-#define GIT_EZLIB (GIT_ERROR - 12)--/** The queried object is currently busy */-#define GIT_EBUSY (GIT_ERROR - 13)--/** The index file is not backed up by an existing repository */-#define GIT_EBAREINDEX (GIT_ERROR - 14)--/** The name of the reference is not valid */-#define GIT_EINVALIDREFNAME (GIT_ERROR - 15)--/** The specified reference has its data corrupted */-#define GIT_EREFCORRUPTED (GIT_ERROR - 16)--/** The specified symbolic reference is too deeply nested */-#define GIT_ETOONESTEDSYMREF (GIT_ERROR - 17)--/** The pack-refs file is either corrupted of its format is not currently supported */-#define GIT_EPACKEDREFSCORRUPTED (GIT_ERROR - 18)--/** The path is invalid */-#define GIT_EINVALIDPATH (GIT_ERROR - 19)--/** The revision walker is empty; there are no more commits left to iterate */-#define GIT_EREVWALKOVER (GIT_ERROR - 20)--/** The state of the reference is not valid */-#define GIT_EINVALIDREFSTATE (GIT_ERROR - 21)+#ifdef GIT_WIN32+#define GIT_PATH_LIST_SEPARATOR ';'+#else+#define GIT_PATH_LIST_SEPARATOR ':'+#endif -GIT_BEGIN_DECL+/**+ * The maximum length of a valid git path.+ */+#define GIT_PATH_MAX 4096 typedef struct { char **strings;@@ -166,6 +87,17 @@ } git_strarray; GIT_EXTERN(void) git_strarray_free(git_strarray *array);+GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src);++/**+ * Return the version of the libgit2 library+ * being currently used.+ *+ * @param major Store the major version number+ * @param minor Store the minor version number+ * @param rev Store the revision (patch) number+ */+GIT_EXTERN(void) git_libgit2_version(int *major, int *minor, int *rev); /** @} */ GIT_END_DECL
+ libgit2/include/git2/config.h view
@@ -0,0 +1,356 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_config_h__+#define INCLUDE_git_config_h__++#include "common.h"+#include "types.h"++/**+ * @file git2/config.h+ * @brief Git config management routines+ * @defgroup git_config Git config management routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Generic backend that implements the interface to+ * access a configuration file+ */+struct git_config_file {+ struct git_config *cfg;++ /* Open means open the file/database and parse if necessary */+ int (*open)(struct git_config_file *);+ int (*get)(struct git_config_file *, const char *key, const char **value);+ int (*get_multivar)(struct git_config_file *, const char *key, const char *regexp, int (*fn)(const char *, void *), void *data);+ int (*set)(struct git_config_file *, const char *key, const char *value);+ int (*set_multivar)(git_config_file *cfg, const char *name, const char *regexp, const char *value);+ int (*del)(struct git_config_file *, const char *key);+ int (*foreach)(struct git_config_file *, int (*fn)(const char *, const char *, void *), void *data);+ void (*free)(struct git_config_file *);+};++typedef enum {+ GIT_CVAR_FALSE = 0,+ GIT_CVAR_TRUE = 1,+ GIT_CVAR_INT32,+ GIT_CVAR_STRING+} git_cvar_t;++typedef struct {+ git_cvar_t cvar_type;+ const char *str_match;+ int map_value;+} git_cvar_map;++/**+ * Locate the path to the global configuration file+ *+ * The user or global configuration file is usually+ * located in `$HOME/.gitconfig`.+ *+ * This method will try to guess the full path to that+ * file, if the file exists. The returned path+ * may be used on any `git_config` call to load the+ * global configuration file.+ *+ * @param global_config_path Buffer of GIT_PATH_MAX length to store the path+ * @return 0 if a global configuration file has been+ * found. Its path will be stored in `buffer`.+ */+GIT_EXTERN(int) git_config_find_global(char *global_config_path, size_t length);++/**+ * Locate the path to the system configuration file+ *+ * If /etc/gitconfig doesn't exist, it will look for+ * %PROGRAMFILES%\Git\etc\gitconfig.++ * @param system_config_path Buffer of GIT_PATH_MAX length to store the path+ * @return 0 if a system configuration file has been+ * found. Its path will be stored in `buffer`.+ */+GIT_EXTERN(int) git_config_find_system(char *system_config_path, size_t length);++/**+ * Open the global configuration file+ *+ * Utility wrapper that calls `git_config_find_global`+ * and opens the located file, if it exists.+ *+ * @param out Pointer to store the config instance+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_open_global(git_config **out);++/**+ * Create a configuration file backend for ondisk files+ *+ * These are the normal `.gitconfig` files that Core Git+ * processes. Note that you first have to add this file to a+ * configuration object before you can query it for configuration+ * variables.+ *+ * @param out the new backend+ * @param path where the config file is located+ */+GIT_EXTERN(int) git_config_file__ondisk(struct git_config_file **out, const char *path);++/**+ * Allocate a new configuration object+ *+ * This object is empty, so you have to add a file to it before you+ * can do anything with it.+ *+ * @param out pointer to the new configuration+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_new(git_config **out);++/**+ * Add a generic config file instance to an existing config+ *+ * Note that the configuration object will free the file+ * automatically.+ *+ * Further queries on this config object will access each+ * of the config file instances in order (instances with+ * a higher priority will be accessed first).+ *+ * @param cfg the configuration to add the file to+ * @param file the configuration file (backend) to add+ * @param priority the priority the backend should have+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_add_file(git_config *cfg, git_config_file *file, int priority);++/**+ * Add an on-disk config file instance to an existing config+ *+ * The on-disk file pointed at by `path` will be opened and+ * parsed; it's expected to be a native Git config file following+ * the default Git config syntax (see man git-config).+ *+ * Note that the configuration object will free the file+ * automatically.+ *+ * Further queries on this config object will access each+ * of the config file instances in order (instances with+ * a higher priority will be accessed first).+ *+ * @param cfg the configuration to add the file to+ * @param path path to the configuration file (backend) to add+ * @param priority the priority the backend should have+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_add_file_ondisk(git_config *cfg, const char *path, int priority);+++/**+ * Create a new config instance containing a single on-disk file+ *+ * This method is a simple utility wrapper for the following sequence+ * of calls:+ * - git_config_new+ * - git_config_add_file_ondisk+ *+ * @param cfg The configuration instance to create+ * @param path Path to the on-disk file to open+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_open_ondisk(git_config **cfg, const char *path);++/**+ * Free the configuration and its associated memory and files+ *+ * @param cfg the configuration to free+ */+GIT_EXTERN(void) git_config_free(git_config *cfg);++/**+ * Get the value of an integer config variable.+ *+ * @param out pointer to the variable where the value should be stored+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_get_int32(int32_t *out, git_config *cfg, const char *name);++/**+ * Get the value of a long integer config variable.+ *+ * @param out pointer to the variable where the value should be stored+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_get_int64(int64_t *out, git_config *cfg, const char *name);++/**+ * Get the value of a boolean config variable.+ *+ * This function uses the usual C convention of 0 being false and+ * anything else true.+ *+ * @param out pointer to the variable where the value should be stored+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_get_bool(int *out, git_config *cfg, const char *name);++/**+ * Get the value of a string config variable.+ *+ * The string is owned by the variable and should not be freed by the+ * user.+ *+ * @param out pointer to the variable's value+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_get_string(const char **out, git_config *cfg, const char *name);++/**+ * Get each value of a multivar.+ *+ * The callback will be called on each variable found+ *+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @param regexp regular expression to filter which variables we're+ * interested in. Use NULL to indicate all+ * @param fn the function to be called on each value of the variable+ * @param data opaque pointer to pass to the callback+ */+GIT_EXTERN(int) git_config_get_multivar(git_config *cfg, const char *name, const char *regexp, int (*fn)(const char *, void *), void *data);++/**+ * Set the value of an integer config variable.+ *+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @param value Integer value for the variable+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_set_int32(git_config *cfg, const char *name, int32_t value);++/**+ * Set the value of a long integer config variable.+ *+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @param value Long integer value for the variable+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_set_int64(git_config *cfg, const char *name, int64_t value);++/**+ * Set the value of a boolean config variable.+ *+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @param value the value to store+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value);++/**+ * Set the value of a string config variable.+ *+ * A copy of the string is made and the user is free to use it+ * afterwards.+ *+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @param value the string to store.+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value);+++/**+ * Set a multivar+ *+ * @param cfg where to look for the variable+ * @param name the variable's name+ * @param regexp a regular expression to indicate which values to replace+ * @param value the new value.+ */+GIT_EXTERN(int) git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value);++/**+ * Delete a config variable+ *+ * @param cfg the configuration+ * @param name the variable to delete+ */+GIT_EXTERN(int) git_config_delete(git_config *cfg, const char *name);++/**+ * Perform an operation on each config variable.+ *+ * The callback receives the normalized name and value of each variable+ * in the config backend, and the data pointer passed to this function.+ * As soon as one of the callback functions returns something other than 0,+ * this function returns that value.+ *+ * @param cfg where to get the variables from+ * @param callback the function to call on each variable+ * @param payload the data to pass to the callback+ * @return 0 or the return value of the callback which didn't return 0+ */+GIT_EXTERN(int) git_config_foreach(+ git_config *cfg,+ int (*callback)(const char *var_name, const char *value, void *payload),+ void *payload);+++/**+ * Query the value of a config variable and return it mapped to+ * an integer constant.+ *+ * This is a helper method to easily map different possible values+ * to a variable to integer constants that easily identify them.+ *+ * A mapping array looks as follows:+ *+ * git_cvar_map autocrlf_mapping[3] = {+ * {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},+ * {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},+ * {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},+ * {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};+ *+ * On any "false" value for the variable (e.g. "false", "FALSE", "no"), the+ * mapping will store `GIT_AUTO_CRLF_FALSE` in the `out` parameter.+ *+ * The same thing applies for any "true" value such as "true", "yes" or "1", storing+ * the `GIT_AUTO_CRLF_TRUE` variable.+ *+ * Otherwise, if the value matches the string "input" (with case insensitive comparison),+ * the given constant will be stored in `out`, and likewise for "default".+ *+ * If not a single match can be made to store in `out`, an error code will be+ * returned.+ *+ * @param out place to store the result of the mapping+ * @param cfg config file to get the variables from+ * @param name name of the config variable to lookup+ * @param maps array of `git_cvar_map` objects specifying the possible mappings+ * @param map_n number of mapping objects in `maps`+ * @return 0 on success, error code otherwise+ */+GIT_EXTERN(int) git_config_get_mapped(int *out, git_config *cfg, const char *name, git_cvar_map *maps, size_t map_n);++/** @} */+GIT_END_DECL+#endif
+ libgit2/include/git2/diff.h view
@@ -0,0 +1,362 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_diff_h__+#define INCLUDE_git_diff_h__++#include "common.h"+#include "types.h"+#include "oid.h"+#include "tree.h"+#include "refs.h"++/**+ * @file git2/diff.h+ * @brief Git tree and file differencing routines.+ *+ * Calculating diffs is generally done in two phases: building a diff list+ * then traversing the diff list. This makes is easier to share logic+ * across the various types of diffs (tree vs tree, workdir vs index, etc.),+ * and also allows you to insert optional diff list post-processing phases,+ * such as rename detected, in between the steps. When you are done with a+ * diff list object, it must be freed.+ *+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++enum {+ GIT_DIFF_NORMAL = 0,+ GIT_DIFF_REVERSE = (1 << 0),+ GIT_DIFF_FORCE_TEXT = (1 << 1),+ GIT_DIFF_IGNORE_WHITESPACE = (1 << 2),+ GIT_DIFF_IGNORE_WHITESPACE_CHANGE = (1 << 3),+ GIT_DIFF_IGNORE_WHITESPACE_EOL = (1 << 4),+ GIT_DIFF_IGNORE_SUBMODULES = (1 << 5),+ GIT_DIFF_PATIENCE = (1 << 6),+ GIT_DIFF_INCLUDE_IGNORED = (1 << 7),+ GIT_DIFF_INCLUDE_UNTRACKED = (1 << 8),+ GIT_DIFF_INCLUDE_UNMODIFIED = (1 << 9),+ GIT_DIFF_RECURSE_UNTRACKED_DIRS = (1 << 10),+};++/**+ * Structure describing options about how the diff should be executed.+ *+ * Setting all values of the structure to zero will yield the default+ * values. Similarly, passing NULL for the options structure will+ * give the defaults. The default values are marked below.+ *+ * @todo Most of the parameters here are not actually supported at this time.+ */+typedef struct {+ uint32_t flags; /**< defaults to GIT_DIFF_NORMAL */+ uint16_t context_lines; /**< defaults to 3 */+ uint16_t interhunk_lines; /**< defaults to 3 */+ char *old_prefix; /**< defaults to "a" */+ char *new_prefix; /**< defaults to "b" */+ git_strarray pathspec; /**< defaults to show all paths */+} git_diff_options;++/**+ * The diff list object that contains all individual file deltas.+ */+typedef struct git_diff_list git_diff_list;++enum {+ GIT_DIFF_FILE_VALID_OID = (1 << 0),+ GIT_DIFF_FILE_FREE_PATH = (1 << 1),+ GIT_DIFF_FILE_BINARY = (1 << 2),+ GIT_DIFF_FILE_NOT_BINARY = (1 << 3),+ GIT_DIFF_FILE_FREE_DATA = (1 << 4),+ GIT_DIFF_FILE_UNMAP_DATA = (1 << 5)+};++/**+ * What type of change is described by a git_diff_delta?+ */+typedef enum {+ GIT_DELTA_UNMODIFIED = 0,+ GIT_DELTA_ADDED = 1,+ GIT_DELTA_DELETED = 2,+ GIT_DELTA_MODIFIED = 3,+ GIT_DELTA_RENAMED = 4,+ GIT_DELTA_COPIED = 5,+ GIT_DELTA_IGNORED = 6,+ GIT_DELTA_UNTRACKED = 7+} git_delta_t;++/**+ * Description of one side of a diff.+ */+typedef struct {+ git_oid oid;+ char *path;+ uint16_t mode;+ git_off_t size;+ unsigned int flags;+} git_diff_file;++/**+ * Description of changes to one file.+ *+ * When iterating over a diff list object, this will generally be passed to+ * most callback functions and you can use the contents to understand+ * exactly what has changed.+ *+ * Under some circumstances, not all fields will be filled in, but the code+ * generally tries to fill in as much as possible. One example is that the+ * "binary" field will not actually look at file contents if you do not+ * pass in hunk and/or line callbacks to the diff foreach iteration function.+ * It will just use the git attributes for those files.+ */+typedef struct {+ git_diff_file old_file;+ git_diff_file new_file;+ git_delta_t status;+ unsigned int similarity; /**< for RENAMED and COPIED, value 0-100 */+ int binary;+} git_diff_delta;++/**+ * When iterating over a diff, callback that will be made per file.+ */+typedef int (*git_diff_file_fn)(+ void *cb_data,+ git_diff_delta *delta,+ float progress);++/**+ * Structure describing a hunk of a diff.+ */+typedef struct {+ int old_start;+ int old_lines;+ int new_start;+ int new_lines;+} git_diff_range;++/**+ * When iterating over a diff, callback that will be made per hunk.+ */+typedef int (*git_diff_hunk_fn)(+ void *cb_data,+ git_diff_delta *delta,+ git_diff_range *range,+ const char *header,+ size_t header_len);++/**+ * Line origin constants.+ *+ * These values describe where a line came from and will be passed to+ * the git_diff_data_fn when iterating over a diff. There are some+ * special origin contants at the end that are used for the text+ * output callbacks to demarcate lines that are actually part of+ * the file or hunk headers.+ */+enum {+ /* these values will be sent to `git_diff_data_fn` along with the line */+ GIT_DIFF_LINE_CONTEXT = ' ',+ GIT_DIFF_LINE_ADDITION = '+',+ GIT_DIFF_LINE_DELETION = '-',+ GIT_DIFF_LINE_ADD_EOFNL = '\n', /**< LF was added at end of file */+ GIT_DIFF_LINE_DEL_EOFNL = '\0', /**< LF was removed at end of file */+ /* these values will only be sent to a `git_diff_data_fn` when the content+ * of a diff is being formatted (eg. through git_diff_print_patch() or+ * git_diff_print_compact(), for instance).+ */+ GIT_DIFF_LINE_FILE_HDR = 'F',+ GIT_DIFF_LINE_HUNK_HDR = 'H',+ GIT_DIFF_LINE_BINARY = 'B'+};++/**+ * When iterating over a diff, callback that will be made per text diff+ * line. In this context, the provided range will be NULL.+ *+ * When printing a diff, callback that will be made to output each line+ * of text. This uses some extra GIT_DIFF_LINE_... constants for output+ * of lines of file and hunk headers.+ */+typedef int (*git_diff_data_fn)(+ void *cb_data,+ git_diff_delta *delta,+ git_diff_range *range,+ char line_origin, /**< GIT_DIFF_LINE_... value from above */+ const char *content,+ size_t content_len);++/** @name Diff List Generator Functions+ *+ * These are the functions you would use to create (or destroy) a+ * git_diff_list from various objects in a repository.+ */+/**@{*/++/**+ * Deallocate a diff list.+ */+GIT_EXTERN(void) git_diff_list_free(git_diff_list *diff);++/**+ * Compute a difference between two tree objects.+ *+ * @param repo The repository containing the trees.+ * @param opts Structure with options to influence diff or NULL for defaults.+ * @param old_tree A git_tree object to diff from.+ * @param new_tree A git_tree object to diff to.+ * @param diff A pointer to a git_diff_list pointer that will be allocated.+ */+GIT_EXTERN(int) git_diff_tree_to_tree(+ git_repository *repo,+ const git_diff_options *opts, /**< can be NULL for defaults */+ git_tree *old_tree,+ git_tree *new_tree,+ git_diff_list **diff);++/**+ * Compute a difference between a tree and the index.+ *+ * @param repo The repository containing the tree and index.+ * @param opts Structure with options to influence diff or NULL for defaults.+ * @param old_tree A git_tree object to diff from.+ * @param diff A pointer to a git_diff_list pointer that will be allocated.+ */+GIT_EXTERN(int) git_diff_index_to_tree(+ git_repository *repo,+ const git_diff_options *opts, /**< can be NULL for defaults */+ git_tree *old_tree,+ git_diff_list **diff);++/**+ * Compute a difference between the working directory and the index.+ *+ * @param repo The repository.+ * @param opts Structure with options to influence diff or NULL for defaults.+ * @param diff A pointer to a git_diff_list pointer that will be allocated.+ */+GIT_EXTERN(int) git_diff_workdir_to_index(+ git_repository *repo,+ const git_diff_options *opts, /**< can be NULL for defaults */+ git_diff_list **diff);++/**+ * Compute a difference between the working directory and a tree.+ *+ * This returns strictly the differences between the tree and the+ * files contained in the working directory, regardless of the state+ * of files in the index. There is no direct equivalent in C git.+ *+ * This is *NOT* the same as 'git diff HEAD' or 'git diff <SHA>'. Those+ * commands diff the tree, the index, and the workdir. To emulate those+ * functions, call `git_diff_index_to_tree` and `git_diff_workdir_to_index`,+ * then call `git_diff_merge` on the results.+ *+ * @param repo The repository containing the tree.+ * @param opts Structure with options to influence diff or NULL for defaults.+ * @param old_tree A git_tree object to diff from.+ * @param diff A pointer to a git_diff_list pointer that will be allocated.+ */+GIT_EXTERN(int) git_diff_workdir_to_tree(+ git_repository *repo,+ const git_diff_options *opts, /**< can be NULL for defaults */+ git_tree *old_tree,+ git_diff_list **diff);++/**+ * Merge one diff list into another.+ *+ * This merges items from the "from" list into the "onto" list. The+ * resulting diff list will have all items that appear in either list.+ * If an item appears in both lists, then it will be "merged" to appear+ * as if the old version was from the "onto" list and the new version+ * is from the "from" list (with the exception that if the item has a+ * pending DELETE in the middle, then it will show as deleted).+ *+ * @param onto Diff to merge into.+ * @param from Diff to merge.+ */+GIT_EXTERN(int) git_diff_merge(+ git_diff_list *onto,+ const git_diff_list *from);++/**@}*/+++/** @name Diff List Processor Functions+ *+ * These are the functions you apply to a diff list to process it+ * or read it in some way.+ */+/**@{*/++/**+ * Iterate over a diff list issuing callbacks.+ *+ * If the hunk and/or line callbacks are not NULL, then this will calculate+ * text diffs for all files it thinks are not binary. If those are both+ * NULL, then this will not bother with the text diffs, so it can be+ * efficient.+ */+GIT_EXTERN(int) git_diff_foreach(+ git_diff_list *diff,+ void *cb_data,+ git_diff_file_fn file_cb,+ git_diff_hunk_fn hunk_cb,+ git_diff_data_fn line_cb);++/**+ * Iterate over a diff generating text output like "git diff --name-status".+ */+GIT_EXTERN(int) git_diff_print_compact(+ git_diff_list *diff,+ void *cb_data,+ git_diff_data_fn print_cb);++/**+ * Iterate over a diff generating text output like "git diff".+ *+ * This is a super easy way to generate a patch from a diff.+ */+GIT_EXTERN(int) git_diff_print_patch(+ git_diff_list *diff,+ void *cb_data,+ git_diff_data_fn print_cb);++/**@}*/+++/*+ * Misc+ */++/**+ * Directly run a text diff on two blobs.+ *+ * Compared to a file, a blob lacks some contextual information. As such, the+ * `git_diff_file` parameters of the callbacks will be filled accordingly to the following:+ * `mode` will be set to 0, `path` will be set to NULL. When dealing with a NULL blob, `oid`+ * will be set to 0.+ *+ * When at least one of the blobs being dealt with is binary, the `git_diff_delta` binary+ * attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made.+ */+GIT_EXTERN(int) git_diff_blobs(+ git_blob *old_blob,+ git_blob *new_blob,+ git_diff_options *options,+ void *cb_data,+ git_diff_file_fn file_cb,+ git_diff_hunk_fn hunk_cb,+ git_diff_data_fn line_cb);++GIT_END_DECL++/** @} */++#endif
libgit2/include/git2/errors.h view
@@ -1,30 +1,14 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_errors_h__ #define INCLUDE_git_errors_h__ +#include "common.h"+ /** * @file git2/errors.h * @brief Git error handling routines and variables@@ -33,12 +17,91 @@ */ GIT_BEGIN_DECL +#ifdef GIT_OLD_ERRORS+enum {+ GIT_SUCCESS = 0,+ GIT_ENOTOID = -2,+ GIT_ENOTFOUND = -3,+ GIT_ENOMEM = -4,+ GIT_EOSERR = -5,+ GIT_EOBJTYPE = -6,+ GIT_ENOTAREPO = -7,+ GIT_EINVALIDTYPE = -8,+ GIT_EMISSINGOBJDATA = -9,+ GIT_EPACKCORRUPTED = -10,+ GIT_EFLOCKFAIL = -11,+ GIT_EZLIB = -12,+ GIT_EBUSY = -13,+ GIT_EBAREINDEX = -14,+ GIT_EINVALIDREFNAME = -15,+ GIT_EREFCORRUPTED = -16,+ GIT_ETOONESTEDSYMREF = -17,+ GIT_EPACKEDREFSCORRUPTED = -18,+ GIT_EINVALIDPATH = -19,+ GIT_EREVWALKOVER = -20,+ GIT_EINVALIDREFSTATE = -21,+ GIT_ENOTIMPLEMENTED = -22,+ GIT_EEXISTS = -23,+ GIT_EOVERFLOW = -24,+ GIT_ENOTNUM = -25,+ GIT_ESTREAM = -26,+ GIT_EINVALIDARGS = -27,+ GIT_EOBJCORRUPTED = -28,+ GIT_EAMBIGUOUS = -29,+ GIT_EPASSTHROUGH = -30,+ GIT_ENOMATCH = -31,+ GIT_ESHORTBUFFER = -32,+};+#endif++/** Generic return codes */+enum {+ GIT_OK = 0,+ GIT_ERROR = -1,+ GIT_ENOTFOUND = -3,+ GIT_EEXISTS = -4,+ GIT_EAMBIGUOUS = -5,+ GIT_EBUFS = -6,++ GIT_PASSTHROUGH = -30,+ GIT_REVWALKOVER = -31,+};++typedef struct {+ char *message;+ int klass;+} git_error;++typedef enum {+ GITERR_NOMEMORY,+ GITERR_OS,+ GITERR_INVALID,+ GITERR_REFERENCE,+ GITERR_ZLIB,+ GITERR_REPOSITORY,+ GITERR_CONFIG,+ GITERR_REGEX,+ GITERR_ODB,+ GITERR_INDEX,+ GITERR_OBJECT,+ GITERR_NET,+ GITERR_TAG,+ GITERR_TREE,+ GITERR_INDEXER,+} git_error_t;+ /**- * strerror() for the Git library- * @param num The error code to explain- * @return a string explaining the error code+ * Return the last `git_error` object that was generated for the+ * current thread or NULL if no error has occurred.+ *+ * @return A git_error object. */-GIT_EXTERN(const char *) git_strerror(int num);+GIT_EXTERN(const git_error *) giterr_last(void);++/**+ * Clear the last library error that occurred for this thread.+ */+GIT_EXTERN(void) giterr_clear(void); /** @} */ GIT_END_DECL
libgit2/include/git2/index.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_index_h__ #define INCLUDE_git_index_h__@@ -38,12 +20,42 @@ */ GIT_BEGIN_DECL -#define GIT_IDXENTRY_NAMEMASK (0x0fff)+#define GIT_IDXENTRY_NAMEMASK (0x0fff) #define GIT_IDXENTRY_STAGEMASK (0x3000)-#define GIT_IDXENTRY_EXTENDED (0x4000)-#define GIT_IDXENTRY_VALID (0x8000)+#define GIT_IDXENTRY_EXTENDED (0x4000)+#define GIT_IDXENTRY_VALID (0x8000) #define GIT_IDXENTRY_STAGESHIFT 12 +/*+ * Flags are divided into two parts: in-memory flags and+ * on-disk ones. Flags in GIT_IDXENTRY_EXTENDED_FLAGS+ * will get saved on-disk.+ *+ * In-memory only flags:+ */+#define GIT_IDXENTRY_UPDATE (1 << 0)+#define GIT_IDXENTRY_REMOVE (1 << 1)+#define GIT_IDXENTRY_UPTODATE (1 << 2)+#define GIT_IDXENTRY_ADDED (1 << 3)++#define GIT_IDXENTRY_HASHED (1 << 4)+#define GIT_IDXENTRY_UNHASHED (1 << 5)+#define GIT_IDXENTRY_WT_REMOVE (1 << 6) /* remove in work directory */+#define GIT_IDXENTRY_CONFLICTED (1 << 7)++#define GIT_IDXENTRY_UNPACKED (1 << 8)+#define GIT_IDXENTRY_NEW_SKIP_WORKTREE (1 << 9)++/*+ * Extended on-disk flags:+ */+#define GIT_IDXENTRY_INTENT_TO_ADD (1 << 13)+#define GIT_IDXENTRY_SKIP_WORKTREE (1 << 14)+/* GIT_IDXENTRY_EXTENDED2 is for future extension */+#define GIT_IDXENTRY_EXTENDED2 (1 << 15)++#define GIT_IDXENTRY_EXTENDED_FLAGS (GIT_IDXENTRY_INTENT_TO_ADD | GIT_IDXENTRY_SKIP_WORKTREE)+ /** Time used in a git index entry */ typedef struct { git_time_t seconds;@@ -71,31 +83,32 @@ char *path; } git_index_entry; +/** Representation of an unmerged file entry in the index. */+typedef struct git_index_entry_unmerged {+ unsigned int mode[3];+ git_oid oid[3];+ char *path;+} git_index_entry_unmerged; /**- * Create a new Git index object as a memory representation+ * Create a new bare Git index object as a memory representation * of the Git index file in 'index_path', without a repository * to back it. *- * Since there is no ODB behind this index, any Index methods- * which rely on the ODB (e.g. index_add) will fail with the- * GIT_EBAREINDEX error code.+ * Since there is no ODB or working directory behind this index,+ * any Index methods which rely on these (e.g. index_add) will+ * fail with the GIT_EBAREINDEX error code. *- * @param index the pointer for the new index- * @param index_path the path to the index file in disk- * @return 0 on success; error code otherwise- */-GIT_EXTERN(int) git_index_open_bare(git_index **index, const char *index_path);--/**- * Open the Index inside the git repository pointed- * by 'repo'.+ * If you need to access the index of an actual repository,+ * use the `git_repository_index` wrapper. *- * @param repo the git repo which owns the index+ * The index must be freed once it's no longer in use.+ *+ * @param index the pointer for the new index * @param index_path the path to the index file in disk- * @return 0 on success; error code otherwise+ * @return 0 or an error code */-GIT_EXTERN(int) git_index_open_inrepo(git_index **index, git_repository *repo);+GIT_EXTERN(int) git_index_open(git_index **index, const char *index_path); /** * Clear the contents (all the entries) of an index object.@@ -118,7 +131,7 @@ * by reading from the hard disk. * * @param index an existing index object- * @return 0 on success, otherwise an error code+ * @return 0 or an error code */ GIT_EXTERN(int) git_index_read(git_index *index); @@ -127,12 +140,12 @@ * using an atomic file lock. * * @param index an existing index object- * @return 0 on success, otherwise an error code+ * @return 0 or an error code */ GIT_EXTERN(int) git_index_write(git_index *index); /**- * Find the first index of any entires which point to given+ * Find the first index of any entries which point to given * path in the Git index. * * @param index an existing index object@@ -142,48 +155,102 @@ GIT_EXTERN(int) git_index_find(git_index *index, const char *path); /**- * Add or update an index entry from a file in disk.+ * Remove all entries with equal path except last added * * @param index an existing index object+ */+GIT_EXTERN(void) git_index_uniq(git_index *index);++/**+ * Add or update an index entry from a file in disk+ *+ * The file `path` must be relative to the repository's+ * working folder and must be readable.+ *+ * This method will fail in bare index instances.+ *+ * This forces the file to be added to the index, not looking+ * at gitignore rules. Those rules can be evaluated through+ * the git_status APIs (in status.h) before calling this.+ *+ * @param index an existing index object * @param path filename to add * @param stage stage for the entry- * @return 0 on success, otherwise an error code+ * @return 0 or an error code */ GIT_EXTERN(int) git_index_add(git_index *index, const char *path, int stage); /**- * Remove an entry from the index + * Add or update an index entry from an in-memory struct *+ * A full copy (including the 'path' string) of the given+ * 'source_entry' will be inserted on the index.+ * * @param index an existing index object- * @param position position of the entry to remove- * @return 0 on success, otherwise an error code+ * @param source_entry new entry object+ * @return 0 or an error code */-GIT_EXTERN(int) git_index_remove(git_index *index, int position);+GIT_EXTERN(int) git_index_add2(git_index *index, const git_index_entry *source_entry); /**- * Insert an entry into the index.+ * Add (append) an index entry from a file in disk+ *+ * A new entry will always be inserted into the index;+ * if the index already contains an entry for such+ * path, the old entry will **not** be replaced.+ *+ * The file `path` must be relative to the repository's+ * working folder and must be readable.+ *+ * This method will fail in bare index instances.+ *+ * @param index an existing index object+ * @param path filename to add+ * @param stage stage for the entry+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_index_append(git_index *index, const char *path, int stage);++/**+ * Add (append) an index entry from an in-memory struct+ *+ * A new entry will always be inserted into the index;+ * if the index already contains an entry for the path+ * in the `entry` struct, the old entry will **not** be+ * replaced.+ * * A full copy (including the 'path' string) of the given- * 'source_entry' will be inserted on the index; if the index- * already contains an entry for the same path, the entry- * will be updated.+ * 'source_entry' will be inserted on the index. * * @param index an existing index object * @param source_entry new entry object- * @return 0 on success, otherwise an error code+ * @return 0 or an error code */-GIT_EXTERN(int) git_index_insert(git_index *index, const git_index_entry *source_entry);+GIT_EXTERN(int) git_index_append2(git_index *index, const git_index_entry *source_entry); /**+ * Remove an entry from the index+ *+ * @param index an existing index object+ * @param position position of the entry to remove+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_index_remove(git_index *index, int position);+++/** * Get a pointer to one of the entries in the index * * This entry can be modified, and the changes will be written * back to disk on the next write() call. *+ * The entry should not be freed by the caller.+ * * @param index an existing index object * @param n the position of the entry * @return a pointer to the entry; NULL if out of bounds */-GIT_EXTERN(git_index_entry *) git_index_get(git_index *index, int n);+GIT_EXTERN(git_index_entry *) git_index_get(git_index *index, unsigned int n); /** * Get the count of entries currently in the index@@ -193,6 +260,61 @@ */ GIT_EXTERN(unsigned int) git_index_entrycount(git_index *index); +/**+ * Get the count of unmerged entries currently in the index+ *+ * @param index an existing index object+ * @return integer of count of current unmerged entries+ */+GIT_EXTERN(unsigned int) git_index_entrycount_unmerged(git_index *index);++/**+ * Get an unmerged entry from the index.+ *+ * The returned entry is read-only and should not be modified+ * of freed by the caller.+ *+ * @param index an existing index object+ * @param path path to search+ * @return the unmerged entry; NULL if not found+ */+GIT_EXTERN(const git_index_entry_unmerged *) git_index_get_unmerged_bypath(git_index *index, const char *path);++/**+ * Get an unmerged entry from the index.+ *+ * The returned entry is read-only and should not be modified+ * of freed by the caller.+ *+ * @param index an existing index object+ * @param n the position of the entry+ * @return a pointer to the unmerged entry; NULL if out of bounds+ */+GIT_EXTERN(const git_index_entry_unmerged *) git_index_get_unmerged_byindex(git_index *index, unsigned int n);++/**+ * Return the stage number from a git index entry+ *+ * This entry is calculated from the entrie's flag+ * attribute like this:+ *+ * (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT+ *+ * @param entry The entry+ * @returns the stage number+ */+GIT_EXTERN(int) git_index_entry_stage(const git_index_entry *entry);++/**+ * Read a tree into the index file+ *+ * The current index contents will be replaced by the specified tree.+ *+ * @param index an existing index object+ * @param tree tree to read+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_index_read_tree(git_index *index, git_tree *tree); /** @} */ GIT_END_DECL
+ libgit2/include/git2/indexer.h view
@@ -0,0 +1,121 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef _INCLUDE_git_indexer_h__+#define _INCLUDE_git_indexer_h__++#include "common.h"+#include "oid.h"++GIT_BEGIN_DECL++/**+ * This is passed as the first argument to the callback to allow the+ * user to see the progress.+ */+typedef struct git_indexer_stats {+ unsigned int total;+ unsigned int processed;+} git_indexer_stats;+++typedef struct git_indexer git_indexer;+typedef struct git_indexer_stream git_indexer_stream;++/**+ * Create a new streaming indexer instance+ *+ * @param out where to store the inexer instance+ * @param path to the gitdir (metadata directory)+ */+GIT_EXTERN(int) git_indexer_stream_new(git_indexer_stream **out, const char *gitdir);++/**+ * Add data to the indexer+ *+ * @param idx the indexer+ * @param data the data to add+ * @param size the size of the data+ * @param stats stat storage+ */+GIT_EXTERN(int) git_indexer_stream_add(git_indexer_stream *idx, const void *data, size_t size, git_indexer_stats *stats);++/**+ * Finalize the pack and index+ *+ * Resolve any pending deltas and write out the index file+ *+ * @param idx the indexer+ */+GIT_EXTERN(int) git_indexer_stream_finalize(git_indexer_stream *idx, git_indexer_stats *stats);++/**+ * Get the packfile's hash+ *+ * A packfile's name is derived from the sorted hashing of all object+ * names. This is only correct after the index has been finalized.+ *+ * @param idx the indexer instance+ */+GIT_EXTERN(const git_oid *) git_indexer_stream_hash(git_indexer_stream *idx);++/**+ * Free the indexer and its resources+ *+ * @param idx the indexer to free+ */+GIT_EXTERN(void) git_indexer_stream_free(git_indexer_stream *idx);++/**+ * Create a new indexer instance+ *+ * @param out where to store the indexer instance+ * @param packname the absolute filename of the packfile to index+ */+GIT_EXTERN(int) git_indexer_new(git_indexer **out, const char *packname);++/**+ * Iterate over the objects in the packfile and extract the information+ *+ * Indexing a packfile can be very expensive so this function is+ * expected to be run in a worker thread and the stats used to provide+ * feedback the user.+ *+ * @param idx the indexer instance+ * @param stats storage for the running state+ */+GIT_EXTERN(int) git_indexer_run(git_indexer *idx, git_indexer_stats *stats);++/**+ * Write the index file to disk.+ *+ * The file will be stored as pack-$hash.idx in the same directory as+ * the packfile.+ *+ * @param idx the indexer instance+ */+GIT_EXTERN(int) git_indexer_write(git_indexer *idx);++/**+ * Get the packfile's hash+ *+ * A packfile's name is derived from the sorted hashing of all object+ * names. This is only correct after the index has been written to disk.+ *+ * @param idx the indexer instance+ */+GIT_EXTERN(const git_oid *) git_indexer_hash(git_indexer *idx);++/**+ * Free the indexer and its resources+ *+ * @param idx the indexer to free+ */+GIT_EXTERN(void) git_indexer_free(git_indexer *idx);++GIT_END_DECL++#endif
+ libgit2/include/git2/inttypes.h view
@@ -0,0 +1,305 @@+// ISO C9x compliant inttypes.h for Microsoft Visual Studio+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124+//+// Copyright (c) 2006 Alexander Chemeris+//+// Redistribution and use in source and binary forms, with or without+// modification, are permitted provided that the following conditions are met:+//+// 1. Redistributions of source code must retain the above copyright notice,+// this list of conditions and the following disclaimer.+//+// 2. Redistributions in binary form must reproduce the above copyright+// notice, this list of conditions and the following disclaimer in the+// documentation and/or other materials provided with the distribution.+//+// 3. The name of the author may be used to endorse or promote products+// derived from this software without specific prior written permission.+//+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+//+///////////////////////////////////////////////////////////////////////////////++#ifndef _MSC_VER // [+#error "Use this header only with Microsoft Visual C++ compilers!"+#endif // _MSC_VER ]++#ifndef _MSC_INTTYPES_H_ // [+#define _MSC_INTTYPES_H_++#if _MSC_VER > 1000+#pragma once+#endif++#include "stdint.h"++// 7.8 Format conversion of integer types++typedef struct {+ intmax_t quot;+ intmax_t rem;+} imaxdiv_t;++// 7.8.1 Macros for format specifiers++#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198++// The fprintf macros for signed integers are:+#define PRId8 "d"+#define PRIi8 "i"+#define PRIdLEAST8 "d"+#define PRIiLEAST8 "i"+#define PRIdFAST8 "d"+#define PRIiFAST8 "i"++#define PRId16 "hd"+#define PRIi16 "hi"+#define PRIdLEAST16 "hd"+#define PRIiLEAST16 "hi"+#define PRIdFAST16 "hd"+#define PRIiFAST16 "hi"++#define PRId32 "I32d"+#define PRIi32 "I32i"+#define PRIdLEAST32 "I32d"+#define PRIiLEAST32 "I32i"+#define PRIdFAST32 "I32d"+#define PRIiFAST32 "I32i"++#define PRId64 "I64d"+#define PRIi64 "I64i"+#define PRIdLEAST64 "I64d"+#define PRIiLEAST64 "I64i"+#define PRIdFAST64 "I64d"+#define PRIiFAST64 "I64i"++#define PRIdMAX "I64d"+#define PRIiMAX "I64i"++#define PRIdPTR "Id"+#define PRIiPTR "Ii"++// The fprintf macros for unsigned integers are:+#define PRIo8 "o"+#define PRIu8 "u"+#define PRIx8 "x"+#define PRIX8 "X"+#define PRIoLEAST8 "o"+#define PRIuLEAST8 "u"+#define PRIxLEAST8 "x"+#define PRIXLEAST8 "X"+#define PRIoFAST8 "o"+#define PRIuFAST8 "u"+#define PRIxFAST8 "x"+#define PRIXFAST8 "X"++#define PRIo16 "ho"+#define PRIu16 "hu"+#define PRIx16 "hx"+#define PRIX16 "hX"+#define PRIoLEAST16 "ho"+#define PRIuLEAST16 "hu"+#define PRIxLEAST16 "hx"+#define PRIXLEAST16 "hX"+#define PRIoFAST16 "ho"+#define PRIuFAST16 "hu"+#define PRIxFAST16 "hx"+#define PRIXFAST16 "hX"++#define PRIo32 "I32o"+#define PRIu32 "I32u"+#define PRIx32 "I32x"+#define PRIX32 "I32X"+#define PRIoLEAST32 "I32o"+#define PRIuLEAST32 "I32u"+#define PRIxLEAST32 "I32x"+#define PRIXLEAST32 "I32X"+#define PRIoFAST32 "I32o"+#define PRIuFAST32 "I32u"+#define PRIxFAST32 "I32x"+#define PRIXFAST32 "I32X"++#define PRIo64 "I64o"+#define PRIu64 "I64u"+#define PRIx64 "I64x"+#define PRIX64 "I64X"+#define PRIoLEAST64 "I64o"+#define PRIuLEAST64 "I64u"+#define PRIxLEAST64 "I64x"+#define PRIXLEAST64 "I64X"+#define PRIoFAST64 "I64o"+#define PRIuFAST64 "I64u"+#define PRIxFAST64 "I64x"+#define PRIXFAST64 "I64X"++#define PRIoMAX "I64o"+#define PRIuMAX "I64u"+#define PRIxMAX "I64x"+#define PRIXMAX "I64X"++#define PRIoPTR "Io"+#define PRIuPTR "Iu"+#define PRIxPTR "Ix"+#define PRIXPTR "IX"++// The fscanf macros for signed integers are:+#define SCNd8 "d"+#define SCNi8 "i"+#define SCNdLEAST8 "d"+#define SCNiLEAST8 "i"+#define SCNdFAST8 "d"+#define SCNiFAST8 "i"++#define SCNd16 "hd"+#define SCNi16 "hi"+#define SCNdLEAST16 "hd"+#define SCNiLEAST16 "hi"+#define SCNdFAST16 "hd"+#define SCNiFAST16 "hi"++#define SCNd32 "ld"+#define SCNi32 "li"+#define SCNdLEAST32 "ld"+#define SCNiLEAST32 "li"+#define SCNdFAST32 "ld"+#define SCNiFAST32 "li"++#define SCNd64 "I64d"+#define SCNi64 "I64i"+#define SCNdLEAST64 "I64d"+#define SCNiLEAST64 "I64i"+#define SCNdFAST64 "I64d"+#define SCNiFAST64 "I64i"++#define SCNdMAX "I64d"+#define SCNiMAX "I64i"++#ifdef _WIN64 // [+# define SCNdPTR "I64d"+# define SCNiPTR "I64i"+#else // _WIN64 ][+# define SCNdPTR "ld"+# define SCNiPTR "li"+#endif // _WIN64 ]++// The fscanf macros for unsigned integers are:+#define SCNo8 "o"+#define SCNu8 "u"+#define SCNx8 "x"+#define SCNX8 "X"+#define SCNoLEAST8 "o"+#define SCNuLEAST8 "u"+#define SCNxLEAST8 "x"+#define SCNXLEAST8 "X"+#define SCNoFAST8 "o"+#define SCNuFAST8 "u"+#define SCNxFAST8 "x"+#define SCNXFAST8 "X"++#define SCNo16 "ho"+#define SCNu16 "hu"+#define SCNx16 "hx"+#define SCNX16 "hX"+#define SCNoLEAST16 "ho"+#define SCNuLEAST16 "hu"+#define SCNxLEAST16 "hx"+#define SCNXLEAST16 "hX"+#define SCNoFAST16 "ho"+#define SCNuFAST16 "hu"+#define SCNxFAST16 "hx"+#define SCNXFAST16 "hX"++#define SCNo32 "lo"+#define SCNu32 "lu"+#define SCNx32 "lx"+#define SCNX32 "lX"+#define SCNoLEAST32 "lo"+#define SCNuLEAST32 "lu"+#define SCNxLEAST32 "lx"+#define SCNXLEAST32 "lX"+#define SCNoFAST32 "lo"+#define SCNuFAST32 "lu"+#define SCNxFAST32 "lx"+#define SCNXFAST32 "lX"++#define SCNo64 "I64o"+#define SCNu64 "I64u"+#define SCNx64 "I64x"+#define SCNX64 "I64X"+#define SCNoLEAST64 "I64o"+#define SCNuLEAST64 "I64u"+#define SCNxLEAST64 "I64x"+#define SCNXLEAST64 "I64X"+#define SCNoFAST64 "I64o"+#define SCNuFAST64 "I64u"+#define SCNxFAST64 "I64x"+#define SCNXFAST64 "I64X"++#define SCNoMAX "I64o"+#define SCNuMAX "I64u"+#define SCNxMAX "I64x"+#define SCNXMAX "I64X"++#ifdef _WIN64 // [+# define SCNoPTR "I64o"+# define SCNuPTR "I64u"+# define SCNxPTR "I64x"+# define SCNXPTR "I64X"+#else // _WIN64 ][+# define SCNoPTR "lo"+# define SCNuPTR "lu"+# define SCNxPTR "lx"+# define SCNXPTR "lX"+#endif // _WIN64 ]++#endif // __STDC_FORMAT_MACROS ]++// 7.8.2 Functions for greatest-width integer types++// 7.8.2.1 The imaxabs function+#define imaxabs _abs64++// 7.8.2.2 The imaxdiv function++// This is modified version of div() function from Microsoft's div.c found+// in %MSVC.NET%\crt\src\div.c+#ifdef STATIC_IMAXDIV // [+static+#else // STATIC_IMAXDIV ][+_inline+#endif // STATIC_IMAXDIV ]+imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)+{+ imaxdiv_t result;++ result.quot = numer / denom;+ result.rem = numer % denom;++ if (numer < 0 && result.rem > 0) {+ // did division wrong; must fix up+ ++result.quot;+ result.rem -= denom;+ }++ return result;+}++// 7.8.2.3 The strtoimax and strtoumax functions+#define strtoimax _strtoi64+#define strtoumax _strtoui64++// 7.8.2.4 The wcstoimax and wcstoumax functions+#define wcstoimax _wcstoi64+#define wcstoumax _wcstoui64+++#endif // _MSC_INTTYPES_H_ ]
+ libgit2/include/git2/merge.h view
@@ -0,0 +1,35 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_merge_h__+#define INCLUDE_git_merge_h__++#include "common.h"+#include "types.h"+#include "oid.h"++/**+ * @file git2/merge.h+ * @brief Git merge-base routines+ * @defgroup git_revwalk Git merge-base routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Find a merge base between two commits+ *+ * @param out the OID of a merge base between 'one' and 'two'+ * @param repo the repository where the commits exist+ * @param one one of the commits+ * @param two the other commit+ */+GIT_EXTERN(int) git_merge_base(git_oid *out, git_repository *repo, git_oid *one, git_oid *two);++/** @} */+GIT_END_DECL+#endif
+ libgit2/include/git2/net.h view
@@ -0,0 +1,51 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_net_h__+#define INCLUDE_net_h__++#include "common.h"+#include "oid.h"+#include "types.h"++/**+ * @file git2/net.h+ * @brief Git networking declarations+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++#define GIT_DEFAULT_PORT "9418"++/*+ * We need this because we need to know whether we should call+ * git-upload-pack or git-receive-pack on the remote end when get_refs+ * gets called.+ */++#define GIT_DIR_FETCH 0+#define GIT_DIR_PUSH 1+++/**+ * Remote head description, given out on `ls` calls.+ */+struct git_remote_head {+ int local:1; /* available locally */+ git_oid oid;+ git_oid loid;+ char *name;+};++/**+ * Callback for listing the remote heads+ */+typedef int (*git_headlist_cb)(git_remote_head *, void *);++/** @} */+GIT_END_DECL+#endif
+ libgit2/include/git2/notes.h view
@@ -0,0 +1,139 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_note_h__+#define INCLUDE_git_note_h__++#include "oid.h"++/**+ * @file git2/notes.h+ * @brief Git notes management routines+ * @defgroup git_note Git notes management routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Read the note for an object+ *+ * The note must be freed manually by the user.+ *+ * @param note the note; NULL in case of error+ * @param repo the Git repository+ * @param notes_ref OID reference to use (optional); defaults to "refs/notes/commits"+ * @param oid OID of the object+ *+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_note_read(git_note **note, git_repository *repo,+ const char *notes_ref, const git_oid *oid);++/**+ * Get the note message+ *+ * @param note+ * @return the note message+ */+GIT_EXTERN(const char *) git_note_message(git_note *note);+++/**+ * Get the note object OID+ *+ * @param note+ * @return the note object OID+ */+GIT_EXTERN(const git_oid *) git_note_oid(git_note *note);+++/**+ * Add a note for an object+ *+ * @param oid pointer to store the OID (optional); NULL in case of error+ * @param repo the Git repository+ * @param author signature of the notes commit author+ * @param committer signature of the notes commit committer+ * @param notes_ref OID reference to update (optional); defaults to "refs/notes/commits"+ * @param oid The OID of the object+ * @param oid The note to add for object oid+ *+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_note_create(git_oid *out, git_repository *repo,+ git_signature *author, git_signature *committer,+ const char *notes_ref, const git_oid *oid,+ const char *note);+++/**+ * Remove the note for an object+ *+ * @param repo the Git repository+ * @param notes_ref OID reference to use (optional); defaults to "refs/notes/commits"+ * @param author signature of the notes commit author+ * @param committer signature of the notes commit committer+ * @param oid the oid which note's to be removed+ *+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_note_remove(git_repository *repo, const char *notes_ref,+ git_signature *author, git_signature *committer,+ const git_oid *oid);++/**+ * Free a git_note object+ *+ * @param note git_note object+ */+GIT_EXTERN(void) git_note_free(git_note *note);++/**+ * Get the default notes reference for a repository+ *+ * @param out Pointer to the default notes reference+ * @param repo The Git repository+ *+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_note_default_ref(const char **out, git_repository *repo);++/**+ * Basic components of a note+ *+ * - Oid of the blob containing the message+ * - Oid of the git object being annotated+ */+typedef struct {+ git_oid blob_oid;+ git_oid annotated_object_oid;+} git_note_data;++/**+ * Loop over all the notes within a specified namespace+ * and issue a callback for each one.+ *+ * @param repo Repository where to find the notes.+ *+ * @param notes_ref OID reference to read from (optional); defaults to "refs/notes/commits".+ *+ * @param note_cb Callback to invoke per found annotation.+ *+ * @param payload Extra parameter to callback function.+ *+ * @return 0 or an error code.+ */+GIT_EXTERN(int) git_note_foreach(+ git_repository *repo,+ const char *notes_ref,+ int (*note_cb)(git_note_data *note_data, void *payload),+ void *payload+);++/** @} */+GIT_END_DECL+#endif
libgit2/include/git2/object.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_object_h__ #define INCLUDE_git_object_h__@@ -42,7 +24,8 @@ * Lookup a reference to one of the objects in a repostory. * * The generated reference is owned by the repository and- * should not be freed by the user.+ * should be closed with the `git_object_free` method+ * instead of free'd manually. * * The 'type' parameter must match the type of the object * in the odb; the method will fail otherwise.@@ -55,57 +38,49 @@ * @param type the type of the object * @return a reference to the object */-GIT_EXTERN(int) git_object_lookup(git_object **object, git_repository *repo, const git_oid *id, git_otype type);--/**- * Create a new in-memory repository object with- * the given type.- *- * The object's attributes can be filled in using the- * corresponding setter methods.- *- * The object will be written back to given git_repository- * when the git_object_write() function is called; objects- * cannot be written to disk until all their main- * attributes have been properly filled.- *- * Objects are instantiated with no SHA1 id; their id- * will be automatically generated when writing to the- * repository.- *- * @param object pointer to the new object- * @parem repo Repository where the object belongs- * @param type Type of the object to be created- * @return the new object- */-GIT_EXTERN(int) git_object_new(git_object **object, git_repository *repo, git_otype type);-+GIT_EXTERN(int) git_object_lookup(+ git_object **object,+ git_repository *repo,+ const git_oid *id,+ git_otype type); /**- * Write back an object to disk.+ * Lookup a reference to one of the objects in a repostory,+ * given a prefix of its identifier (short id). *- * The object will be written to its corresponding- * repository.+ * The object obtained will be so that its identifier+ * matches the first 'len' hexadecimal characters+ * (packets of 4 bits) of the given 'id'.+ * 'len' must be at least GIT_OID_MINPREFIXLEN, and+ * long enough to identify a unique object matching+ * the prefix; otherwise the method will fail. *- * If the object has no changes since it was first- * read from the repository, no actions will take place.+ * The generated reference is owned by the repository and+ * should be closed with the `git_object_free` method+ * instead of free'd manually. *- * If the object has been modified since it was read from- * the repository, or it has been created from scratch- * in memory, it will be written to the repository and- * its SHA1 ID will be updated accordingly.+ * The 'type' parameter must match the type of the object+ * in the odb; the method will fail otherwise.+ * The special value 'GIT_OBJ_ANY' may be passed to let+ * the method guess the object's type. *- * @param object Git object to write back- * @return 0 on success; otherwise an error code+ * @param object_out pointer where to store the looked-up object+ * @param repo the repository to look up the object+ * @param id a short identifier for the object+ * @param len the length of the short identifier+ * @param type the type of the object+ * @return 0 or an error code */-GIT_EXTERN(int) git_object_write(git_object *object);+GIT_EXTERN(int) git_object_lookup_prefix(+ git_object **object_out,+ git_repository *repo,+ const git_oid *id,+ unsigned int len,+ git_otype type); /** * Get the id (SHA1) of a repository object *- * In-memory objects created by git_object_new() do not- * have a SHA1 ID until they are written on a repository.- * * @param obj the repository object * @return the SHA1 id */@@ -122,6 +97,12 @@ /** * Get the repository that owns this object *+ * Freeing or calling `git_repository_close` on the+ * returned pointer will invalidate the actual object.+ *+ * Any other operation may be run on the repository without+ * affecting the object.+ * * @param obj the object * @return the repository who owns this object */@@ -137,18 +118,12 @@ * by the repository. * * IMPORTANT:- * It is *not* necessary to call this method when you stop using- * an object, since all object memory is automatically reclaimed- * by the repository when it is freed.- *- * Forgetting to call `git_object_close` does not cause memory- * leaks, but it's is recommended to close as soon as possible- * the biggest objects (e.g. blobs) to prevent wasting memory- * space.+ * It *is* necessary to call this method when you stop using+ * an object. Failure to do so will cause a memory leak. * * @param object the object to close */-GIT_EXTERN(void) git_object_close(git_object *object);+GIT_EXTERN(void) git_object_free(git_object *object); /** * Convert an object type to it's string representation.
libgit2/include/git2/odb.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_odb_h__ #define INCLUDE_git_odb_h__@@ -28,6 +10,7 @@ #include "common.h" #include "types.h" #include "oid.h"+#include "odb_backend.h" /** * @file git2/odb.h@@ -45,9 +28,8 @@ * backend must be manually added using `git_odb_add_backend()` * * @param out location to store the database pointer, if opened.- * Set to NULL if the open failed.- * @return GIT_SUCCESS if the database was created; otherwise an error- * code describing why the open was not possible.+ * Set to NULL if the open failed.+ * @return 0 or an error code */ GIT_EXTERN(int) git_odb_new(git_odb **out); @@ -63,20 +45,23 @@ * contains a 'pack/' folder with the corresponding data * * @param out location to store the database pointer, if opened.- * Set to NULL if the open failed.+ * Set to NULL if the open failed. * @param objects_dir path of the backends' "objects" directory.- * @return GIT_SUCCESS if the database opened; otherwise an error- * code describing why the open was not possible.+ * @return 0 or an error code */ GIT_EXTERN(int) git_odb_open(git_odb **out, const char *objects_dir); /** * Add a custom backend to an existing Object DB *+ * The backends are checked in relative ordering, based on the+ * value of the `priority` parameter.+ * * Read <odb_backends.h> for more information. * * @param odb database to add the backend to- * @paramm backend pointer to a git_odb_backend instance+ * @param backend pointer to a git_odb_backend instance+ * @param priority Value for ordering the backends queue * @return 0 on sucess; error code otherwise */ GIT_EXTERN(int) git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority);@@ -88,73 +73,93 @@ * Alternate backends are always checked for objects *after* * all the main backends have been exhausted. *+ * The backends are checked in relative ordering, based on the+ * value of the `priority` parameter.+ * * Writing is disabled on alternate backends. * * Read <odb_backends.h> for more information. * * @param odb database to add the backend to- * @paramm backend pointer to a git_odb_backend instance+ * @param backend pointer to a git_odb_backend instance+ * @param priority Value for ordering the backends queue * @return 0 on sucess; error code otherwise */ GIT_EXTERN(int) git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority); /** * Close an open object database.- * @param db database pointer to close. If NULL no action is taken.+ *+ * @param db database pointer to close. If NULL no action is taken. */-GIT_EXTERN(void) git_odb_close(git_odb *db);--/** An object read from the database. */-typedef struct {- void *data; /**< Raw, decompressed object data. */- size_t len; /**< Total number of bytes in data. */- git_otype type; /**< Type of this object. */-} git_rawobj;+GIT_EXTERN(void) git_odb_free(git_odb *db); /** * Read an object from the database. *- * If GIT_ENOTFOUND then out->data is set to NULL.+ * This method queries all available ODB backends+ * trying to read the given OID. *- * @param out object descriptor to populate upon reading.+ * The returned object is reference counted and+ * internally cached, so it should be closed+ * by the user once it's no longer in use.+ *+ * @param out pointer where to store the read object * @param db database to search for the object in. * @param id identity of the object to read. * @return- * - GIT_SUCCESS if the object was read;+ * - 0 if the object was read; * - GIT_ENOTFOUND if the object is not in the database. */-GIT_EXTERN(int) git_odb_read(git_rawobj *out, git_odb *db, const git_oid *id);+GIT_EXTERN(int) git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id); /**- * Read the header of an object from the database, without- * reading its full contents.+ * Read an object from the database, given a prefix+ * of its identifier. *- * Only the 'type' and 'len' fields of the git_rawobj structure- * are filled. The 'data' pointer will always be NULL.+ * This method queries all available ODB backends+ * trying to match the 'len' first hexadecimal+ * characters of the 'short_id'.+ * The remaining (GIT_OID_HEXSZ-len)*4 bits of+ * 'short_id' must be 0s.+ * 'len' must be at least GIT_OID_MINPREFIXLEN,+ * and the prefix must be long enough to identify+ * a unique object in all the backends; the+ * method will fail otherwise. *- * The raw object pointed by 'out' doesn't need to be manually- * closed with git_rawobj_close().+ * The returned object is reference counted and+ * internally cached, so it should be closed+ * by the user once it's no longer in use. *- * @param out object descriptor to populate upon reading.+ * @param out pointer where to store the read object * @param db database to search for the object in.- * @param id identity of the object to read.- * @return- * - GIT_SUCCESS if the object was read;- * - GIT_ENOTFOUND if the object is not in the database.+ * @param short_id a prefix of the id of the object to read.+ * @param len the length of the prefix+ * @return 0 if the object was read;+ * GIT_ENOTFOUND if the object is not in the database.+ * GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix) */-GIT_EXTERN(int) git_odb_read_header(git_rawobj *out, git_odb *db, const git_oid *id);+GIT_EXTERN(int) git_odb_read_prefix(git_odb_object **out, git_odb *db, const git_oid *short_id, unsigned int len); /**- * Write an object to the database.+ * Read the header of an object from the database, without+ * reading its full contents. *- * @param id identity of the object written.- * @param db database to which the object should be written.- * @param obj object descriptor for the object to write.+ * The header includes the length and the type of an object.+ *+ * Note that most backends do not support reading only the header+ * of an object, so the whole object will be read and then the+ * header will be returned.+ *+ * @param len_p pointer where to store the length+ * @param type_p pointer where to store the type+ * @param db database to search for the object in.+ * @param id identity of the object to read. * @return- * - GIT_SUCCESS if the object was written;- * - GIT_ERROR otherwise.+ * - 0 if the object was read;+ * - GIT_ENOTFOUND if the object is not in the database. */-GIT_EXTERN(int) git_odb_write(git_oid *id, git_odb *db, git_rawobj *obj);+GIT_EXTERN(int) git_odb_read_header(size_t *len_p, git_otype *type_p, git_odb *db, const git_oid *id); /** * Determine if the given object can be found in the object database.@@ -162,39 +167,164 @@ * @param db database to be searched for the given object. * @param id the object to search for. * @return- * - true, if the object was found- * - false, otherwise+ * - 1, if the object was found+ * - 0, otherwise */ GIT_EXTERN(int) git_odb_exists(git_odb *db, const git_oid *id); -+/**+ * Write an object directly into the ODB+ *+ * This method writes a full object straight into the ODB.+ * For most cases, it is preferred to write objects through a write+ * stream, which is both faster and less memory intensive, specially+ * for big objects.+ *+ * This method is provided for compatibility with custom backends+ * which are not able to support streaming writes+ *+ * @param oid pointer to store the OID result of the write+ * @param odb object database where to store the object+ * @param data buffer with the data to storr+ * @param len size of the buffer+ * @param type type of the data to store+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_odb_write(git_oid *oid, git_odb *odb, const void *data, size_t len, git_otype type); +/**+ * Open a stream to write an object into the ODB+ *+ * The type and final length of the object must be specified+ * when opening the stream.+ *+ * The returned stream will be of type `GIT_STREAM_WRONLY` and+ * will have the following methods:+ *+ * - stream->write: write `n` bytes into the stream+ * - stream->finalize_write: close the stream and store the object in+ * the odb+ * - stream->free: free the stream+ *+ * The streaming write won't be effective until `stream->finalize_write`+ * is called and returns without an error+ *+ * The stream must always be free'd or will leak memory.+ *+ * @see git_odb_stream+ *+ * @param stream pointer where to store the stream+ * @param db object database where the stream will write+ * @param size final size of the object that will be written+ * @param type type of the object that will be written+ * @return 0 if the stream was created; error code otherwise+ */+GIT_EXTERN(int) git_odb_open_wstream(git_odb_stream **stream, git_odb *db, size_t size, git_otype type); +/**+ * Open a stream to read an object from the ODB+ *+ * Note that most backends do *not* support streaming reads+ * because they store their objects as compressed/delta'ed blobs.+ *+ * It's recommended to use `git_odb_read` instead, which is+ * assured to work on all backends.+ *+ * The returned stream will be of type `GIT_STREAM_RDONLY` and+ * will have the following methods:+ *+ * - stream->read: read `n` bytes from the stream+ * - stream->free: free the stream+ *+ * The stream must always be free'd or will leak memory.+ *+ * @see git_odb_stream+ *+ * @param stream pointer where to store the stream+ * @param db object database where the stream will read from+ * @param oid oid of the object the stream will read from+ * @return 0 if the stream was created; error code otherwise+ */+GIT_EXTERN(int) git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oid); /**- * Determine the object-ID (sha1 hash) of the given git_rawobj.+ * Determine the object-ID (sha1 hash) of a data buffer *- * The input obj must be a valid loose object type and the data- * pointer must not be NULL, unless the len field is also zero.+ * The resulting SHA-1 OID will the itentifier for the data+ * buffer as if the data buffer it were to written to the ODB. * * @param id the resulting object-ID.- * @param obj the object whose hash is to be determined.- * @return- * - GIT_SUCCESS if the object-ID was correctly determined.- * - GIT_ERROR if the given object is malformed.+ * @param data data to hash+ * @param len size of the data+ * @param type of the data to hash+ * @return 0 or an error code */-GIT_EXTERN(int) git_rawobj_hash(git_oid *id, git_rawobj *obj);+GIT_EXTERN(int) git_odb_hash(git_oid *id, const void *data, size_t len, git_otype type); /**- * Release all memory used by the obj structure.+ * Read a file from disk and fill a git_oid with the object id+ * that the file would have if it were written to the Object+ * Database as an object of the given type. Similar functionality+ * to git.git's `git hash-object` without the `-w` flag. *- * As a result of this call, obj->data will be set to NULL.+ * @param out oid structure the result is written into.+ * @param path file to read and determine object id for+ * @param type the type of the object that will be hashed+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_odb_hashfile(git_oid *out, const char *path, git_otype type);++/**+ * Close an ODB object *- * If obj->data is already NULL, nothing happens.+ * This method must always be called once a `git_odb_object` is no+ * longer needed, otherwise memory will leak. *- * @param obj object descriptor to free.+ * @param object object to close */-GIT_EXTERN(void) git_rawobj_close(git_rawobj *obj);+GIT_EXTERN(void) git_odb_object_free(git_odb_object *object);++/**+ * Return the OID of an ODB object+ *+ * This is the OID from which the object was read from+ *+ * @param object the object+ * @return a pointer to the OID+ */+GIT_EXTERN(const git_oid *) git_odb_object_id(git_odb_object *object);++/**+ * Return the data of an ODB object+ *+ * This is the uncompressed, raw data as read from the ODB,+ * without the leading header.+ *+ * This pointer is owned by the object and shall not be free'd.+ *+ * @param object the object+ * @return a pointer to the data+ */+GIT_EXTERN(const void *) git_odb_object_data(git_odb_object *object);++/**+ * Return the size of an ODB object+ *+ * This is the real size of the `data` buffer, not the+ * actual size of the object.+ *+ * @param object the object+ * @return the size+ */+GIT_EXTERN(size_t) git_odb_object_size(git_odb_object *object);++/**+ * Return the type of an ODB object+ *+ * @param object the object+ * @return the type+ */+GIT_EXTERN(git_otype) git_odb_object_type(git_odb_object *object); /** @} */ GIT_END_DECL
libgit2/include/git2/odb_backend.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_odb_backend_h__ #define INCLUDE_git_odb_backend_h__@@ -28,7 +10,6 @@ #include "common.h" #include "types.h" #include "oid.h"-#include "odb.h" /** * @file git2/backend.h@@ -39,25 +20,53 @@ */ GIT_BEGIN_DECL +struct git_odb_stream;+ /** An instance for a custom backend */ struct git_odb_backend { git_odb *odb; int (* read)(- git_rawobj *,+ void **, size_t *, git_otype *, struct git_odb_backend *, const git_oid *); + /* To find a unique object given a prefix+ * of its oid.+ * The oid given must be so that the+ * remaining (GIT_OID_HEXSZ - len)*4 bits+ * are 0s.+ */+ int (* read_prefix)(+ git_oid *,+ void **, size_t *, git_otype *,+ struct git_odb_backend *,+ const git_oid *,+ unsigned int);+ int (* read_header)(- git_rawobj *,+ size_t *, git_otype *, struct git_odb_backend *, const git_oid *); int (* write)(- git_oid *id,+ git_oid *, struct git_odb_backend *,- git_rawobj *obj);+ const void *,+ size_t,+ git_otype); + int (* writestream)(+ struct git_odb_stream **,+ struct git_odb_backend *,+ size_t,+ git_otype);++ int (* readstream)(+ struct git_odb_stream **,+ struct git_odb_backend *,+ const git_oid *);+ int (* exists)( struct git_odb_backend *, const git_oid *);@@ -65,12 +74,26 @@ void (* free)(struct git_odb_backend *); }; -GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir);-GIT_EXTERN(int) git_odb_backend_loose(git_odb_backend **backend_out, const char *objects_dir);+/** Streaming mode */+enum {+ GIT_STREAM_RDONLY = (1 << 1),+ GIT_STREAM_WRONLY = (1 << 2),+ GIT_STREAM_RW = (GIT_STREAM_RDONLY | GIT_STREAM_WRONLY),+}; -#ifdef GIT2_SQLITE_BACKEND-GIT_EXTERN(int) git_odb_backend_sqlite(git_odb_backend **backend_out, const char *sqlite_db);-#endif+/** A stream to read/write from a backend */+struct git_odb_stream {+ struct git_odb_backend *backend;+ int mode;++ int (*read)(struct git_odb_stream *stream, char *buffer, size_t len);+ int (*write)(struct git_odb_stream *stream, const char *buffer, size_t len);+ int (*finalize_write)(git_oid *oid_p, struct git_odb_stream *stream);+ void (*free)(struct git_odb_stream *stream);+};++GIT_EXTERN(int) git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir);+GIT_EXTERN(int) git_odb_backend_loose(git_odb_backend **backend_out, const char *objects_dir, int compression_level, int do_fsync); GIT_END_DECL
libgit2/include/git2/oid.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_oid_h__ #define INCLUDE_git_oid_h__@@ -43,66 +25,88 @@ /** Size (in bytes) of a hex formatted oid */ #define GIT_OID_HEXSZ (GIT_OID_RAWSZ * 2) +/** Minimum length (in number of hex characters,+ * i.e. packets of 4 bits) of an oid prefix */+#define GIT_OID_MINPREFIXLEN 4+ /** Unique identity of any object (commit, tree, blob, tag). */-typedef struct {+typedef struct _git_oid git_oid;+struct _git_oid { /** raw binary formatted id */ unsigned char id[GIT_OID_RAWSZ];-} git_oid;+}; /** * Parse a hex formatted object id into a git_oid.+ * * @param out oid structure the result is written into. * @param str input hex string; must be pointing at the start of- * the hex sequence and have at least the number of bytes- * needed for an oid encoded in hex (40 bytes).- * @return GIT_SUCCESS if valid; GIT_ENOTOID on failure.+ * the hex sequence and have at least the number of bytes+ * needed for an oid encoded in hex (40 bytes).+ * @return 0 or an error code */-GIT_EXTERN(int) git_oid_mkstr(git_oid *out, const char *str);+GIT_EXTERN(int) git_oid_fromstr(git_oid *out, const char *str); /**+ * Parse N characters of a hex formatted object id into a git_oid+ *+ * If N is odd, N-1 characters will be parsed instead.+ * The remaining space in the git_oid will be set to zero.+ *+ * @param out oid structure the result is written into.+ * @param str input hex string of at least size `length`+ * @param length length of the input string+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_oid_fromstrn(git_oid *out, const char *str, size_t length);++/** * Copy an already raw oid into a git_oid structure.+ * * @param out oid structure the result is written into. * @param raw the raw input bytes to be copied. */-GIT_EXTERN(void) git_oid_mkraw(git_oid *out, const unsigned char *raw);+GIT_EXTERN(void) git_oid_fromraw(git_oid *out, const unsigned char *raw); /** * Format a git_oid into a hex string.+ * * @param str output hex string; must be pointing at the start of- * the hex sequence and have at least the number of bytes- * needed for an oid encoded in hex (40 bytes). Only the- * oid digits are written; a '\\0' terminator must be added- * by the caller if it is required.+ * the hex sequence and have at least the number of bytes+ * needed for an oid encoded in hex (40 bytes). Only the+ * oid digits are written; a '\\0' terminator must be added+ * by the caller if it is required. * @param oid oid structure to format. */ GIT_EXTERN(void) git_oid_fmt(char *str, const git_oid *oid); /** * Format a git_oid into a loose-object path string.- * <p>+ * * The resulting string is "aa/...", where "aa" is the first two * hex digitis of the oid and "..." is the remaining 38 digits. * * @param str output hex string; must be pointing at the start of- * the hex sequence and have at least the number of bytes- * needed for an oid encoded in hex (41 bytes). Only the- * oid digits are written; a '\\0' terminator must be added- * by the caller if it is required.+ * the hex sequence and have at least the number of bytes+ * needed for an oid encoded in hex (41 bytes). Only the+ * oid digits are written; a '\\0' terminator must be added+ * by the caller if it is required. * @param oid oid structure to format. */ GIT_EXTERN(void) git_oid_pathfmt(char *str, const git_oid *oid); /**- * Format a gid_oid into a newly allocated c-string.+ * Format a git_oid into a newly allocated c-string.+ * * @param oid the oid structure to format- * @return the c-string; NULL if memory is exhausted. Caller must- * deallocate the string with free().+ * @return the c-string; NULL if memory is exhausted. Caller must+ * deallocate the string with git__free(). */ GIT_EXTERN(char *) git_oid_allocfmt(const git_oid *oid); /** * Format a git_oid into a buffer as a hex format c-string.- * <p>+ * * If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting * oid c-string will be truncated to n-1 characters. If there are * any input parameter errors (out == NULL, n == 0, oid == NULL),@@ -113,12 +117,13 @@ * @param n the size of the out buffer. * @param oid the oid structure to format. * @return the out buffer pointer, assuming no input parameter- * errors, otherwise a pointer to an empty string.+ * errors, otherwise a pointer to an empty string. */-GIT_EXTERN(char *) git_oid_to_string(char *out, size_t n, const git_oid *oid);+GIT_EXTERN(char *) git_oid_tostr(char *out, size_t n, const git_oid *oid); /** * Copy an oid from one structure to another.+ * * @param out oid structure the result is written into. * @param src oid structure to copy from. */@@ -126,6 +131,7 @@ /** * Compare two oid structures.+ * * @param a first oid structure. * @param b second oid structure. * @return <0, 0, >0 if a < b, a == b, a > b.@@ -133,6 +139,32 @@ GIT_EXTERN(int) git_oid_cmp(const git_oid *a, const git_oid *b); /**+ * Compare the first 'len' hexadecimal characters (packets of 4 bits)+ * of two oid structures.+ *+ * @param a first oid structure.+ * @param b second oid structure.+ * @param len the number of hex chars to compare+ * @return 0 in case of a match+ */+GIT_EXTERN(int) git_oid_ncmp(const git_oid *a, const git_oid *b, unsigned int len);++/**+ * Check if an oid equals an hex formatted object id.+ *+ * @param a oid structure.+ * @param str input hex string of an object id.+ * @return GIT_ENOTOID if str is not a valid hex string,+ * 0 in case of a match, GIT_ERROR otherwise.+ */+GIT_EXTERN(int) git_oid_streq(const git_oid *a, const char *str);++/**+ * Check is an oid is all zeros.+ */+GIT_EXTERN(int) git_oid_iszero(const git_oid *a);++/** * OID Shortener object */ typedef struct git_oid_shorten git_oid_shorten;@@ -151,7 +183,7 @@ * be unique. * @return a `git_oid_shorten` instance, NULL if OOM */-git_oid_shorten *git_oid_shorten_new(size_t min_length);+GIT_EXTERN(git_oid_shorten *) git_oid_shorten_new(size_t min_length); /** * Add a new OID to set of shortened OIDs and calculate@@ -177,14 +209,14 @@ * added so far to the set; or an error code (<0) if an * error occurs. */-int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid);+GIT_EXTERN(int) git_oid_shorten_add(git_oid_shorten *os, const char *text_oid); /** * Free an OID shortener instance- * + * * @param os a `git_oid_shorten` instance */-void git_oid_shorten_free(git_oid_shorten *os);+GIT_EXTERN(void) git_oid_shorten_free(git_oid_shorten *os); /** @} */ GIT_END_DECL
+ libgit2/include/git2/reflog.h view
@@ -0,0 +1,128 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_reflog_h__+#define INCLUDE_git_reflog_h__++#include "common.h"+#include "types.h"+#include "oid.h"++/**+ * @file git2/reflog.h+ * @brief Git reflog management routines+ * @defgroup git_reflog Git reflog management routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Read the reflog for the given reference+ *+ * The reflog must be freed manually by using+ * git_reflog_free().+ *+ * @param reflog pointer to reflog+ * @param ref reference to read the reflog for+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_reflog_read(git_reflog **reflog, git_reference *ref);++/**+ * Write a new reflog for the given reference+ *+ * If there is no reflog file for the given+ * reference yet, it will be created.+ *+ * `oid_old` may be NULL in case it's a new reference.+ *+ * `msg` is optional and can be NULL.+ *+ * @param ref the changed reference+ * @param oid_old the OID the reference was pointing to+ * @param committer the signature of the committer+ * @param msg the reflog message+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_reflog_write(git_reference *ref, const git_oid *oid_old, const git_signature *committer, const char *msg);++/**+ * Rename the reflog for the given reference+ *+ * @param ref the reference+ * @param new_name the new name of the reference+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_reflog_rename(git_reference *ref, const char *new_name);++/**+ * Delete the reflog for the given reference+ *+ * @param ref the reference+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_reflog_delete(git_reference *ref);++/**+ * Get the number of log entries in a reflog+ *+ * @param reflog the previously loaded reflog+ * @return the number of log entries+ */+GIT_EXTERN(unsigned int) git_reflog_entrycount(git_reflog *reflog);++/**+ * Lookup an entry by its index+ *+ * @param reflog a previously loaded reflog+ * @param idx the position to lookup+ * @return the entry; NULL if not found+ */+GIT_EXTERN(const git_reflog_entry *) git_reflog_entry_byindex(git_reflog *reflog, unsigned int idx);++/**+ * Get the old oid+ *+ * @param entry a reflog entry+ * @return the old oid+ */+GIT_EXTERN(const git_oid *) git_reflog_entry_oidold(const git_reflog_entry *entry);++/**+ * Get the new oid+ *+ * @param entry a reflog entry+ * @return the new oid at this time+ */+GIT_EXTERN(const git_oid *) git_reflog_entry_oidnew(const git_reflog_entry *entry);++/**+ * Get the committer of this entry+ *+ * @param entry a reflog entry+ * @return the committer+ */+GIT_EXTERN(git_signature *) git_reflog_entry_committer(const git_reflog_entry *entry);++/**+ * Get the log msg+ *+ * @param entry a reflog entry+ * @return the log msg+ */+GIT_EXTERN(char *) git_reflog_entry_msg(const git_reflog_entry *entry);++/**+ * Free the reflog+ *+ * @param reflog reflog to free+ */+GIT_EXTERN(void) git_reflog_free(git_reflog *reflog);++/** @} */+GIT_END_DECL+#endif
libgit2/include/git2/refs.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_refs_h__ #define INCLUDE_git_refs_h__@@ -41,32 +23,45 @@ /** * Lookup a reference by its name in a repository. *- * The generated reference is owned by the repository and- * should not be freed by the user.+ * The generated reference must be freed by the user. * * @param reference_out pointer to the looked-up reference * @param repo the repository to look up the reference * @param name the long name for the reference (e.g. HEAD, ref/heads/master, refs/tags/v0.1.0, ...)- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_reference_lookup(git_reference **reference_out, git_repository *repo, const char *name); /**+ * Lookup a reference by name and resolve immediately to OID.+ *+ * @param oid Pointer to oid to be filled in+ * @param repo The repository in which to look up the reference+ * @param name The long name for the reference+ * @return 0 on success, -1 if name could not be resolved+ */+GIT_EXTERN(int) git_reference_name_to_oid(+ git_oid *out, git_repository *repo, const char *name);++/** * Create a new symbolic reference. * * The reference will be created in the repository and written * to the disk. *- * This reference is owned by the repository and shall not- * be free'd by the user.+ * The generated reference must be freed by the user. *+ * If `force` is true and there already exists a reference+ * with the same name, it will be overwritten.+ * * @param ref_out Pointer to the newly created reference * @param repo Repository where that reference will live * @param name The name of the reference * @param target The target of the reference- * @return 0 on success; error code otherwise+ * @param force Overwrite existing references+ * @return 0 or an error code */-GIT_EXTERN(int) git_reference_create_symbolic(git_reference **ref_out, git_repository *repo, const char *name, const char *target);+GIT_EXTERN(int) git_reference_create_symbolic(git_reference **ref_out, git_repository *repo, const char *name, const char *target, int force); /** * Create a new object id reference.@@ -74,20 +69,23 @@ * The reference will be created in the repository and written * to the disk. *- * This reference is owned by the repository and shall not- * be free'd by the user.+ * The generated reference must be freed by the user. *+ * If `force` is true and there already exists a reference+ * with the same name, it will be overwritten.+ * * @param ref_out Pointer to the newly created reference * @param repo Repository where that reference will live * @param name The name of the reference * @param id The object id pointed to by the reference.- * @return 0 on success; error code otherwise+ * @param force Overwrite existing references+ * @return 0 or an error code */-GIT_EXTERN(int) git_reference_create_oid(git_reference **ref_out, git_repository *repo, const char *name, const git_oid *id);+GIT_EXTERN(int) git_reference_create_oid(git_reference **ref_out, git_repository *repo, const char *name, const git_oid *id, int force); /** * Get the OID pointed to by a reference.- * + * * Only available if the reference is direct (i.e. not symbolic) * * @param ref The reference@@ -97,7 +95,7 @@ /** * Get full name to the reference pointed by this reference- * + * * Only available if the reference is symbolic * * @param ref The reference@@ -113,7 +111,7 @@ * @param ref The reference * @return the type */-GIT_EXTERN(git_rtype) git_reference_type(git_reference *ref);+GIT_EXTERN(git_ref_t) git_reference_type(git_reference *ref); /** * Get the full name of a reference@@ -124,17 +122,22 @@ GIT_EXTERN(const char *) git_reference_name(git_reference *ref); /**- * Resolve a symbolic reference + * Resolve a symbolic reference * * Thie method iteratively peels a symbolic reference * until it resolves to a direct reference to an OID. *+ * The peeled reference is returned in the `resolved_ref`+ * argument, and must be freed manually once it's no longer+ * needed.+ * * If a direct reference is passed as an argument,- * that reference is returned immediately+ * a copy of that reference is returned. This copy must+ * be manually freed too. * * @param resolved_ref Pointer to the peeled reference * @param ref The reference- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_reference_resolve(git_reference **resolved_ref, git_reference *ref); @@ -157,7 +160,7 @@ * * @param ref The reference * @param target The new target for the reference- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_reference_set_target(git_reference *ref, const char *target); @@ -171,8 +174,8 @@ * memory and on disk. * * @param ref The reference- * @param target The new target OID for the reference- * @return 0 on success; error code otherwise+ * @param id The new target OID for the reference+ * @return 0 or an error code */ GIT_EXTERN(int) git_reference_set_oid(git_reference *ref, const git_oid *id); @@ -183,11 +186,26 @@ * The new name will be checked for validity and may be * modified into a normalized form. *- * The refernece will be immediately renamed in-memory+ * The given git_reference will be updated in place.+ *+ * The reference will be immediately renamed in-memory * and on disk. *+ * If the `force` flag is not enabled, and there's already+ * a reference with the given name, the renaming will fail.+ *+ * IMPORTANT:+ * The user needs to write a proper reflog entry if the+ * reflog is enabled for the repository. We only rename+ * the reflog if it exists.+ *+ * @param ref The reference to rename+ * @param new_name The new name for the reference+ * @param force Overwrite an existing reference+ * @return 0 or an error code+ * */-GIT_EXTERN(int) git_reference_rename(git_reference *ref, const char *new_name);+GIT_EXTERN(int) git_reference_rename(git_reference *ref, const char *new_name, int force); /** * Delete an existing reference@@ -197,6 +215,8 @@ * The reference will be immediately removed on disk and from * memory. The given reference pointer will no longer be valid. *+ * @param ref The reference to remove+ * @return 0 or an error code */ GIT_EXTERN(int) git_reference_delete(git_reference *ref); @@ -204,17 +224,14 @@ * Pack all the loose references in the repository * * This method will load into the cache all the loose- * references on the repository and update the + * references on the repository and update the * `packed-refs` file with them. * * Once the `packed-refs` file has been written properly, * the loose references will be removed from disk. *- * WARNING: calling this method may invalidate any existing- * references previously loaded on the cache.- * * @param repo Repository where the loose refs will be packed- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_reference_packall(git_repository *repo); @@ -237,9 +254,75 @@ * @param repo Repository where to find the refs * @param list_flags Filtering flags for the reference * listing.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */-GIT_EXTERN(int) git_reference_listall(git_strarray *array, git_repository *repo, unsigned int list_flags);+GIT_EXTERN(int) git_reference_list(git_strarray *array, git_repository *repo, unsigned int list_flags);+++/**+ * Perform an operation on each reference in the repository+ *+ * The processed references may be filtered by type, or using+ * a bitwise OR of several types. Use the magic value+ * `GIT_REF_LISTALL` to obtain all references, including+ * packed ones.+ *+ * The `callback` function will be called for each of the references+ * in the repository, and will receive the name of the reference and+ * the `payload` value passed to this method.+ *+ * @param repo Repository where to find the refs+ * @param list_flags Filtering flags for the reference+ * listing.+ * @param callback Function which will be called for every listed ref+ * @param payload Additional data to pass to the callback+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_reference_foreach(git_repository *repo, unsigned int list_flags, int (*callback)(const char *, void *), void *payload);++/**+ * Check if a reference has been loaded from a packfile+ *+ * @param ref A git reference+ * @return 0 in case it's not packed; 1 otherwise+ */+GIT_EXTERN(int) git_reference_is_packed(git_reference *ref);++/**+ * Reload a reference from disk+ *+ * Reference pointers may become outdated if the Git+ * repository is accessed simultaneously by other clients+ * whilt the library is open.+ *+ * This method forces a reload of the reference from disk,+ * to ensure that the provided information is still+ * reliable.+ *+ * If the reload fails (e.g. the reference no longer exists+ * on disk, or has become corrupted), an error code will be+ * returned and the reference pointer will be invalidated.+ *+ * @param ref The reference to reload+ * @return 0 on success, or an error code+ */+GIT_EXTERN(int) git_reference_reload(git_reference *ref);++/**+ * Free the given reference+ *+ * @param ref git_reference+ */+GIT_EXTERN(void) git_reference_free(git_reference *ref);++/**+ * Compare two references.+ *+ * @param ref1 The first git_reference+ * @param ref2 The second git_reference+ * @return 0 if the same, else a stable but meaningless ordering.+ */+GIT_EXTERN(int) git_reference_cmp(git_reference *ref1, git_reference *ref2); /** @} */ GIT_END_DECL
+ libgit2/include/git2/refspec.h view
@@ -0,0 +1,60 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_refspec_h__+#define INCLUDE_git_refspec_h__++#include "common.h"+#include "types.h"++/**+ * @file git2/refspec.h+ * @brief Git refspec attributes+ * @defgroup git_refspec Git refspec attributes+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Get the source specifier+ *+ * @param refspec the refspec+ * @return the refspec's source specifier+ */+GIT_EXTERN(const char *) git_refspec_src(const git_refspec *refspec);++/**+ * Get the destination specifier+ *+ * @param refspec the refspec+ * @return the refspec's destination specifier+ */+GIT_EXTERN(const char *) git_refspec_dst(const git_refspec *refspec);++/**+ * Check if a refspec's source descriptor matches a reference + *+ * @param refspec the refspec+ * @param refname the name of the reference to check+ * @return 1 if the refspec matches, 0 otherwise+ */+GIT_EXTERN(int) git_refspec_src_matches(const git_refspec *refspec, const char *refname);++/**+ * Transform a reference to its target following the refspec's rules+ *+ * @param out where to store the target name+ * @param outlen the size ouf the `out` buffer+ * @param spec the refspec+ * @param name the name of the reference to transform+ * @return 0, GIT_EBUFS or another error+ */+GIT_EXTERN(int) git_refspec_transform(char *out, size_t outlen, const git_refspec *spec, const char *name);++GIT_END_DECL++#endif
+ libgit2/include/git2/remote.h view
@@ -0,0 +1,234 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_remote_h__+#define INCLUDE_git_remote_h__++#include "common.h"+#include "repository.h"+#include "refspec.h"+#include "net.h"+#include "indexer.h"++/**+ * @file git2/remote.h+ * @brief Git remote management functions+ * @defgroup git_remote remote management functions+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/*+ * TODO: This functions still need to be implemented:+ * - _listcb/_foreach+ * - _add+ * - _rename+ * - _del (needs support from config)+ */++/**+ * Create a remote in memory+ *+ * Create a remote with the default refspecs in memory. You can use+ * this when you have a URL instead of a remote's name.+ *+ * @param out pointer to the new remote object+ * @param repo the associtated repository+ * @param name the remote's name+ * @param url the remote repository's URL+ * @param fetch the fetch refspec to use for this remote+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_new(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch);++/**+ * Get the information for a particular remote+ *+ * @param out pointer to the new remote object+ * @param cfg the repository's configuration+ * @param name the remote's name+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_load(git_remote **out, git_repository *repo, const char *name);++/**+ * Save a remote to its repository's configuration+ *+ * @param remote the remote to save to config+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_save(const git_remote *remote);++/**+ * Get the remote's name+ *+ * @param remote the remote+ * @return a pointer to the name+ */+GIT_EXTERN(const char *) git_remote_name(git_remote *remote);++/**+ * Get the remote's url+ *+ * @param remote the remote+ * @return a pointer to the url+ */+GIT_EXTERN(const char *) git_remote_url(git_remote *remote);++/**+ * Set the remote's fetch refspec+ *+ * @param remote the remote+ * @apram spec the new fetch refspec+ * @return 0 or an error value+ */+GIT_EXTERN(int) git_remote_set_fetchspec(git_remote *remote, const char *spec);++/**+ * Get the fetch refspec+ *+ * @param remote the remote+ * @return a pointer to the fetch refspec or NULL if it doesn't exist+ */+GIT_EXTERN(const git_refspec *) git_remote_fetchspec(git_remote *remote);++/**+ * Set the remote's push refspec+ *+ * @param remote the remote+ * @apram spec the new push refspec+ * @return 0 or an error value+ */+GIT_EXTERN(int) git_remote_set_pushspec(git_remote *remote, const char *spec);++/**+ * Get the push refspec+ *+ * @param remote the remote+ * @return a pointer to the push refspec or NULL if it doesn't exist+ */++GIT_EXTERN(const git_refspec *) git_remote_pushspec(git_remote *remote);++/**+ * Open a connection to a remote+ *+ * The transport is selected based on the URL. The direction argument+ * is due to a limitation of the git protocol (over TCP or SSH) which+ * starts up a specific binary which can only do the one or the other.+ *+ * @param remote the remote to connect to+ * @param direction whether you want to receive or send data+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_connect(git_remote *remote, int direction);++/**+ * Get a list of refs at the remote+ *+ * The remote (or more exactly its transport) must be connected. The+ * memory belongs to the remote.+ *+ * @param refs where to store the refs+ * @param remote the remote+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_ls(git_remote *remote, git_headlist_cb list_cb, void *payload);++/**+ * Download the packfile+ *+ * Negotiate what objects should be downloaded and download the+ * packfile with those objects. The packfile is downloaded with a+ * temporary filename, as it's final name is not known yet. If there+ * was no packfile needed (all the objects were available locally),+ * filename will be NULL and the function will return success.+ *+ * @param remote the remote to download from+ * @param filename where to store the temproray filename+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_download(git_remote *remote, git_off_t *bytes, git_indexer_stats *stats);++/**+ * Check whether the remote is connected+ *+ * Check whether the remote's underlying transport is connected to the+ * remote host.+ *+ * @return 1 if it's connected, 0 otherwise.+ */+GIT_EXTERN(int) git_remote_connected(git_remote *remote);++/**+ * Disconnect from the remote+ *+ * Close the connection to the remote and free the underlying+ * transport.+ *+ * @param remote the remote to disconnect from+ */+GIT_EXTERN(void) git_remote_disconnect(git_remote *remote);++/**+ * Free the memory associated with a remote+ *+ * This also disconnects from the remote, if the connection+ * has not been closed yet (using git_remote_disconnect).+ *+ * @param remote the remote to free+ */+GIT_EXTERN(void) git_remote_free(git_remote *remote);++/**+ * Update the tips to the new state+ *+ * @param remote the remote to update+ * @param cb callback to run on each ref update. 'a' is the old value, 'b' is then new value+ */+GIT_EXTERN(int) git_remote_update_tips(git_remote *remote, int (*cb)(const char *refname, const git_oid *a, const git_oid *b));++/**+ * Return whether a string is a valid remote URL+ *+ * @param tranport the url to check+ * @param 1 if the url is valid, 0 otherwise+ */+GIT_EXTERN(int) git_remote_valid_url(const char *url);++/**+ * Return whether the passed URL is supported by this version of the library.+ *+ * @param url the url to check+ * @return 1 if the url is supported, 0 otherwise+*/+GIT_EXTERN(int) git_remote_supported_url(const char* url);++/**+ * Get a list of the configured remotes for a repo+ *+ * The string array must be freed by the user.+ *+ * @param remotes_list a string array with the names of the remotes+ * @param repo the repository to query+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_remote_list(git_strarray *remotes_list, git_repository *repo);++/**+ * Add a remote with the default fetch refspec to the repository's configuration+ *+ * @param out the resulting remote+ * @param repo the repository in which to create the remote+ * @param name the remote's name+ * @param url the remote's url+ */+GIT_EXTERN(int) git_remote_add(git_remote **out, git_repository *repo, const char *name, const char *url);++/** @} */+GIT_END_DECL+#endif
libgit2/include/git2/repository.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_repository_h__ #define INCLUDE_git_repository_h__@@ -41,150 +23,281 @@ /** * Open a git repository. *- * The 'path' argument must point to an existing git repository- * folder, e.g.- *- * /path/to/my_repo/.git/ (normal repository)- * objects/- * index- * HEAD- *- * /path/to/bare_repo/ (bare repository)- * objects/- * index- * HEAD+ * The 'path' argument must point to either a git repository+ * folder, or an existing work dir. *- * The method will automatically detect if 'path' is a normal- * or bare repository or fail is 'path' is neither.+ * The method will automatically detect if 'path' is a normal+ * or bare repository or fail is 'path' is neither. * * @param repository pointer to the repo which will be opened * @param path the path to the repository- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_repository_open(git_repository **repository, const char *path); +/**+ * Look for a git repository and copy its path in the given buffer.+ * The lookup start from base_path and walk across parent directories+ * if nothing has been found. The lookup ends when the first repository+ * is found, or when reaching a directory referenced in ceiling_dirs+ * or when the filesystem changes (in case across_fs is true).+ *+ * The method will automatically detect if the repository is bare+ * (if there is a repository).+ *+ * @param repository_path The user allocated buffer which will+ * contain the found path.+ *+ * @param size repository_path size+ *+ * @param start_path The base path where the lookup starts.+ *+ * @param across_fs If true, then the lookup will not stop when a+ * filesystem device change is detected while exploring parent directories.+ *+ * @param ceiling_dirs A GIT_PATH_LIST_SEPARATOR separated list of+ * absolute symbolic link free paths. The lookup will stop when any+ * of this paths is reached. Note that the lookup always performs on+ * start_path no matter start_path appears in ceiling_dirs ceiling_dirs+ * might be NULL (which is equivalent to an empty string)+ *+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_repository_discover(+ char *repository_path,+ size_t size,+ const char *start_path,+ int across_fs,+ const char *ceiling_dirs); +enum {+ GIT_REPOSITORY_OPEN_NO_SEARCH = (1 << 0),+ GIT_REPOSITORY_OPEN_CROSS_FS = (1 << 1),+};+ /**- * Open a git repository by manually specifying all its paths+ * Find and open a repository with extended controls.+ */+GIT_EXTERN(int) git_repository_open_ext(+ git_repository **repo,+ const char *start_path,+ uint32_t flags,+ const char *ceiling_dirs);++/**+ * Free a previously allocated repository *- * @param repository pointer to the repo which will be opened+ * Note that after a repository is free'd, all the objects it has spawned+ * will still exist until they are manually closed by the user+ * with `git_object_free`, but accessing any of the attributes of+ * an object without a backing repository will result in undefined+ * behavior *- * @param git_dir The full path to the repository folder- * e.g. a '.git' folder for live repos, any folder for bare- * Equivalent to $GIT_DIR. - * Cannot be NULL.+ * @param repo repository handle to close. If NULL nothing occurs.+ */+GIT_EXTERN(void) git_repository_free(git_repository *repo);++/**+ * Creates a new Git repository in the given folder. *- * @param git_object_directory The full path to the ODB folder.- * the folder where all the loose and packed objects are stored- * Equivalent to $GIT_OBJECT_DIRECTORY.- * If NULL, "$GIT_DIR/objects/" is assumed.+ * TODO:+ * - Reinit the repository *- * @param git_index_file The full path to the index (dircache) file- * Equivalent to $GIT_INDEX_FILE.- * If NULL, "$GIT_DIR/index" is assumed.+ * @param repo_out pointer to the repo which will be created or reinitialized+ * @param path the path to the repository+ * @param is_bare if true, a Git repository without a working directory is created+ * at the pointed path. If false, provided path will be considered as the working+ * directory into which the .git directory will be created. *- * @param git_work_tree The full path to the working tree of the repository,- * if the repository is not bare.- * Equivalent to $GIT_WORK_TREE.- * If NULL, the repository is assumed to be bare.+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare);++/**+ * Retrieve and resolve the reference pointed at by HEAD. *+ * @param head_out pointer to the reference which will be retrieved+ * @param repo a repository object+ * * @return 0 on success; error code otherwise */-GIT_EXTERN(int) git_repository_open2(git_repository **repository,- const char *git_dir,- const char *git_object_directory,- const char *git_index_file,- const char *git_work_tree);+GIT_EXTERN(int) git_repository_head(git_reference **head_out, git_repository *repo); +/**+ * Check if a repository's HEAD is detached+ *+ * A repository's HEAD is detached when it points directly to a commit+ * instead of a branch.+ *+ * @param repo Repo to test+ * @return 1 if HEAD is detached, 0 if i'ts not; error code if there+ * was an error.+ */+GIT_EXTERN(int) git_repository_head_detached(git_repository *repo); /**- * Open a git repository by manually specifying its paths and- * the object database it will use.+ * Check if the current branch is an orphan *- * @param repository pointer to the repo which will be opened+ * An orphan branch is one named from HEAD but which doesn't exist in+ * the refs namespace, because it doesn't have any commit to point to. *- * @param git_dir The full path to the repository folder- * e.g. a '.git' folder for live repos, any folder for bare- * Equivalent to $GIT_DIR. - * Cannot be NULL.+ * @param repo Repo to test+ * @return 1 if the current branch is an orphan, 0 if it's not; error+ * code if therewas an error+ */+GIT_EXTERN(int) git_repository_head_orphan(git_repository *repo);++/**+ * Check if a repository is empty *- * @param object_database A pointer to a git_odb created & initialized- * by the user (e.g. with custom backends). This object database- * will be owned by the repository and will be automatically free'd.- * It should not be manually free'd by the user, or this- * git_repository object will become invalid.+ * An empty repository has just been initialized and contains+ * no commits. *- * @param git_index_file The full path to the index (dircache) file- * Equivalent to $GIT_INDEX_FILE.- * If NULL, "$GIT_DIR/index" is assumed.+ * @param repo Repo to test+ * @return 1 if the repository is empty, 0 if it isn't, error code+ * if the repository is corrupted+ */+GIT_EXTERN(int) git_repository_is_empty(git_repository *repo);++/**+ * Get the path of this repository *- * @param git_work_tree The full path to the working tree of the repository,- * if the repository is not bare.- * Equivalent to $GIT_WORK_TREE.- * If NULL, the repository is assumed to be bare.+ * This is the path of the `.git` folder for normal repositories,+ * or of the repository itself for bare repositories. *- * @return 0 on success; error code otherwise+ * @param repo A repository object+ * @return the path to the repository */+GIT_EXTERN(const char *) git_repository_path(git_repository *repo); -GIT_EXTERN(int) git_repository_open3(git_repository **repository,- const char *git_dir,- git_odb *object_database,- const char *git_index_file,- const char *git_work_tree);+/**+ * Get the path of the working directory for this repository+ *+ * If the repository is bare, this function will always return+ * NULL.+ *+ * @param repo A repository object+ * @return the path to the working dir, if it exists+ */+GIT_EXTERN(const char *) git_repository_workdir(git_repository *repo); /**- * Get the object database behind a Git repository+ * Set the path to the working directory for this repository *- * @param repo a repository object- * @return a pointer to the object db+ * The working directory doesn't need to be the same one+ * that contains the `.git` folder for this repository.+ *+ * If this repository is bare, setting its working directory+ * will turn it into a normal repository, capable of performing+ * all the common workdir operations (checkout, status, index+ * manipulation, etc).+ *+ * @param repo A repository object+ * @param workdir The path to a working directory+ * @return 0, or an error code */-GIT_EXTERN(git_odb *) git_repository_database(git_repository *repo);+GIT_EXTERN(int) git_repository_set_workdir(git_repository *repo, const char *workdir); /**- * Get the Index file of a Git repository+ * Check if a repository is bare *- * This is a cheap operation; the index is only opened on the first call,- * and subsequent calls only retrieve the previous pointer.+ * @param repo Repo to test+ * @return 1 if the repository is bare, 0 otherwise.+ */+GIT_EXTERN(int) git_repository_is_bare(git_repository *repo);++/**+ * Get the configuration file for this repository. *- * @param index Pointer where to store the index- * @param repo a repository object- * @return 0 on success; error code if the index could not be opened+ * If a configuration file has not been set, the default+ * config set for the repository will be returned, including+ * global and system configurations (if they are available).+ *+ * The configuration file must be freed once it's no longer+ * being used by the user.+ *+ * @param out Pointer to store the loaded config file+ * @param repo A repository object+ * @return 0, or an error code */-GIT_EXTERN(int) git_repository_index(git_index **index, git_repository *repo);+GIT_EXTERN(int) git_repository_config(git_config **out, git_repository *repo); /**- * Free a previously allocated repository+ * Set the configuration file for this repository *- * @param repo repository handle to close. If NULL nothing occurs.+ * This configuration file will be used for all configuration+ * queries involving this repository.+ *+ * The repository will keep a reference to the config file;+ * the user must still free the config after setting it+ * to the repository, or it will leak.+ *+ * @param repo A repository object+ * @param config A Config object */-GIT_EXTERN(void) git_repository_free(git_repository *repo);+GIT_EXTERN(void) git_repository_set_config(git_repository *repo, git_config *config); /**- * Force a garbage collector pass on the repository+ * Get the Object Database for this repository. *- * This will force-free any cached objects that have been- * previously marked by the user as closed (`git_object_close`).+ * If a custom ODB has not been set, the default+ * database for the repository will be returned (the one+ * located in `.git/objects`). *- * @param repo repository handle to collect. If NULL nothing occurs.+ * The ODB must be freed once it's no longer being used by+ * the user.+ *+ * @param out Pointer to store the loaded ODB+ * @param repo A repository object+ * @return 0, or an error code */-GIT_EXTERN(int) git_repository_gc(git_repository *repo);+GIT_EXTERN(int) git_repository_odb(git_odb **out, git_repository *repo); /**- * Creates a new Git repository in the given folder.+ * Set the Object Database for this repository *- * TODO:- * - Reinit the repository- * - Create config files+ * The ODB will be used for all object-related operations+ * involving this repository. *- * @param repo_out pointer to the repo which will be created or reinitialized- * @param path the path to the repository- * @param is_bare if true, a Git repository without a working directory is created - * at the pointed path. If false, provided path will be considered as the working - * directory into which the .git directory will be created.+ * The repository will keep a reference to the ODB; the user+ * must still free the ODB object after setting it to the+ * repository, or it will leak. *- * @return 0 on success; error code otherwise+ * @param repo A repository object+ * @param odb An ODB object */-GIT_EXTERN(int) git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare);+GIT_EXTERN(void) git_repository_set_odb(git_repository *repo, git_odb *odb);++/**+ * Get the Index file for this repository.+ *+ * If a custom index has not been set, the default+ * index for the repository will be returned (the one+ * located in `.git/index`).+ *+ * The index must be freed once it's no longer being used by+ * the user.+ *+ * @param out Pointer to store the loaded index+ * @param repo A repository object+ * @return 0, or an error code+ */+GIT_EXTERN(int) git_repository_index(git_index **out, git_repository *repo);++/**+ * Set the index file for this repository+ *+ * This index will be used for all index-related operations+ * involving this repository.+ *+ * The repository will keep a reference to the index file;+ * the user must still free the index after setting it+ * to the repository, or it will leak.+ *+ * @param repo A repository object+ * @param index An index object+ */+GIT_EXTERN(void) git_repository_set_index(git_repository *repo, git_index *index); /** @} */ GIT_END_DECL
libgit2/include/git2/revwalk.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_revwalk_h__ #define INCLUDE_git_revwalk_h__@@ -44,28 +26,28 @@ * and subject to change at any time. * This is the default sorting for new walkers. */-#define GIT_SORT_NONE (0)+#define GIT_SORT_NONE (0) /** * Sort the repository contents in topological order * (parents before children); this sorting mode * can be combined with time sorting. */-#define GIT_SORT_TOPOLOGICAL (1 << 0)+#define GIT_SORT_TOPOLOGICAL (1 << 0) /** * Sort the repository contents by commit time; * this sorting mode can be combined with * topological sorting. */-#define GIT_SORT_TIME (1 << 1)+#define GIT_SORT_TIME (1 << 1) /** * Iterate through the repository contents in reverse * order; this sorting mode can be combined with * any of the above. */-#define GIT_SORT_REVERSE (1 << 2)+#define GIT_SORT_REVERSE (1 << 2) /** * Allocate a new revision walker to iterate through a repo.@@ -83,7 +65,7 @@ * * @param walker pointer to the new revision walker * @param repo the repo to walk through- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_revwalk_new(git_revwalk **walker, git_repository *repo); @@ -113,14 +95,36 @@ * must be pushed the repository before a walk can * be started. *- * @param walker the walker being used for the traversal.+ * @param walk the walker being used for the traversal. * @param oid the oid of the commit to start from.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_EXTERN(int) git_revwalk_push(git_revwalk *walk, const git_oid *oid); +/**+ * Push matching references+ *+ * The OIDs pinted to by the references that match the given glob+ * pattern will be pushed to the revision walker.+ *+ * A leading 'refs/' is implied it not present as well as a trailing+ * '/ *' if the glob lacks '?', '*' or '['.+ *+ * @param walk the walker being used for the traversal+ * @param glob the glob pattern references should match+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_revwalk_push_glob(git_revwalk *walk, const char *glob); /**+ * Push the repository's HEAD+ *+ * @param walk the walker being used for the traversal+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_revwalk_push_head(git_revwalk *walk);++/** * Mark a commit (and its ancestors) uninteresting for the output. * * The given OID must belong to a commit on the walked@@ -129,13 +133,59 @@ * The resolved commit and all its parents will be hidden from the * output on the revision walk. *- * @param walker the walker being used for the traversal.- * @param commit the commit that will be ignored during the traversal- * @return 0 on success; error code otherwise+ * @param walk the walker being used for the traversal.+ * @param oid the oid of commit that will be ignored during the traversal+ * @return 0 or an error code */ GIT_EXTERN(int) git_revwalk_hide(git_revwalk *walk, const git_oid *oid); /**+ * Hide matching references.+ *+ * The OIDs pinted to by the references that match the given glob+ * pattern and their ancestors will be hidden from the output on the+ * revision walk.+ *+ * A leading 'refs/' is implied it not present as well as a trailing+ * '/ *' if the glob lacks '?', '*' or '['.+ *+ * @param walk the walker being used for the traversal+ * @param glob the glob pattern references should match+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_revwalk_hide_glob(git_revwalk *walk, const char *glob);++/**+ * Hide the repository's HEAD+ *+ * @param walk the walker being used for the traversal+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_revwalk_hide_head(git_revwalk *walk);++/**+ * Push the OID pointed to by a reference+ *+ * The reference must point to a commit.+ *+ * @param walk the walker being used for the traversal+ * @param refname the referece to push+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_revwalk_push_ref(git_revwalk *walk, const char *refname);++/**+ * Hide the OID pointed to by a reference+ *+ * The reference must point to a commit.+ *+ * @param walk the walker being used for the traversal+ * @param refname the referece to hide+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_revwalk_hide_ref(git_revwalk *walk, const char *refname);++/** * Get the next commit from the revision walk. * * The initial call to this method is *not* blocking when@@ -150,8 +200,8 @@ * * @param oid Pointer where to store the oid of the next commit * @param walk the walker to pop the commit from.- * @return GIT_SUCCESS if the next commit was found;- * GIT_EREVWALKOVER if there are no commits left to iterate+ * @return 0 if the next commit was found;+ * GIT_REVWALKOVER if there are no commits left to iterate */ GIT_EXTERN(int) git_revwalk_next(git_oid *oid, git_revwalk *walk); @@ -169,7 +219,7 @@ /** * Free a revision walker previously allocated. *- * @param walk traversal handle to close. If NULL nothing occurs.+ * @param walk traversal handle to close. If NULL nothing occurs. */ GIT_EXTERN(void) git_revwalk_free(git_revwalk *walk);
libgit2/include/git2/signature.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_signature_h__ #define INCLUDE_git_signature_h__@@ -41,19 +23,32 @@ * Create a new action signature. The signature must be freed * manually or using git_signature_free *- * @name name of the person- * @email email of the person- * @time time when the action happened- * @offset timezone offset in minutes for the time- * @return the new sig, NULl on out of memory+ * @param sig_out new signature, in case of error NULL+ * @param name name of the person+ * @param email email of the person+ * @param time time when the action happened+ * @param offset timezone offset in minutes for the time+ * @return 0 or an error code */-GIT_EXTERN(git_signature *) git_signature_new(const char *name, const char *email, time_t time, int offset);+GIT_EXTERN(int) git_signature_new(git_signature **sig_out, const char *name, const char *email, git_time_t time, int offset); /**+ * Create a new action signature with a timestamp of 'now'. The+ * signature must be freed manually or using git_signature_free+ *+ * @param sig_out new signature, in case of error NULL+ * @param name name of the person+ * @param email email of the person+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_signature_now(git_signature **sig_out, const char *name, const char *email);+++/** * Create a copy of an existing signature. * * All internal strings are also duplicated.- * @sig signature to duplicated+ * @param sig signature to duplicated * @return a copy of sig, NULL on out of memory */ GIT_EXTERN(git_signature *) git_signature_dup(const git_signature *sig);@@ -61,7 +56,7 @@ /** * Free an existing signature *- * @sig signature to free+ * @param sig signature to free */ GIT_EXTERN(void) git_signature_free(git_signature *sig);
+ libgit2/include/git2/status.h view
@@ -0,0 +1,164 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_status_h__+#define INCLUDE_git_status_h__++#include "common.h"+#include "types.h"++/**+ * @file git2/status.h+ * @brief Git file status routines+ * @defgroup git_status Git file status routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++enum {+ GIT_STATUS_CURRENT = 0,++ GIT_STATUS_INDEX_NEW = (1 << 0),+ GIT_STATUS_INDEX_MODIFIED = (1 << 1),+ GIT_STATUS_INDEX_DELETED = (1 << 2),++ GIT_STATUS_WT_NEW = (1 << 3),+ GIT_STATUS_WT_MODIFIED = (1 << 4),+ GIT_STATUS_WT_DELETED = (1 << 5),++ GIT_STATUS_IGNORED = (1 << 6),+};++/**+ * Gather file statuses and run a callback for each one.+ *+ * The callback is passed the path of the file, the status and the data+ * pointer passed to this function. If the callback returns something other+ * than 0, this function will return that value.+ *+ * @param repo a repository object+ * @param callback the function to call on each file+ * @return 0 on success or the return value of the callback that was non-zero+ */+GIT_EXTERN(int) git_status_foreach(+ git_repository *repo,+ int (*callback)(const char *, unsigned int, void *),+ void *payload);++/**+ * Select the files on which to report status.+ *+ * - GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This is the+ * rough equivalent of `git status --porcelain` where each file+ * will receive a callback indicating its status in the index and+ * in the workdir.+ * - GIT_STATUS_SHOW_INDEX_ONLY will only make callbacks for index+ * side of status. The status of the index contents relative to+ * the HEAD will be given.+ * - GIT_STATUS_SHOW_WORKDIR_ONLY will only make callbacks for the+ * workdir side of status, reporting the status of workdir content+ * relative to the index.+ * - GIT_STATUS_SHOW_INDEX_THEN_WORKDIR behaves like index-only+ * followed by workdir-only, causing two callbacks to be issued+ * per file (first index then workdir). This is slightly more+ * efficient than making separate calls. This makes it easier to+ * emulate the output of a plain `git status`.+ */+typedef enum {+ GIT_STATUS_SHOW_INDEX_AND_WORKDIR = 0,+ GIT_STATUS_SHOW_INDEX_ONLY = 1,+ GIT_STATUS_SHOW_WORKDIR_ONLY = 2,+ GIT_STATUS_SHOW_INDEX_THEN_WORKDIR = 3,+} git_status_show_t;++/**+ * Flags to control status callbacks+ *+ * - GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should+ * be made on untracked files. These will only be made if the+ * workdir files are included in the status "show" option.+ * - GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files should+ * get callbacks. Again, these callbacks will only be made if+ * the workdir files are included in the status "show" option.+ * Right now, there is no option to include all files in+ * directories that are ignored completely.+ * - GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback+ * should be made even on unmodified files.+ * - GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that directories+ * which appear to be submodules should just be skipped over.+ * - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that the+ * contents of untracked directories should be included in the+ * status. Normally if an entire directory is new, then just+ * the top-level directory will be included (with a trailing+ * slash on the entry name). Given this flag, the directory+ * itself will not be included, but all the files in it will.+ */++enum {+ GIT_STATUS_OPT_INCLUDE_UNTRACKED = (1 << 0),+ GIT_STATUS_OPT_INCLUDE_IGNORED = (1 << 1),+ GIT_STATUS_OPT_INCLUDE_UNMODIFIED = (1 << 2),+ GIT_STATUS_OPT_EXCLUDE_SUBMODULED = (1 << 3),+ GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = (1 << 4),+};++/**+ * Options to control how callbacks will be made by+ * `git_status_foreach_ext()`.+ */+typedef struct {+ git_status_show_t show;+ unsigned int flags;+ git_strarray pathspec;+} git_status_options;++/**+ * Gather file status information and run callbacks as requested.+ */+GIT_EXTERN(int) git_status_foreach_ext(+ git_repository *repo,+ const git_status_options *opts,+ int (*callback)(const char *, unsigned int, void *),+ void *payload);++/**+ * Get file status for a single file+ *+ * @param status_flags the status value+ * @param repo a repository object+ * @param path the file to retrieve status for, rooted at the repo's workdir+ * @return GIT_EINVALIDPATH when `path` points at a folder, GIT_ENOTFOUND when+ * the file doesn't exist in any of HEAD, the index or the worktree,+ * 0 otherwise+ */+GIT_EXTERN(int) git_status_file(+ unsigned int *status_flags,+ git_repository *repo,+ const char *path);++/**+ * Test if the ignore rules apply to a given file.+ *+ * This function simply checks the ignore rules to see if they would apply+ * to the given file. Unlike git_status_file(), this indicates if the file+ * would be ignored regardless of whether the file is already in the index+ * or in the repository.+ *+ * @param ignored boolean returning 0 if the file is not ignored, 1 if it is+ * @param repo a repository object+ * @param path the file to check ignores for, rooted at the repo's workdir.+ * @return 0 if ignore rules could be processed for the file (regardless+ * of whether it exists or not), or an error < 0 if they could not.+ */+GIT_EXTERN(int) git_status_should_ignore(+ int *ignored,+ git_repository *repo,+ const char *path);++/** @} */+GIT_END_DECL+#endif
+ libgit2/include/git2/stdint.h view
@@ -0,0 +1,247 @@+// ISO C9x compliant stdint.h for Microsoft Visual Studio+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124+//+// Copyright (c) 2006-2008 Alexander Chemeris+//+// Redistribution and use in source and binary forms, with or without+// modification, are permitted provided that the following conditions are met:+//+// 1. Redistributions of source code must retain the above copyright notice,+// this list of conditions and the following disclaimer.+//+// 2. Redistributions in binary form must reproduce the above copyright+// notice, this list of conditions and the following disclaimer in the+// documentation and/or other materials provided with the distribution.+//+// 3. The name of the author may be used to endorse or promote products+// derived from this software without specific prior written permission.+//+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+//+///////////////////////////////////////////////////////////////////////////////++#ifndef _MSC_VER // [+#error "Use this header only with Microsoft Visual C++ compilers!"+#endif // _MSC_VER ]++#ifndef _MSC_STDINT_H_ // [+#define _MSC_STDINT_H_++#if _MSC_VER > 1000+#pragma once+#endif++#include <limits.h>++// For Visual Studio 6 in C++ mode and for many Visual Studio versions when+// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'+// or compiler give many errors like this:+// error C2733: second C linkage of overloaded function 'wmemchr' not allowed+#ifdef __cplusplus+extern "C" {+#endif+# include <wchar.h>+#ifdef __cplusplus+}+#endif++// Define _W64 macros to mark types changing their size, like intptr_t.+#ifndef _W64+# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300+# define _W64 __w64+# else+# define _W64+# endif+#endif+++// 7.18.1 Integer types++// 7.18.1.1 Exact-width integer types++// Visual Studio 6 and Embedded Visual C++ 4 doesn't+// realize that, e.g. char has the same size as __int8+// so we give up on __intX for them.+#if (_MSC_VER < 1300)+ typedef signed char int8_t;+ typedef signed short int16_t;+ typedef signed int int32_t;+ typedef unsigned char uint8_t;+ typedef unsigned short uint16_t;+ typedef unsigned int uint32_t;+#else+ typedef signed __int8 int8_t;+ typedef signed __int16 int16_t;+ typedef signed __int32 int32_t;+ typedef unsigned __int8 uint8_t;+ typedef unsigned __int16 uint16_t;+ typedef unsigned __int32 uint32_t;+#endif+typedef signed __int64 int64_t;+typedef unsigned __int64 uint64_t;+++// 7.18.1.2 Minimum-width integer types+typedef int8_t int_least8_t;+typedef int16_t int_least16_t;+typedef int32_t int_least32_t;+typedef int64_t int_least64_t;+typedef uint8_t uint_least8_t;+typedef uint16_t uint_least16_t;+typedef uint32_t uint_least32_t;+typedef uint64_t uint_least64_t;++// 7.18.1.3 Fastest minimum-width integer types+typedef int8_t int_fast8_t;+typedef int16_t int_fast16_t;+typedef int32_t int_fast32_t;+typedef int64_t int_fast64_t;+typedef uint8_t uint_fast8_t;+typedef uint16_t uint_fast16_t;+typedef uint32_t uint_fast32_t;+typedef uint64_t uint_fast64_t;++// 7.18.1.4 Integer types capable of holding object pointers+#ifdef _WIN64 // [+ typedef signed __int64 intptr_t;+ typedef unsigned __int64 uintptr_t;+#else // _WIN64 ][+ typedef _W64 signed int intptr_t;+ typedef _W64 unsigned int uintptr_t;+#endif // _WIN64 ]++// 7.18.1.5 Greatest-width integer types+typedef int64_t intmax_t;+typedef uint64_t uintmax_t;+++// 7.18.2 Limits of specified-width integer types++#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259++// 7.18.2.1 Limits of exact-width integer types+#define INT8_MIN ((int8_t)_I8_MIN)+#define INT8_MAX _I8_MAX+#define INT16_MIN ((int16_t)_I16_MIN)+#define INT16_MAX _I16_MAX+#define INT32_MIN ((int32_t)_I32_MIN)+#define INT32_MAX _I32_MAX+#define INT64_MIN ((int64_t)_I64_MIN)+#define INT64_MAX _I64_MAX+#define UINT8_MAX _UI8_MAX+#define UINT16_MAX _UI16_MAX+#define UINT32_MAX _UI32_MAX+#define UINT64_MAX _UI64_MAX++// 7.18.2.2 Limits of minimum-width integer types+#define INT_LEAST8_MIN INT8_MIN+#define INT_LEAST8_MAX INT8_MAX+#define INT_LEAST16_MIN INT16_MIN+#define INT_LEAST16_MAX INT16_MAX+#define INT_LEAST32_MIN INT32_MIN+#define INT_LEAST32_MAX INT32_MAX+#define INT_LEAST64_MIN INT64_MIN+#define INT_LEAST64_MAX INT64_MAX+#define UINT_LEAST8_MAX UINT8_MAX+#define UINT_LEAST16_MAX UINT16_MAX+#define UINT_LEAST32_MAX UINT32_MAX+#define UINT_LEAST64_MAX UINT64_MAX++// 7.18.2.3 Limits of fastest minimum-width integer types+#define INT_FAST8_MIN INT8_MIN+#define INT_FAST8_MAX INT8_MAX+#define INT_FAST16_MIN INT16_MIN+#define INT_FAST16_MAX INT16_MAX+#define INT_FAST32_MIN INT32_MIN+#define INT_FAST32_MAX INT32_MAX+#define INT_FAST64_MIN INT64_MIN+#define INT_FAST64_MAX INT64_MAX+#define UINT_FAST8_MAX UINT8_MAX+#define UINT_FAST16_MAX UINT16_MAX+#define UINT_FAST32_MAX UINT32_MAX+#define UINT_FAST64_MAX UINT64_MAX++// 7.18.2.4 Limits of integer types capable of holding object pointers+#ifdef _WIN64 // [+# define INTPTR_MIN INT64_MIN+# define INTPTR_MAX INT64_MAX+# define UINTPTR_MAX UINT64_MAX+#else // _WIN64 ][+# define INTPTR_MIN INT32_MIN+# define INTPTR_MAX INT32_MAX+# define UINTPTR_MAX UINT32_MAX+#endif // _WIN64 ]++// 7.18.2.5 Limits of greatest-width integer types+#define INTMAX_MIN INT64_MIN+#define INTMAX_MAX INT64_MAX+#define UINTMAX_MAX UINT64_MAX++// 7.18.3 Limits of other integer types++#ifdef _WIN64 // [+# define PTRDIFF_MIN _I64_MIN+# define PTRDIFF_MAX _I64_MAX+#else // _WIN64 ][+# define PTRDIFF_MIN _I32_MIN+# define PTRDIFF_MAX _I32_MAX+#endif // _WIN64 ]++#define SIG_ATOMIC_MIN INT_MIN+#define SIG_ATOMIC_MAX INT_MAX++#ifndef SIZE_MAX // [+# ifdef _WIN64 // [+# define SIZE_MAX _UI64_MAX+# else // _WIN64 ][+# define SIZE_MAX _UI32_MAX+# endif // _WIN64 ]+#endif // SIZE_MAX ]++// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>+#ifndef WCHAR_MIN // [+# define WCHAR_MIN 0+#endif // WCHAR_MIN ]+#ifndef WCHAR_MAX // [+# define WCHAR_MAX _UI16_MAX+#endif // WCHAR_MAX ]++#define WINT_MIN 0+#define WINT_MAX _UI16_MAX++#endif // __STDC_LIMIT_MACROS ]+++// 7.18.4 Limits of other integer types++#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260++// 7.18.4.1 Macros for minimum-width integer constants++#define INT8_C(val) val##i8+#define INT16_C(val) val##i16+#define INT32_C(val) val##i32+#define INT64_C(val) val##i64++#define UINT8_C(val) val##ui8+#define UINT16_C(val) val##ui16+#define UINT32_C(val) val##ui32+#define UINT64_C(val) val##ui64++// 7.18.4.2 Macros for greatest-width integer constants+#define INTMAX_C INT64_C+#define UINTMAX_C UINT64_C++#endif // __STDC_CONSTANT_MACROS ]+++#endif // _MSC_STDINT_H_ ]
+ libgit2/include/git2/submodule.h view
@@ -0,0 +1,103 @@+/*+ * Copyright (C) 2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_submodule_h__+#define INCLUDE_git_submodule_h__++#include "common.h"+#include "types.h"+#include "oid.h"++/**+ * @file git2/submodule.h+ * @brief Git submodule management utilities+ * @defgroup git_submodule Git submodule management routines+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++typedef enum {+ GIT_SUBMODULE_UPDATE_CHECKOUT = 0,+ GIT_SUBMODULE_UPDATE_REBASE = 1,+ GIT_SUBMODULE_UPDATE_MERGE = 2+} git_submodule_update_t;++typedef enum {+ GIT_SUBMODULE_IGNORE_ALL = 0, /* never dirty */+ GIT_SUBMODULE_IGNORE_DIRTY = 1, /* only dirty if HEAD moved */+ GIT_SUBMODULE_IGNORE_UNTRACKED = 2, /* dirty if tracked files change */+ GIT_SUBMODULE_IGNORE_NONE = 3 /* any change or untracked == dirty */+} git_submodule_ignore_t;++/**+ * Description of submodule+ *+ * This record describes a submodule found in a repository. There+ * should be an entry for every submodule found in the HEAD and for+ * every submodule described in .gitmodules. The fields are as follows:+ *+ * - `name` is the name of the submodule from .gitmodules.+ * - `path` is the path to the submodule from the repo working directory.+ * It is almost always the same as `name`.+ * - `url` is the url for the submodule.+ * - `oid` is the HEAD SHA1 for the submodule.+ * - `update` is a value from above - see gitmodules(5) update.+ * - `ignore` is a value from above - see gitmodules(5) ignore.+ * - `fetch_recurse` is 0 or 1 - see gitmodules(5) fetchRecurseSubmodules.+ * - `refcount` is for internal use.+ *+ * If the submodule has been added to .gitmodules but not yet git added,+ * then the `oid` will be zero. If the submodule has been deleted, but+ * the delete has not been committed yet, then the `oid` will be set, but+ * the `url` will be NULL.+ */+typedef struct {+ char *name;+ char *path;+ char *url;+ git_oid oid; /* sha1 of submodule HEAD ref or zero if not committed */+ git_submodule_update_t update;+ git_submodule_ignore_t ignore;+ int fetch_recurse;+ int refcount;+} git_submodule;++/**+ * Iterate over all submodules of a repository.+ *+ * @param repo The repository+ * @param callback Function to be called with the name of each submodule.+ * Return a non-zero value to terminate the iteration.+ * @param payload Extra data to pass to callback+ * @return 0 on success, -1 on error, or non-zero return value of callback+ */+GIT_EXTERN(int) git_submodule_foreach(+ git_repository *repo,+ int (*callback)(const char *name, void *payload),+ void *payload);++/**+ * Lookup submodule information by name or path.+ *+ * Given either the submodule name or path (they are ususally the same),+ * this returns a structure describing the submodule. If the submodule+ * does not exist, this will return GIT_ENOTFOUND and set the submodule+ * pointer to NULL.+ *+ * @param submodule Pointer to submodule description object pointer..+ * @param repo The repository.+ * @param name The name of the submodule. Trailing slashes will be ignored.+ * @return 0 on success, GIT_ENOTFOUND if submodule does not exist, -1 on error+ */+GIT_EXTERN(int) git_submodule_lookup(+ git_submodule **submodule,+ git_repository *repo,+ const char *name);++/** @} */+GIT_END_DECL+#endif
libgit2/include/git2/tag.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_tag_h__ #define INCLUDE_git_tag_h__@@ -41,13 +23,11 @@ /** * Lookup a tag object from the repository.- * The generated tag object is owned by the revision- * repo and shall not be freed by the user. * * @param tag pointer to the looked up tag * @param repo the repo to use when locating the tag. * @param id identity of the tag to locate.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_INLINE(int) git_tag_lookup(git_tag **tag, git_repository *repo, const git_oid *id) {@@ -55,23 +35,43 @@ } /**- * Create a new in-memory git_tag.+ * Lookup a tag object from the repository,+ * given a prefix of its identifier (short id). *- * The tag object must be manually filled using- * setter methods before it can be written to its- * repository.+ * @see git_object_lookup_prefix *- * @param tag pointer to the new tag- * @param repo The repository where the object will reside- * @return 0 on success; error code otherwise+ * @param tag pointer to the looked up tag+ * @param repo the repo to use when locating the tag.+ * @param id identity of the tag to locate.+ * @param len the length of the short identifier+ * @return 0 or an error code */-GIT_INLINE(int) git_tag_new(git_tag **tag, git_repository *repo)+GIT_INLINE(int) git_tag_lookup_prefix(git_tag **tag, git_repository *repo, const git_oid *id, unsigned int len) {- return git_object_new((git_object **)tag, repo, (git_otype)GIT_OBJ_TAG);+ return git_object_lookup_prefix((git_object **)tag, repo, id, len, (git_otype)GIT_OBJ_TAG); } /**+ * Close an open tag+ *+ * This is a wrapper around git_object_free()+ *+ * IMPORTANT:+ * It *is* necessary to call this method when you stop+ * using a tag. Failure to do so will cause a memory leak.+ *+ * @param tag the tag to close+ */++GIT_INLINE(void) git_tag_free(git_tag *tag)+{+ git_object_free((git_object *) tag);+}+++/** * Get the id of a tag.+ * * @param tag a previously loaded tag. * @return object identity for the tag. */@@ -79,75 +79,218 @@ /** * Get the tagged object of a tag+ *+ * This method performs a repository lookup for the+ * given object and returns it+ * * @param target pointer where to store the target * @param tag a previously loaded tag.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */-GIT_EXTERN(int) git_tag_target(git_object **target, git_tag *t);+GIT_EXTERN(int) git_tag_target(git_object **target, git_tag *tag); /** * Get the OID of the tagged object of a tag+ * * @param tag a previously loaded tag. * @return pointer to the OID */-GIT_EXTERN(const git_oid *) git_tag_target_oid(git_tag *t);+GIT_EXTERN(const git_oid *) git_tag_target_oid(git_tag *tag); /** * Get the type of a tag's tagged object+ * * @param tag a previously loaded tag. * @return type of the tagged object */-GIT_EXTERN(git_otype) git_tag_type(git_tag *t);+GIT_EXTERN(git_otype) git_tag_type(git_tag *tag); /** * Get the name of a tag+ * * @param tag a previously loaded tag. * @return name of the tag */-GIT_EXTERN(const char *) git_tag_name(git_tag *t);+GIT_EXTERN(const char *) git_tag_name(git_tag *tag); /** * Get the tagger (author) of a tag+ * * @param tag a previously loaded tag. * @return reference to the tag's author */-GIT_EXTERN(const git_signature *) git_tag_tagger(git_tag *t);+GIT_EXTERN(const git_signature *) git_tag_tagger(git_tag *tag); /** * Get the message of a tag+ * * @param tag a previously loaded tag. * @return message of the tag */-GIT_EXTERN(const char *) git_tag_message(git_tag *t);+GIT_EXTERN(const char *) git_tag_message(git_tag *tag); + /**- * Set the target of a tag (i.e. the object that the tag points to)- * @param tag The tag to modify- * @param target the new tagged target+ * Create a new tag in the repository from an object+ *+ * A new reference will also be created pointing to+ * this tag object. If `force` is true and a reference+ * already exists with the given name, it'll be replaced.+ *+ * The message will be cleaned up from excess whitespace+ * it will be made sure that the last line ends with a '\n'.+ *+ * @param oid Pointer where to store the OID of the+ * newly created tag. If the tag already exists, this parameter+ * will be the oid of the existing tag, and the function will+ * return a GIT_EEXISTS error code.+ *+ * @param repo Repository where to store the tag+ *+ * @param tag_name Name for the tag; this name is validated+ * for consistency. It should also not conflict with an+ * already existing tag name+ *+ * @param target Object to which this tag points. This object+ * must belong to the given `repo`.+ *+ * @param tagger Signature of the tagger for this tag, and+ * of the tagging time+ *+ * @param message Full message for this tag+ *+ * @param force Overwrite existing references+ *+ * @return 0 or an error code+ * A tag object is written to the ODB, and a proper reference+ * is written in the /refs/tags folder, pointing to it */-GIT_EXTERN(int) git_tag_set_target(git_tag *tag, git_object *target);+GIT_EXTERN(int) git_tag_create(+ git_oid *oid,+ git_repository *repo,+ const char *tag_name,+ const git_object *target,+ const git_signature *tagger,+ const char *message,+ int force); /**- * Set the name of a tag- * @param tag The tag to modify- * @param name the new name for the tag+ * Create a new tag in the repository from a buffer+ *+ * @param oid Pointer where to store the OID of the newly created tag+ * @param repo Repository where to store the tag+ * @param buffer Raw tag data+ * @param force Overwrite existing tags+ * @return 0 on sucess; error code otherwise */-GIT_EXTERN(void) git_tag_set_name(git_tag *tag, const char *name);+GIT_EXTERN(int) git_tag_create_frombuffer(+ git_oid *oid,+ git_repository *repo,+ const char *buffer,+ int force); /**- * Set the tagger of a tag- * @param tag The tag to modify- * @param tagger_sig signature of the tagging action- * @return 0 on success; error code otherwise+ * Create a new lightweight tag pointing at a target object+ *+ * A new direct reference will be created pointing to+ * this target object. If `force` is true and a reference+ * already exists with the given name, it'll be replaced.+ *+ * @param oid Pointer where to store the OID of the provided+ * target object. If the tag already exists, this parameter+ * will be filled with the oid of the existing pointed object+ * and the function will return a GIT_EEXISTS error code.+ *+ * @param repo Repository where to store the lightweight tag+ *+ * @param tag_name Name for the tag; this name is validated+ * for consistency. It should also not conflict with an+ * already existing tag name+ *+ * @param target Object to which this tag points. This object+ * must belong to the given `repo`.+ *+ * @param force Overwrite existing references+ *+ * @return 0 or an error code+ * A proper reference is written in the /refs/tags folder,+ * pointing to the provided target object */-GIT_EXTERN(void) git_tag_set_tagger(git_tag *tag, const git_signature *tagger_sig);+GIT_EXTERN(int) git_tag_create_lightweight(+ git_oid *oid,+ git_repository *repo,+ const char *tag_name,+ const git_object *target,+ int force); /**- * Set the message of a tag- * @param tag The tag to modify- * @param message the new tagger for the tag+ * Delete an existing tag reference.+ *+ * @param repo Repository where lives the tag+ *+ * @param tag_name Name of the tag to be deleted;+ * this name is validated for consistency.+ *+ * @return 0 or an error code */-GIT_EXTERN(void) git_tag_set_message(git_tag *tag, const char *message);+GIT_EXTERN(int) git_tag_delete(+ git_repository *repo,+ const char *tag_name);++/**+ * Fill a list with all the tags in the Repository+ *+ * The string array will be filled with the names of the+ * matching tags; these values are owned by the user and+ * should be free'd manually when no longer needed, using+ * `git_strarray_free`.+ *+ * @param tag_names Pointer to a git_strarray structure where+ * the tag names will be stored+ * @param repo Repository where to find the tags+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_tag_list(+ git_strarray *tag_names,+ git_repository *repo);++/**+ * Fill a list with all the tags in the Repository+ * which name match a defined pattern+ *+ * If an empty pattern is provided, all the tags+ * will be returned.+ *+ * The string array will be filled with the names of the+ * matching tags; these values are owned by the user and+ * should be free'd manually when no longer needed, using+ * `git_strarray_free`.+ *+ * @param tag_names Pointer to a git_strarray structure where+ * the tag names will be stored+ * @param pattern Standard fnmatch pattern+ * @param repo Repository where to find the tags+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_tag_list_match(+ git_strarray *tag_names,+ const char *pattern,+ git_repository *repo);++/**+ * Recursively peel a tag until a non tag git_object+ * is met+ *+ * The retrieved `tag_target` object is owned by the repository+ * and should be closed with the `git_object_free` method.+ *+ * @param tag_target Pointer to the peeled git_object+ * @param tag The tag to be processed+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_tag_peel(+ git_object **tag_target,+ git_tag *tag); /** @} */ GIT_END_DECL
− libgit2/include/git2/thread-utils.h
@@ -1,72 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */-#ifndef INCLUDE_git_thread_utils_h__-#define INCLUDE_git_thread_utils_h__--/*- * How TLS works is compiler+platform dependant- * Sources: http://en.wikipedia.org/wiki/Thread-Specific_Storage- * http://predef.sourceforge.net/precomp.html- */--#define GIT_HAS_TLS 1--#if defined(__APPLE__) && defined(__MACH__)-# undef GIT_TLS--#elif defined(__GNUC__) || \- defined(__SUNPRO_C) || \- defined(__SUNPRO_CC) || \- defined(__xlc__) || \- defined(__xlC__)-# define GIT_TLS __thread--#elif defined(__INTEL_COMPILER)-# if defined(_WIN32) || defined(_WIN32_CE)-# define GIT_TLS __declspec(thread)-# else-# define GIT_TLS __thread-# endif--#elif defined(_WIN32) || \- defined(_WIN32_CE) || \- defined(__BORLANDC__)-# define GIT_TLS __declspec(thread)--#else-# undef GIT_HAS_TLS-# define GIT_TLS /* nothing: tls vars are thread-global */-#endif--/* sparse and cygwin don't grok thread-local variables */-#if defined(__CHECKER__) || defined(__CYGWIN__)-# undef GIT_HAS_TLS-# undef GIT_TLS-# define GIT_TLS-#endif--#define GIT_THREADS 1--#endif /* INCLUDE_git_thread_utils_h__ */
+ libgit2/include/git2/threads.h view
@@ -0,0 +1,48 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_threads_h__+#define INCLUDE_git_threads_h__++#include "common.h"++/**+ * @file git2/threads.h+ * @brief Library level thread functions+ * @defgroup git_thread Threading functions+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Init the threading system.+ *+ * If libgit2 has been built with GIT_THREADS+ * on, this function must be called once before+ * any other library functions.+ *+ * If libgit2 has been built without GIT_THREADS+ * support, this function is a no-op.+ */+GIT_EXTERN(void) git_threads_init(void);++/**+ * Shutdown the threading system.+ *+ * If libgit2 has been built with GIT_THREADS+ * on, this function must be called before shutting+ * down the library.+ *+ * If libgit2 has been built without GIT_THREADS+ * support, this function is a no-op.+ */+GIT_EXTERN(void) git_threads_shutdown(void);++/** @} */+GIT_END_DECL+#endif+
libgit2/include/git2/tree.h view
@@ -1,26 +1,8 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_tree_h__ #define INCLUDE_git_tree_h__@@ -41,13 +23,11 @@ /** * Lookup a tree object from the repository.- * The generated tree object is owned by the revision- * repo and shall not be freed by the user. * * @param tree pointer to the looked up tree * @param repo the repo to use when locating the tree. * @param id identity of the tree to locate.- * @return 0 on success; error code otherwise+ * @return 0 or an error code */ GIT_INLINE(int) git_tree_lookup(git_tree **tree, git_repository *repo, const git_oid *id) {@@ -55,169 +35,284 @@ } /**- * Create a new in-memory git_tree.+ * Lookup a tree object from the repository,+ * given a prefix of its identifier (short id). *- * The tree object must be manually filled using- * setter methods before it can be written to its- * repository.+ * @see git_object_lookup_prefix *- * @param tree pointer to the new tree- * @param repo The repository where the object will reside- * @return 0 on success; error code otherwise+ * @param tree pointer to the looked up tree+ * @param repo the repo to use when locating the tree.+ * @param id identity of the tree to locate.+ * @param len the length of the short identifier+ * @return 0 or an error code */-GIT_INLINE(int) git_tree_new(git_tree **tree, git_repository *repo)+GIT_INLINE(int) git_tree_lookup_prefix(git_tree **tree, git_repository *repo, const git_oid *id, unsigned int len) {- return git_object_new((git_object **)tree, repo, GIT_OBJ_TREE);+ return git_object_lookup_prefix((git_object **)tree, repo, id, len, GIT_OBJ_TREE); } /**+ * Close an open tree+ *+ * This is a wrapper around git_object_free()+ *+ * IMPORTANT:+ * It *is* necessary to call this method when you stop+ * using a tree. Failure to do so will cause a memory leak.+ *+ * @param tree the tree to close+ */++GIT_INLINE(void) git_tree_free(git_tree *tree)+{+ git_object_free((git_object *) tree);+}+++/** * Get the id of a tree.+ * * @param tree a previously loaded tree. * @return object identity for the tree. */ GIT_EXTERN(const git_oid *) git_tree_id(git_tree *tree); - /** * Get the number of entries listed in a tree+ * * @param tree a previously loaded tree. * @return the number of entries in the tree */-GIT_EXTERN(size_t) git_tree_entrycount(git_tree *tree);+GIT_EXTERN(unsigned int) git_tree_entrycount(git_tree *tree); /** * Lookup a tree entry by its filename+ * * @param tree a previously loaded tree. * @param filename the filename of the desired entry * @return the tree entry; NULL if not found */-GIT_EXTERN(git_tree_entry *) git_tree_entry_byname(git_tree *tree, const char *filename);+GIT_EXTERN(const git_tree_entry *) git_tree_entry_byname(git_tree *tree, const char *filename); /** * Lookup a tree entry by its position in the tree+ * * @param tree a previously loaded tree. * @param idx the position in the entry list * @return the tree entry; NULL if not found */-GIT_EXTERN(git_tree_entry *) git_tree_entry_byindex(git_tree *tree, int idx);+GIT_EXTERN(const git_tree_entry *) git_tree_entry_byindex(git_tree *tree, unsigned int idx); /** * Get the UNIX file attributes of a tree entry+ * * @param entry a tree entry * @return attributes as an integer */-GIT_EXTERN(unsigned int) git_tree_entry_attributes(git_tree_entry *entry);+GIT_EXTERN(unsigned int) git_tree_entry_attributes(const git_tree_entry *entry); /** * Get the filename of a tree entry+ * * @param entry a tree entry * @return the name of the file */-GIT_EXTERN(const char *) git_tree_entry_name(git_tree_entry *entry);+GIT_EXTERN(const char *) git_tree_entry_name(const git_tree_entry *entry); /** * Get the id of the object pointed by the entry+ * * @param entry a tree entry * @return the oid of the object */-GIT_EXTERN(const git_oid *) git_tree_entry_id(git_tree_entry *entry);+GIT_EXTERN(const git_oid *) git_tree_entry_id(const git_tree_entry *entry); /**+ * Get the type of the object pointed by the entry+ *+ * @param entry a tree entry+ * @return the type of the pointed object+ */+GIT_EXTERN(git_otype) git_tree_entry_type(const git_tree_entry *entry);++/** * Convert a tree entry to the git_object it points too. * * @param object pointer to the converted object+ * @param repo repository where to lookup the pointed object * @param entry a tree entry- * @return a reference to the pointed object in the repository+ * @return 0 or an error code */-GIT_EXTERN(int) git_tree_entry_2object(git_object **object, git_tree_entry *entry);+GIT_EXTERN(int) git_tree_entry_to_object(git_object **object_out, git_repository *repo, const git_tree_entry *entry); /**- * Add a new entry to a tree and return the new entry.+ * Write a tree to the ODB from the index file *- * This will mark the tree as modified; the new entry will- * be written back to disk on the next git_object_write()+ * This method will scan the index and write a representation+ * of its current state back to disk; it recursively creates+ * tree objects for each of the subtrees stored in the index,+ * but only returns the OID of the root tree. This is the OID+ * that can be used e.g. to create a commit. *- * @param entry_out Pointer to the entry that just got- * created. May be NULL if you are not interested on- * getting the new entry- * @param tree Tree object to store the entry- * @iparam id OID for the tree entry- * @param filename Filename for the tree entry- * @param attributes UNIX file attributes for the entry- * @return 0 on success; otherwise error code+ * The index instance cannot be bare, and needs to be associated+ * to an existing repository.+ *+ * @param oid Pointer where to store the written tree+ * @param index Index to write+ * @return 0 or an error code */-GIT_EXTERN(int) git_tree_add_entry(git_tree_entry **entry_out, git_tree *tree, const git_oid *id, const char *filename, int attributes);+GIT_EXTERN(int) git_tree_create_fromindex(git_oid *oid, git_index *index); /**- * Remove an entry by its index.+ * Create a new tree builder. *- * Index must be >= 0 and < than git_tree_entrycount().+ * The tree builder can be used to create or modify+ * trees in memory and write them as tree objects to the+ * database. *- * This will mark the tree as modified; the modified entry will- * be written back to disk on the next git_object_write()+ * If the `source` parameter is not NULL, the tree builder+ * will be initialized with the entries of the given tree. *- * @param tree Tree where to remove the entry- * @param idx index of the entry- * @return 0 on successful removal; GIT_ENOTFOUND if the entry wasn't found+ * If the `source` parameter is NULL, the tree builder will+ * have no entries and will have to be filled manually.+ *+ * @param builder_p Pointer where to store the tree builder+ * @param source Source tree to initialize the builder (optional)+ * @return 0 on sucess; error code otherwise */-GIT_EXTERN(int) git_tree_remove_entry_byindex(git_tree *tree, int idx);+GIT_EXTERN(int) git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source); /**- * Remove an entry by its filename.+ * Clear all the entires in the builder *- * This will mark the tree as modified; the modified entry will- * be written back to disk on the next git_object_write()+ * @param bld Builder to clear+ */+GIT_EXTERN(void) git_treebuilder_clear(git_treebuilder *bld);++/**+ * Free a tree builder *- * @param tree Tree where to remove the entry- * @param filename File name of the entry- * @return 0 on successful removal; GIT_ENOTFOUND if the entry wasn't found+ * This will clear all the entries and free to builder.+ * Failing to free the builder after you're done using it+ * will result in a memory leak+ *+ * @param bld Builder to free */-GIT_EXTERN(int) git_tree_remove_entry_byname(git_tree *tree, const char *filename);+GIT_EXTERN(void) git_treebuilder_free(git_treebuilder *bld); /**- * Clear all the entries in a tree.+ * Get an entry from the builder from its filename *- * This will mark the tree as modified; the modified entry will- * be written back to disk on the next git_object_write().+ * The returned entry is owned by the builder and should+ * not be freed manually. *- * @param tree Tree object whose entries are to be sorted+ * @param bld Tree builder+ * @param filename Name of the entry+ * @return pointer to the entry; NULL if not found */-GIT_EXTERN(void) git_tree_clear_entries(git_tree *tree);+GIT_EXTERN(const git_tree_entry *) git_treebuilder_get(git_treebuilder *bld, const char *filename); /**- * Change the SHA1 id of a tree entry.+ * Add or update an entry to the builder *- * This will mark the tree that contains the entry as modified;- * the modified entry will be written back to disk on the next git_object_write()+ * Insert a new entry for `filename` in the builder with the+ * given attributes. *- * @param entry Entry object which will be modified- * @param oid new SHA1 oid for the entry+ * if an entry named `filename` already exists, its attributes+ * will be updated with the given ones.+ *+ * The optional pointer `entry_out` can be used to retrieve a+ * pointer to the newly created/updated entry.+ *+ * @param entry_out Pointer to store the entry (optional)+ * @param bld Tree builder+ * @param filename Filename of the entry+ * @param id SHA1 oid of the entry+ * @param attributes Folder attributes of the entry+ * @return 0 or an error code */-GIT_EXTERN(void) git_tree_entry_set_id(git_tree_entry *entry, const git_oid *oid);+GIT_EXTERN(int) git_treebuilder_insert(git_tree_entry **entry_out, git_treebuilder *bld, const char *filename, const git_oid *id, unsigned int attributes); /**- * Change the filename of a tree entry.+ * Remove an entry from the builder by its filename *- * This will mark the tree that contains the entry as modified;- * the modified entry will be written back to disk on the next git_object_write()+ * @param bld Tree builder+ * @param filename Filename of the entry to remove+ */+GIT_EXTERN(int) git_treebuilder_remove(git_treebuilder *bld, const char *filename);++/**+ * Filter the entries in the tree *- * @param entry Entry object which will be modified- * @param oid new filename for the entry+ * The `filter` callback will be called for each entry+ * in the tree with a pointer to the entry and the+ * provided `payload`: if the callback returns 1, the+ * entry will be filtered (removed from the builder).+ *+ * @param bld Tree builder+ * @param filter Callback to filter entries */-GIT_EXTERN(void) git_tree_entry_set_name(git_tree_entry *entry, const char *name);+GIT_EXTERN(void) git_treebuilder_filter(git_treebuilder *bld, int (*filter)(const git_tree_entry *, void *), void *payload); /**- * Change the attributes of a tree entry.+ * Write the contents of the tree builder as a tree object *- * This will mark the tree that contains the entry as modified;- * the modified entry will be written back to disk on the next git_object_write()+ * The tree builder will be written to the given `repo`, and+ * it's identifying SHA1 hash will be stored in the `oid`+ * pointer. *- * @param entry Entry object which will be modified- * @param oid new attributes for the entry- * @return 0 if the attributes were properly set; error code otherwise+ * @param oid Pointer where to store the written OID+ * @param repo Repository where to store the object+ * @param bld Tree builder to write+ * @return 0 or an error code */-GIT_EXTERN(int) git_tree_entry_set_attributes(git_tree_entry *entry, unsigned int attr);+GIT_EXTERN(int) git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *bld); +/**+ * Retrieve a subtree contained in a tree, given its+ * relative path.+ *+ * The returned tree is owned by the repository and+ * should be closed with the `git_object_free` method.+ *+ * @param subtree Pointer where to store the subtree+ * @param root A previously loaded tree which will be the root of the relative path+ * @param subtree_path Path to the contained subtree+ * @return 0 on success; GIT_ENOTFOUND if the path does not lead to a subtree+ */+GIT_EXTERN(int) git_tree_get_subtree(git_tree **subtree, git_tree *root, const char *subtree_path);++/** Callback for the tree traversal method */+typedef int (*git_treewalk_cb)(const char *root, git_tree_entry *entry, void *payload);++/** Tree traversal modes */+enum git_treewalk_mode {+ GIT_TREEWALK_PRE = 0, /* Pre-order */+ GIT_TREEWALK_POST = 1, /* Post-order */+};++/**+ * Traverse the entries in a tree and its subtrees in+ * post or pre order+ *+ * The entries will be traversed in the specified order,+ * children subtrees will be automatically loaded as required,+ * and the `callback` will be called once per entry with+ * the current (relative) root for the entry and the entry+ * data itself.+ *+ * If the callback returns a negative value, the passed entry+ * will be skiped on the traversal.+ *+ * @param tree The tree to walk+ * @param callback Function to call on each tree entry+ * @param mode Traversal mode (pre or post-order)+ * @param payload Opaque pointer to be passed on each callback+ * @return 0 or an error code+ */+GIT_EXTERN(int) git_tree_walk(git_tree *tree, git_treewalk_cb callback, int mode, void *payload);+ /** @} */+ GIT_END_DECL #endif
libgit2/include/git2/types.h view
@@ -1,30 +1,14 @@ /*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.+ * Copyright (C) 2009-2012 the libgit2 contributors *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file. */ #ifndef INCLUDE_git_types_h__ #define INCLUDE_git_types_h__ +#include "common.h"+ /** * @file git2/types.h * @brief libgit2 base & compatibility types@@ -57,33 +41,37 @@ #elif defined(__MINGW32__) typedef off64_t git_off_t;-typedef time_t git_time_t;+typedef __time64_t git_time_t; -#else /* POSIX */+#elif defined(__HAIKU__) -/* +typedef __haiku_std_int64 git_off_t;+typedef __haiku_std_int64 git_time_t;++#else /* POSIX */++/* * Note: Can't use off_t since if a client program includes <sys/types.h> * before us (directly or indirectly), they'll get 32 bit off_t in their client * app, even though /we/ define _FILE_OFFSET_BITS=64. */-typedef long long git_off_t;-typedef time_t git_time_t;+typedef int64_t git_off_t;+typedef int64_t git_time_t; #endif - /** Basic type (loose or packed) of any Git object. */ typedef enum { GIT_OBJ_ANY = -2, /**< Object can be any of the following */- GIT_OBJ_BAD = -1, /**< Object is invalid. */- GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */- GIT_OBJ_COMMIT = 1, /**< A commit object. */- GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */- GIT_OBJ_BLOB = 3, /**< A file revision object. */- GIT_OBJ_TAG = 4, /**< An annotated tag object. */- GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */- GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */- GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */+ GIT_OBJ_BAD = -1, /**< Object is invalid. */+ GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */+ GIT_OBJ_COMMIT = 1, /**< A commit object. */+ GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */+ GIT_OBJ_BLOB = 3, /**< A file revision object. */+ GIT_OBJ_TAG = 4, /**< An annotated tag object. */+ GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */+ GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */+ GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */ } git_otype; /** An open object database handle. */@@ -92,6 +80,12 @@ /** A custom backend in an ODB */ typedef struct git_odb_backend git_odb_backend; +/** An object read from the ODB */+typedef struct git_odb_object git_odb_object;++/** A stream to read/write from the ODB */+typedef struct git_odb_stream git_odb_stream;+ /** * Representation of an existing git repository, * including all its object contents@@ -119,12 +113,30 @@ /** Representation of a tree object. */ typedef struct git_tree git_tree; +/** Constructor for in-memory trees */+typedef struct git_treebuilder git_treebuilder;+ /** Memory representation of an index file. */ typedef struct git_index git_index; +/** Memory representation of a set of config files */+typedef struct git_config git_config;++/** Interface to access a configuration file */+typedef struct git_config_file git_config_file;++/** Representation of a reference log entry */+typedef struct git_reflog_entry git_reflog_entry;++/** Representation of a reference log */+typedef struct git_reflog git_reflog;++/** Representation of a git note */+typedef struct git_note git_note;+ /** Time in a signature */ typedef struct git_time {- time_t time; /** time in seconds from epoch */+ git_time_t time; /** time in seconds from epoch */ int offset; /** timezone offset, in minutes */ } git_time; @@ -146,7 +158,18 @@ GIT_REF_PACKED = 4, GIT_REF_HAS_PEEL = 8, GIT_REF_LISTALL = GIT_REF_OID|GIT_REF_SYMBOLIC|GIT_REF_PACKED,-} git_rtype;+} git_ref_t;++/** Basic type of any Git branch. */+typedef enum {+ GIT_BRANCH_LOCAL = 1,+ GIT_BRANCH_REMOTE = 2,+} git_branch_t;++typedef struct git_refspec git_refspec;+typedef struct git_remote git_remote;++typedef struct git_remote_head git_remote_head; /** @} */ GIT_END_DECL
+ libgit2/include/git2/version.h view
@@ -0,0 +1,15 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_version_h__+#define INCLUDE_git_version_h__++#define LIBGIT2_VERSION "0.17.0"+#define LIBGIT2_VER_MAJOR 0+#define LIBGIT2_VER_MINOR 17+#define LIBGIT2_VER_REVISION 0++#endif
+ libgit2/include/git2/windows.h view
@@ -0,0 +1,59 @@+/*+ * Copyright (C) 2009-2012 the libgit2 contributors+ *+ * This file is part of libgit2, distributed under the GNU GPL v2 with+ * a Linking Exception. For full terms see the included COPYING file.+ */+#ifndef INCLUDE_git_windows_h__+#define INCLUDE_git_windows_h__++#include "common.h"++/**+ * @file git2/windows.h+ * @brief Windows-specific functions+ * @ingroup Git+ * @{+ */+GIT_BEGIN_DECL++/**+ * Set the active codepage for Windows syscalls+ *+ * All syscalls performed by the library will assume+ * this codepage when converting paths and strings+ * to use by the Windows kernel.+ *+ * The default value of UTF-8 will work automatically+ * with most Git repositories created on Unix systems.+ *+ * This settings needs only be changed when working+ * with repositories that contain paths in specific,+ * non-UTF codepages.+ *+ * A full list of all available codepage identifiers may+ * be found at:+ *+ * http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx+ *+ * @param codepage numeric codepage identifier+ */+GIT_EXTERN(void) gitwin_set_codepage(unsigned int codepage);++/**+ * Return the active codepage for Windows syscalls+ *+ * @return numeric codepage identifier+ */+GIT_EXTERN(unsigned int) gitwin_get_codepage(void);++/**+ * Set the active Windows codepage to UTF-8 (this is+ * the default value)+ */+GIT_EXTERN(void) gitwin_set_utf8(void);++/** @} */+GIT_END_DECL+#endif+
− libgit2/include/git2/zlib.h
@@ -1,58 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */-#ifndef INCLUDE_git_zlib_h__-#define INCLUDE_git_zlib_h__--#include <zlib.h>--/**- * @file git2/zlib.h- * @brief Git data compression routines- * @defgroup git_zlib Git data compression routines- * @ingroup Git- * @{- */-GIT_BEGIN_DECL--#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200-/**- * deflateBound returns an upper bound on the compressed size.- *- * This is a stub function used when zlib does not supply the- * deflateBound() implementation itself.- *- * @param stream the stream pointer.- * @param s total length of the source data (in bytes).- * @return maximum length of the compressed data.- */-GIT_INLINE(size_t) deflateBound(z_streamp stream, size_t s)-{- return (s + ((s + 7) >> 3) + ((s + 63) >> 6) + 11);-}-#endif--/** @} */-GIT_END_DECL-#endif
− libgit2/src/blob.c
@@ -1,136 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "git2/common.h"-#include "git2/object.h"-#include "git2/repository.h"--#include "common.h"-#include "blob.h"--const void *git_blob_rawcontent(git_blob *blob)-{- assert(blob);- - if (blob->content.data != NULL)- return blob->content.data;-- if (blob->object.in_memory)- return NULL;-- if (!blob->object.source.open && git_object__source_open((git_object *)blob) < GIT_SUCCESS)- return NULL;-- return blob->object.source.raw.data;-}--int git_blob_rawsize(git_blob *blob)-{- assert(blob);-- if (blob->content.data != NULL)- return blob->content.len;-- return blob->object.source.raw.len;-}--void git_blob__free(git_blob *blob)-{- gitfo_free_buf(&blob->content);- free(blob);-}--int git_blob__parse(git_blob *blob)-{- assert(blob);- return GIT_SUCCESS;-}--int git_blob__writeback(git_blob *blob, git_odb_source *src)-{- assert(blob->object.modified);-- if (blob->content.data == NULL)- return GIT_EMISSINGOBJDATA;-- return git__source_write(src, blob->content.data, blob->content.len);-}--int git_blob_set_rawcontent(git_blob *blob, const void *buffer, size_t len)-{- assert(blob && buffer);-- blob->object.modified = 1;-- git_object__source_close((git_object *)blob);-- if (blob->content.data != NULL)- gitfo_free_buf(&blob->content);-- blob->content.data = git__malloc(len);- blob->content.len = len;-- if (blob->content.data == NULL)- return GIT_ENOMEM;-- memcpy(blob->content.data, buffer, len);-- return GIT_SUCCESS;-}--int git_blob_set_rawcontent_fromfile(git_blob *blob, const char *filename)-{- assert(blob && filename);- blob->object.modified = 1;-- if (blob->content.data != NULL)- gitfo_free_buf(&blob->content);-- return gitfo_read_file(&blob->content, filename);-}--int git_blob_writefile(git_oid *written_id, git_repository *repo, const char *path)-{- int error;- git_blob *blob;-- if (gitfo_exists(path) < 0)- return GIT_ENOTFOUND;-- if ((error = git_blob_new(&blob, repo)) < GIT_SUCCESS)- return error;-- if ((error = git_blob_set_rawcontent_fromfile(blob, path)) < GIT_SUCCESS)- return error;-- if ((error = git_object_write((git_object *)blob)) < GIT_SUCCESS)- return error;-- git_oid_cpy(written_id, git_object_id((git_object *)blob));-- git_object_close((git_object*)blob);- return GIT_SUCCESS;-}-
− libgit2/src/blob.h
@@ -1,17 +0,0 @@-#ifndef INCLUDE_blob_h__-#define INCLUDE_blob_h__--#include "git2/blob.h"-#include "repository.h"-#include "fileops.h"--struct git_blob {- git_object object;- gitfo_buf content;-};--void git_blob__free(git_blob *blob);-int git_blob__parse(git_blob *blob);-int git_blob__writeback(git_blob *blob, git_odb_source *src);--#endif
− libgit2/src/block-sha1/sha1.c
@@ -1,281 +0,0 @@-/*- * SHA1 routine optimized to do word accesses rather than byte accesses,- * and to avoid unnecessary copies into the context array.- *- * This was initially based on the Mozilla SHA1 implementation, although- * none of the original Mozilla code remains.- */--#include "common.h"-#include "sha1.h"--#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))--/*- * Force usage of rol or ror by selecting the one with the smaller constant.- * It _can_ generate slightly smaller code (a constant of 1 is special), but- * perhaps more importantly it's possibly faster on any uarch that does a- * rotate with a loop.- */--#define SHA_ASM(op, x, n) ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; })-#define SHA_ROL(x,n) SHA_ASM("rol", x, n)-#define SHA_ROR(x,n) SHA_ASM("ror", x, n)--#else--#define SHA_ROT(X,l,r) (((X) << (l)) | ((X) >> (r)))-#define SHA_ROL(X,n) SHA_ROT(X,n,32-(n))-#define SHA_ROR(X,n) SHA_ROT(X,32-(n),n)--#endif--/*- * If you have 32 registers or more, the compiler can (and should)- * try to change the array[] accesses into registers. However, on- * machines with less than ~25 registers, that won't really work,- * and at least gcc will make an unholy mess of it.- *- * So to avoid that mess which just slows things down, we force- * the stores to memory to actually happen (we might be better off- * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as- * suggested by Artur Skawina - that will also make gcc unable to- * try to do the silly "optimize away loads" part because it won't- * see what the value will be).- *- * Ben Herrenschmidt reports that on PPC, the C version comes close- * to the optimized asm with this (ie on PPC you don't want that- * 'volatile', since there are lots of registers).- *- * On ARM we get the best code generation by forcing a full memory barrier- * between each SHA_ROUND, otherwise gcc happily get wild with spilling and- * the stack frame size simply explode and performance goes down the drain.- */--#if defined(__i386__) || defined(__x86_64__)- #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val))-#elif defined(__GNUC__) && defined(__arm__)- #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0)-#else- #define setW(x, val) (W(x) = (val))-#endif--/*- * Performance might be improved if the CPU architecture is OK with- * unaligned 32-bit loads and a fast ntohl() is available.- * Otherwise fall back to byte loads and shifts which is portable,- * and is faster on architectures with memory alignment issues.- */--#if defined(__i386__) || defined(__x86_64__) || \- defined(_M_IX86) || defined(_M_X64) || \- defined(__ppc__) || defined(__ppc64__) || \- defined(__powerpc__) || defined(__powerpc64__) || \- defined(__s390__) || defined(__s390x__)--#define get_be32(p) ntohl(*(unsigned int *)(p))-#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0)--#else--#define get_be32(p) ( \- (*((unsigned char *)(p) + 0) << 24) | \- (*((unsigned char *)(p) + 1) << 16) | \- (*((unsigned char *)(p) + 2) << 8) | \- (*((unsigned char *)(p) + 3) << 0) )-#define put_be32(p, v) do { \- unsigned int __v = (v); \- *((unsigned char *)(p) + 0) = __v >> 24; \- *((unsigned char *)(p) + 1) = __v >> 16; \- *((unsigned char *)(p) + 2) = __v >> 8; \- *((unsigned char *)(p) + 3) = __v >> 0; } while (0)--#endif--/* This "rolls" over the 512-bit array */-#define W(x) (array[(x)&15])--/*- * Where do we get the source from? The first 16 iterations get it from- * the input data, the next mix it from the 512-bit array.- */-#define SHA_SRC(t) get_be32(data + t)-#define SHA_MIX(t) SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1)--#define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \- unsigned int TEMP = input(t); setW(t, TEMP); \- E += TEMP + SHA_ROL(A,5) + (fn) + (constant); \- B = SHA_ROR(B, 2); } while (0)--#define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E )-#define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E )-#define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E )-#define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E )-#define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E )--static void blk_SHA1_Block(blk_SHA_CTX *ctx, const unsigned int *data)-{- unsigned int A,B,C,D,E;- unsigned int array[16];-- A = ctx->H[0];- B = ctx->H[1];- C = ctx->H[2];- D = ctx->H[3];- E = ctx->H[4];-- /* Round 1 - iterations 0-16 take their input from 'data' */- T_0_15( 0, A, B, C, D, E);- T_0_15( 1, E, A, B, C, D);- T_0_15( 2, D, E, A, B, C);- T_0_15( 3, C, D, E, A, B);- T_0_15( 4, B, C, D, E, A);- T_0_15( 5, A, B, C, D, E);- T_0_15( 6, E, A, B, C, D);- T_0_15( 7, D, E, A, B, C);- T_0_15( 8, C, D, E, A, B);- T_0_15( 9, B, C, D, E, A);- T_0_15(10, A, B, C, D, E);- T_0_15(11, E, A, B, C, D);- T_0_15(12, D, E, A, B, C);- T_0_15(13, C, D, E, A, B);- T_0_15(14, B, C, D, E, A);- T_0_15(15, A, B, C, D, E);-- /* Round 1 - tail. Input from 512-bit mixing array */- T_16_19(16, E, A, B, C, D);- T_16_19(17, D, E, A, B, C);- T_16_19(18, C, D, E, A, B);- T_16_19(19, B, C, D, E, A);-- /* Round 2 */- T_20_39(20, A, B, C, D, E);- T_20_39(21, E, A, B, C, D);- T_20_39(22, D, E, A, B, C);- T_20_39(23, C, D, E, A, B);- T_20_39(24, B, C, D, E, A);- T_20_39(25, A, B, C, D, E);- T_20_39(26, E, A, B, C, D);- T_20_39(27, D, E, A, B, C);- T_20_39(28, C, D, E, A, B);- T_20_39(29, B, C, D, E, A);- T_20_39(30, A, B, C, D, E);- T_20_39(31, E, A, B, C, D);- T_20_39(32, D, E, A, B, C);- T_20_39(33, C, D, E, A, B);- T_20_39(34, B, C, D, E, A);- T_20_39(35, A, B, C, D, E);- T_20_39(36, E, A, B, C, D);- T_20_39(37, D, E, A, B, C);- T_20_39(38, C, D, E, A, B);- T_20_39(39, B, C, D, E, A);-- /* Round 3 */- T_40_59(40, A, B, C, D, E);- T_40_59(41, E, A, B, C, D);- T_40_59(42, D, E, A, B, C);- T_40_59(43, C, D, E, A, B);- T_40_59(44, B, C, D, E, A);- T_40_59(45, A, B, C, D, E);- T_40_59(46, E, A, B, C, D);- T_40_59(47, D, E, A, B, C);- T_40_59(48, C, D, E, A, B);- T_40_59(49, B, C, D, E, A);- T_40_59(50, A, B, C, D, E);- T_40_59(51, E, A, B, C, D);- T_40_59(52, D, E, A, B, C);- T_40_59(53, C, D, E, A, B);- T_40_59(54, B, C, D, E, A);- T_40_59(55, A, B, C, D, E);- T_40_59(56, E, A, B, C, D);- T_40_59(57, D, E, A, B, C);- T_40_59(58, C, D, E, A, B);- T_40_59(59, B, C, D, E, A);-- /* Round 4 */- T_60_79(60, A, B, C, D, E);- T_60_79(61, E, A, B, C, D);- T_60_79(62, D, E, A, B, C);- T_60_79(63, C, D, E, A, B);- T_60_79(64, B, C, D, E, A);- T_60_79(65, A, B, C, D, E);- T_60_79(66, E, A, B, C, D);- T_60_79(67, D, E, A, B, C);- T_60_79(68, C, D, E, A, B);- T_60_79(69, B, C, D, E, A);- T_60_79(70, A, B, C, D, E);- T_60_79(71, E, A, B, C, D);- T_60_79(72, D, E, A, B, C);- T_60_79(73, C, D, E, A, B);- T_60_79(74, B, C, D, E, A);- T_60_79(75, A, B, C, D, E);- T_60_79(76, E, A, B, C, D);- T_60_79(77, D, E, A, B, C);- T_60_79(78, C, D, E, A, B);- T_60_79(79, B, C, D, E, A);-- ctx->H[0] += A;- ctx->H[1] += B;- ctx->H[2] += C;- ctx->H[3] += D;- ctx->H[4] += E;-}--void git__blk_SHA1_Init(blk_SHA_CTX *ctx)-{- ctx->size = 0;-- /* Initialize H with the magic constants (see FIPS180 for constants) */- ctx->H[0] = 0x67452301;- ctx->H[1] = 0xefcdab89;- ctx->H[2] = 0x98badcfe;- ctx->H[3] = 0x10325476;- ctx->H[4] = 0xc3d2e1f0;-}--void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len)-{- unsigned int lenW = ctx->size & 63;-- ctx->size += len;-- /* Read the data into W and process blocks as they get full */- if (lenW) {- unsigned int left = 64 - lenW;- if (len < left)- left = len;- memcpy(lenW + (char *)ctx->W, data, left);- lenW = (lenW + left) & 63;- len -= left;- data = ((const char *)data + left);- if (lenW)- return;- blk_SHA1_Block(ctx, ctx->W);- }- while (len >= 64) {- blk_SHA1_Block(ctx, data);- data = ((const char *)data + 64);- len -= 64;- }- if (len)- memcpy(ctx->W, data, len);-}--void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx)-{- static const unsigned char pad[64] = { 0x80 };- unsigned int padlen[2];- int i;-- /* Pad with a binary 1 (ie 0x80), then zeroes, then length */- padlen[0] = htonl((uint32_t)(ctx->size >> 29));- padlen[1] = htonl((uint32_t)(ctx->size << 3));-- i = ctx->size & 63;- git__blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i)));- git__blk_SHA1_Update(ctx, padlen, 8);-- /* Output hash */- for (i = 0; i < 5; i++)- put_be32(hashout + i*4, ctx->H[i]);-}
− libgit2/src/block-sha1/sha1.h
@@ -1,22 +0,0 @@-/*- * SHA1 routine optimized to do word accesses rather than byte accesses,- * and to avoid unnecessary copies into the context array.- *- * This was initially based on the Mozilla SHA1 implementation, although- * none of the original Mozilla code remains.- */--typedef struct {- unsigned long long size;- unsigned int H[5];- unsigned int W[16];-} blk_SHA_CTX;--void git__blk_SHA1_Init(blk_SHA_CTX *ctx);-void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len);-void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx);--#define SHA_CTX blk_SHA_CTX-#define SHA1_Init git__blk_SHA1_Init-#define SHA1_Update git__blk_SHA1_Update-#define SHA1_Final git__blk_SHA1_Final
− libgit2/src/bswap.h
@@ -1,97 +0,0 @@-/*- * Let's make sure we always have a sane definition for ntohl()/htonl().- * Some libraries define those as a function call, just to perform byte- * shifting, bringing significant overhead to what should be a simple- * operation.- */--#include "common.h"--/*- * Default version that the compiler ought to optimize properly with- * constant values.- */-GIT_INLINE(uint32_t) default_swab32(uint32_t val)-{- return (((val & 0xff000000) >> 24) |- ((val & 0x00ff0000) >> 8) |- ((val & 0x0000ff00) << 8) |- ((val & 0x000000ff) << 24));-}--#undef bswap32--GIT_INLINE(uint16_t) default_swab16(uint16_t val)-{- return (((val & 0xff00) >> 8) |- ((val & 0x00ff) << 8));-}--#undef bswap16--#if defined(__GNUC__) && defined(__i386__)--#define bswap32(x) ({ \- uint32_t __res; \- if (__builtin_constant_p(x)) { \- __res = default_swab32(x); \- } else { \- __asm__("bswap %0" : "=r" (__res) : "0" ((uint32_t)(x))); \- } \- __res; })--#define bswap16(x) ({ \- uint16_t __res; \- if (__builtin_constant_p(x)) { \- __res = default_swab16(x); \- } else { \- __asm__("xchgb %b0,%h0" : "=q" (__res) : "0" ((uint16_t)(x))); \- } \- __res; })--#elif defined(__GNUC__) && defined(__x86_64__)--#define bswap32(x) ({ \- uint32_t __res; \- if (__builtin_constant_p(x)) { \- __res = default_swab32(x); \- } else { \- __asm__("bswapl %0" : "=r" (__res) : "0" ((uint32_t)(x))); \- } \- __res; })--#define bswap16(x) ({ \- uint16_t __res; \- if (__builtin_constant_p(x)) { \- __res = default_swab16(x); \- } else { \- __asm__("xchgb %b0,%h0" : "=Q" (__res) : "0" ((uint16_t)(x))); \- } \- __res; })--#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))--#include <stdlib.h>--#define bswap32(x) _byteswap_ulong(x)-#define bswap16(x) _byteswap_ushort(x)--#endif--#ifdef bswap32--#undef ntohl-#undef htonl-#define ntohl(x) bswap32(x)-#define htonl(x) bswap32(x)--#endif--#ifdef bswap16--#undef ntohs-#undef htons-#define ntohs(x) bswap16(x)-#define htons(x) bswap16(x)--#endif
− libgit2/src/cc-compat.h
@@ -1,73 +0,0 @@-/*- * cc-compat.h - C compiler compat macros for internal use- */-#ifndef INCLUDE_compat_h__-#define INCLUDE_compat_h__--/*- * See if our compiler is known to support flexible array members.- */-#ifndef GIT_FLEX_ARRAY-# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)-# define GIT_FLEX_ARRAY /* empty */-# elif defined(__GNUC__)-# if (__GNUC__ >= 3)-# define GIT_FLEX_ARRAY /* empty */-# else-# define GIT_FLEX_ARRAY 0 /* older GNU extension */-# endif-# endif--/* Default to safer but a bit wasteful traditional style */-# ifndef GIT_FLEX_ARRAY-# define GIT_FLEX_ARRAY 1-# endif-#endif--#ifdef __GNUC__-# define GIT_TYPEOF(x) (__typeof__(x))-#else-# define GIT_TYPEOF(x)-#endif--#ifdef __cplusplus-# define GIT_UNUSED(x)-#else-# ifdef __GNUC__-# define GIT_UNUSED(x) x __attribute__ ((__unused__))-# else-# define GIT_UNUSED(x) x-# endif-#endif--#if defined(_MSC_VER)-#define GIT_UNUSED_ARG(x) ((void)(x)); /* note trailing ; */-#else-#define GIT_UNUSED_ARG(x)-#endif--/*- * Does our compiler/platform support the C99 <inttypes.h> and- * <stdint.h> header files. (C99 requires that <inttypes.h>- * includes <stdint.h>).- */-#if !defined(_MSC_VER)-# define GIT_HAVE_INTTYPES_H 1-#endif--/* Define the printf format specifer to use for size_t output */-#if defined(_MSC_VER) || defined(__MINGW32__)-# define PRIuZ "Iu"-#else-# define PRIuZ "zu"-#endif--/* Micosoft Visual C/C++ */-#if defined(_MSC_VER)-/* disable "deprecated function" warnings */-# pragma warning ( disable : 4996 )-/* disable "conditional expression is constant" level 4 warnings */-# pragma warning ( disable : 4127 )-#endif--#endif /* INCLUDE_compat_h__ */
− libgit2/src/commit.c
@@ -1,299 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "git2/common.h"-#include "git2/object.h"-#include "git2/repository.h"-#include "git2/signature.h"--#include "common.h"-#include "commit.h"-#include "signature.h"--#define COMMIT_BASIC_PARSE 0x0-#define COMMIT_FULL_PARSE 0x1--#define COMMIT_PRINT(commit) {\- char oid[41]; oid[40] = 0;\- git_oid_fmt(oid, &commit->object.id);\- printf("Oid: %s | In degree: %d | Time: %u\n", oid, commit->in_degree, commit->commit_time);\-}--static void clear_parents(git_commit *commit)-{- unsigned int i;-- for (i = 0; i < commit->parent_oids.length; ++i) {- git_oid *parent = git_vector_get(&commit->parent_oids, i);- free(parent);- }-- git_vector_clear(&commit->parent_oids);-}--void git_commit__free(git_commit *commit)-{- clear_parents(commit);- git_vector_free(&commit->parent_oids);-- git_signature_free(commit->author);- git_signature_free(commit->committer);-- free(commit->message);- free(commit->message_short);- free(commit);-}--const git_oid *git_commit_id(git_commit *c)-{- return git_object_id((git_object *)c);-}--int git_commit__writeback(git_commit *commit, git_odb_source *src)-{- unsigned int i;-- git__write_oid(src, "tree", &commit->tree_oid);-- for (i = 0; i < commit->parent_oids.length; ++i) {- git_oid *parent_oid;-- parent_oid = git_vector_get(&commit->parent_oids, i);- git__write_oid(src, "parent", parent_oid);- }-- if (commit->author == NULL)- return GIT_EMISSINGOBJDATA;-- git_signature__write(src, "author", commit->author);-- if (commit->committer == NULL)- return GIT_EMISSINGOBJDATA;-- git_signature__write(src, "committer", commit->committer);-- if (commit->message != NULL) {- git__source_write(src, "\n", 1);- git__source_write(src, commit->message, strlen(commit->message));- }-- return GIT_SUCCESS;-}--int commit_parse_buffer(git_commit *commit, void *data, size_t len)-{- char *buffer = (char *)data;- const char *buffer_end = (char *)data + len;-- git_oid parent_oid;- int error;-- /* first parse; the vector hasn't been initialized yet */- if (commit->parent_oids.contents == NULL) {- git_vector_init(&commit->parent_oids, 4, NULL);- }-- clear_parents(commit);-- if ((error = git__parse_oid(&commit->tree_oid, &buffer, buffer_end, "tree ")) < GIT_SUCCESS)- return error;-- /*- * TODO: commit grafts!- */-- while (git__parse_oid(&parent_oid, &buffer, buffer_end, "parent ") == GIT_SUCCESS) {- git_oid *new_oid;-- new_oid = git__malloc(sizeof(git_oid));- git_oid_cpy(new_oid, &parent_oid);-- if (git_vector_insert(&commit->parent_oids, new_oid) < GIT_SUCCESS)- return GIT_ENOMEM;- }-- if (commit->author)- git_signature_free(commit->author);-- commit->author = git__malloc(sizeof(git_signature));- if ((error = git_signature__parse(commit->author, &buffer, buffer_end, "author ")) < GIT_SUCCESS)- return error;-- /* Always parse the committer; we need the commit time */- if (commit->committer)- git_signature_free(commit->committer);-- commit->committer = git__malloc(sizeof(git_signature));- if ((error = git_signature__parse(commit->committer, &buffer, buffer_end, "committer ")) < GIT_SUCCESS)- return error;-- /* parse commit message */- while (buffer <= buffer_end && *buffer == '\n')- buffer++;-- if (buffer < buffer_end) {- const char *line_end;- size_t message_len = buffer_end - buffer;-- /* Long message */- message_len = buffer_end - buffer;- commit->message = git__malloc(message_len + 1);- memcpy(commit->message, buffer, message_len);- commit->message[message_len] = 0;-- /* Short message */- if((line_end = memchr(buffer, '\n', buffer_end - buffer)) == NULL)- line_end = buffer_end;- message_len = line_end - buffer;-- commit->message_short = git__malloc(message_len + 1);- memcpy(commit->message_short, buffer, message_len);- commit->message_short[message_len] = 0;- }-- return GIT_SUCCESS;-}--int git_commit__parse(git_commit *commit)-{- assert(commit && commit->object.source.open);- return commit_parse_buffer(commit,- commit->object.source.raw.data, commit->object.source.raw.len);-}--#define GIT_COMMIT_GETTER(_rvalue, _name, _return) \- _rvalue git_commit_##_name(git_commit *commit) \- {\- assert(commit); \- return _return; \- }--GIT_COMMIT_GETTER(const git_signature *, author, commit->author)-GIT_COMMIT_GETTER(const git_signature *, committer, commit->committer)-GIT_COMMIT_GETTER(const char *, message, commit->message)-GIT_COMMIT_GETTER(const char *, message_short, commit->message_short)-GIT_COMMIT_GETTER(time_t, time, commit->committer->when.time)-GIT_COMMIT_GETTER(int, time_offset, commit->committer->when.offset)-GIT_COMMIT_GETTER(unsigned int, parentcount, commit->parent_oids.length)---int git_commit_tree(git_tree **tree_out, git_commit *commit)-{- assert(commit);- return git_tree_lookup(tree_out, commit->object.repo, &commit->tree_oid);-}--int git_commit_parent(git_commit **parent, git_commit *commit, unsigned int n)-{- git_oid *parent_oid;- assert(commit);-- parent_oid = git_vector_get(&commit->parent_oids, n);- if (parent_oid == NULL)- return GIT_ENOTFOUND;-- return git_commit_lookup(parent, commit->object.repo, parent_oid);-}----int git_commit_set_tree(git_commit *commit, git_tree *tree)-{- const git_oid *oid;-- assert(commit && tree);-- if ((oid = git_object_id((git_object *)tree)) == NULL)- return GIT_EMISSINGOBJDATA;-- commit->object.modified = 1;- git_oid_cpy(&commit->tree_oid, oid);- return GIT_SUCCESS;-}--int git_commit_add_parent(git_commit *commit, git_commit *new_parent)-{- const git_oid *parent_oid;- git_oid *new_oid;- assert(commit && new_parent);-- if ((parent_oid = git_object_id((git_object *)new_parent)) == NULL)- return GIT_EMISSINGOBJDATA;-- new_oid = git__malloc(sizeof(git_oid));- if (new_oid == NULL)- return GIT_ENOMEM;-- commit->object.modified = 1;- git_oid_cpy(new_oid, parent_oid);- return git_vector_insert(&commit->parent_oids, new_oid);-}--void git_commit_set_author(git_commit *commit, const git_signature *author_sig)-{- assert(commit && author_sig);- commit->object.modified = 1;-- git_signature_free(commit->author);- commit->author = git_signature_dup(author_sig);-}--void git_commit_set_committer(git_commit *commit, const git_signature *committer_sig)-{- assert(commit && committer_sig);- commit->object.modified = 1;-- git_signature_free(commit->committer);- commit->committer = git_signature_dup(committer_sig);-}--void git_commit_set_message(git_commit *commit, const char *message)-{- const char *line_end;- size_t message_len;-- commit->object.modified = 1;-- if (commit->message)- free(commit->message);-- if (commit->message_short)- free(commit->message_short);-- commit->message = git__strdup(message);-- /* Short message */- if((line_end = strchr(message, '\n')) == NULL) {- commit->message_short = git__strdup(message);- return;- }-- message_len = line_end - message;-- commit->message_short = git__malloc(message_len + 1);- memcpy(commit->message_short, message, message_len);- commit->message_short[message_len] = 0;-}-
− libgit2/src/commit.h
@@ -1,29 +0,0 @@-#ifndef INCLUDE_commit_h__-#define INCLUDE_commit_h__--#include "git2/commit.h"-#include "tree.h"-#include "repository.h"-#include "vector.h"--#include <time.h>--struct git_commit {- git_object object;-- git_vector parent_oids;- git_oid tree_oid;-- git_signature *author;- git_signature *committer;-- char *message;- char *message_short;-};--void git_commit__free(git_commit *c);-int git_commit__parse(git_commit *commit);--int git_commit__writeback(git_commit *commit, git_odb_source *src);--#endif
− libgit2/src/common.h
@@ -1,56 +0,0 @@-#ifndef INCLUDE_common_h__-#define INCLUDE_common_h__--/** Force 64 bit off_t size on POSIX. */-#define _FILE_OFFSET_BITS 64--#if defined(_WIN32) && !defined(__CYGWIN__)-#define GIT_WIN32 1-#endif--#include "git2/thread-utils.h"-#include "cc-compat.h"--#ifdef GIT_HAVE_INTTYPES_H-# include <inttypes.h>-#endif-#include <assert.h>-#include <errno.h>-#include <limits.h>-#include <stdlib.h>-#include <stdio.h>-#include <string.h>--#include <sys/types.h>-#include <sys/stat.h>--#ifdef GIT_WIN32--# include <io.h>-# include <direct.h>-# include <windows.h>-# include "msvc-compat.h"-# include "mingw-compat.h"-# include "win32/pthread.h"--# define snprintf _snprintf--typedef SSIZE_T ssize_t;--#else--# include <unistd.h>-# include <arpa/inet.h>-# include <pthread.h>--#endif--#include "git2/common.h"-#include "git2/types.h"-#include "util.h"-#include "thread-utils.h"-#include "bswap.h"--#define GIT_PATH_MAX 4096--#endif /* INCLUDE_common_h__ */
− libgit2/src/delta-apply.c
@@ -1,109 +0,0 @@-#include "common.h"-#include "git2/odb.h"-#include "delta-apply.h"--/*- * This file was heavily cribbed from BinaryDelta.java in JGit, which- * itself was heavily cribbed from <code>patch-delta.c</code> in the- * GIT project. The original delta patching code was written by- * Nicolas Pitre <nico@cam.org>.- */--static int hdr_sz(- size_t *size,- const unsigned char **delta,- const unsigned char *end)-{- const unsigned char *d = *delta;- size_t r = 0;- unsigned int c, shift = 0;-- do {- if (d == end)- return -1;- c = *d++;- r |= (c & 0x7f) << shift;- shift += 7;- } while (c & 0x80);- *delta = d;- *size = r;- return 0;-}--int git__delta_apply(- git_rawobj *out,- const unsigned char *base,- size_t base_len,- const unsigned char *delta,- size_t delta_len)-{- const unsigned char *delta_end = delta + delta_len;- size_t base_sz, res_sz;- unsigned char *res_dp;-- /* Check that the base size matches the data we were given;- * if not we would underflow while accessing data from the- * base object, resulting in data corruption or segfault.- */- if ((hdr_sz(&base_sz, &delta, delta_end) < 0) || (base_sz != base_len))- return GIT_ERROR;-- if (hdr_sz(&res_sz, &delta, delta_end) < 0)- return GIT_ERROR;-- if ((res_dp = git__malloc(res_sz + 1)) == NULL)- return GIT_ERROR;- res_dp[res_sz] = '\0';- out->data = res_dp;- out->len = res_sz;-- while (delta < delta_end) {- unsigned char cmd = *delta++;- if (cmd & 0x80) {- /* cmd is a copy instruction; copy from the base.- */- size_t off = 0, len = 0;-- if (cmd & 0x01) off = *delta++;- if (cmd & 0x02) off |= *delta++ << 8;- if (cmd & 0x04) off |= *delta++ << 16;- if (cmd & 0x08) off |= *delta++ << 24;-- if (cmd & 0x10) len = *delta++;- if (cmd & 0x20) len |= *delta++ << 8;- if (cmd & 0x40) len |= *delta++ << 16;- if (!len) len = 0x10000;-- if (base_len < off + len || res_sz < len)- goto fail;- memcpy(res_dp, base + off, len);- res_dp += len;- res_sz -= len;-- } else if (cmd) {- /* cmd is a literal insert instruction; copy from- * the delta stream itself.- */- if (delta_end - delta < cmd || res_sz < cmd)- goto fail;- memcpy(res_dp, delta, cmd);- delta += cmd;- res_dp += cmd;- res_sz -= cmd;-- } else {- /* cmd == 0 is reserved for future encodings.- */- goto fail;- }- }-- if (delta != delta_end || res_sz)- goto fail;- return GIT_SUCCESS;--fail:- free(out->data);- out->data = NULL;- return GIT_ERROR;-}
− libgit2/src/delta-apply.h
@@ -1,25 +0,0 @@-#ifndef INCLUDE_delta_apply_h__-#define INCLUDE_delta_apply_h__--/**- * Apply a git binary delta to recover the original content.- *- * @param out the output buffer to receive the original data.- * Only out->data and out->len are populated, as this is- * the only information available in the delta.- * @param base the base to copy from during copy instructions.- * @param base_len number of bytes available at base.- * @param delta the delta to execute copy/insert instructions from.- * @param delta_len total number of bytes in the delta.- * @return- * - GIT_SUCCESS on a successful delta unpack.- * - GIT_ERROR if the delta is corrupt or doesn't match the base.- */-extern int git__delta_apply(- git_rawobj *out,- const unsigned char *base,- size_t base_len,- const unsigned char *delta,- size_t delta_len);--#endif
− libgit2/src/dir.h
@@ -1,41 +0,0 @@-#ifndef INCLUDE_dir_h__-#define INCLUDE_dir_h__--#include "common.h"--#ifndef GIT_WIN32-# include <dirent.h>-#endif--#ifdef GIT_WIN32--struct git__dirent {- int d_ino;- char d_name[261];-};--typedef struct {- HANDLE h;- WIN32_FIND_DATA f;- struct git__dirent entry;- char *dir;- int first;-} git__DIR;--extern git__DIR *git__opendir(const char *);-extern struct git__dirent *git__readdir(git__DIR *);-extern void git__rewinddir(git__DIR *);-extern int git__closedir(git__DIR *);--# ifndef GIT__WIN32_NO_WRAP_DIR-# define dirent git__dirent-# define DIR git__DIR-# define opendir git__opendir-# define readdir git__readdir-# define rewinddir git__rewinddir-# define closedir git__closedir-# endif--#endif--#endif /* INCLUDE_dir_h__ */
− libgit2/src/errors.c
@@ -1,44 +0,0 @@-#include "common.h"-#include "thread-utils.h" /* for GIT_TLS */--static struct {- int num;- const char *str;-} error_codes[] = {- {GIT_ERROR, "Unspecified error"},- {GIT_ENOTOID, "Input was not a properly formatted Git object id."},- {GIT_ENOTFOUND, "Object does not exist in the scope searched."},- {GIT_ENOMEM, "Not enough space available."},- {GIT_EOSERR, "Consult the OS error information."},- {GIT_EOBJTYPE, "The specified object is of invalid type"},- {GIT_EOBJCORRUPTED, "The specified object has its data corrupted"},- {GIT_ENOTAREPO, "The specified repository is invalid"},- {GIT_EINVALIDTYPE, "The object type is invalid or doesn't match"},- {GIT_EMISSINGOBJDATA, "The object cannot be written that because it's missing internal data"},- {GIT_EPACKCORRUPTED, "The packfile for the ODB is corrupted"},- {GIT_EFLOCKFAIL, "Failed to adquire or release a file lock"},- {GIT_EZLIB, "The Z library failed to inflate/deflate an object's data"},- {GIT_EBUSY, "The queried object is currently busy"},- {GIT_EINVALIDPATH, "The path is invalid"},- {GIT_EBAREINDEX, "The index file is not backed up by an existing repository"},- {GIT_EINVALIDREFNAME, "The name of the reference is not valid"},- {GIT_EREFCORRUPTED, "The specified reference has its data corrupted"},- {GIT_ETOONESTEDSYMREF, "The specified symbolic reference is too deeply nested"},- {GIT_EPACKEDREFSCORRUPTED, "The pack-refs file is either corrupted of its format is not currently supported"},- {GIT_EINVALIDPATH, "The path is invalid" },- {GIT_EREVWALKOVER, "The revision walker is empty; there are no more commits left to iterate"},- {GIT_EINVALIDREFSTATE, "The state of the reference is not valid"}-};--const char *git_strerror(int num)-{- size_t i;-- if (num == GIT_EOSERR)- return strerror(errno);- for (i = 0; i < ARRAY_SIZE(error_codes); i++)- if (num == error_codes[i].num)- return error_codes[i].str;-- return "Unknown error";-}
− libgit2/src/filebuf.c
@@ -1,291 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */-#include <stdarg.h>--#include "common.h"-#include "filebuf.h"-#include "fileops.h"--static const size_t WRITE_BUFFER_SIZE = (4096 * 2);--static int lock_file(git_filebuf *file, int flags)-{- if (gitfo_exists(file->path_lock) == 0) {- if (flags & GIT_FILEBUF_FORCE)- gitfo_unlink(file->path_lock);- else- return GIT_EOSERR;- }-- /* create path to the file buffer is required */- if (flags & GIT_FILEBUF_FORCE) {- file->fd = gitfo_creat_force(file->path_lock, 0644);- } else {- file->fd = gitfo_creat(file->path_lock, 0644);- }-- if (file->fd < 0)- return GIT_EOSERR;-- /* TODO: do a flock() in the descriptor file_lock */-- if ((flags & GIT_FILEBUF_APPEND) && gitfo_exists(file->path_original) == 0) {- git_file source;- char buffer[2048];- size_t read_bytes;-- source = gitfo_open(file->path_original, O_RDONLY);- if (source < 0)- return GIT_EOSERR;-- while ((read_bytes = gitfo_read(source, buffer, 2048)) > 0) {- gitfo_write(file->fd, buffer, read_bytes);- if (file->digest)- git_hash_update(file->digest, buffer, read_bytes);- }-- gitfo_close(source);- }-- return GIT_SUCCESS;-}--void git_filebuf_cleanup(git_filebuf *file)-{- if (file->fd >= 0)- gitfo_close(file->fd);-- if (gitfo_exists(file->path_lock) == GIT_SUCCESS)- gitfo_unlink(file->path_lock);-- if (file->digest)- git_hash_free_ctx(file->digest);-- free(file->buffer);--#ifdef GIT_FILEBUF_THREADS- free(file->buffer_back);-#endif-- free(file->path_original);- free(file->path_lock);-}--static int flush_buffer(git_filebuf *file)-{- int result = GIT_SUCCESS;-- if (file->buf_pos > 0) {- result = gitfo_write(file->fd, file->buffer, file->buf_pos);- if (file->digest)- git_hash_update(file->digest, file->buffer, file->buf_pos);-- file->buf_pos = 0;- }-- return result;-}--int git_filebuf_open(git_filebuf *file, const char *path, int flags)-{- int error;- size_t path_len;-- if (file == NULL || path == NULL)- return GIT_ERROR;-- memset(file, 0x0, sizeof(git_filebuf));-- file->buf_size = WRITE_BUFFER_SIZE;- file->buf_pos = 0;- file->fd = -1;-- path_len = strlen(path);-- file->path_original = git__strdup(path);- if (file->path_original == NULL) {- error = GIT_ENOMEM;- goto cleanup;- }-- file->path_lock = git__malloc(path_len + GIT_FILELOCK_EXTLENGTH);- if (file->path_lock == NULL) {- error = GIT_ENOMEM;- goto cleanup;- }-- memcpy(file->path_lock, file->path_original, path_len);- memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH);-- file->buffer = git__malloc(file->buf_size);- if (file->buffer == NULL){- error = GIT_ENOMEM;- goto cleanup;- }--#ifdef GIT_FILEBUF_THREADS- file->buffer_back = git__malloc(file->buf_size);- if (file->buffer_back == NULL){- error = GIT_ENOMEM;- goto cleanup;- }-#endif-- if (flags & GIT_FILEBUF_HASH_CONTENTS) {- if ((file->digest = git_hash_new_ctx()) == NULL) {- error = GIT_ENOMEM;- goto cleanup;- }- }-- if ((error = lock_file(file, flags)) < GIT_SUCCESS)- goto cleanup;-- return GIT_SUCCESS;--cleanup:- git_filebuf_cleanup(file);- return error;-}--int git_filebuf_hash(git_oid *oid, git_filebuf *file)-{- int error;-- if (file->digest == NULL)- return GIT_ERROR;-- if ((error = flush_buffer(file)) < GIT_SUCCESS)- return error;-- git_hash_final(oid, file->digest);- git_hash_free_ctx(file->digest);- file->digest = NULL;-- return GIT_SUCCESS;-}--int git_filebuf_commit(git_filebuf *file)-{- int error;-- if ((error = flush_buffer(file)) < GIT_SUCCESS)- goto cleanup;-- gitfo_close(file->fd);- file->fd = -1;-- error = gitfo_mv(file->path_lock, file->path_original);--cleanup:- git_filebuf_cleanup(file);- return error;-}--GIT_INLINE(void) add_to_cache(git_filebuf *file, void *buf, size_t len)-{- memcpy(file->buffer + file->buf_pos, buf, len);- file->buf_pos += len;-}--int git_filebuf_write(git_filebuf *file, void *buff, size_t len)-{- int error;- unsigned char *buf = buff;-- for (;;) {- size_t space_left = file->buf_size - file->buf_pos;-- /* cache if it's small */- if (space_left > len) {- add_to_cache(file, buf, len);- return GIT_SUCCESS;- }-- /* flush the cache if it doesn't fit */- if (file->buf_pos > 0) {- add_to_cache(file, buf, space_left);-- if ((error = flush_buffer(file)) < GIT_SUCCESS)- return error;-- len -= space_left;- buf += space_left;- }-- /* write too-large chunks immediately */- if (len > file->buf_size) {- error = gitfo_write(file->fd, buf, len);- if (file->digest)- git_hash_update(file->digest, buf, len);- }- }-}--int git_filebuf_reserve(git_filebuf *file, void **buffer, size_t len)-{- int error;- size_t space_left = file->buf_size - file->buf_pos;-- *buffer = NULL;-- if (len > file->buf_size)- return GIT_ENOMEM;-- if (space_left <= len) {- if ((error = flush_buffer(file)) < GIT_SUCCESS)- return error;- }-- *buffer = (file->buffer + file->buf_pos);- file->buf_pos += len;-- return GIT_SUCCESS;-}--int git_filebuf_printf(git_filebuf *file, const char *format, ...)-{- va_list arglist;- size_t space_left = file->buf_size - file->buf_pos;- int len, error;-- va_start(arglist, format);-- len = vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);-- if (len < 0 || (size_t)len >= space_left) {- if ((error = flush_buffer(file)) < GIT_SUCCESS)- return error;-- len = vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);- if (len < 0 || (size_t)len > file->buf_size)- return GIT_ENOMEM;- }-- file->buf_pos += len;- return GIT_SUCCESS;--}-
− libgit2/src/filebuf.h
@@ -1,44 +0,0 @@-#ifndef INCLUDE_filebuf_h__-#define INCLUDE_filebuf_h__--#include "fileops.h"-#include "hash.h"--#ifdef GIT_THREADS-# define GIT_FILEBUF_THREADS-#endif--#define GIT_FILEBUF_HASH_CONTENTS 0x1-#define GIT_FILEBUF_APPEND 0x2-#define GIT_FILEBUF_FORCE 0x4--#define GIT_FILELOCK_EXTENSION ".lock\0"-#define GIT_FILELOCK_EXTLENGTH 6--struct git_filebuf {- char *path_original;- char *path_lock;-- git_hash_ctx *digest;-- unsigned char *buffer;-#ifdef GIT_FILEBUF_THREADS- unsigned char *buffer_back;-#endif-- size_t buf_size, buf_pos;- git_file fd;-};--typedef struct git_filebuf git_filebuf;--int git_filebuf_write(git_filebuf *lock, void *buff, size_t len);-int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len);-int git_filebuf_printf(git_filebuf *file, const char *format, ...);--int git_filebuf_open(git_filebuf *lock, const char *path, int flags);-int git_filebuf_commit(git_filebuf *lock);-void git_filebuf_cleanup(git_filebuf *lock);-int git_filebuf_hash(git_oid *oid, git_filebuf *file);--#endif
− libgit2/src/fileops.c
@@ -1,553 +0,0 @@-#include "common.h"-#include "fileops.h"-#include <ctype.h>--static int force_path(const char *to)-{- const int mode = 0755; /* or 0777 ? */- int error = GIT_SUCCESS;- char target_folder_path[GIT_PATH_MAX];-- error = git__dirname_r(target_folder_path, sizeof(target_folder_path), to);- if (error < GIT_SUCCESS)- return error;-- /* Does the containing folder exist? */- if (gitfo_isdir(target_folder_path)) {- git__joinpath(target_folder_path, target_folder_path, ""); /* Ensure there's a trailing slash */-- /* Let's create the tree structure */- error = gitfo_mkdir_recurs(target_folder_path, mode);- if (error < GIT_SUCCESS)- return error;- }-- return GIT_SUCCESS;-}--int gitfo_open(const char *path, int flags)-{- int fd = open(path, flags | O_BINARY);- return fd >= 0 ? fd : GIT_EOSERR;-}--int gitfo_creat(const char *path, int mode)-{- int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode);- return fd >= 0 ? fd : GIT_EOSERR;-}--int gitfo_creat_force(const char *path, int mode)-{- if (force_path(path) < GIT_SUCCESS)- return GIT_EOSERR;-- return gitfo_creat(path, mode);-}--int gitfo_read(git_file fd, void *buf, size_t cnt)-{- char *b = buf;- while (cnt) {- ssize_t r = read(fd, b, cnt);- if (r < 0) {- if (errno == EINTR || errno == EAGAIN)- continue;- return GIT_EOSERR;- }- if (!r) {- errno = EPIPE;- return GIT_EOSERR;- }- cnt -= r;- b += r;- }- return GIT_SUCCESS;-}--int gitfo_write(git_file fd, void *buf, size_t cnt)-{- char *b = buf;- while (cnt) {- ssize_t r = write(fd, b, cnt);- if (r < 0) {- if (errno == EINTR || errno == EAGAIN)- continue;- return GIT_EOSERR;- }- if (!r) {- errno = EPIPE;- return GIT_EOSERR;- }- cnt -= r;- b += r;- }- return GIT_SUCCESS;-}--int gitfo_isdir(const char *path)-{- struct stat st;- int len, stat_error;-- if (!path)- return GIT_ENOTFOUND;-- len = strlen(path);-- /* win32: stat path for folders cannot end in a slash */- if (path[len - 1] == '/') {- char *path_fixed = NULL;- path_fixed = git__strdup(path);- path_fixed[len - 1] = 0;- stat_error = gitfo_stat(path_fixed, &st);- free(path_fixed);- } else {- stat_error = gitfo_stat(path, &st);- }-- if (stat_error < GIT_SUCCESS)- return GIT_ENOTFOUND;-- if (!S_ISDIR(st.st_mode))- return GIT_ENOTFOUND;-- return GIT_SUCCESS;-}--int gitfo_exists(const char *path)-{- return access(path, F_OK);-}--git_off_t gitfo_size(git_file fd)-{- struct stat sb;- if (gitfo_fstat(fd, &sb))- return GIT_EOSERR;- return sb.st_size;-}--int gitfo_read_file(gitfo_buf *obj, const char *path)-{- git_file fd;- size_t len;- git_off_t size;- unsigned char *buff;-- assert(obj && path && *path);-- if ((fd = gitfo_open(path, O_RDONLY)) < 0)- return GIT_ERROR;-- if (((size = gitfo_size(fd)) < 0) || !git__is_sizet(size+1)) {- gitfo_close(fd);- return GIT_ERROR;- }- len = (size_t) size;-- if ((buff = git__malloc(len + 1)) == NULL) {- gitfo_close(fd);- return GIT_ERROR;- }-- if (gitfo_read(fd, buff, len) < 0) {- gitfo_close(fd);- free(buff);- return GIT_ERROR;- }- buff[len] = '\0';-- gitfo_close(fd);-- obj->data = buff;- obj->len = len;-- return GIT_SUCCESS;-}--void gitfo_free_buf(gitfo_buf *obj)-{- assert(obj);- free(obj->data);- obj->data = NULL;-}--int gitfo_mv(const char *from, const char *to)-{-#ifdef GIT_WIN32- /*- * Win32 POSIX compilance my ass. If the destination- * file exists, the `rename` call fails. This is as- * close as it gets with the Win32 API.- */- return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) ? GIT_SUCCESS : GIT_EOSERR;-#else- /* Don't even try this on Win32 */- if (!link(from, to)) {- gitfo_unlink(from);- return GIT_SUCCESS;- }-- if (!rename(from, to))- return GIT_SUCCESS;-- return GIT_EOSERR;-#endif-}--int gitfo_mv_force(const char *from, const char *to)-{- if (force_path(to) < GIT_SUCCESS)- return GIT_EOSERR;-- return gitfo_mv(from, to);-}--int gitfo_map_ro(git_map *out, git_file fd, git_off_t begin, size_t len)-{- if (git__mmap(out, len, GIT_PROT_READ, GIT_MAP_SHARED, fd, begin) < GIT_SUCCESS)- return GIT_EOSERR;- return GIT_SUCCESS;-}--void gitfo_free_map(git_map *out)-{- git__munmap(out);-}--/* cached diskio */-struct gitfo_cache {- git_file fd;- size_t cache_size, pos;- unsigned char *cache;-};--gitfo_cache *gitfo_enable_caching(git_file fd, size_t cache_size)-{- gitfo_cache *ioc;-- ioc = git__malloc(sizeof(*ioc));- if (!ioc)- return NULL;-- ioc->fd = fd;- ioc->pos = 0;- ioc->cache_size = cache_size;- ioc->cache = git__malloc(cache_size);- if (!ioc->cache) {- free(ioc);- return NULL;- }-- return ioc;-}--GIT_INLINE(void) gitfo_add_to_cache(gitfo_cache *ioc, void *buf, size_t len)-{- memcpy(ioc->cache + ioc->pos, buf, len);- ioc->pos += len;-}--int gitfo_flush_cached(gitfo_cache *ioc)-{- int result = GIT_SUCCESS;-- if (ioc->pos) {- result = gitfo_write(ioc->fd, ioc->cache, ioc->pos);- ioc->pos = 0;- }-- return result;-}--int gitfo_write_cached(gitfo_cache *ioc, void *buff, size_t len)-{- unsigned char *buf = buff;-- for (;;) {- size_t space_left = ioc->cache_size - ioc->pos;- /* cache if it's small */- if (space_left > len) {- gitfo_add_to_cache(ioc, buf, len);- return GIT_SUCCESS;- }-- /* flush the cache if it doesn't fit */- if (ioc->pos) {- int rc;- gitfo_add_to_cache(ioc, buf, space_left);- rc = gitfo_flush_cached(ioc);- if (rc < 0)- return rc;-- len -= space_left;- buf += space_left;- }-- /* write too-large chunks immediately */- if (len > ioc->cache_size)- return gitfo_write(ioc->fd, buf, len);- }-}--int gitfo_close_cached(gitfo_cache *ioc)-{- git_file fd;-- if (gitfo_flush_cached(ioc) < GIT_SUCCESS)- return GIT_ERROR;-- fd = ioc->fd;- free(ioc->cache);- free(ioc);-- return gitfo_close(fd);-}--int gitfo_dirent(- char *path,- size_t path_sz,- int (*fn)(void *, char *),- void *arg)-{- size_t wd_len = strlen(path);- DIR *dir;- struct dirent *de;-- if (!wd_len || path_sz < wd_len + 2)- return GIT_ERROR;-- while (path[wd_len - 1] == '/')- wd_len--;- path[wd_len++] = '/';- path[wd_len] = '\0';-- dir = opendir(path);- if (!dir)- return GIT_EOSERR;-- while ((de = readdir(dir)) != NULL) {- size_t de_len;- int result;-- /* always skip '.' and '..' */- if (de->d_name[0] == '.') {- if (de->d_name[1] == '\0')- continue;- if (de->d_name[1] == '.' && de->d_name[2] == '\0')- continue;- }-- de_len = strlen(de->d_name);- if (path_sz < wd_len + de_len + 1) {- closedir(dir);- return GIT_ERROR;- }-- strcpy(path + wd_len, de->d_name);- result = fn(arg, path);- if (result < GIT_SUCCESS) {- closedir(dir);- return result;- }- if (result > 0) {- closedir(dir);- return result;- }- }-- closedir(dir);- return GIT_SUCCESS;-}--#ifdef GIT_WIN32--static int is_windows_rooted_path(const char *path)-{- /* Does the root of the path look like a windows drive ? */- if (isalpha(path[0]) && (path[1] == ':'))- return GIT_SUCCESS;-- return GIT_ERROR;-}--#endif--int gitfo_mkdir_recurs(const char *path, int mode)-{- int error;- char *pp, *sp;- char *path_copy = git__strdup(path);-- if (path_copy == NULL)- return GIT_ENOMEM;-- error = GIT_SUCCESS;- pp = path_copy;--#ifdef GIT_WIN32-- if (!is_windows_rooted_path(pp))- pp += 2; /* Skip the drive name (eg. C: or D:) */--#endif-- while (error == GIT_SUCCESS && (sp = strchr(pp, '/')) != 0) {- if (sp != pp && gitfo_isdir(path_copy) < GIT_SUCCESS) {- *sp = 0;- error = gitfo_mkdir(path_copy, mode);-- /* Do not choke while trying to recreate an existing directory */- if (errno == EEXIST)- error = GIT_SUCCESS;-- *sp = '/';- }-- pp = sp + 1;- }-- if (*(pp - 1) != '/' && error == GIT_SUCCESS)- error = gitfo_mkdir(path, mode);-- free(path_copy);- return error;-}--static int retrieve_previous_path_component_start(const char *path)-{- int offset, len, start = 0;- - len = strlen(path);- offset = len - 1;-- /* Skip leading slash */- if (path[start] == '/')- start++;-- /* Skip trailing slash */- if (path[offset] == '/')- offset--;-- if (offset < 0)- return GIT_ERROR;-- while (offset > start && path[offset-1] != '/') {- offset--;- }-- return offset;-}--int gitfo_prettify_dir_path(char *buffer_out, const char *path)-{- int len = 0, segment_len, only_dots;- char *current;- const char *buffer_out_start, *buffer_end;-- buffer_out_start = buffer_out;- current = (char *)path;- buffer_end = path + strlen(path);-- while (current < buffer_end) {- /* Prevent multiple slashes from being added to the output */- if (*current == '/' && len > 0 && buffer_out_start[len - 1] == '/') {- current++;- continue;- }- - only_dots = 1;- segment_len = 0;-- /* Copy path segment to the output */- while (current < buffer_end && *current !='/')- {- only_dots &= (*current == '.');- *buffer_out++ = *current++;- segment_len++;- len++;- }-- /* Skip current directory */- if (only_dots && segment_len == 1)- {- current++;- buffer_out -= segment_len;- len -= segment_len;- continue;- }-- /* Handle the double-dot upward directory navigation */- if (only_dots && segment_len == 2)- {- current++;- buffer_out -= segment_len;-- *buffer_out ='\0';- len = retrieve_previous_path_component_start(buffer_out_start);- if (len < GIT_SUCCESS)- return GIT_EINVALIDPATH;-- buffer_out = (char *)buffer_out_start + len;- continue;- }-- /* Guard against potential multiple dot path traversal (cf http://cwe.mitre.org/data/definitions/33.html) */- if (only_dots &&segment_len > 0)- return GIT_EINVALIDPATH;-- *buffer_out++ = '/';- len++;- }-- *buffer_out = '\0';-- return GIT_SUCCESS;-}--int gitfo_prettify_file_path(char *buffer_out, const char *path)-{- int error, path_len, i;- const char* pattern = "/..";-- path_len = strlen(path);-- /* Let's make sure the filename doesn't end with "/", "/." or "/.." */- for (i = 1; path_len > i && i < 4; i++) {- if (!strncmp(path + path_len - i, pattern, i))- return GIT_EINVALIDPATH;- }-- error = gitfo_prettify_dir_path(buffer_out, path);- if (error < GIT_SUCCESS)- return error;-- path_len = strlen(buffer_out);- if (path_len < 2)- return GIT_EINVALIDPATH;-- /* Remove the trailing slash */- buffer_out[path_len - 1] = '\0';-- return GIT_SUCCESS;-}--int gitfo_cmp_path(const char *name1, int len1, int isdir1,- const char *name2, int len2, int isdir2)-{- int len = len1 < len2 ? len1 : len2;- int cmp;-- cmp = memcmp(name1, name2, len);- if (cmp)- return cmp;- if (len1 < len2)- return ((!isdir1 && !isdir2) ? -1 :- (isdir1 ? '/' - name2[len1] : name2[len1] - '/'));- if (len1 > len2)- return ((!isdir1 && !isdir2) ? 1 :- (isdir2 ? name1[len2] - '/' : '/' - name1[len2]));- return 0;-}-
− libgit2/src/fileops.h
@@ -1,191 +0,0 @@-/*- * fileops.h - OS agnostic disk io operations- *- * This header describes the strictly internal part of the api- */-#ifndef INCLUDE_fileops_h__-#define INCLUDE_fileops_h__--#include "common.h"-#include "map.h"-#include "dir.h"-#include <fcntl.h>-#include <time.h>--#ifdef GIT_WIN32-GIT_INLINE(int) link(const char *GIT_UNUSED(old), const char *GIT_UNUSED(new))-{- GIT_UNUSED_ARG(old)- GIT_UNUSED_ARG(new)- errno = ENOSYS;- return -1;-}--GIT_INLINE(int) git__mkdir(const char *path, int GIT_UNUSED(mode))-{- GIT_UNUSED_ARG(mode)- return mkdir(path);-}--extern int git__unlink(const char *path);-extern int git__mkstemp(char *template);-extern int git__fsync(int fd);--# ifndef GIT__WIN32_NO_HIDE_FILEOPS-# define unlink(p) git__unlink(p)-# define mkstemp(t) git__mkstemp(t)-# define mkdir(p,m) git__mkdir(p, m)-# define fsync(fd) git__fsync(fd)-# endif-#endif /* GIT_WIN32 */---#if !defined(O_BINARY)-#define O_BINARY 0-#endif--#define GITFO_BUF_INIT {NULL, 0}--typedef int git_file;-typedef struct gitfo_cache gitfo_cache;--typedef struct { /* file io buffer */- void *data; /* data bytes */- size_t len; /* data length */-} gitfo_buf;--extern int gitfo_exists(const char *path);-extern int gitfo_open(const char *path, int flags);-extern int gitfo_creat(const char *path, int mode);-extern int gitfo_creat_force(const char *path, int mode);-extern int gitfo_isdir(const char *path);-extern int gitfo_mkdir_recurs(const char *path, int mode);-#define gitfo_close(fd) close(fd)--extern int gitfo_read(git_file fd, void *buf, size_t cnt);-extern int gitfo_write(git_file fd, void *buf, size_t cnt);-#define gitfo_lseek(f,n,w) lseek(f, n, w)-extern git_off_t gitfo_size(git_file fd);--extern int gitfo_read_file(gitfo_buf *obj, const char *path);-extern void gitfo_free_buf(gitfo_buf *obj);--/* Move (rename) a file; this operation is atomic */-extern int gitfo_mv(const char *from, const char *to);--/* Move a file (forced); this will create the destination- * path if it doesn't exist */-extern int gitfo_mv_force(const char *from, const char *to);--#define gitfo_stat(p,b) stat(p, b)-#define gitfo_fstat(f,b) fstat(f, b)--#define gitfo_unlink(p) unlink(p)-#define gitfo_rmdir(p) rmdir(p)-#define gitfo_chdir(p) chdir(p)-#define gitfo_mkdir(p,m) mkdir(p, m)--#define gitfo_mkstemp(t) mkstemp(t)-#define gitfo_fsync(fd) fsync(fd)-#define gitfo_chmod(p,m) chmod(p, m)--/**- * Read-only map all or part of a file into memory.- * When possible this function should favor a virtual memory- * style mapping over some form of malloc()+read(), as the- * data access will be random and is not likely to touch the- * majority of the region requested.- *- * @param out buffer to populate with the mapping information.- * @param fd open descriptor to configure the mapping from.- * @param begin first byte to map, this should be page aligned.- * @param end number of bytes to map.- * @return- * - GIT_SUCCESS on success;- * - GIT_EOSERR on an unspecified OS related error.- */-extern int gitfo_map_ro(- git_map *out,- git_file fd,- git_off_t begin,- size_t len);--/**- * Release the memory associated with a previous memory mapping.- * @param map the mapping description previously configured.- */-extern void gitfo_free_map(git_map *map);--/**- * Walk each directory entry, except '.' and '..', calling fn(state).- *- * @param pathbuf buffer the function reads the initial directory- * path from, and updates with each successive entry's name.- * @param pathmax maximum allocation of pathbuf.- * @param fn function to invoke with each entry. The first arg is- * the input state and the second arg is pathbuf. The function- * may modify the pathbuf, but only by appending new text.- * @param state to pass to fn as the first arg.- */-extern int gitfo_dirent(- char *pathbuf,- size_t pathmax,- int (*fn)(void *, char *),- void *state);--extern gitfo_cache *gitfo_enable_caching(git_file fd, size_t cache_size);-extern int gitfo_write_cached(gitfo_cache *ioc, void *buf, size_t len);-extern int gitfo_flush_cached(gitfo_cache *ioc);-extern int gitfo_close_cached(gitfo_cache *ioc);---extern int gitfo_cmp_path(const char *name1, int len1, int isdir1,- const char *name2, int len2, int isdir2);--/**- * Clean up a provided absolute or relative directory path.- * - * This prettification relies on basic operations such as coalescing - * multiple forward slashes into a single slash, removing '.' and - * './' current directory segments, and removing parent directory - * whenever '..' is encountered.- *- * If not empty, the returned path ends with a forward slash.- *- * For instance, this will turn "d1/s1///s2/..//../s3" into "d1/s3/".- *- * This only performs a string based analysis of the path.- * No checks are done to make sure the path actually makes sense from - * the file system perspective.- *- * @param buffer_out buffer to populate with the normalized path.- * @param path directory path to clean up.- * @return- * - GIT_SUCCESS on success;- * - GIT_ERROR when the input path is invalid or escapes the current directory.- */-GIT_EXTERN(int) gitfo_prettify_dir_path(char *buffer_out, const char *path);--/**- * Clean up a provided absolute or relative file path.- * - * This prettification relies on basic operations such as coalescing - * multiple forward slashes into a single slash, removing '.' and - * './' current directory segments, and removing parent directory - * whenever '..' is encountered.- *- * For instance, this will turn "d1/s1///s2/..//../s3" into "d1/s3".- *- * This only performs a string based analysis of the path.- * No checks are done to make sure the path actually makes sense from - * the file system perspective.- *- * @param buffer_out buffer to populate with the normalized path.- * @param path file path to clean up.- * @return- * - GIT_SUCCESS on success;- * - GIT_ERROR when the input path is invalid or escapes the current directory.- */-GIT_EXTERN(int) gitfo_prettify_file_path(char *buffer_out, const char *path);--#endif /* INCLUDE_fileops_h__ */
− libgit2/src/hash.c
@@ -1,94 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "hash.h"--#if defined(PPC_SHA1)-# include "ppc/sha1.h"-#elif defined(OPENSSL_SHA1)-# include <openssl/sha.h>-#else-# include "block-sha1/sha1.h"-#endif--struct git_hash_ctx {- SHA_CTX c;-};--git_hash_ctx *git_hash_new_ctx(void)-{- git_hash_ctx *ctx = git__malloc(sizeof(*ctx));-- if (!ctx)- return NULL;-- SHA1_Init(&ctx->c);-- return ctx;-}--void git_hash_free_ctx(git_hash_ctx *ctx)-{- free(ctx);-}--void git_hash_init(git_hash_ctx *ctx)-{- assert(ctx);- SHA1_Init(&ctx->c);-}--void git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)-{- assert(ctx);- SHA1_Update(&ctx->c, data, len);-}--void git_hash_final(git_oid *out, git_hash_ctx *ctx)-{- assert(ctx);- SHA1_Final(out->id, &ctx->c);-}--void git_hash_buf(git_oid *out, const void *data, size_t len)-{- SHA_CTX c;-- SHA1_Init(&c);- SHA1_Update(&c, data, len);- SHA1_Final(out->id, &c);-}--void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)-{- SHA_CTX c;- size_t i;-- SHA1_Init(&c);- for (i = 0; i < n; i++)- SHA1_Update(&c, vec[i].data, vec[i].len);- SHA1_Final(out->id, &c);-}
− libgit2/src/hash.h
@@ -1,26 +0,0 @@-/*- * hash.h- */-#ifndef INCLUDE_hash_h__-#define INCLUDE_hash_h__--#include "git2/oid.h"--typedef struct git_hash_ctx git_hash_ctx;--typedef struct {- void *data;- size_t len;-} git_buf_vec;--git_hash_ctx *git_hash_new_ctx(void);-void git_hash_free_ctx(git_hash_ctx *ctx);--void git_hash_init(git_hash_ctx *c);-void git_hash_update(git_hash_ctx *c, const void *data, size_t len);-void git_hash_final(git_oid *out, git_hash_ctx *c);--void git_hash_buf(git_oid *out, const void *data, size_t len);-void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n);--#endif /* INCLUDE_hash_h__ */
− libgit2/src/hashtable.c
@@ -1,261 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "repository.h"-#include "commit.h"--#define MAX_LOOPS 5-static const double max_load_factor = 0.65;--static int resize_to(git_hashtable *self, size_t new_size);-static int set_size(git_hashtable *self, size_t new_size);-static git_hashtable_node *node_with_hash(git_hashtable *self, const void *key, int hash_id);-static void node_swap_with(git_hashtable_node *self, git_hashtable_node *other);-static int node_insert(git_hashtable *self, git_hashtable_node *new_node);-static int insert_nodes(git_hashtable *self, git_hashtable_node *old_nodes, size_t old_size);--static int resize_to(git_hashtable *self, size_t new_size)-{- git_hashtable_node *old_nodes = self->nodes;- size_t old_size = self->size;-- self->is_resizing = 1;-- do {- self->size = new_size;- self->size_mask = new_size - 1;- self->key_count = 0;- self->nodes = git__calloc(1, sizeof(git_hashtable_node) * self->size);-- if (self->nodes == NULL)- return GIT_ENOMEM;-- if (insert_nodes(self, old_nodes, old_size) == 0)- self->is_resizing = 0;- else {- new_size *= 2;- free(self->nodes);- }- } while(self->is_resizing);-- free(old_nodes);- return GIT_SUCCESS;-}--static int set_size(git_hashtable *self, size_t new_size)-{- self->nodes = realloc(self->nodes, new_size * sizeof(git_hashtable_node));- if (self->nodes == NULL)- return GIT_ENOMEM;-- if (new_size > self->size) {- memset(&self->nodes[self->size], 0x0, (new_size - self->size) * sizeof(git_hashtable_node));- }-- self->size = new_size;- self->size_mask = new_size - 1;- return GIT_SUCCESS;-}--static git_hashtable_node *node_with_hash(git_hashtable *self, const void *key, int hash_id)-{- size_t pos = self->hash(key, hash_id) & self->size_mask;- return git_hashtable_node_at(self->nodes, pos);-}--static void node_swap_with(git_hashtable_node *self, git_hashtable_node *other)-{- git_hashtable_node tmp = *self;- *self = *other;- *other = tmp;-}--static int node_insert(git_hashtable *self, git_hashtable_node *new_node)-{ - int iteration, hash_id;-- for (iteration = 0; iteration < MAX_LOOPS; iteration++) { - for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {- git_hashtable_node *node;- node = node_with_hash(self, new_node->key, hash_id);- node_swap_with(new_node, node);- if(new_node->key == 0x0){- self->key_count++;- return GIT_SUCCESS; - }- }- }-- if (self->is_resizing) - return GIT_EBUSY;-- resize_to(self, self->size * 2);- git_hashtable_insert(self, new_node->key, new_node->value);- return GIT_SUCCESS;-}--static int insert_nodes(git_hashtable *self, git_hashtable_node *old_nodes, size_t old_size)-{- size_t i;-- for (i = 0; i < old_size; ++i) {- git_hashtable_node *node = git_hashtable_node_at(old_nodes, i);- if (node->key && git_hashtable_insert(self, node->key, node->value) < GIT_SUCCESS)- return GIT_ENOMEM;- }-- return GIT_SUCCESS;-}--git_hashtable *git_hashtable_alloc(size_t min_size, - git_hash_ptr hash,- git_hash_keyeq_ptr key_eq)-{- git_hashtable *table;-- assert(hash && key_eq);-- if ((table = git__malloc(sizeof(git_hashtable))) == NULL)- return NULL;-- memset(table, 0x0, sizeof(git_hashtable));-- if (min_size < 8)- min_size = 8;-- /* round up size to closest power of 2 */- min_size--;- min_size |= min_size >> 1;- min_size |= min_size >> 2;- min_size |= min_size >> 4;- min_size |= min_size >> 8;- min_size |= min_size >> 16;-- table->hash = hash;- table->key_equal = key_eq;-- set_size(table, min_size + 1);-- return table;-}--void git_hashtable_clear(git_hashtable *self)-{- assert(self);-- memset(self->nodes, 0x0, sizeof(git_hashtable_node) * self->size);- self->key_count = 0;-}--void git_hashtable_free(git_hashtable *self)-{- assert(self);-- free(self->nodes);- free(self);-}---int git_hashtable_insert2(git_hashtable *self, const void *key, void *value, void **old_value)-{- int hash_id;- git_hashtable_node *node;-- assert(self && self->nodes);-- *old_value = NULL;-- for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {- node = node_with_hash(self, key, hash_id);-- if (!node->key) {- node->key = key;- node->value = value;- self->key_count++;- return GIT_SUCCESS;- }-- if (key == node->key || self->key_equal(key, node->key) == 0) {- *old_value = node->value;- node->key = key;- node->value = value;- return GIT_SUCCESS;- }- }-- /* no space in table; must do cuckoo dance */- {- git_hashtable_node x;- x.key = key;- x.value = value;- return node_insert(self, &x);- }-}--void *git_hashtable_lookup(git_hashtable *self, const void *key)-{- int hash_id;- git_hashtable_node *node;-- assert(self && self->nodes);-- for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {- node = node_with_hash(self, key, hash_id);- if (node->key && self->key_equal(key, node->key) == 0)- return node->value;- }-- return NULL;-}--int git_hashtable_remove(git_hashtable *self, const void *key)-{- int hash_id;- git_hashtable_node *node;-- assert(self && self->nodes);-- for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {- node = node_with_hash(self, key, hash_id);- if (node->key && self->key_equal(key, node->key) == 0) {- node->key = NULL;- node->value = NULL;- self->key_count--;- return GIT_SUCCESS;- }- }-- return GIT_ENOTFOUND;-}--int git_hashtable_merge(git_hashtable *self, git_hashtable *other)-{- if (resize_to(self, (self->size + other->size) * 2) < GIT_SUCCESS)- return GIT_ENOMEM;-- return insert_nodes(self, other->nodes, other->key_count);-}-
− libgit2/src/hashtable.h
@@ -1,73 +0,0 @@-#ifndef INCLUDE_hashtable_h__-#define INCLUDE_hashtable_h__--#include "git2/common.h"-#include "git2/oid.h"-#include "git2/odb.h"--#define GIT_HASHTABLE_HASHES 3--typedef uint32_t (*git_hash_ptr)(const void *, int hash_id);-typedef int (*git_hash_keyeq_ptr)(const void *key_a, const void *key_b);--struct git_hashtable_node {- const void *key;- void *value;-};--struct git_hashtable {- struct git_hashtable_node *nodes;-- size_t size_mask;- size_t size;- size_t key_count;-- int is_resizing;-- git_hash_ptr hash;- git_hash_keyeq_ptr key_equal;-};--typedef struct git_hashtable_node git_hashtable_node;-typedef struct git_hashtable git_hashtable;--git_hashtable *git_hashtable_alloc(size_t min_size, - git_hash_ptr hash,- git_hash_keyeq_ptr key_eq);-void *git_hashtable_lookup(git_hashtable *h, const void *key);-int git_hashtable_remove(git_hashtable *table, const void *key);-void git_hashtable_free(git_hashtable *h);-void git_hashtable_clear(git_hashtable *h);-int git_hashtable_merge(git_hashtable *self, git_hashtable *other);--int git_hashtable_insert2(git_hashtable *h, const void *key, void *value, void **old_value);--GIT_INLINE(int) git_hashtable_insert(git_hashtable *h, const void *key, void *value)-{- void *_unused;- return git_hashtable_insert2(h, key, value, &_unused);-}--#define git_hashtable_node_at(nodes, pos) ((git_hashtable_node *)(&nodes[pos]))--#define GIT_HASHTABLE_FOREACH(self, pkey, pvalue, code) {\- git_hashtable *_self = (self);\- git_hashtable_node *_nodes = _self->nodes;\- unsigned int _i, _size = _self->size;\- for (_i = 0; _i < _size; _i ++) {\- git_hashtable_node *_node = git_hashtable_node_at(_nodes, _i);\- if (_node->key)\- {\- pkey = _node->key;\- pvalue = _node->value;\- code;\- }\- }\-}--#define GIT_HASHTABLE_FOREACH_DELETE() {\- _node->key = NULL; _node->value = NULL; _self->key_count--;\-}---#endif
− libgit2/src/index.c
@@ -1,768 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include <stddef.h>--#include "common.h"-#include "repository.h"-#include "index.h"-#include "hash.h"-#include "git2/odb.h"-#include "git2/blob.h"--#define entry_size(type,len) ((offsetof(type, path) + (len) + 8) & ~7)-#define short_entry_size(len) entry_size(struct entry_short, len)-#define long_entry_size(len) entry_size(struct entry_long, len)--#define minimal_entry_size (offsetof(struct entry_short, path))--static const size_t INDEX_FOOTER_SIZE = GIT_OID_RAWSZ;-static const size_t INDEX_HEADER_SIZE = 12;--static const unsigned int INDEX_VERSION_NUMBER = 2;-static const unsigned int INDEX_VERSION_NUMBER_EXT = 3;--static const unsigned int INDEX_HEADER_SIG = 0x44495243;-static const char INDEX_EXT_TREECACHE_SIG[] = {'T', 'R', 'E', 'E'};--struct index_header {- uint32_t signature;- uint32_t version;- uint32_t entry_count;-};--struct index_extension {- char signature[4];- uint32_t extension_size;-};--struct entry_time {- uint32_t seconds;- uint32_t nanoseconds;-};--struct entry_short {- struct entry_time ctime;- struct entry_time mtime;- uint32_t dev;- uint32_t ino;- uint32_t mode;- uint32_t uid;- uint32_t gid;- uint32_t file_size;- git_oid oid;- uint16_t flags;- char path[1]; /* arbritrary length */-};--struct entry_long {- struct entry_time ctime;- struct entry_time mtime;- uint32_t dev;- uint32_t ino;- uint32_t mode;- uint32_t uid;- uint32_t gid;- uint32_t file_size;- git_oid oid;- uint16_t flags;- uint16_t flags_extended;- char path[1]; /* arbritrary length */-};--/* local declarations */-static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size);-static size_t read_entry(git_index_entry *dest, const void *buffer, size_t buffer_size);-static int read_header(struct index_header *dest, const void *buffer);--static int read_tree(git_index *index, const char *buffer, size_t buffer_size);-static git_index_tree *read_tree_internal(const char **, const char *, git_index_tree *);--static int parse_index(git_index *index, const char *buffer, size_t buffer_size);-static void sort_index(git_index *index);-static int write_index(git_index *index, git_filebuf *file);--int index_srch(const void *key, const void *array_member)-{- const char *filename = (const char *)key;- const git_index_entry *entry = *(const git_index_entry **)(array_member);-- return strcmp(filename, entry->path);-}--int index_cmp(const void *a, const void *b)-{- const git_index_entry *entry_a = *(const git_index_entry **)(a);- const git_index_entry *entry_b = *(const git_index_entry **)(b);-- return strcmp(entry_a->path, entry_b->path);-}---static int index_initialize(git_index **index_out, git_repository *owner, const char *index_path)-{- git_index *index;-- assert(index_out && index_path);-- index = git__malloc(sizeof(git_index));- if (index == NULL)- return GIT_ENOMEM;-- memset(index, 0x0, sizeof(git_index));-- index->index_file_path = git__strdup(index_path);- if (index->index_file_path == NULL) {- free(index);- return GIT_ENOMEM;- }-- index->repository = owner;-- git_vector_init(&index->entries, 32, index_cmp);-- /* Check if index file is stored on disk already */- if (gitfo_exists(index->index_file_path) == 0)- index->on_disk = 1;-- *index_out = index;- return GIT_SUCCESS;-}--int git_index_open_bare(git_index **index_out, const char *index_path)-{- return index_initialize(index_out, NULL, index_path);-}--int git_index_open_inrepo(git_index **index_out, git_repository *repo)-{- if (repo->is_bare)- return GIT_EBAREINDEX;-- return index_initialize(index_out, repo, repo->path_index);-}--void git_index_free(git_index *index)-{- if (index == NULL || index->repository != NULL)- return;-- git_index_clear(index);- git_vector_free(&index->entries);-- free(index->index_file_path);- free(index);-}--static void free_tree(git_index_tree *tree)-{- unsigned int i;-- if (tree == NULL)- return;-- for (i = 0; i < tree->children_count; ++i)- free_tree(tree->children[i]);-- free(tree->name);- free(tree->children);- free(tree);-}--void git_index_clear(git_index *index)-{- unsigned int i;-- assert(index);-- for (i = 0; i < index->entries.length; ++i) {- git_index_entry *e;- e = git_vector_get(&index->entries, i);- free(e->path);- free(e);- }-- git_vector_clear(&index->entries);- index->last_modified = 0;-- free_tree(index->tree);- index->tree = NULL;-}--int git_index_read(git_index *index)-{- struct stat indexst;- int error = GIT_SUCCESS;-- assert(index->index_file_path);-- if (!index->on_disk || gitfo_exists(index->index_file_path) < 0) {- git_index_clear(index);- index->on_disk = 0;- return GIT_SUCCESS;- }-- if (gitfo_stat(index->index_file_path, &indexst) < 0)- return GIT_EOSERR;-- if (!S_ISREG(indexst.st_mode))- return GIT_ENOTFOUND;-- if (indexst.st_mtime != index->last_modified) {-- gitfo_buf buffer;-- if (gitfo_read_file(&buffer, index->index_file_path) < GIT_SUCCESS)- return GIT_EOSERR;-- git_index_clear(index);- error = parse_index(index, buffer.data, buffer.len);-- if (error == GIT_SUCCESS)- index->last_modified = indexst.st_mtime;-- gitfo_free_buf(&buffer);- }-- return error;-}--int git_index_write(git_index *index)-{- git_filebuf file;- struct stat indexst;- int error;-- sort_index(index);-- if ((error = git_filebuf_open(&file, index->index_file_path, GIT_FILEBUF_HASH_CONTENTS)) < GIT_SUCCESS)- return error;-- if ((error = write_index(index, &file)) < GIT_SUCCESS) {- git_filebuf_cleanup(&file);- return error;- }-- if ((error = git_filebuf_commit(&file)) < GIT_SUCCESS)- return error;-- if (gitfo_stat(index->index_file_path, &indexst) == 0) {- index->last_modified = indexst.st_mtime;- index->on_disk = 1;- }-- return GIT_SUCCESS;-}--unsigned int git_index_entrycount(git_index *index)-{- assert(index);- return index->entries.length;-}--git_index_entry *git_index_get(git_index *index, int n)-{- assert(index);- sort_index(index);- return git_vector_get(&index->entries, (unsigned int)n);-}--int git_index_add(git_index *index, const char *rel_path, int stage)-{- git_index_entry entry;- char full_path[GIT_PATH_MAX];- struct stat st;- int error;-- if (index->repository == NULL)- return GIT_EBAREINDEX;-- git__joinpath(full_path, index->repository->path_workdir, rel_path);-- if (gitfo_exists(full_path) < 0)- return GIT_ENOTFOUND;-- if (gitfo_stat(full_path, &st) < 0)- return GIT_EOSERR;-- if (stage < 0 || stage > 3)- return GIT_ERROR;-- memset(&entry, 0x0, sizeof(git_index_entry));-- entry.ctime.seconds = st.st_ctime;- entry.mtime.seconds = st.st_mtime;- /* entry.mtime.nanoseconds = st.st_mtimensec; */- /* entry.ctime.nanoseconds = st.st_ctimensec; */- entry.dev= st.st_rdev;- entry.ino = st.st_ino;- entry.mode = st.st_mode;- entry.uid = st.st_uid;- entry.gid = st.st_gid;- entry.file_size = st.st_size;-- /* write the blob to disk and get the oid */- if ((error = git_blob_writefile(&entry.oid, index->repository, full_path)) < GIT_SUCCESS)- return error;-- entry.flags |= (stage << GIT_IDXENTRY_STAGESHIFT);- entry.path = (char *)rel_path; /* do not duplicate; index_insert already does this */-- return git_index_insert(index, &entry);-}--void sort_index(git_index *index)-{- git_vector_sort(&index->entries);-}--int git_index_insert(git_index *index, const git_index_entry *source_entry)-{- git_index_entry *entry;- size_t path_length;- int position;-- assert(index && source_entry);-- if (source_entry->path == NULL)- return GIT_EMISSINGOBJDATA;-- entry = git__malloc(sizeof(git_index_entry));- if (entry == NULL)- return GIT_ENOMEM;-- memcpy(entry, source_entry, sizeof(git_index_entry));-- /* duplicate the path string so we own it */- entry->path = git__strdup(entry->path);- if (entry->path == NULL)- return GIT_ENOMEM;-- /* make sure that the path length flag is correct */- path_length = strlen(entry->path);-- entry->flags &= ~GIT_IDXENTRY_NAMEMASK;-- if (path_length < GIT_IDXENTRY_NAMEMASK)- entry->flags |= path_length & GIT_IDXENTRY_NAMEMASK;- else- entry->flags |= GIT_IDXENTRY_NAMEMASK;;--- /* look if an entry with this path already exists */- position = git_index_find(index, source_entry->path);-- /* if no entry exists, add the entry at the end;- * the index is no longer sorted */- if (position == GIT_ENOTFOUND) {- if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS)- return GIT_ENOMEM;-- /* if a previous entry exists, replace it */- } else {- git_index_entry **entry_array = (git_index_entry **)index->entries.contents;-- free(entry_array[position]->path);- free(entry_array[position]);-- entry_array[position] = entry;- }-- return GIT_SUCCESS;-}--int git_index_remove(git_index *index, int position)-{- assert(index);- sort_index(index);- return git_vector_remove(&index->entries, (unsigned int)position);-}--int git_index_find(git_index *index, const char *path)-{- sort_index(index);- return git_vector_bsearch2(&index->entries, index_srch, path);-}--static git_index_tree *read_tree_internal(- const char **buffer_in, const char *buffer_end, git_index_tree *parent)-{- git_index_tree *tree;- const char *name_start, *buffer;-- if ((tree = git__malloc(sizeof(git_index_tree))) == NULL)- return NULL;-- memset(tree, 0x0, sizeof(git_index_tree));- tree->parent = parent;-- buffer = name_start = *buffer_in;-- if ((buffer = memchr(buffer, '\0', buffer_end - buffer)) == NULL)- goto error_cleanup;-- /* NUL-terminated tree name */- tree->name = git__strdup(name_start);- if (++buffer >= buffer_end)- goto error_cleanup;-- /* Blank-terminated ASCII decimal number of entries in this tree */- tree->entries = strtol(buffer, (char **)&buffer, 10);- if (*buffer != ' ' || ++buffer >= buffer_end)- goto error_cleanup;-- /* Number of children of the tree, newline-terminated */- tree->children_count = strtol(buffer, (char **)&buffer, 10);- if (*buffer != '\n' || ++buffer >= buffer_end)- goto error_cleanup;-- /* 160-bit SHA-1 for this tree and it's children */- if (buffer + GIT_OID_RAWSZ > buffer_end)- goto error_cleanup;-- git_oid_mkraw(&tree->oid, (const unsigned char *)buffer);- buffer += GIT_OID_RAWSZ;-- /* Parse children: */- if (tree->children_count > 0) {- unsigned int i;-- tree->children = git__malloc(tree->children_count * sizeof(git_index_tree *));- if (tree->children == NULL)- goto error_cleanup;-- for (i = 0; i < tree->children_count; ++i) {- tree->children[i] = read_tree_internal(&buffer, buffer_end, tree);-- if (tree->children[i] == NULL)- goto error_cleanup;- }- }-- *buffer_in = buffer;- return tree;--error_cleanup:- free_tree(tree);- return NULL;-}--static int read_tree(git_index *index, const char *buffer, size_t buffer_size)-{- const char *buffer_end = buffer + buffer_size;-- index->tree = read_tree_internal(&buffer, buffer_end, NULL);- return (index->tree != NULL && buffer == buffer_end) ? GIT_SUCCESS : GIT_EOBJCORRUPTED;-}--static size_t read_entry(git_index_entry *dest, const void *buffer, size_t buffer_size)-{- size_t path_length, entry_size;- uint16_t flags_raw;- const char *path_ptr;- const struct entry_short *source;-- if (INDEX_FOOTER_SIZE + minimal_entry_size > buffer_size)- return 0;-- memset(dest, 0x0, sizeof(git_index_entry));-- source = (const struct entry_short *)(buffer);-- dest->ctime.seconds = (time_t)ntohl(source->ctime.seconds);- dest->ctime.nanoseconds = (time_t)ntohl(source->ctime.nanoseconds);- dest->mtime.seconds = (time_t)ntohl(source->mtime.seconds);- dest->mtime.nanoseconds = (time_t)ntohl(source->mtime.nanoseconds);- dest->dev = ntohl(source->dev);- dest->ino = ntohl(source->ino);- dest->mode = ntohl(source->mode);- dest->uid = ntohl(source->uid);- dest->gid = ntohl(source->gid);- dest->file_size = ntohl(source->file_size);- git_oid_cpy(&dest->oid, &source->oid);- dest->flags = ntohs(source->flags);-- if (dest->flags & GIT_IDXENTRY_EXTENDED) {- struct entry_long *source_l = (struct entry_long *)source;- path_ptr = source_l->path;-- flags_raw = ntohs(source_l->flags_extended);- memcpy(&dest->flags_extended, &flags_raw, 2);- } else- path_ptr = source->path;-- path_length = dest->flags & GIT_IDXENTRY_NAMEMASK;-- /* if this is a very long string, we must find its- * real length without overflowing */- if (path_length == 0xFFF) {- const char *path_end;-- path_end = memchr(path_ptr, '\0', buffer_size);- if (path_end == NULL)- return 0;-- path_length = path_end - path_ptr;- }-- if (dest->flags & GIT_IDXENTRY_EXTENDED)- entry_size = long_entry_size(path_length);- else- entry_size = short_entry_size(path_length);-- if (INDEX_FOOTER_SIZE + entry_size > buffer_size)- return 0;-- dest->path = git__strdup(path_ptr);- assert(dest->path);-- return entry_size;-}--static int read_header(struct index_header *dest, const void *buffer)-{- const struct index_header *source;- source = (const struct index_header *)(buffer);-- dest->signature = ntohl(source->signature);- if (dest->signature != INDEX_HEADER_SIG)- return GIT_EOBJCORRUPTED;-- dest->version = ntohl(source->version);- if (dest->version != INDEX_VERSION_NUMBER_EXT &&- dest->version != INDEX_VERSION_NUMBER)- return GIT_EOBJCORRUPTED;-- dest->entry_count = ntohl(source->entry_count);- return GIT_SUCCESS;-}--static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size)-{- const struct index_extension *source;- struct index_extension dest;- size_t total_size;-- source = (const struct index_extension *)(buffer);-- memcpy(dest.signature, source->signature, 4);- dest.extension_size = ntohl(source->extension_size);-- total_size = dest.extension_size + sizeof(struct index_extension);-- if (buffer_size - total_size < INDEX_FOOTER_SIZE)- return 0;-- /* optional extension */- if (dest.signature[0] >= 'A' && dest.signature[0] <= 'Z') {- /* tree cache */- if (memcmp(dest.signature, INDEX_EXT_TREECACHE_SIG, 4) == 0) {-- if (read_tree(index, buffer + 8, dest.extension_size) < GIT_SUCCESS)- return 0;- }- } else {- /* we cannot handle non-ignorable extensions;- * in fact they aren't even defined in the standard */- return 0;- }-- return total_size;-}--static int parse_index(git_index *index, const char *buffer, size_t buffer_size)-{- unsigned int i;- struct index_header header;- git_oid checksum_calculated, checksum_expected;--#define seek_forward(_increase) { \- if (_increase >= buffer_size) \- return GIT_EOBJCORRUPTED; \- buffer += _increase; \- buffer_size -= _increase;\-}-- if (buffer_size < INDEX_HEADER_SIZE + INDEX_FOOTER_SIZE)- return GIT_EOBJCORRUPTED;-- /* Precalculate the SHA1 of the files's contents -- we'll match it to- * the provided SHA1 in the footer */- git_hash_buf(&checksum_calculated, (const void *)buffer, buffer_size - INDEX_FOOTER_SIZE);-- /* Parse header */- if (read_header(&header, buffer) < GIT_SUCCESS)- return GIT_EOBJCORRUPTED;-- seek_forward(INDEX_HEADER_SIZE);-- git_vector_clear(&index->entries);-- /* Parse all the entries */- for (i = 0; i < header.entry_count && buffer_size > INDEX_FOOTER_SIZE; ++i) {- size_t entry_size;- git_index_entry *entry;-- entry = git__malloc(sizeof(git_index_entry));- if (entry == NULL)- return GIT_ENOMEM;-- entry_size = read_entry(entry, buffer, buffer_size);-- /* 0 bytes read means an object corruption */- if (entry_size == 0)- return GIT_EOBJCORRUPTED;-- if (git_vector_insert(&index->entries, entry) < GIT_SUCCESS)- return GIT_ENOMEM;-- seek_forward(entry_size);- }-- if (i != header.entry_count)- return GIT_EOBJCORRUPTED;-- /* There's still space for some extensions! */- while (buffer_size > INDEX_FOOTER_SIZE) {- size_t extension_size;-- extension_size = read_extension(index, buffer, buffer_size);-- /* see if we have read any bytes from the extension */- if (extension_size == 0)- return GIT_EOBJCORRUPTED;-- seek_forward(extension_size);- }-- if (buffer_size != INDEX_FOOTER_SIZE)- return GIT_EOBJCORRUPTED;-- /* 160-bit SHA-1 over the content of the index file before this checksum. */- git_oid_mkraw(&checksum_expected, (const unsigned char *)buffer);-- if (git_oid_cmp(&checksum_calculated, &checksum_expected) != 0)- return GIT_EOBJCORRUPTED;--#undef seek_forward-- /* force sorting in the vector: the entries are- * assured to be sorted on the index */- index->entries.sorted = 1;- return GIT_SUCCESS;-}--static int write_disk_entry(git_filebuf *file, git_index_entry *entry)-{- struct entry_short *ondisk;- size_t path_len, disk_size;- char *path;-- path_len = strlen(entry->path);-- if (entry->flags & GIT_IDXENTRY_EXTENDED)- disk_size = long_entry_size(path_len);- else- disk_size = short_entry_size(path_len);-- if (git_filebuf_reserve(file, (void **)&ondisk, disk_size) < GIT_SUCCESS)- return GIT_ENOMEM;-- memset(ondisk, 0x0, disk_size);-- ondisk->ctime.seconds = htonl((unsigned long)entry->ctime.seconds);- ondisk->mtime.seconds = htonl((unsigned long)entry->mtime.seconds);- ondisk->ctime.nanoseconds = htonl(entry->ctime.nanoseconds);- ondisk->mtime.nanoseconds = htonl(entry->mtime.nanoseconds);- ondisk->dev = htonl(entry->dev);- ondisk->ino = htonl(entry->ino);- ondisk->mode = htonl(entry->mode);- ondisk->uid = htonl(entry->uid);- ondisk->gid = htonl(entry->gid);- ondisk->file_size = htonl((unsigned long)entry->file_size);-- git_oid_cpy(&ondisk->oid, &entry->oid);-- ondisk->flags = htons(entry->flags);-- if (entry->flags & GIT_IDXENTRY_EXTENDED) {- struct entry_long *ondisk_ext;- ondisk_ext = (struct entry_long *)ondisk;- ondisk_ext->flags_extended = htons(entry->flags_extended);- path = ondisk_ext->path;- }- else- path = ondisk->path;-- memcpy(path, entry->path, path_len);-- return GIT_SUCCESS;-}--static int write_entries(git_index *index, git_filebuf *file)-{- unsigned int i;-- for (i = 0; i < index->entries.length; ++i) {- git_index_entry *entry;- entry = git_vector_get(&index->entries, i);- if (write_disk_entry(file, entry) < GIT_SUCCESS)- return GIT_ENOMEM;- }-- return GIT_SUCCESS;-}--static int write_index(git_index *index, git_filebuf *file)-{- int error = GIT_SUCCESS;- git_oid hash_final;-- struct index_header header;-- int is_extended = 1;-- assert(index && file);-- header.signature = htonl(INDEX_HEADER_SIG);- header.version = htonl(is_extended ? INDEX_VERSION_NUMBER : INDEX_VERSION_NUMBER_EXT);- header.entry_count = htonl(index->entries.length);-- git_filebuf_write(file, &header, sizeof(struct index_header));-- error = write_entries(index, file);- if (error < GIT_SUCCESS)- return error;-- /* TODO: write extensions (tree cache) */-- /* get out the hash for all the contents we've appended to the file */- git_filebuf_hash(&hash_final, file);-- /* write it at the end of the file */- git_filebuf_write(file, hash_final.id, GIT_OID_RAWSZ);-- return error;-}
− libgit2/src/index.h
@@ -1,34 +0,0 @@-#ifndef INCLUDE_index_h__-#define INCLUDE_index_h__--#include "fileops.h"-#include "filebuf.h"-#include "vector.h"-#include "git2/odb.h"-#include "git2/index.h"--struct git_index_tree {- char *name;-- struct git_index_tree *parent;- struct git_index_tree **children;- size_t children_count;-- size_t entries;- git_oid oid;-};--typedef struct git_index_tree git_index_tree;--struct git_index {- git_repository *repository;- char *index_file_path;-- time_t last_modified;- git_vector entries;-- unsigned int on_disk:1;- git_index_tree *tree;-};--#endif
− libgit2/src/map.h
@@ -1,31 +0,0 @@-#ifndef INCLUDE_map_h__-#define INCLUDE_map_h__--#include "common.h"---/* git__mmap() prot values */-#define GIT_PROT_NONE 0x0-#define GIT_PROT_READ 0x1-#define GIT_PROT_WRITE 0x2-#define GIT_PROT_EXEC 0x4--/* git__mmmap() flags values */-#define GIT_MAP_FILE 0-#define GIT_MAP_SHARED 1-#define GIT_MAP_PRIVATE 2-#define GIT_MAP_TYPE 0xf-#define GIT_MAP_FIXED 0x10--typedef struct { /* memory mapped buffer */- void *data; /* data bytes */- size_t len; /* data length */-#ifdef GIT_WIN32- HANDLE fmh; /* file mapping handle */-#endif-} git_map;--extern int git__mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset);-extern int git__munmap(git_map *map);--#endif /* INCLUDE_map_h__ */
− libgit2/src/mingw-compat.h
@@ -1,13 +0,0 @@-#ifndef INCLUDE_mingw_compat__-#define INCLUDE_mingw_compat__--#if defined(__MINGW32__)--/* use a 64-bit file offset type */-# define lseek _lseeki64-# define stat _stati64-# define fstat _fstati64--#endif--#endif /* INCLUDE_mingw_compat__ */
− libgit2/src/msvc-compat.h
@@ -1,42 +0,0 @@-#ifndef INCLUDE_msvc_compat__-#define INCLUDE_msvc_compat__--#if defined(_MSC_VER)--/* access() mode parameter #defines */-# define F_OK 0 /* existence check */-# define W_OK 2 /* write mode check */-# define R_OK 4 /* read mode check */--# define lseek _lseeki64-# define stat _stat64-# define fstat _fstat64--/* stat: file mode type testing macros */-# define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)-# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG)-# define S_ISFIFO(m) (((m) & _S_IFMT) == _S_IFIFO)--#if (_MSC_VER >= 1600)-# include <stdint.h>-#else-/* add some missing <stdint.h> typedef's */-typedef signed char int8_t;-typedef unsigned char uint8_t;--typedef short int16_t;-typedef unsigned short uint16_t;--typedef long int32_t;-typedef unsigned long uint32_t;--typedef long long int64_t;-typedef unsigned long long uint64_t;--typedef long long intmax_t;-typedef unsigned long long uintmax_t;-#endif--#endif--#endif /* INCLUDE_msvc_compat__ */
− libgit2/src/object.c
@@ -1,487 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */-#include <stdarg.h>--#include "git2/object.h"--#include "common.h"-#include "repository.h"--#include "commit.h"-#include "tree.h"-#include "blob.h"-#include "tag.h"--static const int OBJECT_BASE_SIZE = 4096;--static struct {- const char *str; /* type name string */- int loose; /* valid loose object type flag */- size_t size; /* size in bytes of the object structure */-} git_objects_table[] = {- /* 0 = GIT_OBJ__EXT1 */- { "", 0, 0},-- /* 1 = GIT_OBJ_COMMIT */- { "commit", 1, sizeof(struct git_commit)},-- /* 2 = GIT_OBJ_TREE */- { "tree", 1, sizeof(struct git_tree) },-- /* 3 = GIT_OBJ_BLOB */- { "blob", 1, sizeof(struct git_blob) },-- /* 4 = GIT_OBJ_TAG */- { "tag", 1, sizeof(struct git_tag) },-- /* 5 = GIT_OBJ__EXT2 */- { "", 0, 0 },-- /* 6 = GIT_OBJ_OFS_DELTA */- { "OFS_DELTA", 0, 0 },-- /* 7 = GIT_OBJ_REF_DELTA */- { "REF_DELTA", 0, 0 }-};--/*- * Object source methods- *- * Abstract buffer methods that allow the writeback system- * to prepare the contents of any git file in-memory before- * writing them to disk.- */-static int source_resize(git_odb_source *src)-{- size_t write_offset, new_size;- void *new_data;-- write_offset = (size_t)((char *)src->write_ptr - (char *)src->raw.data);-- new_size = src->raw.len * 2;- if ((new_data = git__malloc(new_size)) == NULL)- return GIT_ENOMEM;-- memcpy(new_data, src->raw.data, src->written_bytes);- free(src->raw.data);-- src->raw.data = new_data;- src->raw.len = new_size;- src->write_ptr = (char *)new_data + write_offset;-- return GIT_SUCCESS;-}--int git__source_printf(git_odb_source *source, const char *format, ...)-{- va_list arglist;- int len;-- assert(source->open && source->write_ptr);-- va_start(arglist, format);-- len = vsnprintf(source->write_ptr, source->raw.len - source->written_bytes, format, arglist);-- while (source->written_bytes + len >= source->raw.len) {- if (source_resize(source) < GIT_SUCCESS)- return GIT_ENOMEM;-- len = vsnprintf(source->write_ptr, source->raw.len - source->written_bytes, format, arglist);- }-- source->write_ptr = (char *)source->write_ptr + len;- source->written_bytes += len;-- return GIT_SUCCESS;-}--int git__source_write(git_odb_source *source, const void *bytes, size_t len)-{- assert(source);-- assert(source->open && source->write_ptr);-- while (source->written_bytes + len >= source->raw.len) {- if (source_resize(source) < GIT_SUCCESS)- return GIT_ENOMEM;- }-- memcpy(source->write_ptr, bytes, len);- source->write_ptr = (char *)source->write_ptr + len;- source->written_bytes += len;-- return GIT_SUCCESS;-}--static void prepare_write(git_object *object)-{- if (object->source.write_ptr != NULL || object->source.open)- git_object__source_close(object);-- /* TODO: proper size calculation */- object->source.raw.data = git__malloc(OBJECT_BASE_SIZE);- object->source.raw.len = OBJECT_BASE_SIZE;-- object->source.write_ptr = object->source.raw.data;- object->source.written_bytes = 0;-- object->source.open = 1;-}--static int write_back(git_object *object)-{- int error;- git_oid new_id;-- assert(object);-- assert(object->source.open);- assert(object->modified);-- object->source.raw.len = object->source.written_bytes;-- if ((error = git_odb_write(&new_id, object->repo->db, &object->source.raw)) < GIT_SUCCESS)- return error;-- if (object->in_memory) {- int idx = git_vector_search(&object->repo->memory_objects, object);- git_vector_remove(&object->repo->memory_objects, idx);- } else {- git_hashtable_remove(object->repo->objects, &object->id);- }-- git_oid_cpy(&object->id, &new_id);- git_hashtable_insert(object->repo->objects, &object->id, object);-- object->source.write_ptr = NULL;- object->source.written_bytes = 0;-- object->modified = 0;- object->in_memory = 0;-- git_object__source_close(object);- return GIT_SUCCESS;-}--int git_object__source_open(git_object *object)-{- int error;-- assert(object && !object->in_memory);-- if (object->source.open)- git_object__source_close(object);-- error = git_odb_read(&object->source.raw, object->repo->db, &object->id);- if (error < GIT_SUCCESS)- return error;-- object->source.open = 1;- return GIT_SUCCESS;-}--void git_object__source_close(git_object *object)-{- assert(object);-- if (object->source.open) {- git_rawobj_close(&object->source.raw);- object->source.open = 0;- }-}--static int create_object(git_object **object_out, git_otype type)-{- git_object *object = NULL;-- assert(object_out);-- *object_out = NULL;-- switch (type) {- case GIT_OBJ_COMMIT:- case GIT_OBJ_TAG:- case GIT_OBJ_BLOB:- object = git__malloc(git_object__size(type));- if (object == NULL)- return GIT_ENOMEM;- memset(object, 0x0, git_object__size(type));- break;- - case GIT_OBJ_TREE:- object = (git_object *)git_tree__new();- if (object == NULL)- return GIT_ENOMEM;- break;-- default:- return GIT_EINVALIDTYPE;- }-- *object_out = object;- return GIT_SUCCESS;-}--int git_object_new(git_object **object_out, git_repository *repo, git_otype type)-{- git_object *object = NULL;- int error;-- assert(object_out && repo);-- if ((error = create_object(&object, type)) < GIT_SUCCESS)- return error;-- object->repo = repo;- object->in_memory = 1;- object->modified = 1;-- object->source.raw.type = type;-- object->lru = ++repo->lru_counter;- *object_out = object;- return GIT_SUCCESS;-}--int git_object_lookup(git_object **object_out, git_repository *repo, const git_oid *id, git_otype type)-{- git_object *object = NULL;- git_rawobj obj_file;- int error = GIT_SUCCESS;-- assert(repo && object_out && id);-- object = git_hashtable_lookup(repo->objects, id);- if (object != NULL) {- if (type != GIT_OBJ_ANY && type != object->source.raw.type)- return GIT_EINVALIDTYPE;-- *object_out = object;- object->lru = ++repo->lru_counter;- object->can_free = 0;- return GIT_SUCCESS;- }-- error = git_odb_read(&obj_file, repo->db, id);- if (error < GIT_SUCCESS)- return error;-- if (type != GIT_OBJ_ANY && type != obj_file.type) {- git_rawobj_close(&obj_file);- return GIT_EINVALIDTYPE;- }-- type = obj_file.type;-- if ((error = create_object(&object, type)) < GIT_SUCCESS)- return error;-- /* Initialize parent object */- git_oid_cpy(&object->id, id);- object->repo = repo;- memcpy(&object->source.raw, &obj_file, sizeof(git_rawobj));- object->source.open = 1;-- switch (type) {- case GIT_OBJ_COMMIT:- error = git_commit__parse((git_commit *)object);- break;-- case GIT_OBJ_TREE:- error = git_tree__parse((git_tree *)object);- break;-- case GIT_OBJ_TAG:- error = git_tag__parse((git_tag *)object);- break;-- case GIT_OBJ_BLOB:- error = git_blob__parse((git_blob *)object);- break;-- default:- break;- }-- if (error < GIT_SUCCESS) {- git_object__free(object);- return error;- }-- git_object__source_close(object);- git_hashtable_insert(repo->objects, &object->id, object);-- object->lru = ++repo->lru_counter;- *object_out = object;- return GIT_SUCCESS;-}--int git_object_write(git_object *object)-{- int error;- git_odb_source *source;-- assert(object);-- if (object->modified == 0)- return GIT_SUCCESS;-- prepare_write(object);- source = &object->source;-- switch (source->raw.type) {- case GIT_OBJ_COMMIT:- error = git_commit__writeback((git_commit *)object, source);- break;-- case GIT_OBJ_TREE:- error = git_tree__writeback((git_tree *)object, source);- break;-- case GIT_OBJ_TAG:- error = git_tag__writeback((git_tag *)object, source);- break;-- case GIT_OBJ_BLOB:- error = git_blob__writeback((git_blob *)object, source);- break;-- default:- error = GIT_ERROR;- break;- }-- if (error < GIT_SUCCESS) {- git_object__source_close(object);- return error;- }-- return write_back(object);-}--void git_object__free(git_object *object)-{- assert(object);-- git_object__source_close(object);-- switch (object->source.raw.type) {- case GIT_OBJ_COMMIT:- git_commit__free((git_commit *)object);- break;-- case GIT_OBJ_TREE:- git_tree__free((git_tree *)object);- break;-- case GIT_OBJ_TAG:- git_tag__free((git_tag *)object);- break;-- case GIT_OBJ_BLOB:- git_blob__free((git_blob *)object);- break;-- default:- free(object);- break;- }-}--void git_object_close(git_object *object)-{- if (object == NULL)- return;-- if (object->in_memory) {- int idx = git_vector_search(&object->repo->memory_objects, object);- git_vector_remove(&object->repo->memory_objects, idx);- git_object__free(object);- } else {- object->can_free = 1;- }-}--const git_oid *git_object_id(const git_object *obj)-{- assert(obj);-- if (obj->in_memory)- return NULL;-- return &obj->id;-}--git_otype git_object_type(const git_object *obj)-{- assert(obj);- return obj->source.raw.type;-}--git_repository *git_object_owner(const git_object *obj)-{- assert(obj);- return obj->repo;-}--const char *git_object_type2string(git_otype type)-{- if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table))- return "";-- return git_objects_table[type].str;-}--git_otype git_object_string2type(const char *str)-{- size_t i;-- if (!str || !*str)- return GIT_OBJ_BAD;-- for (i = 0; i < ARRAY_SIZE(git_objects_table); i++)- if (!strcmp(str, git_objects_table[i].str))- return (git_otype)i;-- return GIT_OBJ_BAD;-}--int git_object_typeisloose(git_otype type)-{- if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table))- return 0;-- return git_objects_table[type].loose;-}--size_t git_object__size(git_otype type)-{- if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table))- return 0;-- return git_objects_table[type].size;-}-
− libgit2/src/odb.c
@@ -1,396 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "git2/zlib.h"-#include "git2/object.h"-#include "fileops.h"-#include "hash.h"-#include "odb.h"-#include "delta-apply.h"--#include "git2/odb_backend.h"--#define GIT_ALTERNATES_FILE "info/alternates"--/* TODO: is this correct? */-#define GIT_LOOSE_PRIORITY 2-#define GIT_PACKED_PRIORITY 1--typedef struct-{- git_odb_backend *backend;- int priority;- int is_alternate;-} backend_internal;--static int format_object_header(char *hdr, size_t n, git_rawobj *obj)-{- const char *type_str = git_object_type2string(obj->type);- int len = snprintf(hdr, n, "%s %"PRIuZ, type_str, obj->len);-- assert(len > 0); /* otherwise snprintf() is broken */- assert(((size_t) len) < n); /* otherwise the caller is broken! */-- if (len < 0 || ((size_t) len) >= n)- return GIT_ERROR;- return len+1;-}--int git_odb__hash_obj(git_oid *id, char *hdr, size_t n, int *len, git_rawobj *obj)-{- git_buf_vec vec[2];- int hdrlen;-- assert(id && hdr && len && obj);-- if (!git_object_typeisloose(obj->type))- return GIT_ERROR;-- if (!obj->data && obj->len != 0)- return GIT_ERROR;-- if ((hdrlen = format_object_header(hdr, n, obj)) < 0)- return GIT_ERROR;-- *len = hdrlen;-- vec[0].data = hdr;- vec[0].len = hdrlen;- vec[1].data = obj->data;- vec[1].len = obj->len;-- git_hash_vec(id, vec, 2);-- return GIT_SUCCESS;-}--void git_rawobj_close(git_rawobj *obj)-{- free(obj->data);- obj->data = NULL;-}--int git_rawobj_hash(git_oid *id, git_rawobj *obj)-{- char hdr[64];- int hdrlen;-- assert(id && obj);-- return git_odb__hash_obj(id, hdr, sizeof(hdr), &hdrlen, obj);-}--int git_odb__inflate_buffer(void *in, size_t inlen, void *out, size_t outlen)-{- z_stream zs;- int status = Z_OK;-- memset(&zs, 0x0, sizeof(zs));-- zs.next_out = out;- zs.avail_out = outlen;-- zs.next_in = in;- zs.avail_in = inlen;-- if (inflateInit(&zs) < Z_OK)- return GIT_ERROR;-- while (status == Z_OK)- status = inflate(&zs, Z_FINISH);-- inflateEnd(&zs);-- if ((status != Z_STREAM_END) /*|| (zs.avail_in != 0) */)- return GIT_ERROR;-- if (zs.total_out != outlen)- return GIT_ERROR;-- return GIT_SUCCESS;-}------/***********************************************************- *- * OBJECT DATABASE PUBLIC API- *- * Public calls for the ODB functionality- *- ***********************************************************/--int backend_sort_cmp(const void *a, const void *b)-{- const backend_internal *backend_a = *(const backend_internal **)(a);- const backend_internal *backend_b = *(const backend_internal **)(b);-- if (backend_a->is_alternate == backend_b->is_alternate)- return (backend_b->priority - backend_a->priority);-- return backend_a->is_alternate ? 1 : -1;-}--int git_odb_new(git_odb **out)-{- git_odb *db = git__calloc(1, sizeof(*db));- if (!db)- return GIT_ENOMEM;-- if (git_vector_init(&db->backends, 4, backend_sort_cmp) < 0) {- free(db);- return GIT_ENOMEM;- }-- *out = db;- return GIT_SUCCESS;-}--static int add_backend_internal(git_odb *odb, git_odb_backend *backend, int priority, int is_alternate)-{- backend_internal *internal;-- assert(odb && backend);-- if (backend->odb != NULL && backend->odb != odb)- return GIT_EBUSY;-- internal = git__malloc(sizeof(backend_internal));- if (internal == NULL)- return GIT_ENOMEM;-- internal->backend = backend;- internal->priority = priority;- internal->is_alternate = is_alternate;-- if (git_vector_insert(&odb->backends, internal) < 0) {- free(internal);- return GIT_ENOMEM;- }-- git_vector_sort(&odb->backends);- internal->backend->odb = odb;- return GIT_SUCCESS;-}--int git_odb_add_backend(git_odb *odb, git_odb_backend *backend, int priority)-{- return add_backend_internal(odb, backend, priority, 0);-}--int git_odb_add_alternate(git_odb *odb, git_odb_backend *backend, int priority)-{- return add_backend_internal(odb, backend, priority, 1);-}--static int add_default_backends(git_odb *db, const char *objects_dir, int as_alternates)-{- git_odb_backend *loose, *packed;- int error;-- /* add the loose object backend */- error = git_odb_backend_loose(&loose, objects_dir);- if (error < GIT_SUCCESS)- return error;-- error = add_backend_internal(db, loose, GIT_LOOSE_PRIORITY, as_alternates);- if (error < GIT_SUCCESS)- return error;-- /* add the packed file backend */- error = git_odb_backend_pack(&packed, objects_dir);- if (error < GIT_SUCCESS)- return error;-- error = add_backend_internal(db, packed, GIT_PACKED_PRIORITY, as_alternates);- if (error < GIT_SUCCESS)- return error;-- return GIT_SUCCESS;-}--static int load_alternates(git_odb *odb, const char *objects_dir)-{- char alternates_path[GIT_PATH_MAX];- char alternate[GIT_PATH_MAX];- char *buffer;-- gitfo_buf alternates_buf = GITFO_BUF_INIT;- int error;-- git__joinpath(alternates_path, objects_dir, GIT_ALTERNATES_FILE);-- if (gitfo_exists(alternates_path) < GIT_SUCCESS)- return GIT_SUCCESS;-- if (gitfo_read_file(&alternates_buf, alternates_path) < GIT_SUCCESS)- return GIT_EOSERR;-- buffer = (char *)alternates_buf.data;- error = GIT_SUCCESS;-- /* add each alternate as a new backend; one alternate per line */- while ((error == GIT_SUCCESS) && (buffer = git__strtok(alternate, buffer, "\r\n")) != NULL)- error = add_default_backends(odb, alternate, 1);-- gitfo_free_buf(&alternates_buf);- return error;-}--int git_odb_open(git_odb **out, const char *objects_dir)-{- git_odb *db;- int error;-- assert(out && objects_dir);-- *out = NULL;-- if ((error = git_odb_new(&db)) < 0)- return error;-- if ((error = add_default_backends(db, objects_dir, 0)) < GIT_SUCCESS)- goto cleanup;-- if ((error = load_alternates(db, objects_dir)) < GIT_SUCCESS)- goto cleanup;-- *out = db;- return GIT_SUCCESS;--cleanup:- git_odb_close(db);- return error;-}--void git_odb_close(git_odb *db)-{- unsigned int i;-- if (db == NULL)- return;-- for (i = 0; i < db->backends.length; ++i) {- backend_internal *internal = git_vector_get(&db->backends, i);- git_odb_backend *backend = internal->backend;-- if (backend->free) backend->free(backend);- else free(backend);-- free(internal);- }-- git_vector_free(&db->backends);- free(db);-}--int git_odb_exists(git_odb *db, const git_oid *id)-{- unsigned int i;- int found = 0;-- assert(db && id);-- for (i = 0; i < db->backends.length && !found; ++i) {- backend_internal *internal = git_vector_get(&db->backends, i);- git_odb_backend *b = internal->backend;-- if (b->exists != NULL)- found = b->exists(b, id);- }-- return found;-}--int git_odb_read_header(git_rawobj *out, git_odb *db, const git_oid *id)-{- unsigned int i;- int error = GIT_ENOTFOUND;-- assert(out && db && id);-- for (i = 0; i < db->backends.length && error < 0; ++i) {- backend_internal *internal = git_vector_get(&db->backends, i);- git_odb_backend *b = internal->backend;-- if (b->read_header != NULL)- error = b->read_header(out, b, id);- }-- /*- * no backend could read only the header.- * try reading the whole object and freeing the contents- */- if (error < 0) {- error = git_odb_read(out, db, id);- git_rawobj_close(out);- }-- return error;-}--int git_odb_read(git_rawobj *out, git_odb *db, const git_oid *id)-{- unsigned int i;- int error = GIT_ENOTFOUND;-- assert(out && db && id);-- for (i = 0; i < db->backends.length && error < 0; ++i) {- backend_internal *internal = git_vector_get(&db->backends, i);- git_odb_backend *b = internal->backend;-- if (b->read != NULL)- error = b->read(out, b, id);- }-- return error;-}--int git_odb_write(git_oid *id, git_odb *db, git_rawobj *obj)-{- unsigned int i;- int error = GIT_ERROR;-- assert(obj && db && id);-- for (i = 0; i < db->backends.length && error < 0; ++i) {- backend_internal *internal = git_vector_get(&db->backends, i);- git_odb_backend *b = internal->backend;-- /* we don't write in alternates! */- if (internal->is_alternate)- continue;-- if (b->write != NULL)- error = b->write(id, b, obj);- }-- return error;-}-
− libgit2/src/odb.h
@@ -1,17 +0,0 @@-#ifndef INCLUDE_odb_h__-#define INCLUDE_odb_h__--#include "git2/odb.h"-#include "git2/oid.h"--#include "vector.h"--struct git_odb {- void *_internal;- git_vector backends;-};--int git_odb__hash_obj(git_oid *id, char *hdr, size_t n, int *len, git_rawobj *obj);-int git_odb__inflate_buffer(void *in, size_t inlen, void *out, size_t outlen);--#endif
− libgit2/src/odb_loose.c
@@ -1,658 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "git2/zlib.h"-#include "git2/object.h"-#include "fileops.h"-#include "hash.h"-#include "odb.h"-#include "delta-apply.h"--#include "git2/odb_backend.h"--typedef struct { /* object header data */- git_otype type; /* object type */- size_t size; /* object size */-} obj_hdr;--typedef struct loose_backend {- git_odb_backend parent;-- int object_zlib_level; /** loose object zlib compression level. */- int fsync_object_files; /** loose object file fsync flag. */- char *objects_dir;-} loose_backend;---/***********************************************************- *- * MISCELANEOUS HELPER FUNCTIONS- *- ***********************************************************/--static int make_temp_file(git_file *fd, char *tmp, size_t n, char *file)-{- char *template = "/tmp_obj_XXXXXX";- size_t tmplen = strlen(template);- int dirlen;-- if ((dirlen = git__dirname_r(tmp, n, file)) < 0)- return GIT_ERROR;-- if ((dirlen + tmplen) >= n)- return GIT_ERROR;-- strcpy(tmp + dirlen, (dirlen) ? template : template + 1);-- *fd = gitfo_mkstemp(tmp);- if (*fd < 0 && dirlen) {- /* create directory if it doesn't exist */- tmp[dirlen] = '\0';- if ((gitfo_exists(tmp) < 0) && gitfo_mkdir(tmp, 0755))- return GIT_ERROR;- /* try again */- strcpy(tmp + dirlen, template);- *fd = gitfo_mkstemp(tmp);- }- if (*fd < 0)- return GIT_ERROR;-- return GIT_SUCCESS;-}----static size_t object_file_name(char *name, size_t n, char *dir, const git_oid *id)-{- size_t len = strlen(dir);-- /* check length: 43 = 40 hex sha1 chars + 2 * '/' + '\0' */- if (len+43 > n)- return len+43;-- /* the object dir: eg $GIT_DIR/objects */- strcpy(name, dir);- if (name[len-1] != '/')- name[len++] = '/';-- /* loose object filename: aa/aaa... (41 bytes) */- git_oid_pathfmt(&name[len], id);- name[len+41] = '\0';-- return 0;-}---static size_t get_binary_object_header(obj_hdr *hdr, gitfo_buf *obj)-{- unsigned char c;- unsigned char *data = obj->data;- size_t shift, size, used = 0;-- if (obj->len == 0)- return 0;-- c = data[used++];- hdr->type = (c >> 4) & 7;-- size = c & 15;- shift = 4;- while (c & 0x80) {- if (obj->len <= used)- return 0;- if (sizeof(size_t) * 8 <= shift)- return 0;- c = data[used++];- size += (c & 0x7f) << shift;- shift += 7;- }- hdr->size = size;-- return used;-}--static size_t get_object_header(obj_hdr *hdr, unsigned char *data)-{- char c, typename[10];- size_t size, used = 0;-- /*- * type name string followed by space.- */- while ((c = data[used]) != ' ') {- typename[used++] = c;- if (used >= sizeof(typename))- return 0;- }- typename[used] = 0;- if (used == 0)- return 0;- hdr->type = git_object_string2type(typename);- used++; /* consume the space */-- /*- * length follows immediately in decimal (without- * leading zeros).- */- size = data[used++] - '0';- if (size > 9)- return 0;- if (size) {- while ((c = data[used]) != '\0') {- size_t d = c - '0';- if (d > 9)- break;- used++;- size = size * 10 + d;- }- }- hdr->size = size;-- /*- * the length must be followed by a zero byte- */- if (data[used++] != '\0')- return 0;-- return used;-}----/***********************************************************- *- * ZLIB RELATED FUNCTIONS- *- ***********************************************************/--static void init_stream(z_stream *s, void *out, size_t len)-{- memset(s, 0, sizeof(*s));- s->next_out = out;- s->avail_out = len;-}--static void set_stream_input(z_stream *s, void *in, size_t len)-{- s->next_in = in;- s->avail_in = len;-}--static void set_stream_output(z_stream *s, void *out, size_t len)-{- s->next_out = out;- s->avail_out = len;-}---static int start_inflate(z_stream *s, gitfo_buf *obj, void *out, size_t len)-{- int status;-- init_stream(s, out, len);- set_stream_input(s, obj->data, obj->len);-- if ((status = inflateInit(s)) < Z_OK)- return status;-- return inflate(s, 0);-}--static int finish_inflate(z_stream *s)-{- int status = Z_OK;-- while (status == Z_OK)- status = inflate(s, Z_FINISH);-- inflateEnd(s);-- if ((status != Z_STREAM_END) || (s->avail_in != 0))- return GIT_ERROR;-- return GIT_SUCCESS;-}--static int deflate_buf(z_stream *s, void *in, size_t len, int flush)-{- int status = Z_OK;-- set_stream_input(s, in, len);- while (status == Z_OK) {- status = deflate(s, flush);- if (s->avail_in == 0)- break;- }- return status;-}--static int deflate_obj(gitfo_buf *buf, char *hdr, int hdrlen, git_rawobj *obj, int level)-{- z_stream zs;- int status;- size_t size;-- assert(buf && !buf->data && hdr && obj);- assert(level == Z_DEFAULT_COMPRESSION || (level >= 0 && level <= 9));-- buf->data = NULL;- buf->len = 0;- init_stream(&zs, NULL, 0);-- if (deflateInit(&zs, level) < Z_OK)- return GIT_ERROR;-- size = deflateBound(&zs, hdrlen + obj->len);-- if ((buf->data = git__malloc(size)) == NULL) {- deflateEnd(&zs);- return GIT_ERROR;- }-- set_stream_output(&zs, buf->data, size);-- /* compress the header */- status = deflate_buf(&zs, hdr, hdrlen, Z_NO_FLUSH);-- /* if header compressed OK, compress the object */- if (status == Z_OK)- status = deflate_buf(&zs, obj->data, obj->len, Z_FINISH);-- if (status != Z_STREAM_END) {- deflateEnd(&zs);- free(buf->data);- buf->data = NULL;- return GIT_ERROR;- }-- buf->len = zs.total_out;- deflateEnd(&zs);-- return GIT_SUCCESS;-}--static int is_zlib_compressed_data(unsigned char *data)-{- unsigned int w;-- w = ((unsigned int)(data[0]) << 8) + data[1];- return data[0] == 0x78 && !(w % 31);-}--static void *inflate_tail(z_stream *s, void *hb, size_t used, obj_hdr *hdr)-{- unsigned char *buf, *head = hb;- size_t tail;-- /*- * allocate a buffer to hold the inflated data and copy the- * initial sequence of inflated data from the tail of the- * head buffer, if any.- */- if ((buf = git__malloc(hdr->size + 1)) == NULL) {- inflateEnd(s);- return NULL;- }- tail = s->total_out - used;- if (used > 0 && tail > 0) {- if (tail > hdr->size)- tail = hdr->size;- memcpy(buf, head + used, tail);- }- used = tail;-- /*- * inflate the remainder of the object data, if any- */- if (hdr->size < used)- inflateEnd(s);- else {- set_stream_output(s, buf + used, hdr->size - used);- if (finish_inflate(s)) {- free(buf);- return NULL;- }- }-- return buf;-}--/*- * At one point, there was a loose object format that was intended to- * mimic the format used in pack-files. This was to allow easy copying- * of loose object data into packs. This format is no longer used, but- * we must still read it.- */-static int inflate_packlike_loose_disk_obj(git_rawobj *out, gitfo_buf *obj)-{- unsigned char *in, *buf;- obj_hdr hdr;- size_t len, used;-- /*- * read the object header, which is an (uncompressed)- * binary encoding of the object type and size.- */- if ((used = get_binary_object_header(&hdr, obj)) == 0)- return GIT_ERROR;-- if (!git_object_typeisloose(hdr.type))- return GIT_ERROR;-- /*- * allocate a buffer and inflate the data into it- */- buf = git__malloc(hdr.size + 1);- if (!buf)- return GIT_ERROR;-- in = ((unsigned char *)obj->data) + used;- len = obj->len - used;- if (git_odb__inflate_buffer(in, len, buf, hdr.size)) {- free(buf);- return GIT_ERROR;- }- buf[hdr.size] = '\0';-- out->data = buf;- out->len = hdr.size;- out->type = hdr.type;-- return GIT_SUCCESS;-}--static int inflate_disk_obj(git_rawobj *out, gitfo_buf *obj)-{- unsigned char head[64], *buf;- z_stream zs;- int z_status;- obj_hdr hdr;- size_t used;-- /*- * check for a pack-like loose object- */- if (!is_zlib_compressed_data(obj->data))- return inflate_packlike_loose_disk_obj(out, obj);-- /*- * inflate the initial part of the io buffer in order- * to parse the object header (type and size).- */- if ((z_status = start_inflate(&zs, obj, head, sizeof(head))) < Z_OK)- return GIT_ERROR;-- if ((used = get_object_header(&hdr, head)) == 0)- return GIT_ERROR;-- if (!git_object_typeisloose(hdr.type))- return GIT_ERROR;-- /*- * allocate a buffer and inflate the object data into it- * (including the initial sequence in the head buffer).- */- if ((buf = inflate_tail(&zs, head, used, &hdr)) == NULL)- return GIT_ERROR;- buf[hdr.size] = '\0';-- out->data = buf;- out->len = hdr.size;- out->type = hdr.type;-- return GIT_SUCCESS;-}-------/***********************************************************- *- * ODB OBJECT READING & WRITING- *- * Backend for the public API; read headers and full objects- * from the ODB. Write raw data to the ODB.- *- ***********************************************************/--static int read_loose(git_rawobj *out, const char *loc)-{- int error;- gitfo_buf obj = GITFO_BUF_INIT;-- assert(out && loc);-- out->data = NULL;- out->len = 0;- out->type = GIT_OBJ_BAD;-- if (gitfo_read_file(&obj, loc) < 0)- return GIT_ENOTFOUND;-- error = inflate_disk_obj(out, &obj);- gitfo_free_buf(&obj);-- return error;-}--static int read_header_loose(git_rawobj *out, const char *loc)-{- int error = GIT_SUCCESS, z_return = Z_ERRNO, read_bytes;- git_file fd;- z_stream zs;- obj_hdr header_obj;- unsigned char raw_buffer[16], inflated_buffer[64];-- assert(out && loc);-- out->data = NULL;-- if ((fd = gitfo_open(loc, O_RDONLY)) < 0)- return GIT_ENOTFOUND;-- init_stream(&zs, inflated_buffer, sizeof(inflated_buffer));-- if (inflateInit(&zs) < Z_OK) {- error = GIT_EZLIB;- goto cleanup;- }-- do {- if ((read_bytes = read(fd, raw_buffer, sizeof(raw_buffer))) > 0) {- set_stream_input(&zs, raw_buffer, read_bytes);- z_return = inflate(&zs, 0);- }- } while (z_return == Z_OK);-- if ((z_return != Z_STREAM_END && z_return != Z_BUF_ERROR)- || get_object_header(&header_obj, inflated_buffer) == 0- || git_object_typeisloose(header_obj.type) == 0) {- error = GIT_EOBJCORRUPTED;- goto cleanup;- }-- out->len = header_obj.size;- out->type = header_obj.type;--cleanup:- finish_inflate(&zs);- gitfo_close(fd);- return error;-}--static int write_obj(gitfo_buf *buf, git_oid *id, loose_backend *backend)-{- char file[GIT_PATH_MAX];- char temp[GIT_PATH_MAX];- git_file fd;-- if (object_file_name(file, sizeof(file), backend->objects_dir, id))- return GIT_EOSERR;-- if (make_temp_file(&fd, temp, sizeof(temp), file) < 0)- return GIT_EOSERR;-- if (gitfo_write(fd, buf->data, buf->len) < 0) {- gitfo_close(fd);- gitfo_unlink(temp);- return GIT_EOSERR;- }-- if (backend->fsync_object_files)- gitfo_fsync(fd);- gitfo_close(fd);- gitfo_chmod(temp, 0444);-- if (gitfo_mv(temp, file) < 0) {- gitfo_unlink(temp);- return GIT_EOSERR;- }-- return GIT_SUCCESS;-}--static int locate_object(char *object_location, loose_backend *backend, const git_oid *oid)-{- object_file_name(object_location, GIT_PATH_MAX, backend->objects_dir, oid);- return gitfo_exists(object_location);-}----------/***********************************************************- *- * LOOSE BACKEND PUBLIC API- *- * Implement the git_odb_backend API calls- *- ***********************************************************/--int loose_backend__read_header(git_rawobj *obj, git_odb_backend *backend, const git_oid *oid)-{- char object_path[GIT_PATH_MAX];-- assert(obj && backend && oid);-- if (locate_object(object_path, (loose_backend *)backend, oid) < 0)- return GIT_ENOTFOUND;-- return read_header_loose(obj, object_path);-}---int loose_backend__read(git_rawobj *obj, git_odb_backend *backend, const git_oid *oid)-{- char object_path[GIT_PATH_MAX];-- assert(obj && backend && oid);-- if (locate_object(object_path, (loose_backend *)backend, oid) < 0)- return GIT_ENOTFOUND;-- return read_loose(obj, object_path);-}--int loose_backend__exists(git_odb_backend *backend, const git_oid *oid)-{- char object_path[GIT_PATH_MAX];-- assert(backend && oid);-- return locate_object(object_path, (loose_backend *)backend, oid) == GIT_SUCCESS;-}---int loose_backend__write(git_oid *id, git_odb_backend *_backend, git_rawobj *obj)-{- char hdr[64];- int hdrlen;- gitfo_buf buf = GITFO_BUF_INIT;- int error;- loose_backend *backend;-- assert(id && _backend && obj);-- backend = (loose_backend *)_backend;-- if ((error = git_odb__hash_obj(id, hdr, sizeof(hdr), &hdrlen, obj)) < 0)- return error;-- if (git_odb_exists(_backend->odb, id))- return GIT_SUCCESS;-- if ((error = deflate_obj(&buf, hdr, hdrlen, obj, backend->object_zlib_level)) < 0)- return error;-- error = write_obj(&buf, id, backend);-- gitfo_free_buf(&buf);- return error;-}--void loose_backend__free(git_odb_backend *_backend)-{- loose_backend *backend;- assert(_backend);- backend = (loose_backend *)_backend;-- free(backend->objects_dir);- free(backend);-}--int git_odb_backend_loose(git_odb_backend **backend_out, const char *objects_dir)-{- loose_backend *backend;-- backend = git__calloc(1, sizeof(loose_backend));- if (backend == NULL)- return GIT_ENOMEM;-- backend->objects_dir = git__strdup(objects_dir);- if (backend->objects_dir == NULL) {- free(backend);- return GIT_ENOMEM;- }-- backend->object_zlib_level = Z_BEST_SPEED;- backend->fsync_object_files = 0;-- backend->parent.read = &loose_backend__read;- backend->parent.read_header = &loose_backend__read_header;- backend->parent.write = &loose_backend__write;- backend->parent.exists = &loose_backend__exists;- backend->parent.free = &loose_backend__free;-- *backend_out = (git_odb_backend *)backend;- return GIT_SUCCESS;-}
− libgit2/src/odb_pack.c
@@ -1,1406 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "git2/zlib.h"-#include "git2/repository.h"-#include "fileops.h"-#include "hash.h"-#include "odb.h"-#include "delta-apply.h"--#include "git2/odb_backend.h"--#define DEFAULT_WINDOW_SIZE \- (sizeof(void*) >= 8 \- ? 1 * 1024 * 1024 * 1024 \- : 32 * 1024 * 1024)--#define DEFAULT_MAPPED_LIMIT \- ((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))--#define PACK_SIGNATURE 0x5041434b /* "PACK" */-#define PACK_VERSION 2-#define pack_version_ok(v) ((v) == htonl(2) || (v) == htonl(3))-struct pack_header {- uint32_t hdr_signature;- uint32_t hdr_version;- uint32_t hdr_entries;-};--/*- * The first four bytes of index formats later than version 1 should- * start with this signature, as all older git binaries would find this- * value illegal and abort reading the file.- *- * This is the case because the number of objects in a packfile- * cannot exceed 1,431,660,000 as every object would need at least- * 3 bytes of data and the overall packfile cannot exceed 4 GiB with- * version 1 of the index file due to the offsets limited to 32 bits.- * Clearly the signature exceeds this maximum.- *- * Very old git binaries will also compare the first 4 bytes to the- * next 4 bytes in the index and abort with a "non-monotonic index"- * error if the second 4 byte word is smaller than the first 4- * byte word. This would be true in the proposed future index- * format as idx_signature would be greater than idx_version.- */-#define PACK_IDX_SIGNATURE 0xff744f63 /* "\377tOc" */--struct pack_idx_header {- uint32_t idx_signature;- uint32_t idx_version;-};--struct pack_window {- struct pack_window *next;- git_map window_map;- off_t offset;- unsigned int last_used;- unsigned int inuse_cnt;-};--struct pack_file {- struct pack_window *windows;- off_t pack_size;-- git_map index_map;-- uint32_t num_objects;- uint32_t num_bad_objects;- git_oid *bad_object_sha1; /* array of git_oid */-- int index_version;- time_t mtime;- int pack_fd;- unsigned pack_local:1, pack_keep:1;- git_oid sha1;-- /* something like ".git/objects/pack/xxxxx.pack" */- char pack_name[GIT_FLEX_ARRAY]; /* more */-};--struct pack_entry {- off_t offset;- git_oid sha1;- struct pack_file *p;-};--struct pack__dirent {- struct pack_backend *backend;- int is_pack_local;-};--struct pack_backend {- git_odb_backend parent;- git_vector packs;- struct pack_file *last_found;-- size_t window_size; /* needs default value */-- size_t mapped_limit; /* needs default value */- size_t peak_mapped;- size_t mapped;-- size_t used_ctr;-- unsigned int peak_open_windows;- unsigned int open_windows;-- unsigned int mmap_calls;-};--/**- * The wonderful tale of a Packed Object lookup query- * ===================================================- * A riveting and epic story of epicness and ASCII- * art, presented by yours truly,- * Sir Vicent of Marti- *- *- * Chapter 1: Once upon a time...- * Initialization of the Pack Backend- * --------------------------------------------------- *- * # git_odb_backend_pack- * | Creates the pack backend structure, initializes the- * | callback pointers to our default read() and exist() methods,- * | and tries to preload all the known packfiles in the ODB.- * |- * |-# packfile_load_all- * | Tries to find the `pack` folder, if it exists. ODBs without- * | a pack folder are ignored altogether. If there's a `pack` folder- * | we run a `dirent` callback through every file in the pack folder- * | to find our packfiles. The packfiles are then sorted according- * | to a sorting callback.- * |- * |-# packfile_load__cb- * | | This callback is called from `dirent` with every single file- * | | inside the pack folder. We find the packs by actually locating- * | | their index (ends in ".idx"). From that index, we verify that- * | | the corresponding packfile exists and is valid, and if so, we- * | | add it to the pack list.- * | |- * | |-# packfile_check- * | Make sure that there's a packfile to back this index, and store- * | some very basic information regarding the packfile itself,- * | such as the full path, the size, and the modification time.- * | We don't actually open the packfile to check for internal consistency.- * |- * |-# packfile_sort__cb- * Sort all the preloaded packs according to some specific criteria:- * we prioritize the "newer" packs because it's more likely they- * contain the objects we are looking for, and we prioritize local- * packs over remote ones.- *- *- *- * Chapter 2: To be, or not to be...- * A standard packed `exist` query for an OID- * --------------------------------------------------- *- * # pack_backend__exists- * | Check if the given SHA1 oid exists in any of the packs- * | that have been loaded for our ODB.- * |- * |-# pack_entry_find- * | Iterate through all the packs that have been preloaded- * | (starting by the pack where the latest object was found)- * | to try to find the OID in one of them.- * |- * |-# pack_entry_find1- * | Check the index of an individual pack to see if the SHA1- * | OID can be found. If we can find the offset to that SHA1- * | inside of the index, that means the object is contained- * | inside of the packfile and we can stop searching.- * | Before returning, we verify that the packfile behing the- * | index we are searching still exists on disk.- * |- * |-# pack_entry_find_offset- * | | Mmap the actual index file to disk if it hasn't been opened- * | | yet, and run a binary search through it to find the OID.- * | | See <http://book.git-scm.com/7_the_packfile.html> for specifics- * | | on the Packfile Index format and how do we find entries in it.- * | |- * | |-# pack_index_open- * | | Guess the name of the index based on the full path to the- * | | packfile, open it and verify its contents. Only if the index- * | | has not been opened already.- * | |- * | |-# pack_index_check- * | Mmap the index file and do a quick run through the header- * | to guess the index version (right now we support v1 and v2),- * | and to verify that the size of the index makes sense.- * |- * |-# packfile_open- * See `packfile_open` in Chapter 3- *- *- *- * Chapter 3: The neverending story...- * A standard packed `lookup` query for an OID- * --------------------------------------------------- * TODO- *- */---- -/***********************************************************- *- * FORWARD DECLARATIONS- *- ***********************************************************/--static void pack_window_free_all(struct pack_backend *backend, struct pack_file *p);-static int pack_window_contains(struct pack_window *win, off_t offset);--static void pack_window_scan_lru(struct pack_file *p, struct pack_file **lru_p,- struct pack_window **lru_w, struct pack_window **lru_l);--static int pack_window_close_lru( struct pack_backend *backend,- struct pack_file *current, git_file keep_fd);--static void pack_window_close(struct pack_window **w_cursor);--static unsigned char *pack_window_open( struct pack_backend *backend,- struct pack_file *p, struct pack_window **w_cursor, off_t offset,- unsigned int *left);--static int packfile_sort__cb(const void *a_, const void *b_);--static void pack_index_free(struct pack_file *p);--static int pack_index_check(const char *path, struct pack_file *p);-static int pack_index_open(struct pack_file *p);--static struct pack_file *packfile_alloc(int extra);-static int packfile_open(struct pack_file *p);-static int packfile_check(struct pack_file **pack_out, const char *path, int local);-static int packfile_load__cb(void *_data, char *path);-static int packfile_load_all(struct pack_backend *backend, const char *odb_path, int local);--static off_t nth_packed_object_offset(const struct pack_file *p, uint32_t n);--static int pack_entry_find_offset(off_t *offset_out,- struct pack_file *p, const git_oid *oid);--static int pack_entry_find1(struct pack_entry *e,- struct pack_file *p, const git_oid *oid);--static int pack_entry_find(struct pack_entry *e,- struct pack_backend *backend, const git_oid *oid);--static off_t get_delta_base(struct pack_backend *backend,- struct pack_file *p, struct pack_window **w_curs,- off_t *curpos, git_otype type,- off_t delta_obj_offset);--static unsigned long packfile_unpack_header1(- size_t *sizep,- git_otype *type, - const unsigned char *buf,- unsigned long len);--static int packfile_unpack_header(- size_t *size_p,- git_otype *type_p,- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t *curpos);--static int packfile_unpack_compressed(- git_rawobj *obj,- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t curpos,- size_t size,- git_otype type);--static int packfile_unpack_delta(- git_rawobj *obj,- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t curpos,- size_t delta_size,- git_otype delta_type,- off_t obj_offset);--static int packfile_unpack(git_rawobj *obj, struct pack_backend *backend,- struct pack_file *p, off_t obj_offset);------/***********************************************************- *- * PACK WINDOW MANAGEMENT- *- ***********************************************************/--void pack_window_free_all(struct pack_backend *backend, struct pack_file *p)-{- while (p->windows) {- struct pack_window *w = p->windows;- assert(w->inuse_cnt == 0);-- backend->mapped -= w->window_map.len;- backend->open_windows--;-- gitfo_free_map(&w->window_map);-- p->windows = w->next;- free(w);- }-}--GIT_INLINE(int) pack_window_contains(struct pack_window *win, off_t offset)-{- /* We must promise at least 20 bytes (one hash) after the- * offset is available from this window, otherwise the offset- * is not actually in this window and a different window (which- * has that one hash excess) must be used. This is to support- * the object header and delta base parsing routines below.- */- off_t win_off = win->offset;- return win_off <= offset- && (offset + 20) <= (off_t)(win_off + win->window_map.len);-}--static void pack_window_scan_lru(- struct pack_file *p,- struct pack_file **lru_p,- struct pack_window **lru_w,- struct pack_window **lru_l)-{- struct pack_window *w, *w_l;-- for (w_l = NULL, w = p->windows; w; w = w->next) {- if (!w->inuse_cnt) {- if (!*lru_w || w->last_used < (*lru_w)->last_used) {- *lru_p = p;- *lru_w = w;- *lru_l = w_l;- }- }- w_l = w;- }-}--static int pack_window_close_lru(- struct pack_backend *backend,- struct pack_file *current,- git_file keep_fd)-{- struct pack_file *lru_p = NULL;- struct pack_window *lru_w = NULL, *lru_l = NULL;- size_t i;-- if (current)- pack_window_scan_lru(current, &lru_p, &lru_w, &lru_l);-- for (i = 0; i < backend->packs.length; ++i)- pack_window_scan_lru(git_vector_get(&backend->packs, i), &lru_p, &lru_w, &lru_l);-- if (lru_p) {- backend->mapped -= lru_w->window_map.len;- gitfo_free_map(&lru_w->window_map);-- if (lru_l)- lru_l->next = lru_w->next;- else {- lru_p->windows = lru_w->next;- if (!lru_p->windows && lru_p->pack_fd != keep_fd) {- gitfo_close(lru_p->pack_fd);- lru_p->pack_fd = -1;- }- }-- free(lru_w);- backend->open_windows--;- return GIT_SUCCESS;- }-- return GIT_ERROR;-}--static void pack_window_close(struct pack_window **w_cursor)-{- struct pack_window *w = *w_cursor;- if (w) {- w->inuse_cnt--;- *w_cursor = NULL;- }-}--static unsigned char *pack_window_open(- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_cursor,- off_t offset,- unsigned int *left)-{- struct pack_window *win = *w_cursor;-- if (p->pack_fd == -1 && packfile_open(p) < GIT_SUCCESS)- return NULL;-- /* Since packfiles end in a hash of their content and it's- * pointless to ask for an offset into the middle of that- * hash, and the pack_window_contains function above wouldn't match- * don't allow an offset too close to the end of the file.- */- if (offset > (p->pack_size - 20))- return NULL;-- if (!win || !pack_window_contains(win, offset)) {-- if (win)- win->inuse_cnt--;-- for (win = p->windows; win; win = win->next) {- if (pack_window_contains(win, offset))- break;- }-- if (!win) {- size_t window_align = backend->window_size / 2;- size_t len;-- win = git__calloc(1, sizeof(*win));- win->offset = (offset / window_align) * window_align;-- len = (size_t)(p->pack_size - win->offset);- if (len > backend->window_size)- len = backend->window_size;-- backend->mapped += len;-- while (backend->mapped_limit < backend->mapped &&- pack_window_close_lru(backend, p, p->pack_fd) == GIT_SUCCESS) {}-- if (gitfo_map_ro(&win->window_map, p->pack_fd,- win->offset, len) < GIT_SUCCESS)- return NULL;-- backend->mmap_calls++;- backend->open_windows++;-- if (backend->mapped > backend->peak_mapped)- backend->peak_mapped = backend->mapped;-- if (backend->open_windows > backend->peak_open_windows)- backend->peak_open_windows = backend->open_windows;-- win->next = p->windows;- p->windows = win;- }- }-- if (win != *w_cursor) {- win->last_used = backend->used_ctr++;- win->inuse_cnt++;- *w_cursor = win;- }-- offset -= win->offset;- assert(git__is_sizet(offset));-- if (left)- *left = win->window_map.len - (size_t)offset;-- return (unsigned char *)win->window_map.data + offset;-}--------/***********************************************************- *- * PACK INDEX METHODS- *- ***********************************************************/--static void pack_index_free(struct pack_file *p)-{- if (p->index_map.data) {- gitfo_free_map(&p->index_map);- p->index_map.data = NULL;- }-}--static int pack_index_check(const char *path, struct pack_file *p)-{- struct pack_idx_header *hdr;- uint32_t version, nr, i, *index;-- void *idx_map;- size_t idx_size;-- struct stat st;-- /* TODO: properly open the file without access time */- git_file fd = gitfo_open(path, O_RDONLY /*| O_NOATIME */);-- int error;-- if (fd < 0)- return GIT_EOSERR;-- if (gitfo_fstat(fd, &st) < GIT_SUCCESS) {- gitfo_close(fd);- return GIT_EOSERR;- }-- if (!git__is_sizet(st.st_size))- return GIT_ENOMEM;-- idx_size = (size_t)st.st_size;-- if (idx_size < 4 * 256 + 20 + 20) {- gitfo_close(fd);- return GIT_EOBJCORRUPTED;- }-- error = gitfo_map_ro(&p->index_map, fd, 0, idx_size);- gitfo_close(fd);-- if (error < GIT_SUCCESS)- return error;-- hdr = idx_map = p->index_map.data;-- if (hdr->idx_signature == htonl(PACK_IDX_SIGNATURE)) {- version = ntohl(hdr->idx_version);-- if (version < 2 || version > 2) {- gitfo_free_map(&p->index_map);- return GIT_EOBJCORRUPTED; /* unsupported index version */- }-- } else- version = 1;-- nr = 0;- index = idx_map;-- if (version > 1)- index += 2; /* skip index header */-- for (i = 0; i < 256; i++) {- uint32_t n = ntohl(index[i]);- if (n < nr) {- gitfo_free_map(&p->index_map);- return GIT_EOBJCORRUPTED; /* non-monotonic index */- }- nr = n;- }-- if (version == 1) {- /*- * Total size:- * - 256 index entries 4 bytes each- * - 24-byte entries * nr (20-byte sha1 + 4-byte offset)- * - 20-byte SHA1 of the packfile- * - 20-byte SHA1 file checksum- */- if (idx_size != 4*256 + nr * 24 + 20 + 20) {- gitfo_free_map(&p->index_map);- return GIT_EOBJCORRUPTED;- }- } else if (version == 2) {- /*- * Minimum size:- * - 8 bytes of header- * - 256 index entries 4 bytes each- * - 20-byte sha1 entry * nr- * - 4-byte crc entry * nr- * - 4-byte offset entry * nr- * - 20-byte SHA1 of the packfile- * - 20-byte SHA1 file checksum- * And after the 4-byte offset table might be a- * variable sized table containing 8-byte entries- * for offsets larger than 2^31.- */- unsigned long min_size = 8 + 4*256 + nr*(20 + 4 + 4) + 20 + 20;- unsigned long max_size = min_size;-- if (nr)- max_size += (nr - 1)*8;-- if (idx_size < min_size || idx_size > max_size) {- gitfo_free_map(&p->index_map);- return GIT_EOBJCORRUPTED;- }-- /* Make sure that off_t is big enough to access the whole pack...- * Is this an issue in libgit2? It shouldn't. */- if (idx_size != min_size && (sizeof(off_t) <= 4)) {- gitfo_free_map(&p->index_map);- return GIT_EOSERR;- }- }-- p->index_version = version;- p->num_objects = nr;- return GIT_SUCCESS;-}--static int pack_index_open(struct pack_file *p)-{- char *idx_name;- int error;-- if (p->index_map.data)- return GIT_SUCCESS;-- idx_name = git__strdup(p->pack_name);- strcpy(idx_name + strlen(idx_name) - STRLEN(".pack"), ".idx");-- error = pack_index_check(idx_name, p);- free(idx_name);-- return error;-}----------/***********************************************************- *- * PACKFILE METHODS- *- ***********************************************************/--static int packfile_sort__cb(const void *a_, const void *b_)-{- struct pack_file *a = *((struct pack_file **)a_);- struct pack_file *b = *((struct pack_file **)b_);- int st;-- /*- * Local packs tend to contain objects specific to our- * variant of the project than remote ones. In addition,- * remote ones could be on a network mounted filesystem.- * Favor local ones for these reasons.- */- st = a->pack_local - b->pack_local;- if (st)- return -st;-- /*- * Younger packs tend to contain more recent objects,- * and more recent objects tend to get accessed more- * often.- */- if (a->mtime < b->mtime)- return 1;- else if (a->mtime == b->mtime)- return 0;-- return -1;-}--static struct pack_file *packfile_alloc(int extra)-{- struct pack_file *p = git__malloc(sizeof(*p) + extra);- memset(p, 0, sizeof(*p));- p->pack_fd = -1;- return p;-}---static void packfile_free(struct pack_backend *backend, struct pack_file *p)-{- assert(p);-- /* clear_delta_base_cache(); */- pack_window_free_all(backend, p);-- if (p->pack_fd != -1)- gitfo_close(p->pack_fd);-- pack_index_free(p);-- free(p->bad_object_sha1);- free(p);-}--static int packfile_open(struct pack_file *p)-{- struct stat st;- struct pack_header hdr;- git_oid sha1;- unsigned char *idx_sha1;-- if (!p->index_map.data && pack_index_open(p) < GIT_SUCCESS)- return GIT_ENOTFOUND;-- /* TODO: open with noatime */- p->pack_fd = gitfo_open(p->pack_name, O_RDONLY);- if (p->pack_fd < 0 || gitfo_fstat(p->pack_fd, &st) < GIT_SUCCESS)- return GIT_EOSERR;-- /* If we created the struct before we had the pack we lack size. */- if (!p->pack_size) {- if (!S_ISREG(st.st_mode))- goto cleanup;- p->pack_size = (off_t)st.st_size;- } else if (p->pack_size != st.st_size)- goto cleanup;--#if 0- /* We leave these file descriptors open with sliding mmap;- * there is no point keeping them open across exec(), though.- */- fd_flag = fcntl(p->pack_fd, F_GETFD, 0);- if (fd_flag < 0)- return error("cannot determine file descriptor flags");-- fd_flag |= FD_CLOEXEC;- if (fcntl(p->pack_fd, F_SETFD, fd_flag) == -1)- return GIT_EOSERR;-#endif-- /* Verify we recognize this pack file format. */- if (gitfo_read(p->pack_fd, &hdr, sizeof(hdr)) < GIT_SUCCESS)- goto cleanup;-- if (hdr.hdr_signature != htonl(PACK_SIGNATURE))- goto cleanup;-- if (!pack_version_ok(hdr.hdr_version))- goto cleanup;-- /* Verify the pack matches its index. */- if (p->num_objects != ntohl(hdr.hdr_entries))- goto cleanup;-- if (gitfo_lseek(p->pack_fd, p->pack_size - GIT_OID_RAWSZ, SEEK_SET) == -1)- goto cleanup;-- if (gitfo_read(p->pack_fd, sha1.id, GIT_OID_RAWSZ) < GIT_SUCCESS)- goto cleanup;-- idx_sha1 = ((unsigned char *)p->index_map.data) + p->index_map.len - 40;-- if (git_oid_cmp(&sha1, (git_oid *)idx_sha1) != 0)- goto cleanup;-- return GIT_SUCCESS; --cleanup:- gitfo_close(p->pack_fd);- p->pack_fd = -1;- return GIT_EPACKCORRUPTED;-}--static int packfile_check(struct pack_file **pack_out, const char *path, int local)-{- struct stat st;- struct pack_file *p;- size_t path_len;-- *pack_out = NULL;- path_len = strlen(path);- p = packfile_alloc(path_len + 2);-- /*- * Make sure a corresponding .pack file exists and that- * the index looks sane.- */- path_len -= STRLEN(".idx");- if (path_len < 1) {- free(p);- return GIT_ENOTFOUND;- }-- memcpy(p->pack_name, path, path_len);-- strcpy(p->pack_name + path_len, ".keep");- if (gitfo_exists(p->pack_name) == GIT_SUCCESS)- p->pack_keep = 1;-- strcpy(p->pack_name + path_len, ".pack");- if (gitfo_stat(p->pack_name, &st) < GIT_SUCCESS || !S_ISREG(st.st_mode)) {- free(p);- return GIT_ENOTFOUND;- }-- /* ok, it looks sane as far as we can check without- * actually mapping the pack file.- */- p->pack_size = (off_t)st.st_size;- p->pack_local = local;- p->mtime = st.st_mtime;-- /* see if we can parse the sha1 oid in the packfile name */- if (path_len < 40 ||- git_oid_mkstr(&p->sha1, path + path_len - GIT_OID_HEXSZ) < GIT_SUCCESS)- memset(&p->sha1, 0x0, GIT_OID_RAWSZ);-- *pack_out = p;- return GIT_SUCCESS;-}--static int packfile_load__cb(void *_data, char *path)-{- struct pack__dirent *data = (struct pack__dirent *)_data;- struct pack_file *pack;- int error;-- if (git__suffixcmp(path, ".idx") != 0)- return GIT_SUCCESS; /* not an index */-- /* FIXME: git.git checks for duplicate packs.- * But that makes no fucking sense. Our dirent is not- * going to generate dupicate entries */-- error = packfile_check(&pack, path, data->is_pack_local);- if (error < GIT_SUCCESS)- return error;-- if (git_vector_insert(&data->backend->packs, pack) < GIT_SUCCESS) {- free(pack);- return GIT_ENOMEM;- }-- return GIT_SUCCESS;-}--static int packfile_load_all(struct pack_backend *backend, const char *odb_path, int local)-{- int error;- char path[GIT_PATH_MAX];- struct pack__dirent data;-- data.backend = backend;- data.is_pack_local = local;-- git__joinpath(path, odb_path, "pack");- if (gitfo_isdir(path) < GIT_SUCCESS)- return GIT_SUCCESS;-- error = gitfo_dirent(path, GIT_PATH_MAX, packfile_load__cb, (void *)&data);- if (error < GIT_SUCCESS)- return error;-- git_vector_sort(&backend->packs);- backend->last_found = git_vector_get(&backend->packs, 0);-- return GIT_SUCCESS;-}---------/***********************************************************- *- * PACKFILE ENTRY SEARCH INTERNALS- *- ***********************************************************/--static off_t nth_packed_object_offset(const struct pack_file *p, uint32_t n)-{- const unsigned char *index = p->index_map.data;- index += 4 * 256;- if (p->index_version == 1) {- return ntohl(*((uint32_t *)(index + 24 * n)));- } else {- uint32_t off;- index += 8 + p->num_objects * (20 + 4);- off = ntohl(*((uint32_t *)(index + 4 * n)));- if (!(off & 0x80000000))- return off;- index += p->num_objects * 4 + (off & 0x7fffffff) * 8;- return (((uint64_t)ntohl(*((uint32_t *)(index + 0)))) << 32) |- ntohl(*((uint32_t *)(index + 4)));- }-}--static int pack_entry_find_offset(- off_t *offset_out,- struct pack_file *p,- const git_oid *oid)-{- const uint32_t *level1_ofs = p->index_map.data;- const unsigned char *index = p->index_map.data;- unsigned hi, lo, stride;-- *offset_out = 0;-- if (index == NULL) {- int error;-- if ((error = pack_index_open(p)) < GIT_SUCCESS)- return error;-- assert(p->index_map.data);-- index = p->index_map.data;- level1_ofs = p->index_map.data;- }-- if (p->index_version > 1) {- level1_ofs += 2;- index += 8;- }-- index += 4 * 256;- hi = ntohl(level1_ofs[(int)oid->id[0]]);- lo = ((oid->id[0] == 0x0) ? 0 : ntohl(level1_ofs[(int)oid->id[0] - 1]));-- if (p->index_version > 1) {- stride = 20;- } else {- stride = 24;- index += 4;- }--#ifdef INDEX_DEBUG_LOOKUP- printf("%02x%02x%02x... lo %u hi %u nr %d\n",- oid->id[0], oid->id[1], oid->id[2], lo, hi, p->num_objects);-#endif--#ifdef GIT2_INDEX_LOOKUP /* TODO: use the advanced lookup method from git.git */-- int pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, oid);- if (pos < 0)- return GIT_ENOTFOUND;-- *offset_out = nth_packed_object_offset(p, pos);- return GIT_SUCCESS;--#else /* use an old and boring binary search */-- do {- unsigned mi = (lo + hi) / 2;- int cmp = memcmp(index + mi * stride, oid->id, GIT_OID_RAWSZ);-- if (!cmp) {- *offset_out = nth_packed_object_offset(p, mi);- return GIT_SUCCESS;- }-- if (cmp > 0)- hi = mi;- else- lo = mi+1;-- } while (lo < hi);-- return GIT_ENOTFOUND;-#endif-}--static int pack_entry_find1(- struct pack_entry *e,- struct pack_file *p,- const git_oid *oid)-{- off_t offset;-- assert(p);-- if (p->num_bad_objects) {- unsigned i;- for (i = 0; i < p->num_bad_objects; i++)- if (git_oid_cmp(oid, &p->bad_object_sha1[i]) == 0)- return GIT_ERROR;- }-- if (pack_entry_find_offset(&offset, p, oid) < GIT_SUCCESS)- return GIT_ENOTFOUND;- - /* we found an entry in the index;- * make sure the packfile backing the index - * still exists on disk */- if (p->pack_fd == -1 && packfile_open(p) < GIT_SUCCESS)- return GIT_EOSERR;-- e->offset = offset;- e->p = p;-- git_oid_cpy(&e->sha1, oid);- return GIT_SUCCESS;-}--static int pack_entry_find(struct pack_entry *e, struct pack_backend *backend, const git_oid *oid)-{- size_t i;-- if (backend->last_found &&- pack_entry_find1(e, backend->last_found, oid) == GIT_SUCCESS)- return GIT_SUCCESS;-- for (i = 0; i < backend->packs.length; ++i) {- struct pack_file *p;-- p = git_vector_get(&backend->packs, i);- if (p == backend->last_found)- continue;-- if (pack_entry_find1(e, p, oid) == GIT_SUCCESS) {- backend->last_found = p;- return GIT_SUCCESS;- }- }-- return GIT_ENOTFOUND;-}-------------/***********************************************************- *- * PACKFILE ENTRY UNPACK INTERNALS- *- ***********************************************************/--static unsigned long packfile_unpack_header1(- size_t *sizep,- git_otype *type, - const unsigned char *buf,- unsigned long len)-{- unsigned shift;- unsigned long size, c;- unsigned long used = 0;-- c = buf[used++];- *type = (c >> 4) & 7;- size = c & 15;- shift = 4;- while (c & 0x80) {- if (len <= used || bitsizeof(long) <= shift)- return 0;-- c = buf[used++];- size += (c & 0x7f) << shift;- shift += 7;- }-- *sizep = (size_t)size;- return used;-}--static int packfile_unpack_header(- size_t *size_p,- git_otype *type_p,- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t *curpos)-{- unsigned char *base;- unsigned int left;- unsigned long used;-- /* pack_window_open() assures us we have [base, base + 20) available- * as a range that we can look at at. (Its actually the hash- * size that is assured.) With our object header encoding- * the maximum deflated object size is 2^137, which is just- * insane, so we know won't exceed what we have been given.- */- base = pack_window_open(backend, p, w_curs, *curpos, &left);- if (base == NULL)- return GIT_ENOMEM;-- used = packfile_unpack_header1(size_p, type_p, base, left);-- if (used == 0)- return GIT_EOBJCORRUPTED;-- *curpos += used;- return GIT_SUCCESS;-}--static int packfile_unpack_compressed(- git_rawobj *obj,- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t curpos,- size_t size,- git_otype type)-{- int st;- z_stream stream;- unsigned char *buffer, *in;-- buffer = git__malloc(size);-- memset(&stream, 0, sizeof(stream));- stream.next_out = buffer;- stream.avail_out = size + 1;-- st = inflateInit(&stream);- if (st != Z_OK) {- free(buffer);- return GIT_EZLIB;- }-- do {- in = pack_window_open(backend, p, w_curs, curpos, &stream.avail_in);- stream.next_in = in;- st = inflate(&stream, Z_FINISH);-- if (!stream.avail_out)- break; /* the payload is larger than it should be */-- curpos += stream.next_in - in;- } while (st == Z_OK || st == Z_BUF_ERROR);-- inflateEnd(&stream);-- if ((st != Z_STREAM_END) || stream.total_out != size) {- free(buffer);- return GIT_EZLIB;- }-- obj->type = type;- obj->len = size;- obj->data = buffer;- return GIT_SUCCESS;-}--static off_t get_delta_base(- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t *curpos,- git_otype type,- off_t delta_obj_offset)-{- unsigned char *base_info = pack_window_open(backend, p, w_curs, *curpos, NULL);- off_t base_offset;-- /* pack_window_open() assured us we have [base_info, base_info + 20)- * as a range that we can look at without walking off the- * end of the mapped window. Its actually the hash size- * that is assured. An OFS_DELTA longer than the hash size- * is stupid, as then a REF_DELTA would be smaller to store.- */- if (type == GIT_OBJ_OFS_DELTA) {- unsigned used = 0;- unsigned char c = base_info[used++];- base_offset = c & 127;- while (c & 128) {- base_offset += 1;- if (!base_offset || MSB(base_offset, 7))- return 0; /* overflow */- c = base_info[used++];- base_offset = (base_offset << 7) + (c & 127);- }- base_offset = delta_obj_offset - base_offset;- if (base_offset <= 0 || base_offset >= delta_obj_offset)- return 0; /* out of bound */- *curpos += used;- } else if (type == GIT_OBJ_REF_DELTA) {- /* The base entry _must_ be in the same pack */- if (pack_entry_find_offset(&base_offset, p, (git_oid *)base_info) < GIT_SUCCESS)- return GIT_EPACKCORRUPTED;- *curpos += 20;- } else- return 0;-- return base_offset;-}--static int packfile_unpack_delta(- git_rawobj *obj,- struct pack_backend *backend,- struct pack_file *p,- struct pack_window **w_curs,- off_t curpos,- size_t delta_size,- git_otype delta_type,- off_t obj_offset)-{- off_t base_offset;- git_rawobj base, delta;- int error;-- base_offset = get_delta_base(backend, p, w_curs, &curpos, delta_type, obj_offset);- if (base_offset == 0)- return GIT_EOBJCORRUPTED;-- pack_window_close(w_curs);- error = packfile_unpack(&base, backend, p, base_offset);-- /* TODO: git.git tries to load the base from other packfiles- * or loose objects */- if (error < GIT_SUCCESS)- return error;-- error = packfile_unpack_compressed(&delta, backend, p, w_curs, curpos, delta_size, delta_type);- if (error < GIT_SUCCESS) {- git_rawobj_close(&base);- return error;- }-- obj->type = base.type;- error = git__delta_apply(obj,- base.data, base.len,- delta.data, delta.len);-- git_rawobj_close(&base);- git_rawobj_close(&delta);-- /* TODO: we might want to cache this shit. eventually */- //add_delta_base_cache(p, base_offset, base, base_size, *type);- return error;-}--static int packfile_unpack(- git_rawobj *obj,- struct pack_backend *backend,- struct pack_file *p,- off_t obj_offset)-{- struct pack_window *w_curs = NULL;- off_t curpos = obj_offset;- int error;-- size_t size;- git_otype type;-- /* - * TODO: optionally check the CRC on the packfile- */-- obj->data = NULL;- obj->len = 0;- obj->type = GIT_OBJ_BAD;-- error = packfile_unpack_header(&size, &type, backend, p, &w_curs, &curpos);- if (error < GIT_SUCCESS)- return error;-- switch (type) {- case GIT_OBJ_OFS_DELTA:- case GIT_OBJ_REF_DELTA:- error = packfile_unpack_delta(- obj, backend, p, &w_curs, curpos,- size, type, obj_offset);- break;-- case GIT_OBJ_COMMIT:- case GIT_OBJ_TREE:- case GIT_OBJ_BLOB:- case GIT_OBJ_TAG:- error = packfile_unpack_compressed(- obj, backend, p, &w_curs, curpos,- size, type);- break;-- default:- error = GIT_EOBJCORRUPTED;- break;- }-- pack_window_close(&w_curs);- return error;-}------/***********************************************************- *- * PACKED BACKEND PUBLIC API- *- * Implement the git_odb_backend API calls- *- ***********************************************************/--/*-int pack_backend__read_header(git_rawobj *obj, git_odb_backend *backend, const git_oid *oid)-{- pack_location location;-- assert(obj && backend && oid);-- if (locate_packfile(&location, (struct pack_backend *)backend, oid) < 0)- return GIT_ENOTFOUND;-- return read_header_packed(obj, &location);-}-*/--int pack_backend__read(git_rawobj *obj, git_odb_backend *backend, const git_oid *oid)-{- struct pack_entry e;- int error;-- if ((error = pack_entry_find(&e, (struct pack_backend *)backend, oid)) < GIT_SUCCESS)- return error;-- return packfile_unpack(obj, (struct pack_backend *)backend, e.p, e.offset);-}--int pack_backend__exists(git_odb_backend *backend, const git_oid *oid)-{- struct pack_entry e;- return pack_entry_find(&e, (struct pack_backend *)backend, oid) == GIT_SUCCESS;-}--void pack_backend__free(git_odb_backend *_backend)-{- struct pack_backend *backend;- size_t i;-- assert(_backend);-- backend = (struct pack_backend *)_backend;-- for (i = 0; i < backend->packs.length; ++i) {- struct pack_file *p = git_vector_get(&backend->packs, i);- packfile_free(backend, p);- }-- git_vector_free(&backend->packs);- free(backend);-}--int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir)-{- int error;- struct pack_backend *backend;-- backend = git__calloc(1, sizeof(struct pack_backend));- if (backend == NULL)- return GIT_ENOMEM;-- if (git_vector_init(&backend->packs, 8, packfile_sort__cb) < GIT_SUCCESS) {- free(backend);- return GIT_ENOMEM;- }-- backend->window_size = DEFAULT_WINDOW_SIZE;- backend->mapped_limit = DEFAULT_MAPPED_LIMIT;-- error = packfile_load_all(backend, objects_dir, 1);- if (error < GIT_SUCCESS) {- pack_backend__free((git_odb_backend *)backend);- return error;- }-- backend->parent.read = &pack_backend__read;- backend->parent.read_header = NULL;- backend->parent.write = NULL;- backend->parent.exists = &pack_backend__exists;- backend->parent.free = &pack_backend__free;-- *backend_out = (git_odb_backend *)backend;- return GIT_SUCCESS;-}
− libgit2/src/oid.c
@@ -1,346 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "git2/oid.h"-#include "repository.h"-#include <string.h>-#include <limits.h>--static signed char from_hex[] = {--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 00 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20 */- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 30 */--1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 40 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 50 */--1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 60 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 70 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 80 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 90 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a0 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* b0 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* c0 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* d0 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* e0 */--1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* f0 */-};-static char to_hex[] = "0123456789abcdef";--int git_oid_mkstr(git_oid *out, const char *str)-{- size_t p;- for (p = 0; p < sizeof(out->id); p++, str += 2) {- int v = (from_hex[(unsigned char)str[0]] << 4)- | from_hex[(unsigned char)str[1]];- if (v < 0)- return GIT_ENOTOID;- out->id[p] = (unsigned char)v;- }- return GIT_SUCCESS;-}--GIT_INLINE(char) *fmt_one(char *str, unsigned int val)-{- *str++ = to_hex[val >> 4];- *str++ = to_hex[val & 0xf];- return str;-}--void git_oid_fmt(char *str, const git_oid *oid)-{- size_t i;-- for (i = 0; i < sizeof(oid->id); i++)- str = fmt_one(str, oid->id[i]);-}--void git_oid_pathfmt(char *str, const git_oid *oid)-{- size_t i;-- str = fmt_one(str, oid->id[0]);- *str++ = '/';- for (i = 1; i < sizeof(oid->id); i++)- str = fmt_one(str, oid->id[i]);-}--char *git_oid_allocfmt(const git_oid *oid)-{- char *str = git__malloc(GIT_OID_HEXSZ + 1);- if (!str)- return NULL;- git_oid_fmt(str, oid);- str[GIT_OID_HEXSZ] = '\0';- return str;-}--char *git_oid_to_string(char *out, size_t n, const git_oid *oid)-{- char str[GIT_OID_HEXSZ];-- if (!out || n == 0 || !oid)- return "";-- n--; /* allow room for terminating NUL */-- if (n > 0) {- git_oid_fmt(str, oid);- if (n > GIT_OID_HEXSZ)- n = GIT_OID_HEXSZ;- memcpy(out, str, n);- }-- out[n] = '\0';-- return out;-}--int git__parse_oid(git_oid *oid, char **buffer_out,- const char *buffer_end, const char *header)-{- const size_t sha_len = GIT_OID_HEXSZ;- const size_t header_len = strlen(header);-- char *buffer = *buffer_out;-- if (buffer + (header_len + sha_len + 1) > buffer_end)- return GIT_EOBJCORRUPTED;-- if (memcmp(buffer, header, header_len) != 0)- return GIT_EOBJCORRUPTED;-- if (buffer[header_len + sha_len] != '\n')- return GIT_EOBJCORRUPTED;-- if (git_oid_mkstr(oid, buffer + header_len) < GIT_SUCCESS)- return GIT_EOBJCORRUPTED;-- *buffer_out = buffer + (header_len + sha_len + 1);-- return GIT_SUCCESS;-}--int git__write_oid(git_odb_source *src, const char *header, const git_oid *oid)-{- char hex_oid[41];-- git_oid_fmt(hex_oid, oid);- hex_oid[40] = 0;-- return git__source_printf(src, "%s %s\n", header, hex_oid);-}--void git_oid_mkraw(git_oid *out, const unsigned char *raw)-{- memcpy(out->id, raw, sizeof(out->id));-}--void git_oid_cpy(git_oid *out, const git_oid *src)-{- memcpy(out->id, src->id, sizeof(out->id));-}--int git_oid_cmp(const git_oid *a, const git_oid *b)-{- return memcmp(a->id, b->id, sizeof(a->id));-}---typedef short node_index;--typedef union {- const char *tail;- node_index children[16];-} trie_node;--struct git_oid_shorten {- trie_node *nodes;- size_t node_count, size;- int min_length, full;-};--static int resize_trie(git_oid_shorten *self, size_t new_size)-{- self->nodes = realloc(self->nodes, new_size * sizeof(trie_node));- if (self->nodes == NULL)- return GIT_ENOMEM;-- if (new_size > self->size) {- memset(&self->nodes[self->size], 0x0, (new_size - self->size) * sizeof(trie_node));- }-- self->size = new_size;- return GIT_SUCCESS;-}--static trie_node *push_leaf(git_oid_shorten *os, node_index idx, int push_at, const char *oid)-{- trie_node *node, *leaf;- node_index idx_leaf;-- if (os->node_count >= os->size) {- if (resize_trie(os, os->size * 2) < GIT_SUCCESS)- return NULL;- }-- idx_leaf = (node_index)os->node_count++;-- if (os->node_count == SHRT_MAX)- os->full = 1;-- node = &os->nodes[idx];- node->children[push_at] = -idx_leaf;-- leaf = &os->nodes[idx_leaf];- leaf->tail = oid;-- return node;-}--git_oid_shorten *git_oid_shorten_new(size_t min_length)-{- git_oid_shorten *os;-- os = git__malloc(sizeof(git_oid_shorten));- if (os == NULL)- return NULL;-- memset(os, 0x0, sizeof(git_oid_shorten));-- if (resize_trie(os, 16) < GIT_SUCCESS) {- free(os);- return NULL;- }-- os->node_count = 1;- os->min_length = min_length;-- return os;-}--void git_oid_shorten_free(git_oid_shorten *os)-{- free(os->nodes);- free(os);-}---/*- * What wizardry is this?- *- * This is just a memory-optimized trie: basically a very fancy- * 16-ary tree, which is used to store the prefixes of the OID- * strings.- *- * Read more: http://en.wikipedia.org/wiki/Trie- *- * Magic that happens in this method:- *- * - Each node in the trie is an union, so it can work both as- * a normal node, or as a leaf.- *- * - Each normal node points to 16 children (one for each possible- * character in the oid). This is *not* stored in an array of- * pointers, because in a 64-bit arch this would be sucking - * 16*sizeof(void*) = 128 bytes of memory per node, which is fucking- * insane. What we do is store Node Indexes, and use these indexes- * to look up each node in the om->index array. These indexes are- * signed shorts, so this limits the amount of unique OIDs that- * fit in the structure to about 20000 (assuming a more or less uniform- * distribution).- *- * - All the nodes in om->index array are stored contiguously in- * memory, and each of them is 32 bytes, so we fit 2x nodes per- * cache line. Convenient for speed.- *- * - To differentiate the leafs from the normal nodes, we store all- * the indexes towards a leaf as a negative index (indexes to normal- * nodes are positives). When we find that one of the children for- * a node has a negative value, that means it's going to be a leaf.- * This reduces the amount of indexes we have by two, but also reduces- * the size of each node by 1-4 bytes (the amount we would need to- * add a `is_leaf` field): this is good because it allows the nodes- * to fit cleanly in cache lines.- *- * - Once we reach an empty children, instead of continuing to insert- * new nodes for each remaining character of the OID, we store a pointer- * to the tail in the leaf; if the leaf is reached again, we turn it- * into a normal node and use the tail to create a new leaf.- *- * This is a pretty good balance between performance and memory usage.- */-int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid)-{- int i, is_leaf;- node_index idx;-- if (os->full)- return GIT_ENOMEM;-- idx = 0;- is_leaf = 0;-- for (i = 0; i < GIT_OID_HEXSZ; ++i) {- int c = from_hex[(int)text_oid[i]];- trie_node *node;-- if (c == -1)- return GIT_ENOTOID;-- node = &os->nodes[idx];-- if (is_leaf) {- const char *tail;-- tail = node->tail;- node->tail = NULL;-- node = push_leaf(os, idx, from_hex[(int)tail[0]], &tail[1]);- if (node == NULL)- return GIT_ENOMEM;- }-- if (node->children[c] == 0) {- if (push_leaf(os, idx, c, &text_oid[i + 1]) == NULL)- return GIT_ENOMEM;- break;- }-- idx = node->children[c];- is_leaf = 0;-- if (idx < 0) {- node->children[c] = idx = -idx;- is_leaf = 1;- }- }-- if (++i > os->min_length)- os->min_length = i;-- return os->min_length;-}-
− libgit2/src/pqueue.c
@@ -1,157 +0,0 @@-/*- * BORING COPYRIGHT NOTICE:- *- * This file is a heavily modified version of the priority queue found- * in the Apache project and the libpqueue library.- *- * https://github.com/vy/libpqueue- *- * These are the original authors:- *- * Copyright 2010 Volkan Yazıcı <volkan.yazici@gmail.com>- * Copyright 2006-2010 The Apache Software Foundation- *- * This file is licensed under the Apache 2.0 license, which - * supposedly makes it compatible with the GPLv2 that libgit2 uses.- *- * Check the Apache license at:- *- * http://www.apache.org/licenses/LICENSE-2.0- *- * So much licensing trouble for a binary heap. Oh well.- */--#include "common.h"-#include "pqueue.h"--#define left(i) ((i) << 1)-#define right(i) (((i) << 1) + 1)-#define parent(i) ((i) >> 1)--int git_pqueue_init(git_pqueue *q, size_t n, git_pqueue_cmp cmppri)-{- assert(q);-- /* Need to allocate n+1 elements since element 0 isn't used. */- if ((q->d = malloc((n + 1) * sizeof(void *))) == NULL)- return GIT_ENOMEM;-- q->size = 1;- q->avail = q->step = (n + 1); /* see comment above about n+1 */- q->cmppri = cmppri;-- return GIT_SUCCESS;-}---void git_pqueue_free(git_pqueue *q)-{- free(q->d);- q->d = NULL;-}--void git_pqueue_clear(git_pqueue *q)-{- q->size = 1;-}--size_t git_pqueue_size(git_pqueue *q)-{- /* queue element 0 exists but doesn't count since it isn't used. */- return (q->size - 1);-}---static void bubble_up(git_pqueue *q, size_t i)-{- size_t parent_node;- void *moving_node = q->d[i];-- for (parent_node = parent(i);- ((i > 1) && q->cmppri(q->d[parent_node], moving_node));- i = parent_node, parent_node = parent(i)) {- q->d[i] = q->d[parent_node];- }-- q->d[i] = moving_node;-}---static size_t maxchild(git_pqueue *q, size_t i)-{- size_t child_node = left(i);-- if (child_node >= q->size)- return 0;-- if ((child_node + 1) < q->size &&- q->cmppri(q->d[child_node], q->d[child_node + 1]))- child_node++; /* use right child instead of left */-- return child_node;-}---static void percolate_down(git_pqueue *q, size_t i)-{- size_t child_node;- void *moving_node = q->d[i];-- while ((child_node = maxchild(q, i)) != 0 &&- q->cmppri(moving_node, q->d[child_node])) {- q->d[i] = q->d[child_node];- i = child_node;- }-- q->d[i] = moving_node;-}---int git_pqueue_insert(git_pqueue *q, void *d)-{- void *tmp;- size_t i;- size_t newsize;-- if (!q) return 1;-- /* allocate more memory if necessary */- if (q->size >= q->avail) {- newsize = q->size + q->step;- if ((tmp = realloc(q->d, sizeof(void *) * newsize)) == NULL)- return GIT_ENOMEM;-- q->d = tmp;- q->avail = newsize;- }-- /* insert item */- i = q->size++;- q->d[i] = d;- bubble_up(q, i);-- return GIT_SUCCESS;-}---void *git_pqueue_pop(git_pqueue *q)-{- void *head;-- if (!q || q->size == 1)- return NULL;-- head = q->d[1];- q->d[1] = q->d[--q->size];- percolate_down(q, 1);-- return head;-}---void *git_pqueue_peek(git_pqueue *q)-{- if (!q || q->size == 1)- return NULL;- return q->d[1];-}
− libgit2/src/pqueue.h
@@ -1,97 +0,0 @@-/*- * BORING COPYRIGHT NOTICE:- *- * This file is a heavily modified version of the priority queue found- * in the Apache project and the libpqueue library.- *- * https://github.com/vy/libpqueue- *- * These are the original authors:- *- * Copyright 2010 Volkan Yazıcı <volkan.yazici@gmail.com>- * Copyright 2006-2010 The Apache Software Foundation- *- * This file is licensed under the Apache 2.0 license, which - * supposedly makes it compatible with the GPLv2 that libgit2 uses.- *- * Check the Apache license at:- *- * http://www.apache.org/licenses/LICENSE-2.0- *- * So much licensing trouble for a binary heap. Oh well.- */--#ifndef INCLUDE_pqueue_h__-#define INCLUDE_pqueue_h__--/** callback functions to get/set/compare the priority of an element */-typedef int (*git_pqueue_cmp)(void *a, void *b);--/** the priority queue handle */-typedef struct {- size_t size, avail, step;- git_pqueue_cmp cmppri;- void **d;-} git_pqueue;---/**- * initialize the queue- *- * @param n the initial estimate of the number of queue items for which memory- * should be preallocated- * @param cmppri the callback function to compare two nodes of the queue- *- * @Return the handle or NULL for insufficent memory- */-int git_pqueue_init(git_pqueue *q, size_t n, git_pqueue_cmp cmppri);---/**- * free all memory used by the queue- * @param q the queue- */-void git_pqueue_free(git_pqueue *q);--/**- * clear all the elements in the queue- * @param q the queue- */-void git_pqueue_clear(git_pqueue *q);--/**- * return the size of the queue.- * @param q the queue- */-size_t git_pqueue_size(git_pqueue *q);---/**- * insert an item into the queue.- * @param q the queue- * @param d the item- * @return 0 on success- */-int git_pqueue_insert(git_pqueue *q, void *d);---/**- * pop the highest-ranking item from the queue.- * @param p the queue- * @param d where to copy the entry to- * @return NULL on error, otherwise the entry- */-void *git_pqueue_pop(git_pqueue *q);---/**- * access highest-ranking item without removing it.- * @param q the queue- * @param d the entry- * @return NULL on error, otherwise the entry- */-void *git_pqueue_peek(git_pqueue *q);--#endif /* PQUEUE_H */-/** @} */-
− libgit2/src/refs.c
@@ -1,1594 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "refs.h"-#include "hash.h"-#include "repository.h"-#include "fileops.h"--#include <git2/tag.h>-#include <git2/object.h>--#define MAX_NESTING_LEVEL 5--typedef struct {- git_reference ref;- git_oid oid;- git_oid peel_target;-} reference_oid;--typedef struct {- git_reference ref;- char *target;-} reference_symbolic;--static const int default_table_size = 32;--static uint32_t reftable_hash(const void *key, int hash_id)-{- static uint32_t hash_seeds[GIT_HASHTABLE_HASHES] = {- 2147483647,- 0x5d20bb23,- 0x7daaab3c - };-- return git__hash(key, strlen((const char *)key), hash_seeds[hash_id]);-}--static void reference_free(git_reference *reference);-static int reference_create(git_reference **ref_out, git_repository *repo, const char *name, git_rtype type);-static int reference_read(gitfo_buf *file_content, time_t *mtime, const char *repo_path, const char *ref_name);--/* loose refs */-static int loose_parse_symbolic(git_reference *ref, gitfo_buf *file_content);-static int loose_parse_oid(git_reference *ref, gitfo_buf *file_content);-static int loose_lookup(git_reference **ref_out, git_repository *repo, const char *name, int skip_symbolic);-static int loose_write(git_reference *ref);-static int loose_update(git_reference *ref);--/* packed refs */-static int packed_parse_peel(reference_oid *tag_ref, const char **buffer_out, const char *buffer_end);-static int packed_parse_oid(reference_oid **ref_out, git_repository *repo, const char **buffer_out, const char *buffer_end);-static int packed_load(git_repository *repo);-static int packed_loadloose(git_repository *repository);-static int packed_write_ref(reference_oid *ref, git_filebuf *file);-static int packed_find_peel(reference_oid *ref);-static int packed_remove_loose(git_repository *repo, git_vector *packing_list);-static int packed_sort(const void *a, const void *b);-static int packed_write(git_repository *repo);--/* name normalization */-static int check_valid_ref_char(char ch);-static int normalize_name(char *buffer_out, const char *name, int is_oid_ref);--/*****************************************- * Internal methods - Constructor/destructor- *****************************************/-static void reference_free(git_reference *reference)-{- if (reference == NULL)- return;-- if (reference->name)- free(reference->name);-- if (reference->type == GIT_REF_SYMBOLIC)- free(((reference_symbolic *)reference)->target);-- free(reference);-}--static int reference_create(- git_reference **ref_out,- git_repository *repo,- const char *name,- git_rtype type)-{- char normalized[MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH];- int error = GIT_SUCCESS, size;- git_reference *reference = NULL;-- assert(ref_out && repo && name);-- if (type == GIT_REF_SYMBOLIC)- size = sizeof(reference_symbolic);- else if (type == GIT_REF_OID)- size = sizeof(reference_oid);- else- return GIT_EINVALIDREFSTATE;-- reference = git__malloc(size);- if (reference == NULL)- return GIT_ENOMEM;-- memset(reference, 0x0, size);- reference->owner = repo;- reference->type = type;-- error = normalize_name(normalized, name, (type & GIT_REF_OID));- if (error < GIT_SUCCESS)- goto cleanup;-- reference->name = git__strdup(normalized);- if (reference->name == NULL) {- error = GIT_ENOMEM;- goto cleanup;- }-- *ref_out = reference;-- return error;--cleanup:- reference_free(reference);- return error;-}--static int reference_read(gitfo_buf *file_content, time_t *mtime, const char *repo_path, const char *ref_name)-{- struct stat st;- char path[GIT_PATH_MAX];-- /* Determine the full path of the file */- git__joinpath(path, repo_path, ref_name);-- if (gitfo_stat(path, &st) < 0)- return GIT_ENOTFOUND;-- if (S_ISDIR(st.st_mode))- return GIT_EOBJCORRUPTED;-- if (mtime)- *mtime = st.st_mtime;-- if (file_content)- return gitfo_read_file(file_content, path);-- return GIT_SUCCESS;-}-----/*****************************************- * Internal methods - Loose references- *****************************************/-static int loose_update(git_reference *ref)-{- int error;- time_t ref_time;- gitfo_buf ref_file = GITFO_BUF_INIT;-- if (ref->type & GIT_REF_PACKED)- return packed_load(ref->owner);-- error = reference_read(NULL, &ref_time, ref->owner->path_repository, ref->name);- if (error < GIT_SUCCESS)- goto cleanup;-- if (ref_time == ref->mtime)- return GIT_SUCCESS;-- error = reference_read(&ref_file, &ref->mtime, ref->owner->path_repository, ref->name);- if (error < GIT_SUCCESS)- goto cleanup;-- if (ref->type == GIT_REF_SYMBOLIC)- error = loose_parse_symbolic(ref, &ref_file);- else if (ref->type == GIT_REF_OID)- error = loose_parse_oid(ref, &ref_file);- else- error = GIT_EINVALIDREFSTATE;-- gitfo_free_buf(&ref_file);--cleanup:- if (error != GIT_SUCCESS) {- reference_free(ref);- git_hashtable_remove(ref->owner->references.loose_cache, ref->name);- }-- return error;-}--static int loose_parse_symbolic(git_reference *ref, gitfo_buf *file_content)-{- const unsigned int header_len = strlen(GIT_SYMREF);- const char *refname_start;- char *eol;- reference_symbolic *ref_sym;-- refname_start = (const char *)file_content->data;- ref_sym = (reference_symbolic *)ref;-- if (file_content->len < (header_len + 1))- return GIT_EREFCORRUPTED;-- /* - * Assume we have already checked for the header- * before calling this function - */-- refname_start += header_len;-- free(ref_sym->target);- ref_sym->target = git__strdup(refname_start);- if (ref_sym->target == NULL)- return GIT_ENOMEM;-- /* remove newline at the end of file */- eol = strchr(ref_sym->target, '\n');- if (eol == NULL)- return GIT_EREFCORRUPTED;-- *eol = '\0';- if (eol[-1] == '\r')- eol[-1] = '\0';-- return GIT_SUCCESS;-}--static int loose_parse_oid(git_reference *ref, gitfo_buf *file_content)-{- reference_oid *ref_oid;- char *buffer;-- buffer = (char *)file_content->data;- ref_oid = (reference_oid *)ref;-- /* File format: 40 chars (OID) + newline */- if (file_content->len < GIT_OID_HEXSZ + 1)- return GIT_EREFCORRUPTED;-- if (git_oid_mkstr(&ref_oid->oid, buffer) < GIT_SUCCESS)- return GIT_EREFCORRUPTED;-- buffer = buffer + GIT_OID_HEXSZ;- if (*buffer == '\r')- buffer++;-- if (*buffer != '\n')- return GIT_EREFCORRUPTED;-- return GIT_SUCCESS;-}---static git_rtype loose_guess_rtype(const char *full_path)-{- gitfo_buf ref_file = GITFO_BUF_INIT;- git_rtype type;-- type = GIT_REF_INVALID;-- if (gitfo_read_file(&ref_file, full_path) == GIT_SUCCESS) {- if (git__prefixcmp((const char *)(ref_file.data), GIT_SYMREF) == 0)- type = GIT_REF_SYMBOLIC;- else- type = GIT_REF_OID;- }-- gitfo_free_buf(&ref_file);- return type;-}--static int loose_lookup(- git_reference **ref_out, - git_repository *repo, - const char *name,- int skip_symbolic)-{- int error = GIT_SUCCESS;- gitfo_buf ref_file = GITFO_BUF_INIT;- git_reference *ref = NULL;- time_t ref_time;-- *ref_out = NULL;-- error = reference_read(&ref_file, &ref_time, repo->path_repository, name);- if (error < GIT_SUCCESS)- goto cleanup;-- if (git__prefixcmp((const char *)(ref_file.data), GIT_SYMREF) == 0) {- if (skip_symbolic)- return GIT_SUCCESS;-- error = reference_create(&ref, repo, name, GIT_REF_SYMBOLIC);- if (error < GIT_SUCCESS)- goto cleanup;-- error = loose_parse_symbolic(ref, &ref_file);- } else {- error = reference_create(&ref, repo, name, GIT_REF_OID);- if (error < GIT_SUCCESS)- goto cleanup;-- error = loose_parse_oid(ref, &ref_file);- }-- if (error < GIT_SUCCESS)- goto cleanup;-- ref->mtime = ref_time;- *ref_out = ref;- return GIT_SUCCESS;--cleanup:- gitfo_free_buf(&ref_file);- reference_free(ref);- return error;-}--static int loose_write(git_reference *ref)-{- git_filebuf file;- char ref_path[GIT_PATH_MAX];- int error, contents_size;- char *ref_contents = NULL;- struct stat st;-- assert((ref->type & GIT_REF_PACKED) == 0);-- git__joinpath(ref_path, ref->owner->path_repository, ref->name);-- if ((error = git_filebuf_open(&file, ref_path, GIT_FILEBUF_FORCE)) < GIT_SUCCESS)- return error;-- if (ref->type & GIT_REF_OID) {- reference_oid *ref_oid = (reference_oid *)ref;-- contents_size = GIT_OID_HEXSZ + 1;- ref_contents = git__malloc(contents_size);- if (ref_contents == NULL) {- error = GIT_ENOMEM;- goto unlock;- }-- git_oid_fmt(ref_contents, &ref_oid->oid);-- } else if (ref->type & GIT_REF_SYMBOLIC) { /* GIT_REF_SYMBOLIC */- reference_symbolic *ref_sym = (reference_symbolic *)ref;-- contents_size = strlen(GIT_SYMREF) + strlen(ref_sym->target) + 1;- ref_contents = git__malloc(contents_size);- if (ref_contents == NULL) {- error = GIT_ENOMEM;- goto unlock;- }-- strcpy(ref_contents, GIT_SYMREF);- strcat(ref_contents, ref_sym->target);- } else {- error = GIT_EINVALIDREFSTATE;- goto unlock;- }-- /* TODO: win32 carriage return when writing references in Windows? */- ref_contents[contents_size - 1] = '\n';-- if ((error = git_filebuf_write(&file, ref_contents, contents_size)) < GIT_SUCCESS)- goto unlock;-- error = git_filebuf_commit(&file);-- if (gitfo_stat(ref_path, &st) == GIT_SUCCESS)- ref->mtime = st.st_mtime;-- free(ref_contents);- return error;--unlock:- git_filebuf_cleanup(&file);- free(ref_contents);- return error;-}-------/*****************************************- * Internal methods - Packed references- *****************************************/--static int packed_parse_peel(- reference_oid *tag_ref,- const char **buffer_out, - const char *buffer_end)-{- const char *buffer = *buffer_out + 1;-- assert(buffer[-1] == '^');-- /* Ensure it's not the first entry of the file */- if (tag_ref == NULL)- return GIT_EPACKEDREFSCORRUPTED;-- /* Ensure reference is a tag */- if (git__prefixcmp(tag_ref->ref.name, GIT_REFS_TAGS_DIR) != 0)- return GIT_EPACKEDREFSCORRUPTED;-- if (buffer + GIT_OID_HEXSZ >= buffer_end)- return GIT_EPACKEDREFSCORRUPTED;-- /* Is this a valid object id? */- if (git_oid_mkstr(&tag_ref->peel_target, buffer) < GIT_SUCCESS)- return GIT_EPACKEDREFSCORRUPTED;-- buffer = buffer + GIT_OID_HEXSZ;- if (*buffer == '\r')- buffer++;-- if (*buffer != '\n')- return GIT_EPACKEDREFSCORRUPTED;-- *buffer_out = buffer + 1;- tag_ref->ref.type |= GIT_REF_HAS_PEEL;-- return GIT_SUCCESS;-}--static int packed_parse_oid(- reference_oid **ref_out,- git_repository *repo,- const char **buffer_out,- const char *buffer_end)-{- reference_oid *ref = NULL;-- const char *buffer = *buffer_out;- const char *refname_begin, *refname_end;-- int error = GIT_SUCCESS;- int refname_len;- char refname[MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH];- git_oid id;-- refname_begin = (buffer + GIT_OID_HEXSZ + 1);- if (refname_begin >= buffer_end ||- refname_begin[-1] != ' ') {- error = GIT_EPACKEDREFSCORRUPTED;- goto cleanup;- }-- /* Is this a valid object id? */- if ((error = git_oid_mkstr(&id, buffer)) < GIT_SUCCESS)- goto cleanup;-- refname_end = memchr(refname_begin, '\n', buffer_end - refname_begin);- if (refname_end == NULL) {- error = GIT_EPACKEDREFSCORRUPTED;- goto cleanup;- }-- refname_len = refname_end - refname_begin;-- memcpy(refname, refname_begin, refname_len);- refname[refname_len] = 0;-- if (refname[refname_len - 1] == '\r')- refname[refname_len - 1] = 0;-- error = reference_create((git_reference **)&ref, repo, refname, GIT_REF_OID);- if (error < GIT_SUCCESS)- goto cleanup;-- git_oid_cpy(&ref->oid, &id);- ref->ref.type |= GIT_REF_PACKED;-- *ref_out = ref;- *buffer_out = refname_end + 1;-- return GIT_SUCCESS;--cleanup:- reference_free((git_reference *)ref);- return error;-}--static int packed_load(git_repository *repo)-{- int error = GIT_SUCCESS;- gitfo_buf packfile = GITFO_BUF_INIT;- const char *buffer_start, *buffer_end;- git_refcache *ref_cache = &repo->references;-- /* already loaded */- if (repo->references.packfile != NULL) {- time_t packed_time;-- /* check if we can read the time of the index;- * if we can read it and it matches the time of the- * index we had previously loaded, we don't need to do- * anything else.- *- * if we cannot load the time (e.g. the packfile- * has disappeared) or the time is different, we- * have to reload the packfile */-- if (!reference_read(NULL, &packed_time, repo->path_repository, GIT_PACKEDREFS_FILE) &&- packed_time == ref_cache->packfile_time)- return GIT_SUCCESS;-- git_hashtable_clear(repo->references.packfile);- } else {- ref_cache->packfile = git_hashtable_alloc(- default_table_size, - reftable_hash,- (git_hash_keyeq_ptr)strcmp);-- if (ref_cache->packfile == NULL)- return GIT_ENOMEM;- }-- /* read the packfile from disk;- * store its modification time to check for future reloads */- error = reference_read(- &packfile,- &ref_cache->packfile_time,- repo->path_repository,- GIT_PACKEDREFS_FILE);-- /* there is no packfile on disk; that's ok */- if (error == GIT_ENOTFOUND)- return GIT_SUCCESS;-- if (error < GIT_SUCCESS)- goto cleanup;-- buffer_start = (const char *)packfile.data;- buffer_end = (const char *)(buffer_start) + packfile.len;-- while (buffer_start < buffer_end && buffer_start[0] == '#') {- buffer_start = strchr(buffer_start, '\n');- if (buffer_start == NULL) {- error = GIT_EPACKEDREFSCORRUPTED;- goto cleanup;- }- buffer_start++;- }-- while (buffer_start < buffer_end) {- reference_oid *ref = NULL;-- error = packed_parse_oid(&ref, repo, &buffer_start, buffer_end);- if (error < GIT_SUCCESS)- goto cleanup;-- if (buffer_start[0] == '^') {- error = packed_parse_peel(ref, &buffer_start, buffer_end);- if (error < GIT_SUCCESS)- goto cleanup;- }-- error = git_hashtable_insert(ref_cache->packfile, ref->ref.name, ref);- if (error < GIT_SUCCESS) {- reference_free((git_reference *)ref);- goto cleanup;- }- }-- gitfo_free_buf(&packfile);- return GIT_SUCCESS;--cleanup:- git_hashtable_free(ref_cache->packfile);- ref_cache->packfile = NULL;- gitfo_free_buf(&packfile);- return error;-}-----struct dirent_list_data {- git_vector ref_list;- git_repository *repo;- size_t repo_path_len;- unsigned int list_flags;-};--static int _dirent_loose_listall(void *_data, char *full_path)-{- struct dirent_list_data *data = (struct dirent_list_data *)_data;- char *file_path = full_path + data->repo_path_len;-- if (gitfo_isdir(full_path) == GIT_SUCCESS)- return gitfo_dirent(full_path, GIT_PATH_MAX, _dirent_loose_listall, _data);-- /* do not add twice a reference that exists already in the packfile */- if ((data->list_flags & GIT_REF_PACKED) != 0 &&- git_hashtable_lookup(data->repo->references.packfile, file_path) != NULL)- return GIT_SUCCESS;-- if ((data->list_flags & loose_guess_rtype(full_path)) == 0)- return GIT_SUCCESS; /* we are filtering out this reference */-- return git_vector_insert(&data->ref_list, git__strdup(file_path));-}--static int _dirent_loose_load(void *data, char *full_path)-{- git_repository *repository = (git_repository *)data;- git_reference *reference, *old_ref;- char *file_path;- int error;-- if (gitfo_isdir(full_path) == GIT_SUCCESS)- return gitfo_dirent(full_path, GIT_PATH_MAX, _dirent_loose_load, repository);-- file_path = full_path + strlen(repository->path_repository);- error = loose_lookup(&reference, repository, file_path, 1);- if (error == GIT_SUCCESS && reference != NULL) {- reference->type |= GIT_REF_PACKED;-- if (git_hashtable_insert2(repository->references.packfile, reference->name, reference, (void **)&old_ref) < GIT_SUCCESS) {- reference_free(reference);- return GIT_ENOMEM;- }-- if (old_ref != NULL)- reference_free(old_ref);- }-- return error;-}--/*- * Load all the loose references from the repository- * into the in-memory Packfile, and build a vector with- * all the references so it can be written back to- * disk.- */-static int packed_loadloose(git_repository *repository)-{- char refs_path[GIT_PATH_MAX];-- /* the packfile must have been previously loaded! */- assert(repository->references.packfile);-- git__joinpath(refs_path, repository->path_repository, GIT_REFS_DIR);-- /* Remove any loose references from the cache */- {- const void *_unused;- git_reference *reference;-- GIT_HASHTABLE_FOREACH(repository->references.loose_cache, _unused, reference,- reference_free(reference);- );- }-- git_hashtable_clear(repository->references.loose_cache);-- /*- * Load all the loose files from disk into the Packfile table.- * This will overwrite any old packed entries with their- * updated loose versions - */- return gitfo_dirent(refs_path, GIT_PATH_MAX, _dirent_loose_load, repository);-}--/*- * Write a single reference into a packfile- */-static int packed_write_ref(reference_oid *ref, git_filebuf *file)-{- int error;- char oid[GIT_OID_HEXSZ + 1];-- git_oid_fmt(oid, &ref->oid);- oid[GIT_OID_HEXSZ] = 0;-- /* - * For references that peel to an object in the repo, we must- * write the resulting peel on a separate line, e.g.- *- * 6fa8a902cc1d18527e1355773c86721945475d37 refs/tags/libgit2-0.4- * ^2ec0cb7959b0bf965d54f95453f5b4b34e8d3100- *- * This obviously only applies to tags.- * The required peels have already been loaded into `ref->peel_target`.- */- if (ref->ref.type & GIT_REF_HAS_PEEL) {- char peel[GIT_OID_HEXSZ + 1];- git_oid_fmt(peel, &ref->peel_target);- peel[GIT_OID_HEXSZ] = 0;-- error = git_filebuf_printf(file, "%s %s\n^%s\n", oid, ref->ref.name, peel);- } else {- error = git_filebuf_printf(file, "%s %s\n", oid, ref->ref.name);- }-- return error;-}--/*- * Find out what object this reference resolves to.- *- * For references that point to a 'big' tag (e.g. an - * actual tag object on the repository), we need to- * cache on the packfile the OID of the object to- * which that 'big tag' is pointing to.- */-static int packed_find_peel(reference_oid *ref)-{- git_tag *tag;- int error;-- if (ref->ref.type & GIT_REF_HAS_PEEL)- return GIT_SUCCESS;-- /*- * Only applies to tags, i.e. references- * in the /refs/tags folder- */- if (git__prefixcmp(ref->ref.name, GIT_REFS_TAGS_DIR) != 0)- return GIT_SUCCESS;-- /*- * Find the tag in the repository. The tag must exist,- * otherwise this reference is broken and we shouldn't- * pack it.- */- error = git_tag_lookup(&tag, ref->ref.owner, &ref->oid);- if (error < GIT_SUCCESS)- return GIT_EOBJCORRUPTED;-- /*- * Find the object pointed at by this tag- */- git_oid_cpy(&ref->peel_target, git_tag_target_oid(tag));- ref->ref.type |= GIT_REF_HAS_PEEL;-- /* - * The reference has now cached the resolved OID, and is- * marked at such. When written to the packfile, it'll be- * accompanied by this resolved oid- */-- return GIT_SUCCESS;-}--/*- * Remove all loose references- *- * Once we have successfully written a packfile,- * all the loose references that were packed must be- * removed from disk.- *- * This is a dangerous method; make sure the packfile- * is well-written, because we are destructing references- * here otherwise.- */-static int packed_remove_loose(git_repository *repo, git_vector *packing_list)-{- unsigned int i;- char full_path[GIT_PATH_MAX];- int error = GIT_SUCCESS;- git_reference *reference;-- for (i = 0; i < packing_list->length; ++i) {- git_reference *ref = git_vector_get(packing_list, i);-- /* Ensure the packed reference doesn't exist- * in a (more up-to-date?) state as a loose reference- */- reference = git_hashtable_lookup(ref->owner->references.loose_cache, ref->name);- if (reference != NULL)- continue;-- git__joinpath(full_path, repo->path_repository, ref->name);-- if (gitfo_exists(full_path) == GIT_SUCCESS &&- gitfo_unlink(full_path) < GIT_SUCCESS)- error = GIT_EOSERR;-- /*- * if we fail to remove a single file, this is *not* good,- * but we should keep going and remove as many as possible.- * After we've removed as many files as possible, we return- * the error code anyway.- *- * TODO: mark this with a very special error code?- * GIT_EFAILTORMLOOSE- */- }-- return error;-}--static int packed_sort(const void *a, const void *b)-{- const git_reference *ref_a = *(const git_reference **)a;- const git_reference *ref_b = *(const git_reference **)b;-- return strcmp(ref_a->name, ref_b->name);-}--/*- * Write all the contents in the in-memory packfile to disk.- */-static int packed_write(git_repository *repo)-{- git_filebuf pack_file;- int error;- unsigned int i;- char pack_file_path[GIT_PATH_MAX];-- git_vector packing_list;- size_t total_refs;-- assert(repo && repo->references.packfile);-- total_refs = repo->references.packfile->key_count;- if ((error = git_vector_init(&packing_list, total_refs, packed_sort)) < GIT_SUCCESS)- return error;-- /* Load all the packfile into a vector */- {- git_reference *reference;- const void *_unused;-- GIT_HASHTABLE_FOREACH(repo->references.packfile, _unused, reference,- git_vector_insert(&packing_list, reference); /* cannot fail: vector already has the right size */- );- }-- /* sort the vector so the entries appear sorted on the packfile */- git_vector_sort(&packing_list);-- /* Now we can open the file! */- git__joinpath(pack_file_path, repo->path_repository, GIT_PACKEDREFS_FILE);- if ((error = git_filebuf_open(&pack_file, pack_file_path, 0)) < GIT_SUCCESS)- return error;-- /* Packfiles have a header... apparently- * This is in fact not required, but we might as well print it- * just for kicks */- if ((error = git_filebuf_printf(&pack_file, "%s\n", GIT_PACKEDREFS_HEADER)) < GIT_SUCCESS)- return error;-- for (i = 0; i < packing_list.length; ++i) {- reference_oid *ref = (reference_oid *)git_vector_get(&packing_list, i);-- /* only direct references go to the packfile; otherwise- * this is a disaster */- assert(ref->ref.type & GIT_REF_OID);-- if ((error = packed_find_peel(ref)) < GIT_SUCCESS)- goto cleanup;-- if ((error = packed_write_ref(ref, &pack_file)) < GIT_SUCCESS)- goto cleanup;- }--cleanup:- /* if we've written all the references properly, we can commit- * the packfile to make the changes effective */- if (error == GIT_SUCCESS) {- error = git_filebuf_commit(&pack_file);-- /* when and only when the packfile has been properly written,- * we can go ahead and remove the loose refs */- if (error == GIT_SUCCESS) {- struct stat st;-- error = packed_remove_loose(repo, &packing_list);-- if (gitfo_stat(pack_file_path, &st) == GIT_SUCCESS)- repo->references.packfile_time = st.st_mtime;- }- }- else git_filebuf_cleanup(&pack_file);-- git_vector_free(&packing_list);-- return error;-}-----/*****************************************- * External Library API- *****************************************/--/**- * Constructors- */-int git_reference_lookup(git_reference **ref_out, git_repository *repo, const char *name)-{- int error;- char normalized_name[GIT_PATH_MAX];-- assert(ref_out && repo && name);-- *ref_out = NULL;-- error = normalize_name(normalized_name, name, 0);- if (error < GIT_SUCCESS)- return error;-- /* First, check has been previously loaded and cached */- *ref_out = git_hashtable_lookup(repo->references.loose_cache, normalized_name);- if (*ref_out != NULL)- return loose_update(*ref_out);-- /* Then check if there is a loose file for that reference.*/- error = loose_lookup(ref_out, repo, normalized_name, 0);-- /* If the file exists, we store it on the cache */- if (error == GIT_SUCCESS)- return git_hashtable_insert(repo->references.loose_cache, (*ref_out)->name, (*ref_out));-- /* The loose lookup has failed, but not because the reference wasn't found;- * probably the loose reference is corrupted. this is bad. */- if (error != GIT_ENOTFOUND)- return error;-- /*- * If we cannot find a loose reference, we look into the packfile- * Load the packfile first if it hasn't been loaded - */- /* load all the packed references */- error = packed_load(repo);- if (error < GIT_SUCCESS)- return error;-- /* Look up on the packfile */- *ref_out = git_hashtable_lookup(repo->references.packfile, normalized_name);- if (*ref_out != NULL)- return GIT_SUCCESS;-- /* The reference doesn't exist anywhere */- return GIT_ENOTFOUND;-}--int git_reference_create_symbolic(git_reference **ref_out, git_repository *repo, const char *name, const char *target)-{- char normalized[MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH];- int error = GIT_SUCCESS;- git_reference *ref = NULL;-- error = reference_create(&ref, repo, name, GIT_REF_SYMBOLIC);- if (error < GIT_SUCCESS)- goto cleanup;-- /* The target can aither be the name of an object id reference or the name of another symbolic reference */- error = normalize_name(normalized, target, 0);- if (error < GIT_SUCCESS)- goto cleanup;-- /* set the target; this will write the reference on disk */- error = git_reference_set_target(ref, normalized);- if (error < GIT_SUCCESS)- goto cleanup;-- error = git_hashtable_insert(repo->references.loose_cache, ref->name, ref);- if (error < GIT_SUCCESS)- goto cleanup;-- *ref_out = ref;-- return error;--cleanup:- reference_free(ref);- return error;-}--int git_reference_create_oid(git_reference **ref_out, git_repository *repo, const char *name, const git_oid *id)-{- int error = GIT_SUCCESS;- git_reference *ref = NULL;-- error = reference_create(&ref, repo, name, GIT_REF_OID);- if (error < GIT_SUCCESS)- goto cleanup;-- /* set the oid; this will write the reference on disk */- error = git_reference_set_oid(ref, id);- if (error < GIT_SUCCESS)- goto cleanup;-- error = git_hashtable_insert(repo->references.loose_cache, ref->name, ref);- if (error < GIT_SUCCESS)- goto cleanup;-- *ref_out = ref;-- return error;--cleanup:- reference_free(ref);- return error;-}---/**- * Getters- */-git_rtype git_reference_type(git_reference *ref)-{- assert(ref);-- if (ref->type & GIT_REF_OID)- return GIT_REF_OID;-- if (ref->type & GIT_REF_SYMBOLIC)- return GIT_REF_SYMBOLIC;-- return GIT_REF_INVALID;-}--const char *git_reference_name(git_reference *ref)-{- assert(ref);- return ref->name;-}--git_repository *git_reference_owner(git_reference *ref)-{- assert(ref);- return ref->owner;-}--const git_oid *git_reference_oid(git_reference *ref)-{- assert(ref);-- if ((ref->type & GIT_REF_OID) == 0)- return NULL;-- if (loose_update(ref) < GIT_SUCCESS)- return NULL;-- return &((reference_oid *)ref)->oid;-}--const char *git_reference_target(git_reference *ref)-{- assert(ref);-- if ((ref->type & GIT_REF_SYMBOLIC) == 0)- return NULL;-- if (loose_update(ref) < GIT_SUCCESS)- return NULL;-- return ((reference_symbolic *)ref)->target;-}--/**- * Setters- */--/*- * Change the OID target of a reference.- *- * For loose references, just change the oid in memory- * and overwrite the file in disk.- *- * For packed files, this is not pretty:- * For performance reasons, we write the new reference- * loose on disk (it replaces the old on the packfile),- * but we cannot invalidate the pointer to the reference,- * and most importantly, the `packfile` object must stay- * consistent with the representation of the packfile- * on disk. This is what we need to:- *- * 1. Copy the reference- * 2. Change the oid on the original- * 3. Write the original to disk- * 4. Write the original to the loose cache- * 5. Replace the original with the copy (old reference) in the packfile cache- */-int git_reference_set_oid(git_reference *ref, const git_oid *id)-{- reference_oid *ref_oid;- reference_oid *ref_old = NULL;- int error = GIT_SUCCESS;-- if ((ref->type & GIT_REF_OID) == 0)- return GIT_EINVALIDREFSTATE;-- ref_oid = (reference_oid *)ref;-- /* duplicate the reference;- * this copy will stay on the packfile cache */- if (ref->type & GIT_REF_PACKED) {- ref_old = git__malloc(sizeof(reference_oid));- if (ref_old == NULL)- return GIT_ENOMEM;-- ref_old->ref.name = git__strdup(ref->name);- if (ref_old->ref.name == NULL) {- free(ref_old);- return GIT_ENOMEM;- }- }-- git_oid_cpy(&ref_oid->oid, id);- ref->type &= ~GIT_REF_HAS_PEEL;-- error = loose_write(ref); - if (error < GIT_SUCCESS)- goto cleanup;-- if (ref->type & GIT_REF_PACKED) {- /* insert the original on the loose cache */- error = git_hashtable_insert(ref->owner->references.loose_cache, ref->name, ref);- if (error < GIT_SUCCESS)- goto cleanup;-- ref->type &= ~GIT_REF_PACKED;-- /* replace the original in the packfile with the copy */- error = git_hashtable_insert(ref->owner->references.packfile, ref_old->ref.name, ref_old);- if (error < GIT_SUCCESS)- goto cleanup;- }-- return GIT_SUCCESS;--cleanup:- reference_free((git_reference *)ref_old);- return error;-}--/*- * Change the target of a symbolic reference.- *- * This is easy because symrefs cannot be inside- * a pack. We just change the target in memory- * and overwrite the file on disk.- */-int git_reference_set_target(git_reference *ref, const char *target)-{- reference_symbolic *ref_sym;-- if ((ref->type & GIT_REF_SYMBOLIC) == 0)- return GIT_EINVALIDREFSTATE;-- ref_sym = (reference_symbolic *)ref;-- free(ref_sym->target);- ref_sym->target = git__strdup(target);- if (ref_sym->target == NULL)- return GIT_ENOMEM;-- return loose_write(ref);-}--/**- * Other- */--/*- * Delete a reference.- *- * If the reference is packed, this is an expensive- * operation. We need to remove the reference from- * the memory cache and then rewrite the whole pack- *- * If the reference is loose, we remove it on- * the filesystem and update the in-memory cache- * accordingly. We also make sure that an older version- * of it doesn't exist as a packed reference. If this- * is the case, this packed reference is removed as well.- *- * This obviously invalidates the `ref` pointer.- */-int git_reference_delete(git_reference *ref)-{- int error;- git_reference *reference;-- assert(ref);-- if (ref->type & GIT_REF_PACKED) {- git_hashtable_remove(ref->owner->references.packfile, ref->name);- error = packed_write(ref->owner);- } else {- char full_path[GIT_PATH_MAX];- git__joinpath(full_path, ref->owner->path_repository, ref->name);- git_hashtable_remove(ref->owner->references.loose_cache, ref->name);- error = gitfo_unlink(full_path);- if (error < GIT_SUCCESS)- goto cleanup;-- /* When deleting a loose reference, we have to ensure that an older- * packed version of it doesn't exist- */- if (!git_reference_lookup(&reference, ref->owner, ref->name)) {- assert((reference->type & GIT_REF_PACKED) != 0);- error = git_reference_delete(reference);- }- }--cleanup:- reference_free(ref);- return error;-}--/*- * Rename a reference- *- * If the reference is packed, we need to rewrite the- * packfile to remove the reference from it and create- * the reference back as a loose one.- *- * If the reference is loose, we just rename it on- * the filesystem.- *- * We also need to re-insert the reference on its corresponding- * in-memory cache, since the caches are indexed by refname.- */-int git_reference_rename(git_reference *ref, const char *new_name)-{- int error;- char *old_name;- char old_path[GIT_PATH_MAX], new_path[GIT_PATH_MAX], normalized_name[MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH];- git_reference *looked_up_ref;-- assert(ref);-- /* Ensure the name is valid */- error = normalize_name(normalized_name, new_name, ref->type & GIT_REF_OID);- if (error < GIT_SUCCESS)- return error;-- /* Ensure we're not going to overwrite an existing reference */- error = git_reference_lookup(&looked_up_ref, ref->owner, new_name);- if (error == GIT_SUCCESS)- return GIT_EINVALIDREFNAME;-- if (error != GIT_ENOTFOUND)- return error;--- old_name = ref->name;- ref->name = git__strdup(new_name);-- if (ref->name == NULL) {- ref->name = old_name;- return GIT_ENOMEM;- }-- if (ref->type & GIT_REF_PACKED) {- /* write the packfile to disk; note- * that the state of the in-memory cache is not- * consistent, because the reference is indexed- * by its old name but it already has the new one.- * This doesn't affect writing, though, and allows- * us to rollback if writing fails- */-- ref->type &= ~GIT_REF_PACKED;-- /* Create the loose ref under its new name */- error = loose_write(ref);- if (error < GIT_SUCCESS) {- ref->type |= GIT_REF_PACKED;- goto cleanup;- }-- /* Remove from the packfile cache in order to avoid packing it back- * Note : we do not rely on git_reference_delete() because this would- * invalidate the reference.- */- git_hashtable_remove(ref->owner->references.packfile, old_name);-- /* Recreate the packed-refs file without the reference */- error = packed_write(ref->owner);- if (error < GIT_SUCCESS)- goto rename_loose_to_old_name;-- } else {- git__joinpath(old_path, ref->owner->path_repository, old_name);- git__joinpath(new_path, ref->owner->path_repository, ref->name);-- error = gitfo_mv_force(old_path, new_path);- if (error < GIT_SUCCESS)- goto cleanup;-- /* Once succesfully renamed, remove from the cache the reference known by its old name*/- git_hashtable_remove(ref->owner->references.loose_cache, old_name);- }-- /* Store the renamed reference into the loose ref cache */- error = git_hashtable_insert(ref->owner->references.loose_cache, ref->name, ref);-- free(old_name);- return error;--cleanup:- /* restore the old name if this failed */- free(ref->name);- ref->name = old_name;- return error;--rename_loose_to_old_name:- /* If we hit this point. Something *bad* happened! Think "Ghostbusters- * crossing the streams" definition of bad.- * Either the packed-refs has been correctly generated and something else- * has gone wrong, or the writing of the new packed-refs has failed, and- * we're stuck with the old one. As a loose ref always takes priority over- * a packed ref, we'll eventually try and rename the generated loose ref to- * its former name. It even that fails, well... we might have lost the reference- * for good. :-/- */-- git__joinpath(old_path, ref->owner->path_repository, ref->name);- git__joinpath(new_path, ref->owner->path_repository, old_name);-- /* No error checking. We'll return the initial error */- gitfo_mv_force(old_path, new_path);-- /* restore the old name */- free(ref->name);- ref->name = old_name;-- return error;-}--int git_reference_resolve(git_reference **resolved_ref, git_reference *ref)-{- git_repository *repo;- int error, i;-- assert(resolved_ref && ref);- *resolved_ref = NULL;-- if ((error = loose_update(ref)) < GIT_SUCCESS)- return error;- - repo = ref->owner;-- for (i = 0; i < MAX_NESTING_LEVEL; ++i) {- reference_symbolic *ref_sym;-- if (ref->type & GIT_REF_OID) {- *resolved_ref = ref;- return GIT_SUCCESS;- }-- ref_sym = (reference_symbolic *)ref;- if ((error = git_reference_lookup(&ref, repo, ref_sym->target)) < GIT_SUCCESS)- return error;- }-- return GIT_ETOONESTEDSYMREF;-}--int git_reference_packall(git_repository *repo)-{- int error;-- /* load the existing packfile */- if ((error = packed_load(repo)) < GIT_SUCCESS)- return error;-- /* update it in-memory with all the loose references */- if ((error = packed_loadloose(repo)) < GIT_SUCCESS)- return error;-- /* write it back to disk */- return packed_write(repo);-}--int git_reference_listall(git_strarray *array, git_repository *repo, unsigned int list_flags)-{- int error;- struct dirent_list_data data;- char refs_path[GIT_PATH_MAX];-- array->strings = NULL;- array->count = 0;-- git_vector_init(&data.ref_list, 8, NULL);- data.repo_path_len = strlen(repo->path_repository);- data.list_flags = list_flags;- data.repo = repo;-- /* list all the packed references first */- if (list_flags & GIT_REF_PACKED) {- const char *ref_name;- void *_unused;-- if ((error = packed_load(repo)) < GIT_SUCCESS) {- git_vector_free(&data.ref_list);- return error;- }-- GIT_HASHTABLE_FOREACH(repo->references.packfile, ref_name, _unused,- git_vector_insert(&data.ref_list, git__strdup(ref_name));- );- }-- /* now list the loose references, trying not to- * duplicate the ref names already in the packed-refs file */- git__joinpath(refs_path, repo->path_repository, GIT_REFS_DIR);- error = gitfo_dirent(refs_path, GIT_PATH_MAX, _dirent_loose_listall, &data);-- if (error < GIT_SUCCESS) {- git_vector_free(&data.ref_list);- return error;- }-- array->strings = (char **)data.ref_list.contents;- array->count = data.ref_list.length;- return GIT_SUCCESS;-}-----/*****************************************- * Init/free (repository API)- *****************************************/-int git_repository__refcache_init(git_refcache *refs)-{- assert(refs);-- refs->loose_cache = git_hashtable_alloc(- default_table_size,- reftable_hash,- (git_hash_keyeq_ptr)strcmp);-- /* packfile loaded lazily */- refs->packfile = NULL;-- return (refs->loose_cache) ? GIT_SUCCESS : GIT_ENOMEM;-}--void git_repository__refcache_free(git_refcache *refs)-{- git_reference *reference;- const void *_unused;-- assert(refs);-- GIT_HASHTABLE_FOREACH(refs->loose_cache, _unused, reference,- reference_free(reference);- );-- git_hashtable_free(refs->loose_cache);-- if (refs->packfile) {- GIT_HASHTABLE_FOREACH(refs->packfile, _unused, reference,- reference_free(reference);- );-- git_hashtable_free(refs->packfile);- }-}----/*****************************************- * Name normalization- *****************************************/-static int check_valid_ref_char(char ch)-{- if (ch <= ' ')- return GIT_ERROR;-- switch (ch) {- case '~':- case '^':- case ':':- case '\\':- case '?':- case '[':- case '*':- return GIT_ERROR;- break;-- default:- return GIT_SUCCESS;- }-}--static int normalize_name(char *buffer_out, const char *name, int is_oid_ref)-{- int error = GIT_SUCCESS;- const char *name_end, *buffer_out_start;- char *current;- int contains_a_slash = 0;-- assert(name && buffer_out);-- buffer_out_start = buffer_out;- current = (char *)name;- name_end = name + strlen(name);-- /* A refname can not be empty */- if (name_end == name)- return GIT_EINVALIDREFNAME;-- /* A refname can not end with a dot or a slash */- if (*(name_end - 1) == '.' || *(name_end - 1) == '/')- return GIT_EINVALIDREFNAME;-- while (current < name_end) {- if (check_valid_ref_char(*current))- return GIT_EINVALIDREFNAME;-- if (buffer_out > buffer_out_start) {- char prev = *(buffer_out - 1);-- /* A refname can not start with a dot nor contain a double dot */- if (*current == '.' && ((prev == '.') || (prev == '/')))- return GIT_EINVALIDREFNAME;-- /* '@{' is forbidden within a refname */- if (*current == '{' && prev == '@')- return GIT_EINVALIDREFNAME;-- /* Prevent multiple slashes from being added to the output */- if (*current == '/' && prev == '/') {- current++;- continue;- }- }-- if (*current == '/')- contains_a_slash = 1;-- *buffer_out++ = *current++;- }-- /* Object id refname have to contain at least one slash */- if (is_oid_ref && !contains_a_slash)- return GIT_EINVALIDREFNAME;-- /* A refname can not end with ".lock" */- if (!git__suffixcmp(name, GIT_FILELOCK_EXTENSION))- return GIT_EINVALIDREFNAME;-- *buffer_out = '\0';-- /* For object id references, name has to start with refs/(heads|tags|remotes) */- if (is_oid_ref && !(!git__prefixcmp(buffer_out_start, GIT_REFS_HEADS_DIR) ||- !git__prefixcmp(buffer_out_start, GIT_REFS_TAGS_DIR) || !git__prefixcmp(buffer_out_start, GIT_REFS_REMOTES_DIR)))- return GIT_EINVALIDREFNAME;-- return error;-}--int git_reference__normalize_name(char *buffer_out, const char *name)-{- return normalize_name(buffer_out, name, 0);-}--int git_reference__normalize_name_oid(char *buffer_out, const char *name)-{- return normalize_name(buffer_out, name, 1);-}--
− libgit2/src/refs.h
@@ -1,42 +0,0 @@-#ifndef INCLUDE_refs_h__-#define INCLUDE_refs_h__--#include "common.h"-#include "git2/oid.h"-#include "git2/refs.h"-#include "hashtable.h"--#define GIT_REFS_DIR "refs/"-#define GIT_REFS_HEADS_DIR GIT_REFS_DIR "heads/"-#define GIT_REFS_TAGS_DIR GIT_REFS_DIR "tags/"-#define GIT_REFS_REMOTES_DIR GIT_REFS_DIR "remotes/"--#define GIT_SYMREF "ref: "-#define GIT_PACKEDREFS_FILE "packed-refs"-#define GIT_PACKEDREFS_HEADER "# pack-refs with: peeled "-#define MAX_GITDIR_TREE_STRUCTURE_PATH_LENGTH 100--#define GIT_HEAD_FILE "HEAD"-#define GIT_REFS_HEADS_MASTER_FILE GIT_REFS_HEADS_DIR "master"--struct git_reference {- git_repository *owner;- char *name;- unsigned int type;- time_t mtime;-};--typedef struct {- git_hashtable *packfile;- git_hashtable *loose_cache;- time_t packfile_time;-} git_refcache;---void git_repository__refcache_free(git_refcache *refs);-int git_repository__refcache_init(git_refcache *refs);--int git_reference__normalize_name(char *buffer_out, const char *name);-int git_reference__normalize_name_oid(char *buffer_out, const char *name);--#endif
− libgit2/src/repository.c
@@ -1,541 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */-#include <stdarg.h>--#include "git2/object.h"--#include "common.h"-#include "repository.h"-#include "commit.h"-#include "tag.h"-#include "blob.h"-#include "fileops.h"--#include "refs.h"--#define GIT_OBJECTS_INFO_DIR GIT_OBJECTS_DIR "info/"-#define GIT_OBJECTS_PACK_DIR GIT_OBJECTS_DIR "pack/"--#define GIT_BRANCH_MASTER "master"--static const int OBJECT_TABLE_SIZE = 32;--typedef struct {- char *path_repository;- unsigned is_bare:1, has_been_reinit:1;-} repo_init;--/*- * Hash table methods- *- * Callbacks for the ODB cache, implemented- * as a hash table- */-static uint32_t object_table_hash(const void *key, int hash_id)-{- uint32_t r;- git_oid *id;-- id = (git_oid *)key;- memcpy(&r, id->id + (hash_id * sizeof(uint32_t)), sizeof(r));- return r;-}--/*- * Git repository open methods- *- * Open a repository object from its path- */-static int assign_repository_dirs(- git_repository *repo,- const char *git_dir,- const char *git_object_directory,- const char *git_index_file,- const char *git_work_tree)-{- char path_aux[GIT_PATH_MAX];- size_t git_dir_path_len;- int error = GIT_SUCCESS;-- assert(repo);-- if (git_dir == NULL)- return GIT_ENOTFOUND;-- error = gitfo_prettify_dir_path(path_aux, git_dir);- if (error < GIT_SUCCESS)- return error;-- git_dir_path_len = strlen(path_aux);-- /* store GIT_DIR */- repo->path_repository = git__strdup(path_aux);- if (repo->path_repository == NULL)- return GIT_ENOMEM;-- /* path to GIT_OBJECT_DIRECTORY */- if (git_object_directory == NULL)- git__joinpath(path_aux, repo->path_repository, GIT_OBJECTS_DIR);- else {- error = gitfo_prettify_dir_path(path_aux, git_object_directory);- if (error < GIT_SUCCESS)- return error;- }-- /* Store GIT_OBJECT_DIRECTORY */- repo->path_odb = git__strdup(path_aux);- if (repo->path_odb == NULL)- return GIT_ENOMEM;-- /* path to GIT_WORK_TREE */- if (git_work_tree == NULL)- repo->is_bare = 1;- else {- error = gitfo_prettify_dir_path(path_aux, git_work_tree);- if (error < GIT_SUCCESS)- return error;-- /* Store GIT_WORK_TREE */- repo->path_workdir = git__strdup(path_aux);- if (repo->path_workdir == NULL)- return GIT_ENOMEM;-- /* Path to GIT_INDEX_FILE */- if (git_index_file == NULL)- git__joinpath(path_aux, repo->path_repository, GIT_INDEX_FILE);- else {- error = gitfo_prettify_file_path(path_aux, git_index_file);- if (error < GIT_SUCCESS)- return error;- }-- /* store GIT_INDEX_FILE */- repo->path_index = git__strdup(path_aux);- if (repo->path_index == NULL)- return GIT_ENOMEM;- }- - return GIT_SUCCESS;-}--static int check_repository_dirs(git_repository *repo)-{- char path_aux[GIT_PATH_MAX];-- if (gitfo_isdir(repo->path_repository) < GIT_SUCCESS)- return GIT_ENOTAREPO;-- /* Ensure GIT_OBJECT_DIRECTORY exists */- if (gitfo_isdir(repo->path_odb) < GIT_SUCCESS)- return GIT_ENOTAREPO;-- /* Ensure HEAD file exists */- git__joinpath(path_aux, repo->path_repository, GIT_HEAD_FILE);- if (gitfo_exists(path_aux) < 0)- return GIT_ENOTAREPO;-- return GIT_SUCCESS;-}--static int guess_repository_dirs(git_repository *repo, const char *repository_path)-{- char buffer[GIT_PATH_MAX];- const char *path_work_tree = NULL;-- /* Git directory name */- if (git__basename_r(buffer, sizeof(buffer), repository_path) < 0)- return GIT_EINVALIDPATH;-- if (strcmp(buffer, DOT_GIT) == 0) {- /* Path to working dir */- if (git__dirname_r(buffer, sizeof(buffer), repository_path) < 0)- return GIT_EINVALIDPATH;- path_work_tree = buffer;- }-- return assign_repository_dirs(repo, repository_path, NULL, NULL, path_work_tree);-}--static git_repository *repository_alloc()-{- git_repository *repo = git__malloc(sizeof(git_repository));- if (!repo)- return NULL;-- memset(repo, 0x0, sizeof(git_repository));-- repo->objects = git_hashtable_alloc(- OBJECT_TABLE_SIZE, - object_table_hash,- (git_hash_keyeq_ptr)git_oid_cmp);-- if (repo->objects == NULL) { - free(repo);- return NULL;- }-- if (git_repository__refcache_init(&repo->references) < GIT_SUCCESS) {- git_hashtable_free(repo->objects);- free(repo);- return NULL;- }-- if (git_vector_init(&repo->memory_objects, 16, NULL) < GIT_SUCCESS) {- git_hashtable_free(repo->objects);- git_repository__refcache_free(&repo->references);- free(repo);- return NULL;- }-- return repo;-}--static int init_odb(git_repository *repo)-{- return git_odb_open(&repo->db, repo->path_odb);-}--int git_repository_open3(git_repository **repo_out,- const char *git_dir,- git_odb *object_database,- const char *git_index_file,- const char *git_work_tree)-{- git_repository *repo;- int error = GIT_SUCCESS;-- assert(repo_out);-- if (object_database == NULL)- return GIT_ERROR;-- repo = repository_alloc();- if (repo == NULL)- return GIT_ENOMEM;-- error = assign_repository_dirs(repo, - git_dir, - NULL,- git_index_file,- git_work_tree);-- if (error < GIT_SUCCESS)- goto cleanup;-- error = check_repository_dirs(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- repo->db = object_database;-- *repo_out = repo;- return GIT_SUCCESS;--cleanup:- git_repository_free(repo);- return error;-}---int git_repository_open2(git_repository **repo_out,- const char *git_dir,- const char *git_object_directory,- const char *git_index_file,- const char *git_work_tree)-{- git_repository *repo;- int error = GIT_SUCCESS;-- assert(repo_out);-- repo = repository_alloc();- if (repo == NULL)- return GIT_ENOMEM;-- error = assign_repository_dirs(repo,- git_dir, - git_object_directory,- git_index_file,- git_work_tree);-- if (error < GIT_SUCCESS)- goto cleanup;-- error = check_repository_dirs(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- error = init_odb(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- *repo_out = repo;- return GIT_SUCCESS;--cleanup:- git_repository_free(repo);- return error;-}--int git_repository_open(git_repository **repo_out, const char *path)-{- git_repository *repo;- int error = GIT_SUCCESS;-- assert(repo_out && path);-- repo = repository_alloc();- if (repo == NULL)- return GIT_ENOMEM;-- error = guess_repository_dirs(repo, path);- if (error < GIT_SUCCESS)- goto cleanup;-- error = check_repository_dirs(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- error = init_odb(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- *repo_out = repo;- return GIT_SUCCESS;--cleanup:- git_repository_free(repo);- return error;-}--int git_repository_gc(git_repository *repo)-{- int collected = 0;- git_object *object;- const void *_unused;-- GIT_HASHTABLE_FOREACH(repo->objects, _unused, object,- if (object->can_free) {- git_object__free(object);- collected++;- }- );-- return collected;-}--void git_repository_free(git_repository *repo)-{- git_object *object;- const void *_unused;- unsigned int i;-- if (repo == NULL)- return;-- /* force free all the objects */- GIT_HASHTABLE_FOREACH(repo->objects, _unused, object,- git_object__free(object);- );-- for (i = 0; i < repo->memory_objects.length; ++i) {- object = git_vector_get(&repo->memory_objects, i);- git_object__free(object);- }-- free(repo->path_workdir);- free(repo->path_index);- free(repo->path_repository);- free(repo->path_odb);-- git_hashtable_free(repo->objects);- git_vector_free(&repo->memory_objects);-- git_repository__refcache_free(&repo->references);-- if (repo->db != NULL)- git_odb_close(repo->db);-- if (repo->index != NULL)- git_index_free(repo->index);-- free(repo);-}--int git_repository_index(git_index **index_out, git_repository *repo)-{- int error;-- assert(index_out && repo);-- if (repo->index == NULL) {- error = git_index_open_inrepo(&repo->index, repo);- if (error < GIT_SUCCESS)- return error;-- assert(repo->index != NULL);- }-- *index_out = repo->index;- return GIT_SUCCESS;-}--git_odb *git_repository_database(git_repository *repo)-{- assert(repo);- return repo->db;-}--static int repo_init_reinit(repo_init *results)-{- /* TODO: reinit the repository */- results->has_been_reinit = 1;- return GIT_SUCCESS;-}--static int repo_init_createhead(git_repository *repo)-{- git_reference *head_reference;- return git_reference_create_symbolic(&head_reference, repo, GIT_HEAD_FILE, GIT_REFS_HEADS_MASTER_FILE);-}--static int repo_init_check_head_existence(char * repository_path)-{- char temp_path[GIT_PATH_MAX];-- git__joinpath(temp_path, repository_path, GIT_HEAD_FILE);- return gitfo_exists(temp_path);-}--static int repo_init_structure(repo_init *results)-{- const int mode = 0755; /* or 0777 ? */-- char temp_path[GIT_PATH_MAX];- char *git_dir = results->path_repository;-- if (gitfo_mkdir_recurs(git_dir, mode))- return GIT_ERROR;-- /* Creates the '/objects/info/' directory */- git__joinpath(temp_path, git_dir, GIT_OBJECTS_INFO_DIR);- if (gitfo_mkdir_recurs(temp_path, mode) < GIT_SUCCESS)- return GIT_ERROR;-- /* Creates the '/objects/pack/' directory */- git__joinpath(temp_path, git_dir, GIT_OBJECTS_PACK_DIR);- if (gitfo_mkdir(temp_path, mode))- return GIT_ERROR;-- /* Creates the '/refs/heads/' directory */- git__joinpath(temp_path, git_dir, GIT_REFS_HEADS_DIR);- if (gitfo_mkdir_recurs(temp_path, mode))- return GIT_ERROR;-- /* Creates the '/refs/tags/' directory */- git__joinpath(temp_path, git_dir, GIT_REFS_TAGS_DIR);- if (gitfo_mkdir(temp_path, mode))- return GIT_ERROR;-- /* TODO: what's left? templates? */-- return GIT_SUCCESS;-}--static int repo_init_find_dir(repo_init *results, const char* path)-{- char temp_path[GIT_PATH_MAX];- int error = GIT_SUCCESS;-- error = gitfo_prettify_dir_path(temp_path, path);- if (error < GIT_SUCCESS)- return error;-- if (!results->is_bare) {- git__joinpath(temp_path, temp_path, GIT_DIR);- }-- results->path_repository = git__strdup(temp_path);- if (results->path_repository == NULL)- return GIT_ENOMEM;-- return GIT_SUCCESS;-}--int git_repository_init(git_repository **repo_out, const char *path, unsigned is_bare)-{- int error = GIT_SUCCESS;- git_repository *repo = NULL;- repo_init results;- - assert(repo_out && path);-- results.path_repository = NULL;- results.is_bare = is_bare;-- error = repo_init_find_dir(&results, path);- if (error < GIT_SUCCESS)- goto cleanup;-- if (!repo_init_check_head_existence(results.path_repository))- return repo_init_reinit(&results);-- error = repo_init_structure(&results);- if (error < GIT_SUCCESS)- goto cleanup;-- repo = repository_alloc();- if (repo == NULL) {- error = GIT_ENOMEM;- goto cleanup;- }-- error = guess_repository_dirs(repo, results.path_repository);- if (error < GIT_SUCCESS)- goto cleanup;-- assert(repo->is_bare == is_bare);-- error = init_odb(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- error = repo_init_createhead(repo);- if (error < GIT_SUCCESS)- goto cleanup;-- /* should never fail */- assert(check_repository_dirs(repo) == GIT_SUCCESS);-- free(results.path_repository);- *repo_out = repo;- return GIT_SUCCESS;--cleanup:- free(results.path_repository);- git_repository_free(repo);- return error;-}-
− libgit2/src/repository.h
@@ -1,65 +0,0 @@-#ifndef INCLUDE_repository_h__-#define INCLUDE_repository_h__--#include "git2/common.h"-#include "git2/oid.h"-#include "git2/odb.h"-#include "git2/repository.h"-#include "git2/object.h"--#include "hashtable.h"-#include "index.h"-#include "refs.h"--#define DOT_GIT ".git"-#define GIT_DIR DOT_GIT "/"-#define GIT_OBJECTS_DIR "objects/"-#define GIT_INDEX_FILE "index"--typedef struct {- git_rawobj raw;- void *write_ptr;- size_t written_bytes;- int open:1;-} git_odb_source;--struct git_object {- git_oid id;- git_repository *repo;- git_odb_source source;- unsigned int lru;- unsigned char in_memory, modified, can_free, _pad;-};--struct git_repository {- git_odb *db;- git_index *index;-- git_hashtable *objects;- git_vector memory_objects;-- git_refcache references;-- char *path_repository;- char *path_index;- char *path_odb;- char *path_workdir;-- unsigned is_bare:1;- unsigned int lru_counter;-};--int git_object__source_open(git_object *object);-void git_object__source_close(git_object *object);--/* fully free the object; internal method, do not- * export */-void git_object__free(git_object *object);--int git__source_printf(git_odb_source *source, const char *format, ...);-int git__source_write(git_odb_source *source, const void *bytes, size_t len);--int git__parse_oid(git_oid *oid, char **buffer_out, const char *buffer_end, const char *header);-int git__write_oid(git_odb_source *src, const char *header, const git_oid *oid);--#endif
− libgit2/src/revwalk.c
@@ -1,565 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "commit.h"-#include "hashtable.h"-#include "pqueue.h"--#include "git2/revwalk.h"--typedef struct commit_object {- git_oid oid;- uint32_t time;- unsigned int seen:1,- uninteresting:1,- topo_delay:1,- parsed:1;-- unsigned short in_degree;- unsigned short out_degree;-- struct commit_object **parents;-} commit_object;--typedef struct commit_list {- commit_object *item;- struct commit_list *next;-} commit_list;--struct git_revwalk {- git_repository *repo;-- git_hashtable *commits;-- commit_list *iterator_topo;- commit_list *iterator_rand;- commit_list *iterator_reverse;- git_pqueue iterator_time;-- int (*get_next)(commit_object **, git_revwalk *);- int (*enqueue)(git_revwalk *, commit_object *);-- git_vector memory_alloc;- size_t chunk_size;-- unsigned walking:1;- unsigned int sorting;-};--commit_list *commit_list_insert(commit_object *item, commit_list **list_p)-{- commit_list *new_list = git__malloc(sizeof(commit_list));- new_list->item = item;- new_list->next = *list_p;- *list_p = new_list;- return new_list;-}--void commit_list_free(commit_list **list_p)-{- commit_list *list = *list_p;-- while (list) {- commit_list *temp = list;- list = temp->next;- free(temp);- }-- *list_p = NULL;-}--commit_object *commit_list_pop(commit_list **stack)-{- commit_list *top = *stack;- commit_object *item = top ? top->item : NULL;-- if (top) {- *stack = top->next;- free(top);- }- return item;-}--static int commit_time_cmp(void *a, void *b)-{- commit_object *commit_a = (commit_object *)a;- commit_object *commit_b = (commit_object *)b;-- return (commit_a->time < commit_b->time);-}--static uint32_t object_table_hash(const void *key, int hash_id)-{- uint32_t r;- git_oid *id;-- id = (git_oid *)key;- memcpy(&r, id->id + (hash_id * sizeof(uint32_t)), sizeof(r));- return r;-}--#define COMMITS_PER_CHUNK 128-#define CHUNK_STEP 64-#define PARENTS_PER_COMMIT ((CHUNK_STEP - sizeof(commit_object)) / sizeof(commit_object *))--static int alloc_chunk(git_revwalk *walk)-{- void *chunk;-- chunk = git__calloc(COMMITS_PER_CHUNK, CHUNK_STEP);- if (chunk == NULL)- return GIT_ENOMEM;-- walk->chunk_size = 0;- return git_vector_insert(&walk->memory_alloc, chunk);-}--static commit_object *alloc_commit(git_revwalk *walk)-{- unsigned char *chunk;-- if (walk->chunk_size == COMMITS_PER_CHUNK)- alloc_chunk(walk);-- chunk = git_vector_get(&walk->memory_alloc, walk->memory_alloc.length - 1);- chunk += (walk->chunk_size * CHUNK_STEP);- walk->chunk_size++;-- return (commit_object *)chunk;-}--static commit_object **alloc_parents(commit_object *commit, size_t n_parents)-{- if (n_parents <= PARENTS_PER_COMMIT)- return (commit_object **)((unsigned char *)commit + sizeof(commit_object));-- return git__malloc(n_parents * sizeof(commit_object *));-}---static commit_object *commit_lookup(git_revwalk *walk, const git_oid *oid)-{- commit_object *commit;-- if ((commit = git_hashtable_lookup(walk->commits, oid)) != NULL)- return commit;-- commit = alloc_commit(walk);- if (commit == NULL)- return NULL;-- git_oid_cpy(&commit->oid, oid);-- if (git_hashtable_insert(walk->commits, &commit->oid, commit) < GIT_SUCCESS) {- free(commit);- return NULL;- }-- return commit;-}--static int commit_quick_parse(git_revwalk *walk, commit_object *commit, git_rawobj *raw)-{- const int parent_len = STRLEN("parent ") + GIT_OID_HEXSZ + 1;-- unsigned char *buffer = raw->data;- unsigned char *buffer_end = buffer + raw->len;- unsigned char *parents_start;-- int i, parents = 0;-- buffer += STRLEN("tree ") + GIT_OID_HEXSZ + 1;-- parents_start = buffer;- while (buffer + parent_len < buffer_end && memcmp(buffer, "parent ", STRLEN("parent ")) == 0) {- parents++;- buffer += parent_len;- }-- commit->parents = alloc_parents(commit, parents);- if (commit->parents == NULL)- return GIT_ENOMEM;-- buffer = parents_start;- for (i = 0; i < parents; ++i) {- git_oid oid;-- if (git_oid_mkstr(&oid, (char *)buffer + STRLEN("parent ")) < GIT_SUCCESS)- return GIT_EOBJCORRUPTED;-- commit->parents[i] = commit_lookup(walk, &oid);- if (commit->parents[i] == NULL)- return GIT_ENOMEM;-- buffer += parent_len;- }-- commit->out_degree = (unsigned short)parents;-- if ((buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL)- return GIT_EOBJCORRUPTED;-- buffer = memchr(buffer, '>', buffer_end - buffer);- if (buffer == NULL)- return GIT_EOBJCORRUPTED;-- commit->time = strtol((char *)buffer + 2, NULL, 10);- if (commit->time == 0)- return GIT_EOBJCORRUPTED;-- commit->parsed = 1;- return GIT_SUCCESS;-}--static int commit_parse(git_revwalk *walk, commit_object *commit)-{- git_rawobj data;- int error;-- if (commit->parsed)- return GIT_SUCCESS;-- if ((error = git_odb_read(&data, walk->repo->db, &commit->oid)) < GIT_SUCCESS)- return error;-- if (data.type != GIT_OBJ_COMMIT) {- git_rawobj_close(&data);- return GIT_EOBJTYPE;- }-- error = commit_quick_parse(walk, commit, &data);- git_rawobj_close(&data);- return error;-}--static void mark_uninteresting(commit_object *commit)-{- unsigned short i;- assert(commit);-- commit->uninteresting = 1;-- for (i = 0; i < commit->out_degree; ++i)- if (!commit->parents[i]->uninteresting)- mark_uninteresting(commit->parents[i]);-}--static int process_commit(git_revwalk *walk, commit_object *commit)-{- int error;-- if (commit->seen)- return GIT_SUCCESS;-- commit->seen = 1;-- if ((error = commit_parse(walk, commit)) < GIT_SUCCESS)- return error;-- if (commit->uninteresting)- mark_uninteresting(commit);-- return walk->enqueue(walk, commit);-}--static int process_commit_parents(git_revwalk *walk, commit_object *commit)-{- unsigned short i;- int error = GIT_SUCCESS;-- for (i = 0; i < commit->out_degree && error == GIT_SUCCESS; ++i) {- error = process_commit(walk, commit->parents[i]);- }-- return error;-}--static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting)-{- commit_object *commit;-- commit = commit_lookup(walk, oid);- if (commit == NULL)- return GIT_ENOTFOUND;-- commit->uninteresting = uninteresting;-- return process_commit(walk, commit);-}--int git_revwalk_push(git_revwalk *walk, const git_oid *oid)-{- assert(walk && oid);- return push_commit(walk, oid, 0);-}--int git_revwalk_hide(git_revwalk *walk, const git_oid *oid)-{- assert(walk && oid);- return push_commit(walk, oid, 1);-}--static int revwalk_enqueue_timesort(git_revwalk *walk, commit_object *commit)-{- return git_pqueue_insert(&walk->iterator_time, commit);-}--static int revwalk_enqueue_unsorted(git_revwalk *walk, commit_object *commit)-{- return commit_list_insert(commit, &walk->iterator_rand) ? GIT_SUCCESS : GIT_ENOMEM;-}--static int revwalk_next_timesort(commit_object **object_out, git_revwalk *walk)-{- int error;- commit_object *next;-- while ((next = git_pqueue_pop(&walk->iterator_time)) != NULL) {- if ((error = process_commit_parents(walk, next)) < GIT_SUCCESS)- return error;-- if (!next->uninteresting) {- *object_out = next;- return GIT_SUCCESS;- }- }-- return GIT_EREVWALKOVER;-}--static int revwalk_next_unsorted(commit_object **object_out, git_revwalk *walk)-{- int error;- commit_object *next;-- while ((next = commit_list_pop(&walk->iterator_rand)) != NULL) {- if ((error = process_commit_parents(walk, next)) < GIT_SUCCESS)- return error;-- if (!next->uninteresting) {- *object_out = next;- return GIT_SUCCESS;- }- }-- return GIT_EREVWALKOVER;-}--static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk)-{- commit_object *next;- unsigned short i;-- for (;;) {- next = commit_list_pop(&walk->iterator_topo);- if (next == NULL)- return GIT_EREVWALKOVER;-- if (next->in_degree > 0) {- next->topo_delay = 1;- continue;- }-- for (i = 0; i < next->out_degree; ++i) {- commit_object *parent = next->parents[i];-- if (--parent->in_degree == 0 && parent->topo_delay) {- parent->topo_delay = 0;- commit_list_insert(parent, &walk->iterator_topo);- }- }-- *object_out = next;- return GIT_SUCCESS;- }-}--static int revwalk_next_reverse(commit_object **object_out, git_revwalk *walk)-{- *object_out = commit_list_pop(&walk->iterator_reverse);- return *object_out ? GIT_SUCCESS : GIT_EREVWALKOVER;-}---static int prepare_walk(git_revwalk *walk)-{- int error;- commit_object *next;-- if (walk->sorting & GIT_SORT_TOPOLOGICAL) {- unsigned short i;-- while ((error = walk->get_next(&next, walk)) == GIT_SUCCESS) {- for (i = 0; i < next->out_degree; ++i) {- commit_object *parent = next->parents[i];- parent->in_degree++;- }-- commit_list_insert(next, &walk->iterator_topo);- }-- if (error != GIT_EREVWALKOVER)- return error;-- walk->get_next = &revwalk_next_toposort;- }-- if (walk->sorting & GIT_SORT_REVERSE) {-- while ((error = walk->get_next(&next, walk)) == GIT_SUCCESS)- commit_list_insert(next, &walk->iterator_reverse);-- if (error != GIT_EREVWALKOVER)- return error;-- walk->get_next = &revwalk_next_reverse;- }-- walk->walking = 1;- return GIT_SUCCESS;-}------int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo)-{- git_revwalk *walk;-- walk = git__malloc(sizeof(git_revwalk));- if (walk == NULL)- return GIT_ENOMEM;-- memset(walk, 0x0, sizeof(git_revwalk));-- walk->commits = git_hashtable_alloc(64,- object_table_hash,- (git_hash_keyeq_ptr)git_oid_cmp);-- if (walk->commits == NULL) {- free(walk);- return GIT_ENOMEM;- }-- git_pqueue_init(&walk->iterator_time, 8, commit_time_cmp);- git_vector_init(&walk->memory_alloc, 8, NULL);- alloc_chunk(walk);-- walk->get_next = &revwalk_next_unsorted;- walk->enqueue = &revwalk_enqueue_unsorted;-- walk->repo = repo;-- *revwalk_out = walk;- return GIT_SUCCESS;-}--void git_revwalk_free(git_revwalk *walk)-{- unsigned int i;-- if (walk == NULL)- return;-- git_revwalk_reset(walk);- git_hashtable_free(walk->commits);- git_pqueue_free(&walk->iterator_time);-- for (i = 0; i < walk->memory_alloc.length; ++i)- free(git_vector_get(&walk->memory_alloc, i));-- git_vector_free(&walk->memory_alloc);- free(walk);-}--git_repository *git_revwalk_repository(git_revwalk *walk)-{- assert(walk);- return walk->repo;-}--void git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode)-{- assert(walk);-- if (walk->walking)- git_revwalk_reset(walk);-- walk->sorting = sort_mode;-- if (walk->sorting & GIT_SORT_TIME) {- walk->get_next = &revwalk_next_timesort;- walk->enqueue = &revwalk_enqueue_timesort;- } else {- walk->get_next = &revwalk_next_unsorted;- walk->enqueue = &revwalk_enqueue_unsorted;- }-}--int git_revwalk_next(git_oid *oid, git_revwalk *walk)-{- int error;- commit_object *next;-- assert(walk && oid);-- if (!walk->walking) {- if ((error = prepare_walk(walk)) < GIT_SUCCESS)- return error;- }-- error = walk->get_next(&next, walk);- if (error < GIT_SUCCESS) {- if (error == GIT_EREVWALKOVER)- git_revwalk_reset(walk);- return error;- }-- git_oid_cpy(oid, &next->oid);- return GIT_SUCCESS;-}--void git_revwalk_reset(git_revwalk *walk)-{- const void *_unused;- commit_object *commit;-- assert(walk);-- GIT_HASHTABLE_FOREACH(walk->commits, _unused, commit,- commit->seen = 0;- commit->in_degree = 0;- commit->topo_delay = 0;- );-- git_pqueue_clear(&walk->iterator_time);- commit_list_free(&walk->iterator_topo);- commit_list_free(&walk->iterator_rand);- commit_list_free(&walk->iterator_reverse);- walk->walking = 0;-}-
− libgit2/src/signature.c
@@ -1,199 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "signature.h"-#include "repository.h"-#include "git2/common.h"--void git_signature_free(git_signature *sig)-{- if (sig == NULL)- return;-- free(sig->name);- free(sig->email);- free(sig);-}--git_signature *git_signature_new(const char *name, const char *email, time_t time, int offset)-{- git_signature *p = NULL;-- if ((p = git__malloc(sizeof(git_signature))) == NULL)- goto cleanup;-- p->name = git__strdup(name);- if (p->name == NULL)- goto cleanup;-- p->email = git__strdup(email);- if (p->email == NULL)- goto cleanup;-- p->when.time = time;- p->when.offset = offset;-- if (p->name == NULL || p->email == NULL)- goto cleanup;-- return p;--cleanup:- git_signature_free(p);- return NULL;-}--git_signature *git_signature_dup(const git_signature *sig)-{- return git_signature_new(sig->name, sig->email, sig->when.time, sig->when.offset);-}---static int parse_timezone_offset(const char *buffer, int *offset_out)-{- int offset, dec_offset;- int mins, hours;-- const char* offset_start;- char* offset_end;-- offset_start = buffer + 1;-- if (*offset_start == '\n') {- *offset_out = 0;- return GIT_SUCCESS;- }-- if (offset_start[0] != '-' && offset_start[0] != '+')- return GIT_EOBJCORRUPTED;-- dec_offset = strtol(offset_start + 1, &offset_end, 10);-- if (offset_end - offset_start != 5)- return GIT_EOBJCORRUPTED;-- hours = dec_offset / 100;- mins = dec_offset % 100;-- if (hours > 14) // see http://www.worldtimezone.com/faq.html - return GIT_EOBJCORRUPTED;-- if (mins > 59)- return GIT_EOBJCORRUPTED;-- offset = (hours * 60) + mins;-- if (offset_start[0] == '-')- offset *= -1;- - *offset_out = offset;-- return GIT_SUCCESS;-}---int git_signature__parse(git_signature *sig, char **buffer_out,- const char *buffer_end, const char *header)-{- const size_t header_len = strlen(header);-- int name_length, email_length;- char *buffer = *buffer_out;- char *line_end, *name_end, *email_end;- int offset = 0;-- memset(sig, 0x0, sizeof(git_signature));-- line_end = memchr(buffer, '\n', buffer_end - buffer);- if (!line_end)- return GIT_EOBJCORRUPTED;-- if (buffer + (header_len + 1) > line_end)- return GIT_EOBJCORRUPTED;-- if (memcmp(buffer, header, header_len) != 0)- return GIT_EOBJCORRUPTED;-- buffer += header_len;-- /* Parse name */- if ((name_end = memchr(buffer, '<', buffer_end - buffer)) == NULL)- return GIT_EOBJCORRUPTED;-- name_length = name_end - buffer - 1;- sig->name = git__malloc(name_length + 1);- memcpy(sig->name, buffer, name_length);- sig->name[name_length] = 0;- buffer = name_end + 1;-- if (buffer >= line_end)- return GIT_EOBJCORRUPTED;-- /* Parse email */- if ((email_end = memchr(buffer, '>', buffer_end - buffer)) == NULL)- return GIT_EOBJCORRUPTED;-- email_length = email_end - buffer;- sig->email = git__malloc(email_length + 1);- memcpy(sig->email, buffer, email_length);- sig->email[email_length] = 0;- buffer = email_end + 1;-- if (buffer >= line_end)- return GIT_EOBJCORRUPTED;-- sig->when.time = strtol(buffer, &buffer, 10);-- if (sig->when.time == 0)- return GIT_EOBJCORRUPTED;-- if (parse_timezone_offset(buffer, &offset) < GIT_SUCCESS)- return GIT_EOBJCORRUPTED;- - sig->when.offset = offset;-- *buffer_out = (line_end + 1);- return GIT_SUCCESS;-}--int git_signature__write(git_odb_source *src, const char *header, const git_signature *sig)-{- char sign;- int offset, hours, mins;-- offset = sig->when.offset;- sign = (sig->when.offset < 0) ? '-' : '+';- - if (offset < 0)- offset = -offset;-- hours = offset / 60;- mins = offset % 60;-- return git__source_printf(src, "%s %s <%s> %u %c%02d%02d\n", header, sig->name, sig->email, (unsigned)sig->when.time, sign, hours, mins);-}--
− libgit2/src/signature.h
@@ -1,12 +0,0 @@-#ifndef INCLUDE_signature_h__-#define INCLUDE_signature_h__--#include "git2/common.h"-#include "git2/signature.h"-#include "repository.h"-#include <time.h>--int git_signature__parse(git_signature *sig, char **buffer_out, const char *buffer_end, const char *header);-int git_signature__write(git_odb_source *src, const char *header, const git_signature *sig);--#endif
− libgit2/src/t03-data.h
@@ -1,344 +0,0 @@--typedef struct object_data {- char *id; /* object id (sha1) */- char *dir; /* object store (fan-out) directory name */- char *file; /* object store filename */-} object_data;--static object_data commit = {- "3d7f8a6af076c8c3f20071a8935cdbe8228594d1",- "test-objects/3d",- "test-objects/3d/7f8a6af076c8c3f20071a8935cdbe8228594d1",-};--static unsigned char commit_data[] = {- 0x74, 0x72, 0x65, 0x65, 0x20, 0x64, 0x66, 0x66,- 0x32, 0x64, 0x61, 0x39, 0x30, 0x62, 0x32, 0x35,- 0x34, 0x65, 0x31, 0x62, 0x65, 0x62, 0x38, 0x38,- 0x39, 0x64, 0x31, 0x66, 0x31, 0x66, 0x31, 0x32,- 0x38, 0x38, 0x62, 0x65, 0x31, 0x38, 0x30, 0x33,- 0x37, 0x38, 0x32, 0x64, 0x66, 0x0a, 0x61, 0x75,- 0x74, 0x68, 0x6f, 0x72, 0x20, 0x41, 0x20, 0x55,- 0x20, 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61,- 0x75, 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78,- 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f,- 0x6d, 0x3e, 0x20, 0x31, 0x32, 0x32, 0x37, 0x38,- 0x31, 0x34, 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30,- 0x30, 0x30, 0x30, 0x0a, 0x63, 0x6f, 0x6d, 0x6d,- 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x43, 0x20,- 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72,- 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,- 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d,- 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e,- 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34,- 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30,- 0x30, 0x0a, 0x0a, 0x41, 0x20, 0x6f, 0x6e, 0x65,- 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f,- 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x73, 0x75, 0x6d,- 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x54, 0x68,- 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f,- 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,- 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x6d, 0x65, 0x73,- 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f,- 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67,- 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72,- 0x20, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61,- 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x6f, 0x66, 0x20,- 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, 0x70,- 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,- 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67,- 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f,- 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79,- 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d,- 0x6d, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x53, 0x69,- 0x67, 0x6e, 0x65, 0x64, 0x2d, 0x6f, 0x66, 0x2d,- 0x62, 0x79, 0x3a, 0x20, 0x41, 0x20, 0x55, 0x20,- 0x54, 0x68, 0x6f, 0x72, 0x20, 0x3c, 0x61, 0x75,- 0x74, 0x68, 0x6f, 0x72, 0x40, 0x65, 0x78, 0x61,- 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d,- 0x3e, 0x0a,-};--static git_rawobj commit_obj = {- commit_data,- sizeof(commit_data),- GIT_OBJ_COMMIT-};--static object_data tree = {- "dff2da90b254e1beb889d1f1f1288be1803782df",- "test-objects/df",- "test-objects/df/f2da90b254e1beb889d1f1f1288be1803782df",-};--static unsigned char tree_data[] = {- 0x31, 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x6f,- 0x6e, 0x65, 0x00, 0x8b, 0x13, 0x78, 0x91, 0x79,- 0x1f, 0xe9, 0x69, 0x27, 0xad, 0x78, 0xe6, 0x4b,- 0x0a, 0xad, 0x7b, 0xde, 0xd0, 0x8b, 0xdc, 0x31,- 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x73, 0x6f,- 0x6d, 0x65, 0x00, 0xfd, 0x84, 0x30, 0xbc, 0x86,- 0x4c, 0xfc, 0xd5, 0xf1, 0x0e, 0x55, 0x90, 0xf8,- 0xa4, 0x47, 0xe0, 0x1b, 0x94, 0x2b, 0xfe, 0x31,- 0x30, 0x30, 0x36, 0x34, 0x34, 0x20, 0x74, 0x77,- 0x6f, 0x00, 0x78, 0x98, 0x19, 0x22, 0x61, 0x3b,- 0x2a, 0xfb, 0x60, 0x25, 0x04, 0x2f, 0xf6, 0xbd,- 0x87, 0x8a, 0xc1, 0x99, 0x4e, 0x85, 0x31, 0x30,- 0x30, 0x36, 0x34, 0x34, 0x20, 0x7a, 0x65, 0x72,- 0x6f, 0x00, 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1,- 0xd6, 0x43, 0x4b, 0x8b, 0x29, 0xae, 0x77, 0x5a,- 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91,-};--static git_rawobj tree_obj = {- tree_data,- sizeof(tree_data),- GIT_OBJ_TREE-};--static object_data tag = {- "09d373e1dfdc16b129ceec6dd649739911541e05",- "test-objects/09",- "test-objects/09/d373e1dfdc16b129ceec6dd649739911541e05",-};--static unsigned char tag_data[] = {- 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x33,- 0x64, 0x37, 0x66, 0x38, 0x61, 0x36, 0x61, 0x66,- 0x30, 0x37, 0x36, 0x63, 0x38, 0x63, 0x33, 0x66,- 0x32, 0x30, 0x30, 0x37, 0x31, 0x61, 0x38, 0x39,- 0x33, 0x35, 0x63, 0x64, 0x62, 0x65, 0x38, 0x32,- 0x32, 0x38, 0x35, 0x39, 0x34, 0x64, 0x31, 0x0a,- 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6f, 0x6d,- 0x6d, 0x69, 0x74, 0x0a, 0x74, 0x61, 0x67, 0x20,- 0x76, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x0a, 0x74,- 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x43, 0x20,- 0x4f, 0x20, 0x4d, 0x69, 0x74, 0x74, 0x65, 0x72,- 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,- 0x74, 0x65, 0x72, 0x40, 0x65, 0x78, 0x61, 0x6d,- 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x3e,- 0x20, 0x31, 0x32, 0x32, 0x37, 0x38, 0x31, 0x34,- 0x32, 0x39, 0x37, 0x20, 0x2b, 0x30, 0x30, 0x30,- 0x30, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20,- 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74,- 0x61, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63,- 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65,- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x76, 0x30,- 0x2e, 0x30, 0x2e, 0x31, 0x0a,-};--static git_rawobj tag_obj = {- tag_data,- sizeof(tag_data),- GIT_OBJ_TAG-};--static object_data zero = {- "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",- "test-objects/e6",- "test-objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391",-};--static unsigned char zero_data[] = {- 0x00 /* dummy data */-};--static git_rawobj zero_obj = {- zero_data,- 0,- GIT_OBJ_BLOB-};--static object_data one = {- "8b137891791fe96927ad78e64b0aad7bded08bdc",- "test-objects/8b",- "test-objects/8b/137891791fe96927ad78e64b0aad7bded08bdc",-};--static unsigned char one_data[] = {- 0x0a,-};--static git_rawobj one_obj = {- one_data,- sizeof(one_data),- GIT_OBJ_BLOB-};--static object_data two = {- "78981922613b2afb6025042ff6bd878ac1994e85",- "test-objects/78",- "test-objects/78/981922613b2afb6025042ff6bd878ac1994e85",-};--static unsigned char two_data[] = {- 0x61, 0x0a,-};--static git_rawobj two_obj = {- two_data,- sizeof(two_data),- GIT_OBJ_BLOB-};--static object_data some = {- "fd8430bc864cfcd5f10e5590f8a447e01b942bfe",- "test-objects/fd",- "test-objects/fd/8430bc864cfcd5f10e5590f8a447e01b942bfe",-};--static unsigned char some_data[] = {- 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68,- 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,- 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20,- 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,- 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61,- 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74,- 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69,- 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72,- 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a,- 0x20, 0x2a, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e,- 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,- 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66,- 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55,- 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,- 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20,- 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c,- 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,- 0x20, 0x32, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61,- 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,- 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74,- 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20,- 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,- 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74,- 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a,- 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64,- 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,- 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65,- 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,- 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,- 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e,- 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62,- 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65,- 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20,- 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68,- 0x6f, 0x72, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65,- 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x6c,- 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x70,- 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,- 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e,- 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,- 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20,- 0x2a, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,- 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69,- 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69,- 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x62,- 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74,- 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67,- 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x0a, 0x20, 0x2a,- 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20,- 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75,- 0x74, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65,- 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61,- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69,- 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e,- 0x79, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69,- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a,- 0x20, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20,- 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65,- 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20,- 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c,- 0x65, 0x2e, 0x20, 0x20, 0x28, 0x54, 0x68, 0x65,- 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,- 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20,- 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a,- 0x20, 0x2a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72,- 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,- 0x64, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79,- 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65,- 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63,- 0x74, 0x73, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20,- 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c,- 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x6f,- 0x76, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d,- 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,- 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74,- 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c,- 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73,- 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f,- 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e,- 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65,- 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20,- 0x2a, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x62,- 0x69, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x78, 0x65,- 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e,- 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20,- 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c,- 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73,- 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64,- 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,- 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61,- 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c,- 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65,- 0x66, 0x75, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74,- 0x0a, 0x20, 0x2a, 0x20, 0x57, 0x49, 0x54, 0x48,- 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20,- 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59,- 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75,- 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74,- 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69,- 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61,- 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20,- 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41,- 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54,- 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54,- 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52,- 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49,- 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55,- 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20,- 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,- 0x47, 0x4e, 0x55, 0x0a, 0x20, 0x2a, 0x20, 0x47,- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50,- 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69,- 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f,- 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64,- 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a,- 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f,- 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,- 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65,- 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61,- 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66,- 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55,- 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,- 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20,- 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a,- 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67,- 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,- 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72,- 0x61, 0x6d, 0x3b, 0x20, 0x73, 0x65, 0x65, 0x20,- 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65,- 0x20, 0x43, 0x4f, 0x50, 0x59, 0x49, 0x4e, 0x47,- 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f,- 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65,- 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x74,- 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20,- 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,- 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74,- 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x35, 0x31, 0x20,- 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e,- 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c,- 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46,- 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x2a,- 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c,- 0x20, 0x4d, 0x41, 0x20, 0x30, 0x32, 0x31, 0x31,- 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20,- 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x20, 0x2a, 0x2f,- 0x0a,-};--static git_rawobj some_obj = {- some_data,- sizeof(some_data),- GIT_OBJ_BLOB-};
− libgit2/src/tag.c
@@ -1,232 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "commit.h"-#include "tag.h"-#include "signature.h"-#include "git2/object.h"-#include "git2/repository.h"-#include "git2/signature.h"--void git_tag__free(git_tag *tag)-{- git_signature_free(tag->tagger);- free(tag->message);- free(tag->tag_name);- free(tag);-}--const git_oid *git_tag_id(git_tag *c)-{- return git_object_id((git_object *)c);-}--int git_tag_target(git_object **target, git_tag *t)-{- assert(t);- return git_object_lookup(target, t->object.repo, &t->target, t->type);-}--const git_oid *git_tag_target_oid(git_tag *t)-{- assert(t);- return &t->target;-}--int git_tag_set_target(git_tag *tag, git_object *target)-{- const git_oid *oid;-- assert(tag && target);-- if ((oid = git_object_id(target)) == NULL)- return GIT_EMISSINGOBJDATA;-- tag->object.modified = 1;- git_oid_cpy(&tag->target, oid);- tag->type = git_object_type(target);- return GIT_SUCCESS;-}--git_otype git_tag_type(git_tag *t)-{- assert(t);- return t->type;-}--const char *git_tag_name(git_tag *t)-{- assert(t);- return t->tag_name;-}--void git_tag_set_name(git_tag *tag, const char *name)-{- assert(tag && name);-- tag->object.modified = 1;-- if (tag->tag_name)- free(tag->tag_name);-- tag->tag_name = git__strdup(name);-}--const git_signature *git_tag_tagger(git_tag *t)-{- return t->tagger;-}--void git_tag_set_tagger(git_tag *tag, const git_signature *tagger_sig)-{- assert(tag && tagger_sig);- tag->object.modified = 1;-- git_signature_free(tag->tagger);- tag->tagger = git_signature_dup(tagger_sig);-}--const char *git_tag_message(git_tag *t)-{- assert(t);- return t->message;-}--void git_tag_set_message(git_tag *tag, const char *message)-{- assert(tag && message);-- tag->object.modified = 1;-- if (tag->message)- free(tag->message);-- tag->message = git__strdup(message);-}--static int parse_tag_buffer(git_tag *tag, char *buffer, const char *buffer_end)-{- static const char *tag_types[] = {- NULL, "commit\n", "tree\n", "blob\n", "tag\n"- };-- unsigned int i, text_len;- char *search;- int error;-- if ((error = git__parse_oid(&tag->target, &buffer, buffer_end, "object ")) < 0)- return error;-- if (buffer + 5 >= buffer_end)- return GIT_EOBJCORRUPTED;-- if (memcmp(buffer, "type ", 5) != 0)- return GIT_EOBJCORRUPTED;- buffer += 5;-- tag->type = GIT_OBJ_BAD;-- for (i = 1; i < ARRAY_SIZE(tag_types); ++i) {- size_t type_length = strlen(tag_types[i]);-- if (buffer + type_length >= buffer_end)- return GIT_EOBJCORRUPTED;-- if (memcmp(buffer, tag_types[i], type_length) == 0) {- tag->type = i;- buffer += type_length;- break;- }- }-- if (tag->type == GIT_OBJ_BAD)- return GIT_EOBJCORRUPTED;-- if (buffer + 4 >= buffer_end)- return GIT_EOBJCORRUPTED;-- if (memcmp(buffer, "tag ", 4) != 0)- return GIT_EOBJCORRUPTED;- buffer += 4;-- search = memchr(buffer, '\n', buffer_end - buffer);- if (search == NULL)- return GIT_EOBJCORRUPTED;-- text_len = search - buffer;-- if (tag->tag_name != NULL)- free(tag->tag_name);-- tag->tag_name = git__malloc(text_len + 1);- memcpy(tag->tag_name, buffer, text_len);- tag->tag_name[text_len] = '\0';-- buffer = search + 1;-- if (tag->tagger != NULL)- git_signature_free(tag->tagger);-- tag->tagger = git__malloc(sizeof(git_signature));-- if ((error = git_signature__parse(tag->tagger, &buffer, buffer_end, "tagger ")) != 0)- return error;-- text_len = buffer_end - ++buffer;-- if (tag->message != NULL)- free(tag->message);-- tag->message = git__malloc(text_len + 1);- memcpy(tag->message, buffer, text_len);- tag->message[text_len] = '\0';-- return GIT_SUCCESS;-}--int git_tag__writeback(git_tag *tag, git_odb_source *src)-{- if (tag->tag_name == NULL || tag->tagger == NULL)- return GIT_EMISSINGOBJDATA;-- git__write_oid(src, "object", &tag->target);- git__source_printf(src, "type %s\n", git_object_type2string(tag->type));- git__source_printf(src, "tag %s\n", tag->tag_name);- git_signature__write(src, "tagger", tag->tagger);-- if (tag->message != NULL)- git__source_printf(src, "\n%s", tag->message);-- return GIT_SUCCESS;-}---int git_tag__parse(git_tag *tag)-{- assert(tag && tag->object.source.open);- return parse_tag_buffer(tag, tag->object.source.raw.data, (char *)tag->object.source.raw.data + tag->object.source.raw.len);-}-
− libgit2/src/tag.h
@@ -1,22 +0,0 @@-#ifndef INCLUDE_tag_h__-#define INCLUDE_tag_h__--#include "git2/tag.h"-#include "repository.h"--struct git_tag {- git_object object;-- git_oid target;- git_otype type;-- char *tag_name;- git_signature *tagger;- char *message;-};--void git_tag__free(git_tag *tag);-int git_tag__parse(git_tag *tag);-int git_tag__writeback(git_tag *tag, git_odb_source *src);--#endif
− libgit2/src/thread-utils.c
@@ -1,49 +0,0 @@-#include "common.h"-#include "thread-utils.h"--#ifdef _WIN32-# define WIN32_LEAN_AND_MEAN-# include <windows.h>-#elif defined(hpux) || defined(__hpux) || defined(_hpux)-# include <sys/pstat.h>-#endif--/*- * By doing this in two steps we can at least get- * the function to be somewhat coherent, even- * with this disgusting nest of #ifdefs.- */-#ifndef _SC_NPROCESSORS_ONLN-# ifdef _SC_NPROC_ONLN-# define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN-# elif defined _SC_CRAY_NCPU-# define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU-# endif-#endif--int git_online_cpus(void)-{-#ifdef _SC_NPROCESSORS_ONLN- long ncpus;-#endif--#ifdef _WIN32- SYSTEM_INFO info;- GetSystemInfo(&info);-- if ((int)info.dwNumberOfProcessors > 0)- return (int)info.dwNumberOfProcessors;-#elif defined(hpux) || defined(__hpux) || defined(_hpux)- struct pst_dynamic psd;-- if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0))- return (int)psd.psd_proc_cnt;-#endif--#ifdef _SC_NPROCESSORS_ONLN- if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0)- return (int)ncpus;-#endif-- return 1;-}
− libgit2/src/thread-utils.h
@@ -1,28 +0,0 @@-#ifndef INCLUDE_thread_utils_h__-#define INCLUDE_thread_utils_h__---#define git_thread pthread_t-#define git_thread_create(thread, attr, start_routine, arg) pthread_create(thread, attr, start_routine, arg)-#define git_thread_kill(thread) pthread_cancel(thread)-#define git_thread_exit(status) pthread_exit(status)-#define git_thread_join(id, status) pthread_join(id, status)--/* Pthreads Mutex */-#define git_mutex pthread_mutex_t-#define git_mutex_init(a) pthread_mutex_init(a, NULL)-#define git_mutex_lock(a) pthread_mutex_lock(a)-#define git_mutex_unlock(a) pthread_mutex_unlock(a)-#define git_mutex_free(a) pthread_mutex_destroy(a)--/* Pthreads condition vars */-#define git_cond pthread_cond_t-#define git_cond_init(c, a) pthread_cond_init(c, a)-#define git_cond_free(c) pthread_cond_destroy(c)-#define git_cond_wait(c, l) pthread_cond_wait(c, l)-#define git_cond_signal(c) pthread_cond_signal(c)-#define git_cond_broadcast(c) pthread_cond_broadcast(c)--extern int git_online_cpus(void);--#endif /* INCLUDE_thread_utils_h__ */
− libgit2/src/tree.c
@@ -1,351 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "commit.h"-#include "tree.h"-#include "git2/repository.h"-#include "git2/object.h"--#define DEFAULT_TREE_SIZE 16-#define MAX_FILEMODE 0777777-#define MAX_FILEMODE_BYTES 6--int entry_search_cmp(const void *key, const void *array_member)-{- const char *filename = (const char *)key;- const git_tree_entry *entry = *(const git_tree_entry **)(array_member);-- return strcmp(filename, entry->filename);-}--static int valid_attributes(const int attributes) {- return attributes >= 0 && attributes <= MAX_FILEMODE; -}--int entry_sort_cmp(const void *a, const void *b)-{- const git_tree_entry *entry_a = *(const git_tree_entry **)(a);- const git_tree_entry *entry_b = *(const git_tree_entry **)(b);-- return gitfo_cmp_path(entry_a->filename, strlen(entry_a->filename),- entry_a->attr & 040000,- entry_b->filename, strlen(entry_b->filename),- entry_b->attr & 040000);-}--void git_tree_clear_entries(git_tree *tree)-{- unsigned int i;-- if (tree == NULL)- return;-- for (i = 0; i < tree->entries.length; ++i) {- git_tree_entry *e;- e = git_vector_get(&tree->entries, i);-- free(e->filename);- free(e);- }-- git_vector_clear(&tree->entries);- tree->object.modified = 1;-}---git_tree *git_tree__new(void)-{- git_tree *tree;-- tree = git__malloc(sizeof(struct git_tree));- if (tree == NULL)- return NULL;-- memset(tree, 0x0, sizeof(struct git_tree));-- if (git_vector_init(&tree->entries, DEFAULT_TREE_SIZE, entry_sort_cmp) < GIT_SUCCESS) {- free(tree);- return NULL;- }-- return tree;-}--void git_tree__free(git_tree *tree)-{- git_tree_clear_entries(tree);- git_vector_free(&tree->entries);- free(tree);-}--const git_oid *git_tree_id(git_tree *c)-{- return git_object_id((git_object *)c);-}--int git_tree_entry_set_attributes(git_tree_entry *entry, unsigned int attr)-{- assert(entry && entry->owner);- - if (!valid_attributes(attr)) {- return GIT_ERROR;- }-- entry->attr = attr;- entry->owner->object.modified = 1;- return GIT_SUCCESS;-}--void git_tree_entry_set_name(git_tree_entry *entry, const char *name)-{- assert(entry && entry->owner);-- free(entry->filename);- entry->filename = git__strdup(name);- git_vector_sort(&entry->owner->entries);- entry->owner->object.modified = 1;-}--void git_tree_entry_set_id(git_tree_entry *entry, const git_oid *oid)-{- assert(entry && entry->owner);-- git_oid_cpy(&entry->oid, oid);- entry->owner->object.modified = 1;-}--unsigned int git_tree_entry_attributes(git_tree_entry *entry)-{- return entry->attr;-}--const char *git_tree_entry_name(git_tree_entry *entry)-{- assert(entry);- return entry->filename;-}--const git_oid *git_tree_entry_id(git_tree_entry *entry)-{- assert(entry);- return &entry->oid;-}--int git_tree_entry_2object(git_object **object_out, git_tree_entry *entry)-{- assert(entry && object_out);- return git_object_lookup(object_out, entry->owner->object.repo, &entry->oid, GIT_OBJ_ANY);-}--static void sort_entries(git_tree *tree)-{- git_vector_sort(&tree->entries);-}--git_tree_entry *git_tree_entry_byname(git_tree *tree, const char *filename)-{- int idx;-- assert(tree && filename);-- sort_entries(tree);-- idx = git_vector_bsearch2(&tree->entries, entry_search_cmp, filename);- if (idx == GIT_ENOTFOUND)- return NULL;-- return git_vector_get(&tree->entries, idx);-}--git_tree_entry *git_tree_entry_byindex(git_tree *tree, int idx)-{- assert(tree);-- sort_entries(tree);-- return git_vector_get(&tree->entries, (unsigned int)idx);-}--size_t git_tree_entrycount(git_tree *tree)-{- assert(tree);- return tree->entries.length;-}--int git_tree_add_entry(git_tree_entry **entry_out, git_tree *tree, const git_oid *id, const char *filename, int attributes)-{- git_tree_entry *entry;-- assert(tree && id && filename);- if (!valid_attributes(attributes)) {- return GIT_ERROR;- }-- if ((entry = git__malloc(sizeof(git_tree_entry))) == NULL)- return GIT_ENOMEM;-- memset(entry, 0x0, sizeof(git_tree_entry));-- entry->filename = git__strdup(filename);- git_oid_cpy(&entry->oid, id);- entry->attr = attributes;- entry->owner = tree;-- if (git_vector_insert(&tree->entries, entry) < 0)- return GIT_ENOMEM;-- if (entry_out != NULL)- *entry_out = entry;-- tree->object.modified = 1;- return GIT_SUCCESS;-}--int git_tree_remove_entry_byindex(git_tree *tree, int idx)-{- git_tree_entry *remove_ptr;-- assert(tree);-- sort_entries(tree);-- remove_ptr = git_vector_get(&tree->entries, (unsigned int)idx);- if (remove_ptr == NULL)- return GIT_ENOTFOUND;-- free(remove_ptr->filename);- free(remove_ptr);-- tree->object.modified = 1;-- return git_vector_remove(&tree->entries, (unsigned int)idx);-}--int git_tree_remove_entry_byname(git_tree *tree, const char *filename)-{- int idx;-- assert(tree && filename);-- sort_entries(tree);-- idx = git_vector_bsearch2(&tree->entries, entry_search_cmp, filename);- if (idx == GIT_ENOTFOUND)- return GIT_ENOTFOUND;-- return git_tree_remove_entry_byindex(tree, idx);-}--int git_tree__writeback(git_tree *tree, git_odb_source *src)-{- size_t i;- char filemode[MAX_FILEMODE_BYTES + 1 + 1];-- assert(tree && src);-- if (tree->entries.length == 0)- return GIT_EMISSINGOBJDATA;-- sort_entries(tree);-- for (i = 0; i < tree->entries.length; ++i) {- git_tree_entry *entry;-- entry = git_vector_get(&tree->entries, i);- - snprintf(filemode, sizeof(filemode), "%o ", entry->attr);- - git__source_write(src, filemode, strlen(filemode));- git__source_write(src, entry->filename, strlen(entry->filename) + 1);- git__source_write(src, entry->oid.id, GIT_OID_RAWSZ);- } -- return GIT_SUCCESS;-}---static int tree_parse_buffer(git_tree *tree, char *buffer, char *buffer_end)-{- static const size_t avg_entry_size = 40;- unsigned int expected_size;- int error = GIT_SUCCESS;-- expected_size = (tree->object.source.raw.len / avg_entry_size) + 1;-- git_tree_clear_entries(tree);-- while (buffer < buffer_end) {- git_tree_entry *entry;-- entry = git__malloc(sizeof(git_tree_entry));- if (entry == NULL) {- error = GIT_ENOMEM;- break;- }-- if (git_vector_insert(&tree->entries, entry) < GIT_SUCCESS)- return GIT_ENOMEM;-- entry->owner = tree;- entry->attr = strtol(buffer, &buffer, 8);-- if (*buffer++ != ' ') {- error = GIT_EOBJCORRUPTED;- break;- }-- if (memchr(buffer, 0, buffer_end - buffer) == NULL) {- error = GIT_EOBJCORRUPTED;- break;- }-- entry->filename = git__strdup(buffer);-- while (buffer < buffer_end && *buffer != 0)- buffer++;-- buffer++;-- git_oid_mkraw(&entry->oid, (const unsigned char *)buffer);- buffer += GIT_OID_RAWSZ;- }-- return error;-}--int git_tree__parse(git_tree *tree)-{- char *buffer, *buffer_end;-- assert(tree && tree->object.source.open);- assert(!tree->object.in_memory);-- buffer = tree->object.source.raw.data;- buffer_end = buffer + tree->object.source.raw.len;-- return tree_parse_buffer(tree, buffer, buffer_end);-}-
− libgit2/src/tree.h
@@ -1,26 +0,0 @@-#ifndef INCLUDE_tree_h__-#define INCLUDE_tree_h__--#include "git2/tree.h"-#include "repository.h"-#include "vector.h"--struct git_tree_entry {- unsigned int attr;- char *filename;- git_oid oid;-- git_tree *owner;-};--struct git_tree {- git_object object;- git_vector entries;-};--void git_tree__free(git_tree *tree);-git_tree *git_tree__new(void);-int git_tree__parse(git_tree *tree);-int git_tree__writeback(git_tree *tree, git_odb_source *src);--#endif
− libgit2/src/unix/map.c
@@ -1,61 +0,0 @@--#include "map.h"-#include <sys/mman.h>-#include <errno.h>---int git__mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)-{- int mprot = 0;- int mflag = 0;-- assert((out != NULL) && (len > 0));-- if ((out == NULL) || (len == 0)) {- errno = EINVAL;- return GIT_ERROR;- }-- out->data = NULL;- out->len = 0;-- if (prot & GIT_PROT_WRITE)- mprot = PROT_WRITE;- else if (prot & GIT_PROT_READ)- mprot = PROT_READ;- else {- errno = EINVAL;- return GIT_ERROR;- }-- if ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED)- mflag = MAP_SHARED;- else if ((flags & GIT_MAP_TYPE) == GIT_MAP_PRIVATE)- mflag = MAP_PRIVATE;-- if (flags & GIT_MAP_FIXED) {- errno = EINVAL;- return GIT_ERROR;- }-- out->data = mmap(NULL, len, mprot, mflag, fd, offset);- if (!out->data || out->data == MAP_FAILED)- return GIT_EOSERR;- out->len = len;-- return GIT_SUCCESS;-}--int git__munmap(git_map *map)-{- assert(map != NULL);-- if (!map)- return GIT_ERROR;-- munmap(map->data, map->len);-- return GIT_SUCCESS;-}--
− libgit2/src/util.c
@@ -1,406 +0,0 @@-#define GIT__NO_HIDE_MALLOC-#include "common.h"-#include <stdarg.h>-#include <stdio.h>--void git_strarray_free(git_strarray *array)-{- size_t i;- for (i = 0; i < array->count; ++i)- free(array->strings[i]);-- free(array->strings);-}--int git__fmt(char *buf, size_t buf_sz, const char *fmt, ...)-{- va_list va;- int r;-- va_start(va, fmt);- r = vsnprintf(buf, buf_sz, fmt, va);- va_end(va);- if (r < 0 || ((size_t) r) >= buf_sz)- return GIT_ERROR;- return r;-}--int git__prefixcmp(const char *str, const char *prefix)-{- for (;;) {- char p = *(prefix++), s;- if (!p)- return 0;- if ((s = *(str++)) != p)- return s - p;- }-}--int git__suffixcmp(const char *str, const char *suffix)-{- size_t a = strlen(str);- size_t b = strlen(suffix);- if (a < b)- return -1;- return strcmp(str + (a - b), suffix);-}--/*- * Based on the Android implementation, BSD licensed.- * Check http://android.git.kernel.org/- */-int git__basename_r(char *buffer, size_t bufflen, const char *path)-{- const char *endp, *startp;- int len, result;-- /* Empty or NULL string gets treated as "." */- if (path == NULL || *path == '\0') {- startp = ".";- len = 1;- goto Exit;- }-- /* Strip trailing slashes */- endp = path + strlen(path) - 1;- while (endp > path && *endp == '/')- endp--;-- /* All slashes becomes "/" */- if (endp == path && *endp == '/') {- startp = "/";- len = 1;- goto Exit;- }-- /* Find the start of the base */- startp = endp;- while (startp > path && *(startp - 1) != '/')- startp--;-- len = endp - startp +1;--Exit:- result = len;- if (buffer == NULL) {- return result;- }- if (len > (int)bufflen-1) {- len = (int)bufflen-1;- result = GIT_ENOMEM;- }-- if (len >= 0) {- memmove(buffer, startp, len);- buffer[len] = 0;- }- return result;-}--/*- * Based on the Android implementation, BSD licensed.- * Check http://android.git.kernel.org/- */-int git__dirname_r(char *buffer, size_t bufflen, const char *path)-{- const char *endp;- int result, len;-- /* Empty or NULL string gets treated as "." */- if (path == NULL || *path == '\0') {- path = ".";- len = 1;- goto Exit;- }-- /* Strip trailing slashes */- endp = path + strlen(path) - 1;- while (endp > path && *endp == '/')- endp--;-- /* Find the start of the dir */- while (endp > path && *endp != '/')- endp--;-- /* Either the dir is "/" or there are no slashes */- if (endp == path) {- path = (*endp == '/') ? "/" : ".";- len = 1;- goto Exit;- }-- do {- endp--;- } while (endp > path && *endp == '/');-- len = endp - path +1;--Exit:- result = len;- if (len+1 > GIT_PATH_MAX) {- return GIT_ENOMEM;- }- if (buffer == NULL)- return result;-- if (len > (int)bufflen-1) {- len = (int)bufflen-1;- result = GIT_ENOMEM;- }-- if (len >= 0) {- memmove(buffer, path, len);- buffer[len] = 0;- }- return result;-}---char *git__dirname(const char *path)-{- char *dname = NULL;- int len;-- len = (path ? strlen(path) : 0) + 2;- dname = (char *)git__malloc(len);- if (dname == NULL)- return NULL;-- if (git__dirname_r(dname, len, path) < GIT_SUCCESS) {- free(dname);- return NULL;- }-- return dname;-}--char *git__basename(const char *path)-{- char *bname = NULL;- int len;-- len = (path ? strlen(path) : 0) + 2;- bname = (char *)git__malloc(len);- if (bname == NULL)- return NULL;-- if (git__basename_r(bname, len, path) < GIT_SUCCESS) {- free(bname);- return NULL;- }-- return bname;-}---const char *git__topdir(const char *path)-{- size_t len;- int i;-- assert(path);- len = strlen(path);-- if (!len || path[len - 1] != '/')- return NULL;-- for (i = len - 2; i >= 0; --i)- if (path[i] == '/')- break;-- return &path[i + 1];-}--void git__joinpath_n(char *buffer_out, int count, ...)-{- va_list ap;- int i;- char *buffer_start = buffer_out;-- va_start(ap, count);- for (i = 0; i < count; ++i) {- const char *path;- int len;-- path = va_arg(ap, const char *);- if (i > 0 && *path == '/' && buffer_out > buffer_start && buffer_out[-1] == '/')- path++;-- if (!*path)- continue;-- len = strlen(path);- memmove(buffer_out, path, len);- buffer_out = buffer_out + len;-- if (i < count - 1 && buffer_out[-1] != '/')- *buffer_out++ = '/';- }- va_end(ap);-- *buffer_out = '\0';-}--static char *strtok_raw(char *output, char *src, char *delimit, int keep)-{- while (*src && strchr(delimit, *src) == NULL)- *output++ = *src++;-- *output = 0;-- if (keep)- return src;- else- return *src ? src+1 : src;-}--char *git__strtok(char *output, char *src, char *delimit)-{- return strtok_raw(output, src, delimit, 0);-}--char *git__strtok_keep(char *output, char *src, char *delimit)-{- return strtok_raw(output, src, delimit, 1);-}--void git__hexdump(const char *buffer, size_t len)-{- static const size_t LINE_WIDTH = 16;-- size_t line_count, last_line, i, j;- const char *line;-- line_count = (len / LINE_WIDTH);- last_line = (len % LINE_WIDTH);-- for (i = 0; i < line_count; ++i) {- line = buffer + (i * LINE_WIDTH);- for (j = 0; j < LINE_WIDTH; ++j, ++line)- printf("%02X ", (unsigned char)*line & 0xFF);-- printf("| ");-- line = buffer + (i * LINE_WIDTH);- for (j = 0; j < LINE_WIDTH; ++j, ++line)- printf("%c", (*line >= 32 && *line <= 126) ? *line : '.');-- printf("\n");- }-- if (last_line > 0) {-- line = buffer + (line_count * LINE_WIDTH);- for (j = 0; j < last_line; ++j, ++line)- printf("%02X ", (unsigned char)*line & 0xFF);-- for (j = 0; j < (LINE_WIDTH - last_line); ++j)- printf(" ");-- printf("| ");-- line = buffer + (line_count * LINE_WIDTH);- for (j = 0; j < last_line; ++j, ++line)- printf("%c", (*line >= 32 && *line <= 126) ? *line : '.');-- printf("\n");- }-- printf("\n");-}--#ifdef GIT_LEGACY_HASH-uint32_t git__hash(const void *key, int len, unsigned int seed)-{- const uint32_t m = 0x5bd1e995;- const int r = 24;- uint32_t h = seed ^ len;-- const unsigned char *data = (const unsigned char *)key;-- while(len >= 4) {- uint32_t k = *(uint32_t *)data;-- k *= m; - k ^= k >> r; - k *= m; - - h *= m; - h ^= k;-- data += 4;- len -= 4;- }- - switch(len) {- case 3: h ^= data[2] << 16;- case 2: h ^= data[1] << 8;- case 1: h ^= data[0];- h *= m;- };-- h ^= h >> 13;- h *= m;- h ^= h >> 15;-- return h;-} -#else-/*- Cross-platform version of Murmurhash3- http://code.google.com/p/smhasher/wiki/MurmurHash3- by Austin Appleby (aappleby@gmail.com)-- This code is on the public domain.-*/-uint32_t git__hash(const void *key, int len, uint32_t seed)-{--#define MURMUR_BLOCK() {\- k1 *= c1; \- k1 = git__rotl(k1,11);\- k1 *= c2;\- h1 ^= k1;\- h1 = h1*3 + 0x52dce729;\- c1 = c1*5 + 0x7b7d159c;\- c2 = c2*5 + 0x6bce6396;\-}-- const uint8_t *data = (const uint8_t*)key;- const int nblocks = len / 4;-- const uint32_t *blocks = (const uint32_t *)(data + nblocks * 4);- const uint8_t *tail = (const uint8_t *)(data + nblocks * 4);-- uint32_t h1 = 0x971e137b ^ seed;- uint32_t k1;-- uint32_t c1 = 0x95543787;- uint32_t c2 = 0x2ad7eb25;-- int i;-- for (i = -nblocks; i; i++) {- k1 = blocks[i];- MURMUR_BLOCK();- }-- k1 = 0;-- switch(len & 3) {- case 3: k1 ^= tail[2] << 16;- case 2: k1 ^= tail[1] << 8;- case 1: k1 ^= tail[0];- MURMUR_BLOCK();- }-- h1 ^= len;- h1 ^= h1 >> 16;- h1 *= 0x85ebca6b;- h1 ^= h1 >> 13;- h1 *= 0xc2b2ae35;- h1 ^= h1 >> 16;-- return h1;-} -#endif
− libgit2/src/util.h
@@ -1,119 +0,0 @@-#ifndef INCLUDE_util_h__-#define INCLUDE_util_h__--#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))-#define bitsizeof(x) (CHAR_BIT * sizeof(x))-#define MSB(x, bits) ((x) & (~0ULL << (bitsizeof(x) - (bits))))--/* - * Don't wrap malloc/calloc.- * Use the default versions in glibc, and make- * sure that any methods that allocate memory- * return a GIT_ENOMEM error when allocation- * fails.- */-#define git__malloc malloc-#define git__calloc calloc-#define git__strdup strdup--extern int git__fmt(char *, size_t, const char *, ...)- GIT_FORMAT_PRINTF(3, 4);-extern int git__prefixcmp(const char *str, const char *prefix);-extern int git__suffixcmp(const char *str, const char *suffix);--/*- * The dirname() function shall take a pointer to a character string- * that contains a pathname, and return a pointer to a string that is a- * pathname of the parent directory of that file. Trailing '/' characters- * in the path are not counted as part of the path.- *- * If path does not contain a '/', then dirname() shall return a pointer to- * the string ".". If path is a null pointer or points to an empty string,- * dirname() shall return a pointer to the string "." .- *- * The `git__dirname` implementation is thread safe. The returned - * string must be manually free'd.- *- * The `git__dirname_r` implementation expects a string allocated- * by the user with big enough size.- */-extern char *git__dirname(const char *path);-extern int git__dirname_r(char *buffer, size_t bufflen, const char *path);--/*- * This function returns the basename of the file, which is the last- * part of its full name given by fname, with the drive letter and- * leading directories stripped off. For example, the basename of- * c:/foo/bar/file.ext is file.ext, and the basename of a:foo is foo.- *- * Trailing slashes and backslashes are significant: the basename of- * c:/foo/bar/ is an empty string after the rightmost slash.- *- * The `git__basename` implementation is thread safe. The returned - * string must be manually free'd.- *- * The `git__basename_r` implementation expects a string allocated- * by the user with big enough size.- */-extern char *git__basename(const char *path);-extern int git__basename_r(char *buffer, size_t bufflen, const char *path);--extern const char *git__topdir(const char *path);--/**- * Join two paths together. Takes care of properly fixing the- * middle slashes and everything- *- * The paths are joined together into buffer_out; this is expected- * to be an user allocated buffer of `GIT_PATH_MAX` size - */-extern void git__joinpath_n(char *buffer_out, int npath, ...);--GIT_INLINE(void) git__joinpath(char *buffer_out, const char *path_a, const char *path_b)-{- git__joinpath_n(buffer_out, 2, path_a, path_b);-}--extern void git__hexdump(const char *buffer, size_t n);-extern uint32_t git__hash(const void *key, int len, uint32_t seed);---/** @return true if p fits into the range of a size_t */-GIT_INLINE(int) git__is_sizet(git_off_t p)-{- size_t r = (size_t)p;- return p == (git_off_t)r;-}--/* 32-bit cross-platform rotl */-#ifdef _MSC_VER /* use built-in method in MSVC */-# define git__rotl(v, s) (uint32_t)_rotl(v, s)-#else /* use bitops in GCC; with o2 this gets optimized to a rotl instruction */-# define git__rotl(v, s) (uint32_t)(((uint32_t)(v) << (s)) | ((uint32_t)(v) >> (32 - (s))))-#endif--extern char *git__strtok(char *output, char *src, char *delimit);-extern char *git__strtok_keep(char *output, char *src, char *delimit);--#define STRLEN(str) (sizeof(str) - 1)--/*- * Realloc the buffer pointed at by variable 'x' so that it can hold- * at least 'nr' entries; the number of entries currently allocated- * is 'alloc', using the standard growing factor alloc_nr() macro.- *- * DO NOT USE any expression with side-effect for 'x' or 'alloc'.- */-#define alloc_nr(x) (((x)+16)*3/2)-#define ALLOC_GROW(x, nr, alloc) \- do { \- if ((nr) > alloc) { \- if (alloc_nr(alloc) < (nr)) \- alloc = (nr); \- else \- alloc = alloc_nr(alloc); \- x = xrealloc((x), alloc * sizeof(*(x))); \- } \- } while (0)--#endif /* INCLUDE_util_h__ */
− libgit2/src/vector.c
@@ -1,175 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- */--#include "common.h"-#include "repository.h"-#include "vector.h"--static const double resize_factor = 1.75;-static const size_t minimum_size = 8;--static int resize_vector(git_vector *v)-{- v->_alloc_size = ((unsigned int)(v->_alloc_size * resize_factor)) + 1;- if (v->_alloc_size < minimum_size)- v->_alloc_size = minimum_size;-- v->contents = realloc(v->contents, v->_alloc_size * sizeof(void *));- if (v->contents == NULL)- return GIT_ENOMEM;-- return GIT_SUCCESS;-}---void git_vector_free(git_vector *v)-{- assert(v);- free(v->contents);-}--int git_vector_init(git_vector *v, unsigned int initial_size, git_vector_cmp cmp)-{- assert(v);-- memset(v, 0x0, sizeof(git_vector));-- if (initial_size == 0)- initial_size = minimum_size;-- v->_alloc_size = initial_size;- v->_cmp = cmp;- - v->length = 0;- v->sorted = 1;-- v->contents = git__malloc(v->_alloc_size * sizeof(void *));- if (v->contents == NULL)- return GIT_ENOMEM;-- return GIT_SUCCESS;-}--int git_vector_insert(git_vector *v, void *element)-{- assert(v);-- if (v->length >= v->_alloc_size) {- if (resize_vector(v) < 0)- return GIT_ENOMEM;- }-- v->contents[v->length++] = element;- v->sorted = 0;-- return GIT_SUCCESS;-}--void git_vector_sort(git_vector *v)-{- assert(v);-- if (v->sorted || v->_cmp == NULL)- return;-- qsort(v->contents, v->length, sizeof(void *), v->_cmp);- v->sorted = 1;-}--int git_vector_bsearch2(git_vector *v, git_vector_cmp key_lookup, const void *key)-{- void **find;-- assert(v && key && key_lookup);-- /* need comparison function to sort the vector */- if (v->_cmp == NULL)- return GIT_ENOTFOUND;-- git_vector_sort(v);-- find = bsearch(key, v->contents, v->length, sizeof(void *), key_lookup);- if (find != NULL)- return (int)(find - v->contents);-- return GIT_ENOTFOUND;-}--int git_vector_search2(git_vector *v, git_vector_cmp key_lookup, const void *key)-{- unsigned int i;-- assert(v && key && key_lookup);-- for (i = 0; i < v->length; ++i) {- if (key_lookup(key, v->contents[i]) == 0)- return i;- }-- return GIT_ENOTFOUND;-}--static int strict_comparison(const void *a, const void *b)-{- return (a == b) ? 0 : -1;-}--int git_vector_search(git_vector *v, const void *entry)-{- return git_vector_search2(v, v->_cmp ? v->_cmp : strict_comparison, entry);-}--int git_vector_bsearch(git_vector *v, const void *key)-{- if (v->_cmp == NULL)- return GIT_ENOTFOUND;-- return git_vector_bsearch2(v, v->_cmp, key);-}--int git_vector_remove(git_vector *v, unsigned int idx)-{- unsigned int i;-- assert(v);-- if (idx >= v->length || v->length == 0)- return GIT_ENOTFOUND;-- for (i = idx; i < v->length - 1; ++i)- v->contents[i] = v->contents[i + 1];-- v->length--;- return GIT_SUCCESS;-}--void git_vector_clear(git_vector *v)-{- assert(v);- v->length = 0;- v->sorted = 1;-}--
− libgit2/src/vector.h
@@ -1,36 +0,0 @@-#ifndef INCLUDE_vector_h__-#define INCLUDE_vector_h__--#include "git2/common.h"--typedef int (*git_vector_cmp)(const void *, const void *);--typedef struct git_vector {- unsigned int _alloc_size;- git_vector_cmp _cmp;- void **contents;- unsigned int length;- int sorted;-} git_vector;--int git_vector_init(git_vector *v, unsigned int initial_size, git_vector_cmp cmp);-void git_vector_free(git_vector *v);-void git_vector_clear(git_vector *v);--int git_vector_search(git_vector *v, const void *entry);-int git_vector_search2(git_vector *v, git_vector_cmp cmp, const void *key);--int git_vector_bsearch(git_vector *v, const void *entry);-int git_vector_bsearch2(git_vector *v, git_vector_cmp cmp, const void *key);--void git_vector_sort(git_vector *v);--GIT_INLINE(void *) git_vector_get(git_vector *v, unsigned int position)-{- return (position < v->length) ? v->contents[position] : NULL;-}--int git_vector_insert(git_vector *v, void *element);-int git_vector_remove(git_vector *v, unsigned int idx);--#endif
− libgit2/src/win32/dir.c
@@ -1,98 +0,0 @@-#define GIT__WIN32_NO_WRAP_DIR-#include "dir.h"--static int init_filter(char *filter, size_t n, const char *dir)-{- size_t len = strlen(dir);-- if (len+3 >= n)- return 0;-- strcpy(filter, dir);- if (len && dir[len-1] != '/')- strcat(filter, "/");- strcat(filter, "*");-- return 1;-}--git__DIR *git__opendir(const char *dir)-{- char filter[4096];- git__DIR *new;-- if (!dir || !init_filter(filter, sizeof(filter), dir))- return NULL;-- new = git__malloc(sizeof(*new));- if (!new)- return NULL;-- new->dir = git__malloc(strlen(dir)+1);- if (!new->dir) {- free(new);- return NULL;- }- strcpy(new->dir, dir);-- new->h = FindFirstFile(filter, &new->f);- if (new->h == INVALID_HANDLE_VALUE) {- free(new->dir);- free(new);- return NULL;- }- new->first = 1;-- return new;-}--struct git__dirent *git__readdir(git__DIR *d)-{- if (!d || d->h == INVALID_HANDLE_VALUE)- return NULL;-- if (d->first)- d->first = 0;- else {- if (!FindNextFile(d->h, &d->f))- return NULL;- }-- if (strlen(d->f.cFileName) >= sizeof(d->entry.d_name))- return NULL;-- d->entry.d_ino = 0;- strcpy(d->entry.d_name, d->f.cFileName);-- return &d->entry;-}--void git__rewinddir(git__DIR *d)-{- char filter[4096];-- if (d) {- if (d->h != INVALID_HANDLE_VALUE)- FindClose(d->h);- d->h = INVALID_HANDLE_VALUE;- d->first = 0;- if (init_filter(filter, sizeof(filter), d->dir)) {- d->h = FindFirstFile(filter, &d->f);- if (d->h != INVALID_HANDLE_VALUE)- d->first = 1;- }- }-}--int git__closedir(git__DIR *d)-{- if (d) {- if (d->h != INVALID_HANDLE_VALUE)- FindClose(d->h);- if (d->dir)- free(d->dir);- free(d);- }- return 0;-}-
− libgit2/src/win32/fileops.c
@@ -1,41 +0,0 @@-#define GIT__WIN32_NO_HIDE_FILEOPS-#include "fileops.h"-#include <errno.h>--int git__unlink(const char *path)-{- chmod(path, 0666);- return unlink(path);-}--int git__mkstemp(char *template)-{- char *file = mktemp(template);- if (file == NULL)- return -1;- return open(file, O_RDWR | O_CREAT | O_BINARY, 0600);-}--int git__fsync(int fd)-{- HANDLE fh = (HANDLE)_get_osfhandle(fd);-- if (fh == INVALID_HANDLE_VALUE) {- errno = EBADF;- return -1;- }-- if (!FlushFileBuffers(fh)) {- DWORD code = GetLastError();-- if (code == ERROR_INVALID_HANDLE)- errno = EINVAL;- else- errno = EIO;-- return -1;- }-- return 0;-}-
− libgit2/src/win32/map.c
@@ -1,125 +0,0 @@--#include "map.h"-#include <errno.h>---static DWORD get_page_size(void)-{- static DWORD page_size;- SYSTEM_INFO sys;-- if (!page_size) {- GetSystemInfo(&sys);- page_size = sys.dwAllocationGranularity;- }-- return page_size;-}--int git__mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)-{- HANDLE fh = (HANDLE)_get_osfhandle(fd);- DWORD page_size = get_page_size();- DWORD fmap_prot = 0;- DWORD view_prot = 0;- DWORD off_low = 0;- DWORD off_hi = 0;- git_off_t page_start;- git_off_t page_offset;-- assert((out != NULL) && (len > 0));-- if ((out == NULL) || (len == 0)) {- errno = EINVAL;- return GIT_ERROR;- }-- out->data = NULL;- out->len = 0;- out->fmh = NULL;-- if (fh == INVALID_HANDLE_VALUE) {- errno = EBADF;- return GIT_ERROR;- }-- if (prot & GIT_PROT_WRITE)- fmap_prot |= PAGE_READWRITE;- else if (prot & GIT_PROT_READ)- fmap_prot |= PAGE_READONLY;- else {- errno = EINVAL;- return GIT_ERROR;- }-- if (prot & GIT_PROT_WRITE)- view_prot |= FILE_MAP_WRITE;- if (prot & GIT_PROT_READ)- view_prot |= FILE_MAP_READ;-- if (flags & GIT_MAP_FIXED) {- errno = EINVAL;- return GIT_ERROR;- }-- page_start = (offset / page_size) * page_size;- page_offset = offset - page_start;-- if (page_offset != 0) { /* offset must be multiple of page size */- errno = EINVAL;- return GIT_ERROR;- }-- out->fmh = CreateFileMapping(fh, NULL, fmap_prot, 0, 0, NULL);- if (!out->fmh || out->fmh == INVALID_HANDLE_VALUE) {- /* errno = ? */- out->fmh = NULL;- return GIT_ERROR;- }-- assert(sizeof(git_off_t) == 8);- off_low = (DWORD)(page_start);- off_hi = (DWORD)(page_start >> 32);- out->data = MapViewOfFile(out->fmh, view_prot, off_hi, off_low, len);- if (!out->data) {- /* errno = ? */- CloseHandle(out->fmh);- out->fmh = NULL;- return GIT_ERROR;- }- out->len = len;-- return GIT_SUCCESS;-}--int git__munmap(git_map *map)-{- assert(map != NULL);-- if (!map)- return GIT_ERROR;-- if (map->data) {- if (!UnmapViewOfFile(map->data)) {- /* errno = ? */- CloseHandle(map->fmh);- map->data = NULL;- map->fmh = NULL;- return GIT_ERROR;- }- map->data = NULL;- }-- if (map->fmh) {- if (!CloseHandle(map->fmh)) {- /* errno = ? */- map->fmh = NULL;- return GIT_ERROR;- }- map->fmh = NULL;- }-- return GIT_SUCCESS;-}--
− libgit2/src/win32/pthread.c
@@ -1,120 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- *- * Original code by Ramiro Polla (Public Domain)- */--#include "pthread.h"--int pthread_create(pthread_t *GIT_RESTRICT thread,- const pthread_attr_t *GIT_RESTRICT GIT_UNUSED(attr),- void *(*start_routine)(void*), void *GIT_RESTRICT arg)-{- GIT_UNUSED_ARG(attr);- *thread = (pthread_t) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL);- return *thread ? GIT_SUCCESS : GIT_EOSERR;-}--int pthread_cond_signal(pthread_cond_t *cond)-{- WakeConditionVariable(cond);- return 0;-}--int pthread_cond_wait(pthread_cond_t *GIT_RESTRICT cond,- pthread_mutex_t *GIT_RESTRICT mutex)-{- int ret;- ret = SleepConditionVariableCS(cond, mutex, INFINITE);- return -(!ret);-}--int pthread_mutex_lock(pthread_mutex_t *mutex)-{- EnterCriticalSection(mutex);- return 0;-}--int pthread_mutex_unlock(pthread_mutex_t *mutex)-{- LeaveCriticalSection(mutex);- return 0;-}--int pthread_join(pthread_t thread, void **value_ptr)-{- int ret;- ret = WaitForSingleObject(thread, INFINITE);- if (ret && value_ptr)- GetExitCodeThread(thread, (void*) value_ptr);- return -(!!ret);-}--int pthread_cond_broadcast(pthread_cond_t *cond)-{- WakeAllConditionVariable(cond);- return 0;-}--int pthread_mutex_destroy(pthread_mutex_t *mutex)-{- int ret;- ret = CloseHandle(mutex);- return -(!ret);-}--int pthread_cond_destroy(pthread_cond_t *GIT_UNUSED(cond))-{- GIT_UNUSED_ARG(cond);- return 0;-}--int pthread_cond_init(pthread_cond_t *GIT_RESTRICT cond,- const pthread_condattr_t *GIT_RESTRICT GIT_UNUSED(condattr))-{- GIT_UNUSED_ARG(condattr);- InitializeConditionVariable(cond);- return 0;-}--int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT mutex,- const pthread_mutexattr_t *GIT_RESTRICT GIT_UNUSED(mutexattr))-{- GIT_UNUSED_ARG(mutexattr);- InitializeCriticalSection(mutex);- return 0;-}--int pthread_num_processors_np(void)-{- DWORD_PTR p, s;- int n = 0;-- if (GetProcessAffinityMask(GetCurrentProcess(), &p, &s))- for (; p; p >>= 1)- n += p&1;-- return n ? n : 1;-}-
− libgit2/src/win32/pthread.h
@@ -1,67 +0,0 @@-/*- * This file is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License, version 2,- * as published by the Free Software Foundation.- *- * In addition to the permissions in the GNU General Public License,- * the authors give you unlimited permission to link the compiled- * version of this file into combinations with other programs,- * and to distribute those combinations without any restriction- * coming from the use of this file. (The General Public License- * restrictions do apply in other respects; for example, they cover- * modification of the file, and distribution when not linked into- * a combined executable.)- *- * This file is distributed in the hope that it will be useful, but- * WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU- * General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; see the file COPYING. If not, write to- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,- * Boston, MA 02110-1301, USA.- *- * Original code by Ramiro Polla (Public Domain)- */--#ifndef GIT_PTHREAD_H-#define GIT_PTHREAD_H--#include "../common.h"--#if defined (_MSC_VER)-# define GIT_RESTRICT __restrict-#else-# define GIT_RESTRICT __restrict__-#endif--typedef int pthread_mutexattr_t;-typedef int pthread_condattr_t;-typedef int pthread_attr_t;-typedef CRITICAL_SECTION pthread_mutex_t;-typedef CONDITION_VARIABLE pthread_cond_t;-typedef HANDLE pthread_t;--#define PTHREAD_MUTEX_INITIALIZER {(void*)-1};--int pthread_create(pthread_t *GIT_RESTRICT,- const pthread_attr_t *GIT_RESTRICT,- void *(*start_routine)(void*), void *__restrict);--int pthread_join(pthread_t, void **);--int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT, const pthread_mutexattr_t *GIT_RESTRICT);-int pthread_mutex_destroy(pthread_mutex_t *);-int pthread_mutex_lock(pthread_mutex_t *);-int pthread_mutex_unlock(pthread_mutex_t *);--int pthread_cond_init(pthread_cond_t *GIT_RESTRICT, const pthread_condattr_t *GIT_RESTRICT);-int pthread_cond_destroy(pthread_cond_t *);-int pthread_cond_broadcast(pthread_cond_t *);-int pthread_cond_signal(pthread_cond_t *);-int pthread_cond_wait(pthread_cond_t *GIT_RESTRICT, pthread_mutex_t *GIT_RESTRICT);--int pthread_num_processors_np(void);--#endif
− tests/Main.hi
binary file changed (837 → absent bytes)
− tests/Main.hs~
@@ -1,10 +0,0 @@-module Main where-import Bindings.Libgit2-import Foreign-import Foreign.C.String--main = do- alloca $ \ptr -> do- withCString "foobar.git/.git" $ \str -> do- c'git_repository_open ptr str- peek ptr >>= c'git_repository_free
− tests/Main.o
binary file changed (4476 → absent bytes)