diff options
| author | John Schmidt <john.schmidt.h@gmail.com> | 2014-04-03 17:07:14 +0200 |
|---|---|---|
| committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-04-04 16:33:12 -0300 |
| commit | 6f53cb1cc311025f0c21d142af06fbfbda113fc4 (patch) | |
| tree | d4381dd18e74f4bec084ed7602e90561fa3ad50c /src | |
| parent | 3fe0580a8edae062c91fda83fcb2766188088f2e (diff) | |
| download | rneovim-6f53cb1cc311025f0c21d142af06fbfbda113fc4.tar.gz rneovim-6f53cb1cc311025f0c21d142af06fbfbda113fc4.tar.bz2 rneovim-6f53cb1cc311025f0c21d142af06fbfbda113fc4.zip | |
Extract memory.c from misc2.c
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer.c | 1 | ||||
| -rw-r--r-- | src/charset.c | 1 | ||||
| -rw-r--r-- | src/diff.c | 1 | ||||
| -rw-r--r-- | src/digraph.c | 1 | ||||
| -rw-r--r-- | src/edit.c | 1 | ||||
| -rw-r--r-- | src/eval.c | 1 | ||||
| -rw-r--r-- | src/ex_cmds.c | 1 | ||||
| -rw-r--r-- | src/ex_cmds2.c | 1 | ||||
| -rw-r--r-- | src/ex_docmd.c | 1 | ||||
| -rw-r--r-- | src/ex_eval.c | 1 | ||||
| -rw-r--r-- | src/ex_getln.c | 1 | ||||
| -rw-r--r-- | src/file_search.c | 1 | ||||
| -rw-r--r-- | src/fileio.c | 1 | ||||
| -rw-r--r-- | src/fold.c | 1 | ||||
| -rw-r--r-- | src/garray.c | 1 | ||||
| -rw-r--r-- | src/getchar.c | 1 | ||||
| -rw-r--r-- | src/hardcopy.c | 1 | ||||
| -rw-r--r-- | src/hashtab.c | 1 | ||||
| -rw-r--r-- | src/if_cscope.c | 1 | ||||
| -rw-r--r-- | src/indent.c | 1 | ||||
| -rw-r--r-- | src/indent_c.c | 1 | ||||
| -rw-r--r-- | src/main.c | 1 | ||||
| -rw-r--r-- | src/mark.c | 1 | ||||
| -rw-r--r-- | src/mbyte.c | 1 | ||||
| -rw-r--r-- | src/memfile.c | 1 | ||||
| -rw-r--r-- | src/memline.c | 1 | ||||
| -rw-r--r-- | src/memory.c | 327 | ||||
| -rw-r--r-- | src/memory.h | 38 | ||||
| -rw-r--r-- | src/menu.c | 1 | ||||
| -rw-r--r-- | src/message.c | 1 | ||||
| -rw-r--r-- | src/misc1.c | 1 | ||||
| -rw-r--r-- | src/misc2.c | 306 | ||||
| -rw-r--r-- | src/misc2.h | 12 | ||||
| -rw-r--r-- | src/normal.c | 1 | ||||
| -rw-r--r-- | src/ops.c | 1 | ||||
| -rw-r--r-- | src/option.c | 1 | ||||
| -rw-r--r-- | src/os/event.c | 1 | ||||
| -rw-r--r-- | src/os/fs.c | 1 | ||||
| -rw-r--r-- | src/os/shell.c | 1 | ||||
| -rw-r--r-- | src/os/signal.c | 1 | ||||
| -rw-r--r-- | src/os_unix.c | 1 | ||||
| -rw-r--r-- | src/path.c | 1 | ||||
| -rw-r--r-- | src/quickfix.c | 1 | ||||
| -rw-r--r-- | src/regexp.c | 1 | ||||
| -rw-r--r-- | src/screen.c | 1 | ||||
| -rw-r--r-- | src/search.c | 1 | ||||
| -rw-r--r-- | src/spell.c | 1 | ||||
| -rw-r--r-- | src/syntax.c | 1 | ||||
| -rw-r--r-- | src/tag.c | 1 | ||||
| -rw-r--r-- | src/term.c | 1 | ||||
| -rw-r--r-- | src/ui.c | 1 | ||||
| -rw-r--r-- | src/undo.c | 1 | ||||
| -rw-r--r-- | src/window.c | 1 |
53 files changed, 415 insertions, 317 deletions
diff --git a/src/buffer.c b/src/buffer.c index 9f842cb4ee..5c77f85506 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -48,6 +48,7 @@ #include "mark.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/charset.c b/src/charset.c index b88682b88a..928886f53a 100644 --- a/src/charset.c +++ b/src/charset.c @@ -12,6 +12,7 @@ #include "main.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "misc1.h" #include "misc2.h" #include "garray.h" diff --git a/src/diff.c b/src/diff.c index 67d941c35a..0db4890cfe 100644 --- a/src/diff.c +++ b/src/diff.c @@ -17,6 +17,7 @@ #include "message.h" #include "misc1.h" #include "misc2.h" +#include "memory.h" #include "move.h" #include "normal.h" #include "option.h" diff --git a/src/digraph.c b/src/digraph.c index bfa2d648c9..e0fda19387 100644 --- a/src/digraph.c +++ b/src/digraph.c @@ -12,6 +12,7 @@ #include "mbyte.h" #include "message.h" #include "misc2.h" +#include "memory.h" #include "garray.h" #include "normal.h" #include "screen.h" diff --git a/src/edit.c b/src/edit.c index 873d5b5898..55f9328ce0 100644 --- a/src/edit.c +++ b/src/edit.c @@ -30,6 +30,7 @@ #include "main.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/eval.c b/src/eval.c index 94eca72b4e..32497a5e8f 100644 --- a/src/eval.c +++ b/src/eval.c @@ -35,6 +35,7 @@ #include "mark.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/ex_cmds.c b/src/ex_cmds.c index d8839d213c..45f8e79e25 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -40,6 +40,7 @@ #include "misc1.h" #include "misc2.h" #include "garray.h" +#include "memory.h" #include "move.h" #include "normal.h" #include "ops.h" diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index fefe6ed461..a74f7b7d62 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -31,6 +31,7 @@ #include "misc1.h" #include "misc2.h" #include "garray.h" +#include "memory.h" #include "move.h" #include "normal.h" #include "option.h" diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 4d80c9462e..23d03e7b32 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -35,6 +35,7 @@ #include "mark.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "menu.h" #include "message.h" #include "misc1.h" diff --git a/src/ex_eval.c b/src/ex_eval.c index 79fbd03bc6..639dbbfd43 100644 --- a/src/ex_eval.c +++ b/src/ex_eval.c @@ -19,6 +19,7 @@ #include "ex_docmd.h" #include "message.h" #include "misc2.h" +#include "memory.h" #include "regexp.h" diff --git a/src/ex_getln.c b/src/ex_getln.c index 75d400daba..9e0e35dd09 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -38,6 +38,7 @@ #include "message.h" #include "misc1.h" #include "misc2.h" +#include "memory.h" #include "cursor_shape.h" #include "keymap.h" #include "garray.h" diff --git a/src/file_search.c b/src/file_search.c index 5808c600dc..d5cc280c05 100644 --- a/src/file_search.c +++ b/src/file_search.c @@ -50,6 +50,7 @@ #include "file_search.h" #include "charset.h" #include "fileio.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/fileio.c b/src/fileio.c index 9ab8090f51..33e9bb96cb 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -30,6 +30,7 @@ #include "mbyte.h" #include "memfile.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/fold.c b/src/fold.c index c789871804..fecb2e376c 100644 --- a/src/fold.c +++ b/src/fold.c @@ -23,6 +23,7 @@ #include "indent.h" #include "mark.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/garray.c b/src/garray.c index 87fbcb3d91..1c79274fc8 100644 --- a/src/garray.c +++ b/src/garray.c @@ -7,6 +7,7 @@ #include "vim.h" #include "ascii.h" #include "misc2.h" +#include "memory.h" #include "path.h" #include "garray.h" diff --git a/src/getchar.c b/src/getchar.c index 95ca63cc16..4d6f693912 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -29,6 +29,7 @@ #include "main.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/hardcopy.c b/src/hardcopy.c index 036c59d8ca..f8a9a5b496 100644 --- a/src/hardcopy.c +++ b/src/hardcopy.c @@ -24,6 +24,7 @@ #include "fileio.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/hashtab.c b/src/hashtab.c index 2d9dcfe6ff..5ce33219bb 100644 --- a/src/hashtab.c +++ b/src/hashtab.c @@ -23,6 +23,7 @@ #include "vim.h" #include "hashtab.h" #include "message.h" +#include "memory.h" #include "misc2.h" // Magic value for algorithm that walks through the array. diff --git a/src/if_cscope.c b/src/if_cscope.c index d5a766e1b9..d1f709010c 100644 --- a/src/if_cscope.c +++ b/src/if_cscope.c @@ -17,6 +17,7 @@ #include "message.h" #include "misc1.h" #include "misc2.h" +#include "memory.h" #include "os/time.h" #include "path.h" #include "quickfix.h" diff --git a/src/indent.c b/src/indent.c index decd1ed132..29fe3fbdb4 100644 --- a/src/indent.c +++ b/src/indent.c @@ -2,6 +2,7 @@ #include "eval.h" #include "charset.h" #include "memline.h" +#include "memory.h" #include "misc1.h" #include "misc2.h" #include "option.h" diff --git a/src/indent_c.c b/src/indent_c.c index 9a9968ab16..10e463860a 100644 --- a/src/indent_c.c +++ b/src/indent_c.c @@ -5,6 +5,7 @@ #include "indent.h" #include "indent_c.h" #include "memline.h" +#include "memory.h" #include "misc2.h" #include "option.h" #include "search.h" diff --git a/src/main.c b/src/main.c index 9722d7fdae..7ef7b48d2f 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ #include "misc2.h" #include "crypt.h" #include "garray.h" +#include "memory.h" #include "move.h" #include "normal.h" #include "ops.h" diff --git a/src/mark.c b/src/mark.c index 1f113dd957..f133c1b3fa 100644 --- a/src/mark.c +++ b/src/mark.c @@ -24,6 +24,7 @@ #include "fold.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/mbyte.c b/src/mbyte.c index facea8e02e..8278deb6f8 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -88,6 +88,7 @@ #include "message.h" #include "misc1.h" #include "misc2.h" +#include "memory.h" #include "option.h" #include "screen.h" #include "spell.h" diff --git a/src/memfile.c b/src/memfile.c index b55d9cee4f..cdcdd23484 100644 --- a/src/memfile.c +++ b/src/memfile.c @@ -41,6 +41,7 @@ #include "message.h" #include "misc1.h" #include "misc2.h" +#include "memory.h" #include "os_unix.h" #include "path.h" #include "ui.h" diff --git a/src/memline.c b/src/memline.c index fb5da647d8..c1375a1a85 100644 --- a/src/memline.c +++ b/src/memline.c @@ -54,6 +54,7 @@ #include "mark.h" #include "mbyte.h" #include "memfile.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000000..66a4a5d3c6 --- /dev/null +++ b/src/memory.c @@ -0,0 +1,327 @@ + // Various routines dealing with allocation and deallocation of memory. + +#include <string.h> + +#include "vim.h" +#include "misc2.h" +#include "file_search.h" +#include "blowfish.h" +#include "buffer.h" +#include "charset.h" +#include "diff.h" +#include "edit.h" +#include "eval.h" +#include "ex_cmds.h" +#include "ex_docmd.h" +#include "ex_getln.h" +#include "fileio.h" +#include "fold.h" +#include "getchar.h" +#include "mark.h" +#include "mbyte.h" +#include "memfile.h" +#include "memline.h" +#include "memory.h" +#include "message.h" +#include "misc1.h" +#include "move.h" +#include "option.h" +#include "ops.h" +#include "os_unix.h" +#include "path.h" +#include "quickfix.h" +#include "regexp.h" +#include "screen.h" +#include "search.h" +#include "spell.h" +#include "syntax.h" +#include "tag.h" +#include "term.h" +#include "ui.h" +#include "window.h" +#include "os/os.h" + +static void try_to_free_memory(); + +/* + * Note: if unsigned is 16 bits we can only allocate up to 64K with alloc(). + * Use lalloc for larger blocks. + */ +char_u *alloc(unsigned size) +{ + return lalloc((long_u)size, TRUE); +} + +/* + * Allocate memory and set all bytes to zero. + */ +char_u *alloc_clear(unsigned size) +{ + char_u *p; + + p = lalloc((long_u)size, TRUE); + if (p != NULL) + (void)memset(p, 0, (size_t)size); + return p; +} + +/* + * alloc() with check for maximum line length + */ +char_u *alloc_check(unsigned size) +{ +#if !defined(UNIX) && !defined(__EMX__) + if (sizeof(int) == 2 && size > 0x7fff) { + /* Don't hide this message */ + emsg_silent = 0; + EMSG(_("E340: Line is becoming too long")); + return NULL; + } +#endif + return lalloc((long_u)size, TRUE); +} + +/* + * Allocate memory like lalloc() and set all bytes to zero. + */ +char_u *lalloc_clear(long_u size, int message) +{ + char_u *p = lalloc(size, message); + memset(p, 0, (size_t)size); + return p; +} + +/// Try to free memory. Used when trying to recover from out of memory errors. +/// @see {xmalloc} +static void try_to_free_memory() +{ + static bool trying_to_free = false; + // avoid recursive calls + if (trying_to_free) + return; + trying_to_free = true; + + // free any scrollback text + clear_sb_text(); + // Try to save all buffers and release as many blocks as possible + mf_release_all(); + // cleanup recursive lists/dicts + garbage_collect(); + + trying_to_free = false; +} + +void *xmalloc(size_t size) +{ + void *ret = malloc(size); + + if (!ret && !size) + ret = malloc(1); + + if (!ret) { + try_to_free_memory(); + ret = malloc(size); + if (!ret && !size) + ret = malloc(1); + if (!ret) { + OUT_STR("Vim: Error: Out of memory.\n"); + preserve_exit(); + } + } + + return ret; +} + +void *xrealloc(void *ptr, size_t size) +{ + void *ret = realloc(ptr, size); + + if (!ret && !size) + ret = realloc(ptr, 1); + + if (!ret) { + try_to_free_memory(); + ret = realloc(ptr, size); + if (!ret && !size) + ret = realloc(ptr, 1); + if (!ret) { + OUT_STR("Vim: Error: Out of memory.\n"); + preserve_exit(); + } + } + + return ret; +} + +char_u *lalloc(long_u size, int message) +{ + return (char_u *)xmalloc((size_t)size); +} + +/* + * Avoid repeating the error message many times (they take 1 second each). + * Did_outofmem_msg is reset when a character is read. + */ +void do_outofmem_msg(long_u size) +{ + if (!did_outofmem_msg) { + /* Don't hide this message */ + emsg_silent = 0; + + /* Must come first to avoid coming back here when printing the error + * message fails, e.g. when setting v:errmsg. */ + did_outofmem_msg = TRUE; + + EMSGN(_("E342: Out of memory! (allocating %lu bytes)"), size); + } +} + +#if defined(EXITFREE) || defined(PROTO) + +/* + * Free everything that we allocated. + * Can be used to detect memory leaks, e.g., with ccmalloc. + * NOTE: This is tricky! Things are freed that functions depend on. Don't be + * surprised if Vim crashes... + * Some things can't be freed, esp. things local to a library function. + */ +void free_all_mem(void) +{ + buf_T *buf, *nextbuf; + static int entered = FALSE; + + /* When we cause a crash here it is caught and Vim tries to exit cleanly. + * Don't try freeing everything again. */ + if (entered) + return; + entered = TRUE; + + block_autocmds(); /* don't want to trigger autocommands here */ + + /* Close all tabs and windows. Reset 'equalalways' to avoid redraws. */ + p_ea = FALSE; + if (first_tabpage->tp_next != NULL) + do_cmdline_cmd((char_u *)"tabonly!"); + if (firstwin != lastwin) + do_cmdline_cmd((char_u *)"only!"); + + /* Free all spell info. */ + spell_free_all(); + + /* Clear user commands (before deleting buffers). */ + ex_comclear(NULL); + + /* Clear menus. */ + do_cmdline_cmd((char_u *)"aunmenu *"); + do_cmdline_cmd((char_u *)"menutranslate clear"); + + /* Clear mappings, abbreviations, breakpoints. */ + do_cmdline_cmd((char_u *)"lmapclear"); + do_cmdline_cmd((char_u *)"xmapclear"); + do_cmdline_cmd((char_u *)"mapclear"); + do_cmdline_cmd((char_u *)"mapclear!"); + do_cmdline_cmd((char_u *)"abclear"); + do_cmdline_cmd((char_u *)"breakdel *"); + do_cmdline_cmd((char_u *)"profdel *"); + do_cmdline_cmd((char_u *)"set keymap="); + + free_titles(); + free_findfile(); + + /* Obviously named calls. */ + free_all_autocmds(); + clear_termcodes(); + free_all_options(); + free_all_marks(); + alist_clear(&global_alist); + free_homedir(); + free_users(); + free_search_patterns(); + free_old_sub(); + free_last_insert(); + free_prev_shellcmd(); + free_regexp_stuff(); + free_tag_stuff(); + free_cd_dir(); + free_signs(); + set_expr_line(NULL); + diff_clear(curtab); + clear_sb_text(); /* free any scrollback text */ + + /* Free some global vars. */ + vim_free(last_cmdline); + vim_free(new_last_cmdline); + set_keep_msg(NULL, 0); + + /* Clear cmdline history. */ + p_hi = 0; + init_history(); + + { + win_T *win; + tabpage_T *tab; + + qf_free_all(NULL); + /* Free all location lists */ + FOR_ALL_TAB_WINDOWS(tab, win) + qf_free_all(win); + } + + /* Close all script inputs. */ + close_all_scripts(); + + /* Destroy all windows. Must come before freeing buffers. */ + win_free_all(); + + /* Free all buffers. Reset 'autochdir' to avoid accessing things that + * were freed already. */ + p_acd = FALSE; + for (buf = firstbuf; buf != NULL; ) { + nextbuf = buf->b_next; + close_buffer(NULL, buf, DOBUF_WIPE, FALSE); + if (buf_valid(buf)) + buf = nextbuf; /* didn't work, try next one */ + else + buf = firstbuf; + } + + free_cmdline_buf(); + + /* Clear registers. */ + clear_registers(); + ResetRedobuff(); + ResetRedobuff(); + + + /* highlight info */ + free_highlight(); + + reset_last_sourcing(); + + free_tabpage(first_tabpage); + first_tabpage = NULL; + +# ifdef UNIX + /* Machine-specific free. */ + mch_free_mem(); +# endif + + /* message history */ + for (;; ) + if (delete_first_msg() == FAIL) + break; + + eval_clear(); + + free_termoptions(); + + /* screenlines (can't display anything now!) */ + free_screenlines(); + + clear_hl_tables(); + + vim_free(IObuff); + vim_free(NameBuff); +} + +#endif diff --git a/src/memory.h b/src/memory.h new file mode 100644 index 0000000000..49661d6117 --- /dev/null +++ b/src/memory.h @@ -0,0 +1,38 @@ +#ifndef NEOVIM_MEMORY_H +#define NEOVIM_MEMORY_H + +#include "func_attr.h" + +char_u *alloc(unsigned size) FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1); +char_u *alloc_clear(unsigned size) FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1); +char_u *alloc_check(unsigned size) FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1); +char_u *lalloc_clear(long_u size, int message) FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1); + +/// malloc() wrapper +/// +/// xmalloc() succeeds or gracefully aborts when out of memory. +/// Before aborting try to free some memory and call malloc again. +/// +/// @see {try_to_free_memory} +/// @param size +/// @return pointer to allocated space. Never NULL +void *xmalloc(size_t size) + FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1) FUNC_ATTR_NONNULL_RET; + +/// realloc() wrapper +/// +/// @see {xmalloc} +/// @param size +/// @return pointer to reallocated space. Never NULL +void *xrealloc(void *ptr, size_t size) + FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALLOC_SIZE(2) FUNC_ATTR_NONNULL_RET; + +/// Old low level memory allocation function. +/// +/// @deprecated use xmalloc() directly instead +/// @param size +/// @return pointer to allocated space. Never NULL +char_u *lalloc(long_u size, int message) FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1); +void do_outofmem_msg(long_u size); +void free_all_mem(void); +#endif diff --git a/src/menu.c b/src/menu.c index e64a28e91a..5461bd186a 100644 --- a/src/menu.c +++ b/src/menu.c @@ -20,6 +20,7 @@ #include "eval.h" #include "ex_docmd.h" #include "getchar.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "misc2.h" diff --git a/src/message.c b/src/message.c index af62f80275..9a130dd202 100644 --- a/src/message.c +++ b/src/message.c @@ -23,6 +23,7 @@ #include "fileio.h" #include "getchar.h" #include "mbyte.h" +#include "memory.h" #include "misc1.h" #include "misc2.h" #include "keymap.h" diff --git a/src/misc1.c b/src/misc1.c index db8b9dc58f..ea3763f929 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -32,6 +32,7 @@ #include "mark.h" #include "mbyte.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc2.h" #include "garray.h" diff --git a/src/misc2.c b/src/misc2.c index c5620e2103..e97d838477 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -31,6 +31,7 @@ #include "mbyte.h" #include "memfile.h" #include "memline.h" +#include "memory.h" #include "message.h" #include "misc1.h" #include "move.h" @@ -595,311 +596,6 @@ int leftcol_changed(void) return retval; } -/********************************************************************** - * Various routines dealing with allocation and deallocation of memory. - */ - -/* - * Note: if unsigned is 16 bits we can only allocate up to 64K with alloc(). |