Skip to content
Snippets Groups Projects
Select Git revision
  • 6bc6ed2f77ebb7d53ac8c38133d5f622a199e629
  • master default protected
  • 8.0
  • 9.0
  • 7.8
  • 7.6
  • 7.4
  • 7.2
  • 7.0
  • 0.6
  • rosuav/latex-markdown-renderer
  • rxnpatch/rxnpatch
  • marcus/gobject-introspection
  • rxnpatch/8.0
  • rosuav/pre-listening-ports
  • nt-tools
  • rosuav/async-annotations
  • rosuav/pgsql-ssl
  • rxnpatch/rxnpatch-broken/2023-10-06T094250
  • grubba/fdlib
  • grubba/wip/sakura/8.0
  • v8.0.2006
  • v8.0.2004
  • v8.0.2002
  • v8.0.2000
  • v8.0.1998
  • v8.0.1996
  • v8.0.1994
  • v8.0.1992
  • v8.0.1990
  • v8.0.1988
  • v8.0.1986
  • rxnpatch/clusters/8.0/2025-04-29T124414
  • rxnpatch/2025-04-29T124414
  • v8.0.1984
  • v8.0.1982
  • v8.0.1980
  • v8.0.1978
  • v8.0.1976
  • v8.0.1974
  • v8.0.1972
41 results

memory.c

Blame
    • Fredrik Hübinette (Hubbe)'s avatar
      cb22562e
      committing · cb22562e
      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
      cb22562e
      History
      committing
      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
    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;
    }