diff options
Diffstat (limited to 'src/UriResolve.c')
-rw-r--r-- | src/UriResolve.c | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/src/UriResolve.c b/src/UriResolve.c index bb1d21a..6569819 100644 --- a/src/UriResolve.c +++ b/src/UriResolve.c @@ -64,6 +64,7 @@ #ifndef URI_DOXYGEN # include <uriparser/Uri.h> # include "UriCommon.h" +# include "UriMemory.h" #endif @@ -71,7 +72,7 @@ /* Appends a relative URI to an absolute. The last path segment of * the absolute URI is replaced. */ static URI_INLINE UriBool URI_FUNC(MergePath)(URI_TYPE(Uri) * absWork, - const URI_TYPE(Uri) * relAppend) { + const URI_TYPE(Uri) * relAppend, UriMemoryManager * memory) { URI_TYPE(PathSegment) * sourceWalker; URI_TYPE(PathSegment) * destPrev; if (relAppend->pathHead == NULL) { @@ -80,7 +81,7 @@ static URI_INLINE UriBool URI_FUNC(MergePath)(URI_TYPE(Uri) * absWork, /* Replace last segment ("" if trailing slash) with first of append chain */ if (absWork->pathHead == NULL) { - URI_TYPE(PathSegment) * const dup = malloc(sizeof(URI_TYPE(PathSegment))); + URI_TYPE(PathSegment) * const dup = memory->malloc(memory, sizeof(URI_TYPE(PathSegment))); if (dup == NULL) { return URI_FALSE; /* Raises malloc error */ } @@ -99,7 +100,7 @@ static URI_INLINE UriBool URI_FUNC(MergePath)(URI_TYPE(Uri) * absWork, destPrev = absWork->pathTail; for (;;) { - URI_TYPE(PathSegment) * const dup = malloc(sizeof(URI_TYPE(PathSegment))); + URI_TYPE(PathSegment) * const dup = memory->malloc(memory, sizeof(URI_TYPE(PathSegment))); if (dup == NULL) { destPrev->next = NULL; absWork->pathTail = destPrev; @@ -121,7 +122,8 @@ static URI_INLINE UriBool URI_FUNC(MergePath)(URI_TYPE(Uri) * absWork, } -static int URI_FUNC(ResolveAbsolutePathFlag)(URI_TYPE(Uri) * absWork) { +static int URI_FUNC(ResolveAbsolutePathFlag)(URI_TYPE(Uri) * absWork, + UriMemoryManager * memory) { if (absWork == NULL) { return URI_ERROR_NULL; } @@ -129,7 +131,7 @@ static int URI_FUNC(ResolveAbsolutePathFlag)(URI_TYPE(Uri) * absWork) { if (URI_FUNC(IsHostSet)(absWork) && absWork->absolutePath) { /* Empty segment needed, instead? */ if (absWork->pathHead == NULL) { - URI_TYPE(PathSegment) * const segment = malloc(sizeof(URI_TYPE(PathSegment))); + URI_TYPE(PathSegment) * const segment = memory->malloc(memory, sizeof(URI_TYPE(PathSegment))); if (segment == NULL) { return URI_ERROR_MALLOC; } @@ -151,7 +153,7 @@ static int URI_FUNC(ResolveAbsolutePathFlag)(URI_TYPE(Uri) * absWork) { static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, const URI_TYPE(Uri) * relSource, const URI_TYPE(Uri) * absBase, - UriResolutionOptions options) { + UriResolutionOptions options, UriMemoryManager * memory) { UriBool relSourceHasScheme; if (absDest == NULL) { @@ -186,14 +188,14 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, /* [02/32] T.scheme = R.scheme; */ absDest->scheme = relSource->scheme; /* [03/32] T.authority = R.authority; */ - if (!URI_FUNC(CopyAuthority)(absDest, relSource)) { + if (!URI_FUNC(CopyAuthority)(absDest, relSource, memory)) { return URI_ERROR_MALLOC; } /* [04/32] T.path = remove_dot_segments(R.path); */ - if (!URI_FUNC(CopyPath)(absDest, relSource)) { + if (!URI_FUNC(CopyPath)(absDest, relSource, memory)) { return URI_ERROR_MALLOC; } - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { + if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest, memory)) { return URI_ERROR_MALLOC; } /* [05/32] T.query = R.query; */ @@ -203,14 +205,14 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, /* [07/32] if defined(R.authority) then */ if (URI_FUNC(IsHostSet)(relSource)) { /* [08/32] T.authority = R.authority; */ - if (!URI_FUNC(CopyAuthority)(absDest, relSource)) { + if (!URI_FUNC(CopyAuthority)(absDest, relSource, memory)) { return URI_ERROR_MALLOC; } /* [09/32] T.path = remove_dot_segments(R.path); */ - if (!URI_FUNC(CopyPath)(absDest, relSource)) { + if (!URI_FUNC(CopyPath)(absDest, relSource, memory)) { return URI_ERROR_MALLOC; } - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { + if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest, memory)) { return URI_ERROR_MALLOC; } /* [10/32] T.query = R.query; */ @@ -218,13 +220,13 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, /* [11/32] else */ } else { /* [28/32] T.authority = Base.authority; */ - if (!URI_FUNC(CopyAuthority)(absDest, absBase)) { + if (!URI_FUNC(CopyAuthority)(absDest, absBase, memory)) { return URI_ERROR_MALLOC; } /* [12/32] if (R.path == "") then */ if (relSource->pathHead == NULL && !relSource->absolutePath) { /* [13/32] T.path = Base.path; */ - if (!URI_FUNC(CopyPath)(absDest, absBase)) { + if (!URI_FUNC(CopyPath)(absDest, absBase, memory)) { return URI_ERROR_MALLOC; } /* [14/32] if defined(R.query) then */ @@ -243,31 +245,31 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, if (relSource->absolutePath) { int res; /* [21/32] T.path = remove_dot_segments(R.path); */ - if (!URI_FUNC(CopyPath)(absDest, relSource)) { + if (!URI_FUNC(CopyPath)(absDest, relSource, memory)) { return URI_ERROR_MALLOC; } - res = URI_FUNC(ResolveAbsolutePathFlag)(absDest); + res = URI_FUNC(ResolveAbsolutePathFlag)(absDest, memory); if (res != URI_SUCCESS) { return res; } - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { + if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest, memory)) { return URI_ERROR_MALLOC; } /* [22/32] else */ } else { /* [23/32] T.path = merge(Base.path, R.path); */ - if (!URI_FUNC(CopyPath)(absDest, absBase)) { + if (!URI_FUNC(CopyPath)(absDest, absBase, memory)) { return URI_ERROR_MALLOC; } - if (!URI_FUNC(MergePath)(absDest, relSource)) { + if (!URI_FUNC(MergePath)(absDest, relSource, memory)) { return URI_ERROR_MALLOC; } /* [24/32] T.path = remove_dot_segments(T.path); */ - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { + if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest, memory)) { return URI_ERROR_MALLOC; } - if (!URI_FUNC(FixAmbiguity)(absDest)) { + if (!URI_FUNC(FixAmbiguity)(absDest, memory)) { return URI_ERROR_MALLOC; } /* [25/32] endif; */ @@ -276,7 +278,7 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, absDest->query = relSource->query; /* [27/32] endif; */ } - URI_FUNC(FixEmptyTrailSegment)(absDest); + URI_FUNC(FixEmptyTrailSegment)(absDest, memory); /* [29/32] endif; */ } /* [30/32] T.scheme = Base.scheme; */ @@ -294,11 +296,8 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, int URI_FUNC(AddBaseUri)(URI_TYPE(Uri) * absDest, const URI_TYPE(Uri) * relSource, const URI_TYPE(Uri) * absBase) { - const int res = URI_FUNC(AddBaseUriImpl)(absDest, relSource, absBase, URI_RESOLVE_STRICTLY); - if ((res != URI_SUCCESS) && (absDest != NULL)) { - URI_FUNC(FreeUriMembers)(absDest); - } - return res; + const UriResolutionOptions options = URI_RESOLVE_STRICTLY; + return URI_FUNC(AddBaseUriEx)(absDest, relSource, absBase, options); } @@ -306,9 +305,21 @@ int URI_FUNC(AddBaseUri)(URI_TYPE(Uri) * absDest, int URI_FUNC(AddBaseUriEx)(URI_TYPE(Uri) * absDest, const URI_TYPE(Uri) * relSource, const URI_TYPE(Uri) * absBase, UriResolutionOptions options) { - const int res = URI_FUNC(AddBaseUriImpl)(absDest, relSource, absBase, options); + return URI_FUNC(AddBaseUriExMm)(absDest, relSource, absBase, options, NULL); +} + + + +int URI_FUNC(AddBaseUriExMm)(URI_TYPE(Uri) * absDest, + const URI_TYPE(Uri) * relSource, const URI_TYPE(Uri) * absBase, + UriResolutionOptions options, UriMemoryManager * memory) { + int res; + + URI_CHECK_MEMORY_MANAGER(memory); /* may return */ + + res = URI_FUNC(AddBaseUriImpl)(absDest, relSource, absBase, options, memory); if ((res != URI_SUCCESS) && (absDest != NULL)) { - URI_FUNC(FreeUriMembers)(absDest); + URI_FUNC(FreeUriMembersMm)(absDest, memory); } return res; } |