#define STRICT
#include <stdio.h>
#include <string.h>
/*#include <mem.h>*/
#include "memstrea.h"
#pragma argsused

TMemStream::TMemStream(char *Buf,int Size)
{
LoadFromStream(Buf,Size);
}

int TMemStream::MoveMainBuf(int Size)
{
 char *xxx;
 if(mSize>Size) return 0;
 try { xxx= new char[Size];} catch(...){ return 0;}
 if(MainBuf){memmove(xxx,MainBuf,mSize);delete MainBuf;}
 else memset(xxx,0,Size);
 mSize=Size; MainBuf=xxx;
 return 1;
}

int TMemStream::SetSize(int Size)
{
return MoveMainBuf(Size);
}

void TMemStream::Reset(void)
{
if(MainBuf) delete MainBuf;
MainBuf=0;
mSize=Cursor=0;
}

void TMemStream::LoadFromStream(char *Buf,int Size)
{
if(Buf)
 {
 if(MainBuf) delete MainBuf;
 try{MainBuf= new char[Size];} catch(...){return;}
 mSize=Size; Cursor=0;
 memmove(MainBuf,Buf,Size);
 }
}

int TMemStream::Read(char *Buf,int Size)
{
int xx=Size;
if(mSize<(xx+Cursor)) xx=mSize-Cursor;
if(xx) memmove(Buf,(MainBuf+Cursor),xx);
Cursor+=xx;
return xx;
}

void TMemStream::Write(char *Buf,int Size)
{
int xx=Size+Cursor;
if(mSize<xx) MoveMainBuf(2*xx);
memmove((MainBuf+Cursor),Buf,Size);
Cursor+=Size;
}

char *TMemStream::GetFitsStr(int nn)
{
char *c=0;
int xx=80*(nn+1);
if(mSize>=(Cursor+xx)) c=(MainBuf+Cursor+(xx-80));
return c;
}

int TMemStream::ReadString(char *Buf, int Size)
{
if(!MainBuf) return 0;
char *c=(MainBuf+Cursor);
int i=0,xx=Size;
while(*c<33&&(mSize-i-Cursor)){c++;i++;};
Cursor+=i;if(mSize==Cursor) return 0; i=0;
if(mSize<(xx+Cursor)) xx=mSize-Cursor;
while(*c>32&&i<xx){Buf[i]=*c;c++;i++;};Buf[i]=0;
Cursor+=i; return i;
}

int TMemStream::LoadFromFile(char *fName)
{
FILE *in;
int i;
in=fopen(fName,"rb");
if(!in) return 0;
fseek(in,0,SEEK_END);
i=ftell(in);if(i<0)i=0; mSize=i;
fseek(in,0,SEEK_SET);
if(MainBuf) delete MainBuf;
MainBuf= new char[mSize+1]; Cursor=0;
fread(MainBuf,1,mSize,in);
fclose(in);
return i;
}

int TMemStream::SaveToFile(char *fName)
{
FILE *in;
if(!MainBuf) return 0;
in=fopen(fName,"wb");
if(!in) return 0;
fwrite(MainBuf,1,Cursor,in);
fclose(in);
return 1;
}

int TMemStream::SaveToFile(FILE *in)
{
if(!MainBuf) return 0;
if(!in) return 0;
fwrite(MainBuf,1,Cursor,in);
return 1;
}


int TMemStream::gets(char *Buf,int nn)
{
if(!MainBuf) return 0;
int i=0,j=mSize-Cursor;
char *c=(MainBuf+Cursor);
while(*c && (*c!='\n')&&(i<nn)){Buf[i]=*c;c++;i++;if(i==j)break;};
Buf[i]=0; Cursor+=i;
return i;
}
