53 lines
		
	
	
		
			970 B
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			970 B
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* 7zBuf2.c -- Byte Buffer
 | 
						|
2017-04-03 : Igor Pavlov : Public domain */
 | 
						|
 | 
						|
#include "Precomp.h"
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#include "7zBuf.h"
 | 
						|
 | 
						|
void DynBuf_Construct(CDynBuf *p)
 | 
						|
{
 | 
						|
  p->data = 0;
 | 
						|
  p->size = 0;
 | 
						|
  p->pos = 0;
 | 
						|
}
 | 
						|
 | 
						|
void DynBuf_SeekToBeg(CDynBuf *p)
 | 
						|
{
 | 
						|
  p->pos = 0;
 | 
						|
}
 | 
						|
 | 
						|
int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc)
 | 
						|
{
 | 
						|
  if (size > p->size - p->pos)
 | 
						|
  {
 | 
						|
    size_t newSize = p->pos + size;
 | 
						|
    Byte *data;
 | 
						|
    newSize += newSize / 4;
 | 
						|
    data = (Byte *)ISzAlloc_Alloc(alloc, newSize);
 | 
						|
    if (!data)
 | 
						|
      return 0;
 | 
						|
    p->size = newSize;
 | 
						|
    if (p->pos != 0)
 | 
						|
      memcpy(data, p->data, p->pos);
 | 
						|
    ISzAlloc_Free(alloc, p->data);
 | 
						|
    p->data = data;
 | 
						|
  }
 | 
						|
  if (size != 0)
 | 
						|
  {
 | 
						|
    memcpy(p->data + p->pos, buf, size);
 | 
						|
    p->pos += size;
 | 
						|
  }
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 | 
						|
void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc)
 | 
						|
{
 | 
						|
  ISzAlloc_Free(alloc, p->data);
 | 
						|
  p->data = 0;
 | 
						|
  p->size = 0;
 | 
						|
  p->pos = 0;
 | 
						|
}
 |