Select Git revision
-
Fredrik Hübinette (Hubbe) authored
Rev: README:1.1 Rev: bin/create_testsuite:1.3 Rev: bin/hilfe.lpc:1.2 Rev: bin/rsif:1.2 Rev: bin/uhttpd.lpc:1.2 Rev: doc/simulated/open:1.1 Rev: lib/master.lpc:1.2 Rev: lib/simulate.lpc:1.4 Rev: lib/testsuite.lpc:1.3 Rev: src/BUGS:1.3 Rev: src/Makefile.in:1.6 Rev: src/Makefile.in.src:1.2 Rev: src/README:1.2 Rev: src/add_efun.c:1.2 Rev: src/add_efun.h:1.2 Rev: src/array.c:1.4 Rev: src/array.h:1.2 Rev: src/backend.c:1.3 Rev: src/backend.h:1.2 Rev: src/builtin_efuns.c:1.2 Rev: src/builtin_efuns.h:1.2 Rev: src/call_out.c:1.5 Rev: src/call_out.h:1.2 Rev: src/callback.c:1.2 Rev: src/callback.h:1.2 Rev: src/config.h:1.6 Rev: src/configure.in:1.9 Rev: src/debug.c:1.4 Rev: src/debug.h:1.4 Rev: src/docode.c:1.4 Rev: src/docode.h:1.2 Rev: src/dynamic_buffer.c:1.3 Rev: src/dynamic_buffer.h:1.2 Rev: src/efun.h:1.2 Rev: src/error.c:1.2 Rev: src/error.h:1.2 Rev: src/fd_control.c:1.2 Rev: src/fd_control.h:1.2 Rev: src/fsort.c:1.2 Rev: src/fsort.h:1.2 Rev: src/global.h:1.2 Rev: src/hashtable.c:1.2 Rev: src/hashtable.h:1.2 Rev: src/interpret.c:1.5 Rev: src/interpret.h:1.2 Rev: src/language.y:1.3 Rev: src/las.c:1.3 Rev: src/las.h:1.3 Rev: src/lex.c:1.3 Rev: src/lex.h:1.2 Rev: src/list.c:1.3 Rev: src/list.h:1.2 Rev: src/lpc_signal.c:1.1 Rev: src/lpc_signal.h:1.1 Rev: src/lpc_types.c:1.3 Rev: src/lpc_types.h:1.2 Rev: src/machine.h.in:1.3 Rev: src/macros.h:1.4 Rev: src/main.c:1.8 Rev: src/main.h:1.2 Rev: src/mapping.c:1.4 Rev: src/mapping.h:1.2 Rev: src/memory.c:1.3 Rev: src/memory.h:1.2 Rev: src/module.c:1.2 Rev: src/module.h:1.2 Rev: src/modules/files/Makefile.in:1.3 Rev: src/modules/files/Makefile.in.src:1.2 Rev: src/modules/files/configure.in:1.5 Rev: src/modules/files/datagram.c:1.2 Rev: src/modules/files/efuns.c:1.4 Rev: src/modules/files/file.c:1.5 Rev: src/modules/files/file.h:1.3 Rev: src/modules/files/file_machine.h.in:1.3 Rev: src/modules/files/socket.c:1.6 Rev: src/modules/math/Makefile.in:1.4 Rev: src/modules/math/Makefile.in.src:1.3 Rev: src/modules/math/math.c:1.2 Rev: src/modules/regexp/Makefile.in:1.3 Rev: src/modules/regexp/Makefile.in.src:1.2 Rev: src/modules/regexp/glue.c:1.2 Rev: src/modules/regexp/regexp.h:1.2 Rev: src/modules/sprintf/Makefile.in:1.3 Rev: src/modules/sprintf/Makefile.in.src:1.2 Rev: src/modules/sprintf/sprintf.c:1.2 Rev: src/object.c:1.3 Rev: src/object.h:1.2 Rev: src/opcodes.c:1.6 Rev: src/opcodes.h:1.2 Rev: src/operators.c:1.3 Rev: src/operators.h:1.2 Rev: src/otable.h:1.2 Rev: src/port.c:1.9 Rev: src/port.h:1.4 Rev: src/program.h:1.2 Rev: src/rusage.c:1.3 Rev: src/rusage.h:1.2 Rev: src/stralloc.c:1.3 Rev: src/stralloc.h:1.3 Rev: src/stuff.c:1.2 Rev: src/stuff.h:1.2 Rev: src/svalue.c:1.4 Rev: src/svalue.h:1.2 Rev: src/todo:1.2 Rev: src/types.h:1.6 Rev: src/ualarm.c:1.2
Fredrik Hübinette (Hubbe) authoredRev: README:1.1 Rev: bin/create_testsuite:1.3 Rev: bin/hilfe.lpc:1.2 Rev: bin/rsif:1.2 Rev: bin/uhttpd.lpc:1.2 Rev: doc/simulated/open:1.1 Rev: lib/master.lpc:1.2 Rev: lib/simulate.lpc:1.4 Rev: lib/testsuite.lpc:1.3 Rev: src/BUGS:1.3 Rev: src/Makefile.in:1.6 Rev: src/Makefile.in.src:1.2 Rev: src/README:1.2 Rev: src/add_efun.c:1.2 Rev: src/add_efun.h:1.2 Rev: src/array.c:1.4 Rev: src/array.h:1.2 Rev: src/backend.c:1.3 Rev: src/backend.h:1.2 Rev: src/builtin_efuns.c:1.2 Rev: src/builtin_efuns.h:1.2 Rev: src/call_out.c:1.5 Rev: src/call_out.h:1.2 Rev: src/callback.c:1.2 Rev: src/callback.h:1.2 Rev: src/config.h:1.6 Rev: src/configure.in:1.9 Rev: src/debug.c:1.4 Rev: src/debug.h:1.4 Rev: src/docode.c:1.4 Rev: src/docode.h:1.2 Rev: src/dynamic_buffer.c:1.3 Rev: src/dynamic_buffer.h:1.2 Rev: src/efun.h:1.2 Rev: src/error.c:1.2 Rev: src/error.h:1.2 Rev: src/fd_control.c:1.2 Rev: src/fd_control.h:1.2 Rev: src/fsort.c:1.2 Rev: src/fsort.h:1.2 Rev: src/global.h:1.2 Rev: src/hashtable.c:1.2 Rev: src/hashtable.h:1.2 Rev: src/interpret.c:1.5 Rev: src/interpret.h:1.2 Rev: src/language.y:1.3 Rev: src/las.c:1.3 Rev: src/las.h:1.3 Rev: src/lex.c:1.3 Rev: src/lex.h:1.2 Rev: src/list.c:1.3 Rev: src/list.h:1.2 Rev: src/lpc_signal.c:1.1 Rev: src/lpc_signal.h:1.1 Rev: src/lpc_types.c:1.3 Rev: src/lpc_types.h:1.2 Rev: src/machine.h.in:1.3 Rev: src/macros.h:1.4 Rev: src/main.c:1.8 Rev: src/main.h:1.2 Rev: src/mapping.c:1.4 Rev: src/mapping.h:1.2 Rev: src/memory.c:1.3 Rev: src/memory.h:1.2 Rev: src/module.c:1.2 Rev: src/module.h:1.2 Rev: src/modules/files/Makefile.in:1.3 Rev: src/modules/files/Makefile.in.src:1.2 Rev: src/modules/files/configure.in:1.5 Rev: src/modules/files/datagram.c:1.2 Rev: src/modules/files/efuns.c:1.4 Rev: src/modules/files/file.c:1.5 Rev: src/modules/files/file.h:1.3 Rev: src/modules/files/file_machine.h.in:1.3 Rev: src/modules/files/socket.c:1.6 Rev: src/modules/math/Makefile.in:1.4 Rev: src/modules/math/Makefile.in.src:1.3 Rev: src/modules/math/math.c:1.2 Rev: src/modules/regexp/Makefile.in:1.3 Rev: src/modules/regexp/Makefile.in.src:1.2 Rev: src/modules/regexp/glue.c:1.2 Rev: src/modules/regexp/regexp.h:1.2 Rev: src/modules/sprintf/Makefile.in:1.3 Rev: src/modules/sprintf/Makefile.in.src:1.2 Rev: src/modules/sprintf/sprintf.c:1.2 Rev: src/object.c:1.3 Rev: src/object.h:1.2 Rev: src/opcodes.c:1.6 Rev: src/opcodes.h:1.2 Rev: src/operators.c:1.3 Rev: src/operators.h:1.2 Rev: src/otable.h:1.2 Rev: src/port.c:1.9 Rev: src/port.h:1.4 Rev: src/program.h:1.2 Rev: src/rusage.c:1.3 Rev: src/rusage.h:1.2 Rev: src/stralloc.c:1.3 Rev: src/stralloc.h:1.3 Rev: src/stuff.c:1.2 Rev: src/stuff.h:1.2 Rev: src/svalue.c:1.4 Rev: src/svalue.h:1.2 Rev: src/todo:1.2 Rev: src/types.h:1.6 Rev: src/ualarm.c:1.2
memory.c 5.78 KiB
/*\
||| This file a part of uLPC, and is copyright by Fredrik Hubinette
||| uLPC is distributed as GPL (General Public License)
||| See the files COPYING and DISCLAIMER for more information.
\*/
#include <stdlib.h>
#include "global.h"
#include "memory.h"
#include "error.h"
char *xalloc(SIZE_T size)
{
char *ret;
if(!size) return 0;
ret=(char *)malloc(size);
if(ret) return ret;
error("Out of memory.\n");
return 0;
}
#if 0
/*
* This function may NOT change 'order'
* This function is probably too slow, but it does not use
* any extra space, so it could still be used if no extra space
* could be allocated.
*/
void reorder(char *memory,INT32 nitems,INT32 size,INT32 *order)
{
INT32 e, w;
switch(size)
{
case 4:
for(e=0; e<nitems-1; e++)
{
INT32 tmp;
for(w = order[e]; w < e; w = order[w]);
if(w == e) continue;
tmp=((INT32 *)memory)[e];
((INT32 *)memory)[e]=((INT32 *)memory)[w];
((INT32 *)memory)[w]=tmp;
}
break;
case 8:
for(e=0; e<nitems-1; e++)
{
typedef struct eight_bytes { char t[8]; } eight_bytes;
eight_bytes tmp;
for(w = order[e]; w < e; w = order[w]);
if(w == e) continue;
tmp=((eight_bytes *)memory)[e];
((eight_bytes *)memory)[e]=((eight_bytes *)memory)[w];
((eight_bytes *)memory)[w]=tmp;
}
break;
default:
for(e=0; e<nitems-1; e++)
{
INT32 z;
for(w = order[e]; w < e; w = order[w]);
if(w == e) continue;
for(z=0; z<size; z++)
{
char tmp;
tmp=memory[e*size+z];
memory[e*size+z]=memory[w*size+z];
memory[e*size+z]=tmp;
}
}
}
}
#else
/*
* This function may NOT change 'order'
* This function is probably too slow, but it does not use
* any extra space, so it could still be used if no extra space
* could be allocated.
* (actually, it _does_ change 'order' but restores it afterwards)
*/
void reorder(char *memory, INT32 nitems, INT32 size,INT32 *order)
{
INT32 e,d,c;
#ifdef DEBUG
for(e=0;e<nitems;e++)
{
for(d=0;d<nitems;d++) if(order[d]==e) break;
if(d==nitems)
fatal("Missing number %ld in reorder() (nitems = %ld)\n",
(long)e,
(long)nitems);
}
#endif
switch(size)
{
#ifdef DEBUG
case 0:
fatal("FEL FEL FEL\n");
break;
#endif
case 1:
{
char a,*m;
m=memory;
for(e=0;e<nitems;e++)
{
if(order[e]==e) continue;
if(order[e]>=0)
{
a=memory[c=e];
do
{
c=order[d=c];
m[d]=m[c];
order[d]=~c;
} while(c!=e);
memory[d]=a;
}
order[e] =~ order[e];
}
break;
}
case 2:
{
typedef struct TMP2 { char t[2]; } tmp2;
tmp2 a,*m;
m=(tmp2 *)memory;
for(e=0;e<nitems;e++)
{
if(order[e]==e) continue;
if(order[e]>=0)
{
a=m[c=e];
do
{
c=order[d=c];
m[d]=m[c];
order[d]=~c;
}
while(c!=e);
m[d]=a;
}
order[e] =~ order[e];
}
break;
}
case 4:
{
typedef struct TMP4 { char t[4]; } tmp4;
tmp4 a,*m;
m=(tmp4 *)memory;
for(e=0;e<nitems;e++)
{
if(order[e]==e) continue;
if(order[e]>=0)
{
a=m[c=e];
do
{
c=order[d=c];
m[d]=m[c];
order[d]=~c;
} while(c!=e);
m[d]=a;
}
order[e] =~ order[e];
}
break;
}
case 8:
{
typedef struct TMP8 { char t[8]; } tmp8;
tmp8 a,*m;
m=(tmp8 *)memory;
for(e=0;e<nitems;e++)
{
if(order[e]==e) continue;
if(order[e]>=0)
{
a=m[c=e];
do {
c=order[d=c];
m[d]=m[c];
order[d]= ~c;
}while(c!=e);
m[d]=a;
}
order[e] =~ order[e];
}
break;
}
case 16:
{
typedef struct TMP16 { char t[16]; } tmp16;
tmp16 a,*m;
m=(tmp16 *)memory;
for(e=0;e<nitems;e++)
{
if(order[e]==e) continue;
if(order[e]>=0)
{
a=m[c=e];
do {
c=order[d=c];
m[d]=m[c];
order[d]= ~c;
}while(c!=e);
m[d]=a;
}
order[e] =~ order[e];
}
break;
}
default:
{
char *a;
a=(char *)alloca(size);
for(e=0;e<nitems;e++)
{
if(order[e]==e) continue;
if(order[e]>=0)
{
MEMCPY(a, memory+e*size, size);
c=e;
do {
c=order[d=c];
MEMCPY(memory+d*size, memory+c*size, size);
order[d]= ~c;
}while(d!=e);
MEMCPY(memory+d*size, a, size);
}
order[e] =~ order[e];
}
}
}
}
#endif
unsigned INT32 hashmem(const unsigned char *a,INT32 len,INT32 mlen)
{
unsigned INT32 ret;
ret=9248339*len;
if(len<mlen) mlen=len;
switch(mlen&7)
{
case 7: ret^=*(a++);
case 6: ret^=(ret<<4)+*(a++);
case 5: ret^=(ret<<7)+*(a++);
case 4: ret^=(ret<<6)+*(a++);
case 3: ret^=(ret<<3)+*(a++);
case 2: ret^=(ret<<7)+*(a++);
case 1: ret^=(ret<<5)+*(a++);
}
#ifdef HANDLES_UNALIGNED_MEMORY_ACCESS
{
unsigned int *b;
b=(unsigned int *)a;
for(mlen>>=3;--mlen>=0;)
{
ret^=(ret<<7)+*(b++);
ret^=(ret>>6)+*(b++);
}
}
#else
for(mlen>>=3;--mlen>=0;)
{
ret^=(ret<<7)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++));
ret^=(ret>>6)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++));
}
#endif
return ret;
}
unsigned INT32 hashstr(const unsigned char *str,INT32 maxn)
{
unsigned INT32 ret,c;
ret=str++[0];
for(; maxn>=0; maxn--)
{
c=str++[0];
if(!c) break;
ret ^= ( ret << 4 ) + c ;
ret &= 0x7fffffff;
}
return ret;
}