예제 #1
0
/**
 * 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;
}
예제 #2
0
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;
}
예제 #3
0
static inline uint8_t *
protobuf_c_data_buffer_fragment_start (ProtobufCDataBufferFragment *frag)
{
  return PROTOBUF_C_FRAGMENT_DATA(frag) + frag->buf_start;
}