Re: Shift elements of an array
On Mon, 07 Oct 2013 21:29:51 +0200, Rosario1903 wrote:
who know if there are memory leak?...
#include <iostream>
#include <cstdlib>
using namespace std;
#define u32 unsigned
#define u8 unsigned char
#define i8 char
#define F for
#define R return
class mya{
public:
~mya(){free(arr);}
mya(){arr=(u8*) malloc(15);
if(arr==0) exit(-1);
s=15;
}
mya(u32 c)
{if(c>0xFFFF) exit(-1);
arr=(u8*)malloc(c);
if(arr==0) exit(-1);
s=c;
}
mya(u8* c)
{u32 v, i;
if(c==0)
{v=1;}
else {v=strlen((i8*)c)+1;}
arr=(u8*)malloc(v);
if(arr==0) exit(-1);
if(v==1) *arr=0;
else {F(i=0; i<v ; ++i)
{arr[i]=c[i];
if(c[i]==0) break;
}
F(; i<v;++i)
arr[i]=0;
}
s=v;
}
mya& operator=(const mya& r)
{u32 i;
if(s<r.s)
{free(arr);
arr=(u8*) malloc(r.s);
if(arr==0) exit(-1);
s=r.s;
}
F(i=0; i<r.s; ++i)
arr[i]=r.arr[i];
R *this;
}
mya& operator=(u8* rs)
{u32 i, len, len1;
if(rs==0) exit(-1);
len=strlen((i8*)rs);
if(len>0xFFFFF) exit(-1);
len1=len+1;
if(s<len1)
{free(arr);
arr=(u8*) malloc(len1);
if(arr==0) exit(-1);
s=len1;
}
F(i=0; i<len1; ++i)
arr[i]=rs[i];
R *this;
}
/* lo chiamano costruttore di copia mha...
dicono che serve in:
mya b, a=b;
spero che la memoria nn sia gia' inizializzata
*/
mya(const mya& r)
{u32 i;
arr=(u8*)malloc(r.s);
if(arr==0) exit(-1);
s=r.s;
F(i=0; i<s; ++i)
arr[i]=r.arr[i];
}
friend ostream& operator<<(ostream& os, mya& ma)
{u32 i;
if(ma.s!=0)
{F(i=0; i<ma.s-1; ++i)
{if(ma.arr[i]==0) os<<" ";
else os<<ma.arr[i];
}
R os<<ma.arr[i];
}
else R os;
}
void shiftd(mya& ma, u32 pos)
{u32 i, j;
if(s<ma.s)
{free(arr);
arr=(u8*)malloc(ma.s);
if(arr==0) exit(-1);
s=ma.s;
}
if(pos>=ma.s)
{F(i=0;i<s; ++i) arr[i]=0;}
else {/* 0 1 2 3 4 5 6 */
/* | shiftd 3*/
F(j=pos, i=0; j<ma.s; ++j,++i)
arr[i]=ma.arr[j];
F(;i<s;++i)
arr[i]=0;
}
}
void shiftm(mya& ma, u32 pos)
{u32 i, j, k;
if(s<ma.s)
{free(arr);
arr=(u8*)malloc(ma.s);
if(arr==0) exit(-1);
s=ma.s;
}
if(pos>=ma.s)
{F(i=0;i<s; ++i) arr[i]=0;}
else {/* 0 1 2 3 4 5 6 */
/* | shiftm 3*/
F(i=0; i<pos; ++i)
arr[i]=0;
k=ma.s-pos;
F(j=0; j<k; ++j,++i)
arr[i]=ma.arr[j];
F(;i<s;++i)
arr[i]=0;
}
}
friend mya* forCompilerMya(u32 a);
friend mya& operator<<(mya& ma, u32 pos)
{mya *b;
b=forCompilerMya(15);
(*b).shiftd(ma, pos);
R *b;
}
friend mya& operator>>(mya& ma, u32 pos)
{mya *b;
b=forCompilerMya(15);
(*b).shiftm(ma, pos);
R *b;
}
friend mya& operator|(mya& ma, u32 c)
{mya *b;
b=forCompilerMya(15);
*b=ma;
b->arr[0]|=c;
R *b;
}
friend mya& operator^(mya& ma, mya& mb)
{mya *b;
u32 M, m, i;
M=ma.s>mb.s? ma.s: mb.s;
m=ma.s>mb.s? mb.s: ma.s;
b=forCompilerMya(M);
F(i=0; i<m; ++i)
b->arr[i]=ma.arr[i]^mb.arr[i];
F( ; i<M; ++i)
b->arr[i]=0;
R *b;
}
u32 s;
u8 *arr;
};
mya **bi=0;
u32 membi=0;
u32 index=0;
void fill_bi(mya* a)
{mya *r, **j;
u32 i;
if(index<=membi)
{if(membi>0xFFFFF) exit(-1);
i=membi+128; /* 128 0..127 */
j=(mya**)realloc(bi, i*sizeof *j);
if(j==0) exit(-1);
bi=j; membi=i;
}
bi[index]=a;
++index;
}
void zero_bi(void)
{mya *a;
u32 i;
if(index!=0)
{F(i=index-1; ; --i)
{a=bi[i];
free(a->arr);
free(a);
bi[i]=0;
if(i==0) break;
}
}
index=0;
}
void free_bi(void)
{zero_bi(); free(bi); bi=0; membi=0;}
mya* allocMya(u32 a)
{mya *b;
if(a>0xFFFF) exit(-1);
b=(mya*)malloc(sizeof *b);
if(b==0) exit(-1);
b->arr=(u8*)malloc(a);
if(b->arr==0)exit(-1);
b->s=a;
R b;
}
mya* forCompilerMya(u32 a)
{mya *b;
b=allocMya(a);
fill_bi(b);
R b;
}
mya& f(void)
{mya a((u8*)"1 2 3 4"), *b;
b=forCompilerMya(15);
*b=a;
R *b;
}
int main(void)
{mya v((u8*)"this and that "), ma, b, c[40];
u32 i, *w;
u8 *cs="A0CDEFGHILMN";
cout<<"at start v=["<<v <<"]\n";
ma.shiftd(v, 3);
cout<<"at end ma=["<<ma<<"]\n";
F(i=0;i<12;++i)
{ma.shiftd(ma, 1);
cout<<"at end ma=["<<ma<<"]\n";
}
b=v;
cout<<"b="<<b<<"\n";
b=f(); zero_bi();
cout<<"b="<<b<<"\n";
F(i=0; i<4; ++i)
{c[i]=cs;
++cs[0];++cs[1];++cs[2];++cs[3];
}
F(i=0; i<4; ++i)
cout<<"c["<<i<<"]=["<<c[i]<<"]\n";
b=(((c[0]>>1)|'Q')>>1|'v');
cout<<"b=["<<b<<"]\n";
cout<<"index="<<index<<"\n";
zero_bi();
c[0]= (u8*)"";
b=c[0]^c[1] ;
cout<<"index="<<index<<"\n";
cout<<"b="<<b<<"\n";
free_bi();
R 0;
}