/** * rig_protobuf_c_data_buffer_str_index_of: * @buffer: buffer to scan. * @str_to_find: a string to look for. * * Scans for the first instance of the given string. * returns: its index in the buffer, or -1 if the string * is not in the buffer. */ int rig_protobuf_c_data_buffer_str_index_of (ProtobufCDataBuffer *buffer, const char *str_to_find) { ProtobufCDataBufferFragment *frag = buffer->first_frag; size_t rv = 0; for (frag = buffer->first_frag; frag; frag = frag->next) { const uint8_t *frag_at = PROTOBUF_C_FRAGMENT_DATA (frag); size_t frag_rem = frag->buf_length; while (frag_rem > 0) { ProtobufCDataBufferFragment *subfrag; const uint8_t *subfrag_at; size_t subfrag_rem; const char *str_at; if (*frag_at != str_to_find[0]) { frag_at++; frag_rem--; rv++; continue; } subfrag = frag; subfrag_at = frag_at + 1; subfrag_rem = frag_rem - 1; str_at = str_to_find + 1; if (*str_at == '\0') return rv; while (subfrag != NULL) { while (subfrag_rem == 0) { subfrag = subfrag->next; if (subfrag == NULL) goto bad_guess; subfrag_at = rig_protobuf_c_data_buffer_fragment_start (subfrag); subfrag_rem = subfrag->buf_length; } while (*str_at != '\0' && subfrag_rem != 0) { if (*str_at++ != *subfrag_at++) goto bad_guess; subfrag_rem--; } if (*str_at == '\0') return rv; } bad_guess: frag_at++; frag_rem--; rv++; } } return -1; }
static inline uint8_t * rig_protobuf_c_data_buffer_fragment_end (ProtobufCDataBufferFragment *frag) { return PROTOBUF_C_FRAGMENT_DATA(frag) + frag->buf_start + frag->buf_length; }
static inline uint8_t * protobuf_c_data_buffer_fragment_start (ProtobufCDataBufferFragment *frag) { return PROTOBUF_C_FRAGMENT_DATA(frag) + frag->buf_start; }