1*cc02d7e2SAndroid Build Coastguard Worker /* 2*cc02d7e2SAndroid Build Coastguard Worker * 3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2015 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker * 5*cc02d7e2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker * 9*cc02d7e2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker * 11*cc02d7e2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker * limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker * 17*cc02d7e2SAndroid Build Coastguard Worker */ 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPC_SLICE_H 20*cc02d7e2SAndroid Build Coastguard Worker #define GRPC_SLICE_H 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/impl/slice_type.h> // IWYU pragma: export 23*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h> 24*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/sync.h> 25*cc02d7e2SAndroid Build Coastguard Worker 26*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus 27*cc02d7e2SAndroid Build Coastguard Worker extern "C" { 28*cc02d7e2SAndroid Build Coastguard Worker #endif 29*cc02d7e2SAndroid Build Coastguard Worker 30*cc02d7e2SAndroid Build Coastguard Worker /** Increment the refcount of s. Requires slice is initialized. 31*cc02d7e2SAndroid Build Coastguard Worker Returns s. */ 32*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_ref(grpc_slice s); 33*cc02d7e2SAndroid Build Coastguard Worker 34*cc02d7e2SAndroid Build Coastguard Worker /** Decrement the ref count of s. If the ref count of s reaches zero, all 35*cc02d7e2SAndroid Build Coastguard Worker slices sharing the ref count are destroyed, and considered no longer 36*cc02d7e2SAndroid Build Coastguard Worker initialized. If s is ultimately derived from a call to grpc_slice_new(start, 37*cc02d7e2SAndroid Build Coastguard Worker len, dest) where dest!=NULL , then (*dest)(start) is called, else if s is 38*cc02d7e2SAndroid Build Coastguard Worker ultimately derived from a call to grpc_slice_new_with_len(start, len, dest) 39*cc02d7e2SAndroid Build Coastguard Worker where dest!=NULL , then (*dest)(start, len). Requires s initialized. */ 40*cc02d7e2SAndroid Build Coastguard Worker GPRAPI void grpc_slice_unref(grpc_slice s); 41*cc02d7e2SAndroid Build Coastguard Worker 42*cc02d7e2SAndroid Build Coastguard Worker /** Copy slice - create a new slice that contains the same data as s */ 43*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_copy(grpc_slice s); 44*cc02d7e2SAndroid Build Coastguard Worker 45*cc02d7e2SAndroid Build Coastguard Worker /** Create a slice pointing at some data. Calls malloc to allocate a refcount 46*cc02d7e2SAndroid Build Coastguard Worker for the object, and arranges that destroy will be called with the pointer 47*cc02d7e2SAndroid Build Coastguard Worker passed in at destruction. */ 48*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_new(void* p, size_t len, void (*destroy)(void*)); 49*cc02d7e2SAndroid Build Coastguard Worker 50*cc02d7e2SAndroid Build Coastguard Worker /** Equivalent to grpc_slice_new, but with a separate pointer that is 51*cc02d7e2SAndroid Build Coastguard Worker passed to the destroy function. This function can be useful when 52*cc02d7e2SAndroid Build Coastguard Worker the data is part of a larger structure that must be destroyed when 53*cc02d7e2SAndroid Build Coastguard Worker the data is no longer needed. */ 54*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, 55*cc02d7e2SAndroid Build Coastguard Worker void (*destroy)(void*), 56*cc02d7e2SAndroid Build Coastguard Worker void* user_data); 57*cc02d7e2SAndroid Build Coastguard Worker 58*cc02d7e2SAndroid Build Coastguard Worker /** Equivalent to grpc_slice_new, but with a two argument destroy function that 59*cc02d7e2SAndroid Build Coastguard Worker also takes the slice length. */ 60*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_new_with_len(void* p, size_t len, 61*cc02d7e2SAndroid Build Coastguard Worker void (*destroy)(void*, size_t)); 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Worker /** Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc() 64*cc02d7e2SAndroid Build Coastguard Worker call. 65*cc02d7e2SAndroid Build Coastguard Worker Aborts if malloc() fails. */ 66*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_malloc(size_t length); 67*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_malloc_large(size_t length); 68*cc02d7e2SAndroid Build Coastguard Worker 69*cc02d7e2SAndroid Build Coastguard Worker #define GRPC_SLICE_MALLOC(len) grpc_slice_malloc(len) 70*cc02d7e2SAndroid Build Coastguard Worker 71*cc02d7e2SAndroid Build Coastguard Worker /** Create a slice by copying a string. 72*cc02d7e2SAndroid Build Coastguard Worker Does not preserve null terminators. 73*cc02d7e2SAndroid Build Coastguard Worker Equivalent to: 74*cc02d7e2SAndroid Build Coastguard Worker size_t len = strlen(source); 75*cc02d7e2SAndroid Build Coastguard Worker grpc_slice slice = grpc_slice_malloc(len); 76*cc02d7e2SAndroid Build Coastguard Worker memcpy(slice->data, source, len); */ 77*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_from_copied_string(const char* source); 78*cc02d7e2SAndroid Build Coastguard Worker 79*cc02d7e2SAndroid Build Coastguard Worker /** Create a slice by copying a buffer. 80*cc02d7e2SAndroid Build Coastguard Worker Equivalent to: 81*cc02d7e2SAndroid Build Coastguard Worker grpc_slice slice = grpc_slice_malloc(len); 82*cc02d7e2SAndroid Build Coastguard Worker memcpy(slice->data, source, len); */ 83*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t len); 84*cc02d7e2SAndroid Build Coastguard Worker 85*cc02d7e2SAndroid Build Coastguard Worker /** Create a slice pointing to constant memory */ 86*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_from_static_string(const char* source); 87*cc02d7e2SAndroid Build Coastguard Worker 88*cc02d7e2SAndroid Build Coastguard Worker /** Create a slice pointing to constant memory */ 89*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_from_static_buffer(const void* source, size_t len); 90*cc02d7e2SAndroid Build Coastguard Worker 91*cc02d7e2SAndroid Build Coastguard Worker /** Return a result slice derived from s, which shares a ref count with \a s, 92*cc02d7e2SAndroid Build Coastguard Worker where result.data==s.data+begin, and result.length==end-begin. The ref count 93*cc02d7e2SAndroid Build Coastguard Worker of \a s is increased by one. Do not assign result back to \a s. 94*cc02d7e2SAndroid Build Coastguard Worker Requires s initialized, begin <= end, begin <= s.length, and 95*cc02d7e2SAndroid Build Coastguard Worker end <= source->length. */ 96*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end); 97*cc02d7e2SAndroid Build Coastguard Worker 98*cc02d7e2SAndroid Build Coastguard Worker /** The same as grpc_slice_sub, but without altering the ref count */ 99*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end); 100*cc02d7e2SAndroid Build Coastguard Worker 101*cc02d7e2SAndroid Build Coastguard Worker /** Splits s into two: modifies s to be s[0:split], and returns a new slice, 102*cc02d7e2SAndroid Build Coastguard Worker sharing a refcount with s, that contains s[split:s.length]. 103*cc02d7e2SAndroid Build Coastguard Worker Requires s initialized, split <= s.length */ 104*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split); 105*cc02d7e2SAndroid Build Coastguard Worker 106*cc02d7e2SAndroid Build Coastguard Worker typedef enum { 107*cc02d7e2SAndroid Build Coastguard Worker GRPC_SLICE_REF_TAIL = 1, 108*cc02d7e2SAndroid Build Coastguard Worker GRPC_SLICE_REF_HEAD = 2, 109*cc02d7e2SAndroid Build Coastguard Worker GRPC_SLICE_REF_BOTH = 1 + 2 110*cc02d7e2SAndroid Build Coastguard Worker } grpc_slice_ref_whom; 111*cc02d7e2SAndroid Build Coastguard Worker 112*cc02d7e2SAndroid Build Coastguard Worker /** The same as grpc_slice_split_tail, but with an option to skip altering 113*cc02d7e2SAndroid Build Coastguard Worker * refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to 114*cc02d7e2SAndroid Build Coastguard Worker * grpc_slice_split_tail(...)) */ 115*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice* s, size_t split, 116*cc02d7e2SAndroid Build Coastguard Worker grpc_slice_ref_whom ref_whom); 117*cc02d7e2SAndroid Build Coastguard Worker 118*cc02d7e2SAndroid Build Coastguard Worker /** Splits s into two: modifies s to be s[split:s.length], and returns a new 119*cc02d7e2SAndroid Build Coastguard Worker slice, sharing a refcount with s, that contains s[0:split]. 120*cc02d7e2SAndroid Build Coastguard Worker Requires s initialized, split <= s.length */ 121*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split); 122*cc02d7e2SAndroid Build Coastguard Worker 123*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_empty_slice(void); 124*cc02d7e2SAndroid Build Coastguard Worker 125*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_eq(grpc_slice a, grpc_slice b); 126*cc02d7e2SAndroid Build Coastguard Worker 127*cc02d7e2SAndroid Build Coastguard Worker /** Returns <0 if a < b, ==0 if a == b, >0 if a > b 128*cc02d7e2SAndroid Build Coastguard Worker The order is arbitrary, and is not guaranteed to be stable across different 129*cc02d7e2SAndroid Build Coastguard Worker versions of the API. */ 130*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b); 131*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char* b); 132*cc02d7e2SAndroid Build Coastguard Worker 133*cc02d7e2SAndroid Build Coastguard Worker /** return non-zero if the first blen bytes of a are equal to b */ 134*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_buf_start_eq(grpc_slice a, const void* b, size_t blen); 135*cc02d7e2SAndroid Build Coastguard Worker 136*cc02d7e2SAndroid Build Coastguard Worker /** return the index of the last instance of \a c in \a s, or -1 if not found */ 137*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_rchr(grpc_slice s, char c); 138*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_chr(grpc_slice s, char c); 139*cc02d7e2SAndroid Build Coastguard Worker 140*cc02d7e2SAndroid Build Coastguard Worker /** return the index of the first occurrence of \a needle in \a haystack, or -1 141*cc02d7e2SAndroid Build Coastguard Worker if it's not found */ 142*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_slice(grpc_slice haystack, grpc_slice needle); 143*cc02d7e2SAndroid Build Coastguard Worker 144*cc02d7e2SAndroid Build Coastguard Worker /** Do two slices point at the same memory, with the same length 145*cc02d7e2SAndroid Build Coastguard Worker If a or b is inlined, actually compares data */ 146*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int grpc_slice_is_equivalent(grpc_slice a, grpc_slice b); 147*cc02d7e2SAndroid Build Coastguard Worker 148*cc02d7e2SAndroid Build Coastguard Worker /** Return a slice pointing to newly allocated memory that has the same contents 149*cc02d7e2SAndroid Build Coastguard Worker * as \a s */ 150*cc02d7e2SAndroid Build Coastguard Worker GPRAPI grpc_slice grpc_slice_dup(grpc_slice a); 151*cc02d7e2SAndroid Build Coastguard Worker 152*cc02d7e2SAndroid Build Coastguard Worker /** Return a copy of slice as a C string. Offers no protection against embedded 153*cc02d7e2SAndroid Build Coastguard Worker NULL's. Returned string must be freed with gpr_free. */ 154*cc02d7e2SAndroid Build Coastguard Worker GPRAPI char* grpc_slice_to_c_string(grpc_slice s); 155*cc02d7e2SAndroid Build Coastguard Worker 156*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus 157*cc02d7e2SAndroid Build Coastguard Worker } 158*cc02d7e2SAndroid Build Coastguard Worker #endif 159*cc02d7e2SAndroid Build Coastguard Worker 160*cc02d7e2SAndroid Build Coastguard Worker #endif /* GRPC_SLICE_H */ 161