home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / mar94 / util / edit / vim.lha / Vim / src / alloc.c < prev    next >
C/C++ Source or Header  |  1993-12-14  |  3KB  |  197 lines

  1. /* vi:ts=4:sw=4
  2.  *
  3.  * VIM - Vi IMproved
  4.  *
  5.  * Code Contributions By:    Bram Moolenaar            mool@oce.nl
  6.  *                            Tim Thompson            twitch!tjt
  7.  *                            Tony Andrews            onecom!wldrdg!tony 
  8.  *                            G. R. (Fred) Walter        watmath!watcgl!grwalter 
  9.  */
  10.  
  11. /*
  12.  * alloc.c
  13.  *
  14.  * This file contains various routines dealing with allocation and
  15.  * deallocation of memory. And some funcions for copying text.
  16.  */
  17.  
  18. #include "vim.h"
  19. #include "globals.h"
  20. #include "proto.h"
  21.  
  22. #ifdef AMIGA
  23. # undef FALSE            /* these are redefined in exec/types.h */
  24. # undef TRUE
  25. # include <exec/types.h>
  26. # include <exec/memory.h>
  27. # undef FALSE
  28. # define FALSE 0        /* define FALSE and TRUE as ints instead of longs */
  29. # undef TRUE
  30. # define TRUE 1
  31. #endif /* AMIGA */
  32.  
  33. #ifdef MSDOS
  34. # include <alloc.h>
  35. #endif /* MSDOS */
  36.  
  37. #define PANIC_FACTOR_CHIP 8192L
  38.  
  39. /*
  40.  * Note: if unsinged is 16 bits we can only allocate up to 64K with alloc().
  41.  * Use lalloc for larger blocks.
  42.  */
  43.     char *
  44. alloc(size)
  45.     unsigned        size;
  46. {
  47.     return (lalloc((u_long)size, TRUE));
  48. }
  49.  
  50.     char *
  51. lalloc(size, message)
  52.     u_long            size;
  53.     int                message;
  54. {
  55.     register char   *p;            /* pointer to new storage space */
  56.  
  57. #ifdef MSDOS
  58.     if (size >= 0xfff0)            /* in MSDOS we can't deal with >64K blocks */
  59.         p = NULL;
  60.     else
  61. #endif
  62.  
  63.     if ((p = (char *)malloc(size)) != NULL)
  64.     {
  65. #ifdef AMIGA
  66.         if (AvailMem((long)MEMF_CHIP) < PANIC_FACTOR_CHIP)
  67.         {                                 /* System is low... no go! */
  68.                 free(p);
  69.                 p = NULL;
  70.         }
  71. #endif
  72. #ifdef MSDOS
  73.         if (coreleft() < PANIC_FACTOR_CHIP)
  74.         {                                 /* System is low... no go! */
  75.                 free(p);
  76.                 p = NULL;
  77.         }
  78. #endif
  79.     }
  80.     /*
  81.      * Avoid repeating the error message many times (they take 1 second each).
  82.      * Did_outofmem_msg is reset when a character is read.
  83.      */
  84.     if (message && p == NULL && !did_outofmem_msg)
  85.     {
  86.         emsg(e_outofmem);
  87.         did_outofmem_msg = TRUE;
  88.     }
  89.     return (p);
  90. }
  91.  
  92. /*
  93.  * copy a string into newly allocated memory
  94.  */
  95.     char *
  96. strsave(string)
  97.     char           *string;
  98. {
  99.     char *p;
  100.  
  101.     p = alloc((unsigned) (strlen(string) + 1));
  102.     if (p != NULL)
  103.         strcpy(p, string);
  104.     return p;
  105. }
  106.  
  107.     char *
  108. strnsave(string, len)
  109.     char        *string;
  110.     int         len;
  111. {
  112.     char *p;
  113.  
  114.     p = alloc((unsigned) (len + 1));
  115.     if (p != NULL)
  116.     {
  117.         strncpy(p, string, (size_t)len);
  118.         p[len] = NUL;
  119.     }
  120.     return p;
  121. }
  122.  
  123. /*
  124.  * copy a number of spaces
  125.  */
  126.     void
  127. copy_spaces(ptr, count)
  128.     char    *ptr;
  129.     size_t    count;
  130. {
  131.     register size_t    i = count;
  132.     register char    *p = ptr;
  133.  
  134.     while (i--)
  135.         *p++ = ' ';
  136. }
  137.  
  138. #ifdef NO_FREE_NULL
  139. #undef free
  140. /*
  141.  * replacement for free() that cannot handle NULL pointers
  142.  */
  143.     void
  144. nofreeNULL(x)
  145.     void *x;
  146. {
  147.     if (x != NULL)
  148.         free(x);
  149. }
  150. #endif
  151.  
  152. #ifdef BSD_UNIX
  153.     char *
  154. bsdmemset(ptr, c, size)
  155.     char    *ptr;
  156.     int        c;
  157.     long    size;
  158. {
  159.     register char *p = ptr;
  160.  
  161.     while (size-- > 0)
  162.         *p++ = c;
  163.     return ptr;
  164. }
  165. #endif
  166.  
  167. #ifdef MEMMOVE
  168. /*
  169.  * Version of memmove that handles overlapping source and destination.
  170.  * For systems that don't have a function that is guaranteed to do that (SYSV).
  171.  */
  172.     void *
  173. memmove(desti, source, len)
  174.     void    *source, *desti;
  175. #ifdef __sgi
  176.     size_t    len;
  177. #else
  178.     int        len;
  179. #endif
  180. {
  181.     char *src = (char *)source;
  182.     char *dst = (char *)desti;
  183.  
  184.     if (dst > src && dst < src + len)    /* overlap, copy backwards */
  185.     {
  186.         src +=len;
  187.         dst +=len;
  188.         while (--len >= 0)
  189.             *--dst = *--src;
  190.     }
  191.     else                                /* copy forwards */
  192.         while (--len >= 0)
  193.             *dst++ = *src++;
  194.     return desti;
  195. }
  196. #endif
  197.