/*
  Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization
  dedicated to making software imaging solutions freely available.
  
  You may not use this file except in compliance with the License.  You may
  obtain a copy of the License at
  
    https://imagemagick.org/script/license.php
  
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
#ifndef MAGICK_BYTE_BUFFER_PRIVATE_H
#define MAGICK_BYTE_BUFFER_PRIVATE_H

#include "MagickCore/blob.h"
#include "MagickCore/blob-private.h"

typedef struct _MagickByteBuffer
{
  Image
    *image;

  ssize_t
    offset,
    count;

  unsigned char
    data[MagickMinBufferExtent];
} MagickByteBuffer;

static inline int ReadMagickByteBuffer(MagickByteBuffer *buffer)
{
  if ((buffer->offset == buffer->count) && (buffer->offset > 0))
    {
      if (buffer->count != (ssize_t) sizeof(buffer->data)-1)
        return(EOF);
      buffer->offset=0;
      buffer->count=0;
    }
  if ((buffer->offset == 0) && (buffer->count == 0))
    {
      buffer->count=ReadBlob(buffer->image,sizeof(buffer->data)-1,
        buffer->data);
      if (buffer->count < 1)
        return(EOF);
    }
  return(buffer->data[buffer->offset++]);
}

static inline char *GetMagickByteBufferDatum(MagickByteBuffer *buffer)
{
  ssize_t
    count,
    i;

  if (buffer->offset != 0)
    {
      i=0;
      while (buffer->offset < buffer->count)
        buffer->data[i++]=buffer->data[buffer->offset++];
      count=ReadBlob(buffer->image,sizeof(buffer->data)-1-i,buffer->data+i);
      buffer->count=i;
      if (count > 0)
        buffer->count+=count;
      buffer->offset=0;
    }
  return((char *) buffer->data);
}

static void CheckMagickByteBuffer(MagickByteBuffer *buffer,
  const size_t length)
{
  if ((buffer->offset+length) > (ssize_t) sizeof(buffer->data))
    (void) GetMagickByteBufferDatum(buffer);
}

static MagickBooleanType CompareMagickByteBuffer(MagickByteBuffer *buffer,
  const char *p,const size_t length)
{
  const char
    *q;

  CheckMagickByteBuffer(buffer,length);
  q=(const char *) buffer->data+buffer->offset;
  if (LocaleNCompare(p,q,length) != 0)
    return(MagickFalse);
  return(MagickTrue);
}

static inline void SkipMagickByteBuffer(MagickByteBuffer *buffer,
  const size_t length)
{
  CheckMagickByteBuffer(buffer,length);
  if ((ssize_t) (buffer->offset+length) < buffer->count)
    buffer->offset+=length;
}

static inline MagickBooleanType SkipMagickByteBufferUntilNewline(
  MagickByteBuffer *buffer)
{
  int
    c;

  c=ReadMagickByteBuffer(buffer);
  while ((c != '\n') && (c != '\r'))
  {
    c=ReadMagickByteBuffer(buffer);
    if (c == EOF)
      return(MagickFalse);
  }
  return(MagickTrue);
}

#endif
