mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-11 06:33:34 +02:00
compat
examples
tools
www
CHANGES
FAQ
GNUmakefile
Makefile
NOTES
TODO
array.h
attributes.c
buffer-poll.c
buffer.c
cfg.c
client-fn.c
client.c
clock.c
cmd-attach-session.c
cmd-bind-key.c
cmd-break-pane.c
cmd-choose-session.c
cmd-choose-window.c
cmd-clear-history.c
cmd-clock-mode.c
cmd-command-prompt.c
cmd-confirm-before.c
cmd-copy-buffer.c
cmd-copy-mode.c
cmd-delete-buffer.c
cmd-detach-client.c
cmd-display-message.c
cmd-down-pane.c
cmd-find-window.c
cmd-generic.c
cmd-has-session.c
cmd-if-shell.c
cmd-kill-pane.c
cmd-kill-server.c
cmd-kill-session.c
cmd-kill-window.c
cmd-last-window.c
cmd-link-window.c
cmd-list-buffers.c
cmd-list-clients.c
cmd-list-commands.c
cmd-list-keys.c
cmd-list-sessions.c
cmd-list-windows.c
cmd-list.c
cmd-load-buffer.c
cmd-lock-server.c
cmd-move-window.c
cmd-new-session.c
cmd-new-window.c
cmd-next-layout.c
cmd-next-window.c
cmd-paste-buffer.c
cmd-previous-layout.c
cmd-previous-window.c
cmd-refresh-client.c
cmd-rename-session.c
cmd-rename-window.c
cmd-resize-pane.c
cmd-respawn-window.c
cmd-rotate-window.c
cmd-save-buffer.c
cmd-scroll-mode.c
cmd-select-layout.c
cmd-select-pane.c
cmd-select-prompt.c
cmd-select-window.c
cmd-send-keys.c
cmd-send-prefix.c
cmd-server-info.c
cmd-set-buffer.c
cmd-set-environment.c
cmd-set-option.c
cmd-set-password.c
cmd-set-window-option.c
cmd-show-buffer.c
cmd-show-environment.c
cmd-show-options.c
cmd-show-window-options.c
cmd-source-file.c
cmd-split-window.c
cmd-start-server.c
cmd-string.c
cmd-suspend-client.c
cmd-swap-pane.c
cmd-swap-window.c
cmd-switch-client.c
cmd-unbind-key.c
cmd-unlink-window.c
cmd-up-pane.c
cmd.c
colour.c
compat.h
configure
environ.c
grid-view.c
grid.c
input-keys.c
input.c
key-bindings.c
key-string.c
layout-set.c
layout.c
log.c
mode-key.c
names.c
options-cmd.c
options.c
osdep-darwin.c
osdep-freebsd.c
osdep-linux.c
osdep-netbsd.c
osdep-openbsd.c
osdep-unknown.c
paste.c
resize.c
screen-redraw.c
screen-write.c
screen.c
server-fn.c
server-msg.c
server.c
session.c
status.c
tmux.1
tmux.c
tmux.h
tty-keys.c
tty-term.c
tty.c
utf8.c
window-choose.c
window-clock.c
window-copy.c
window-more.c
window-scroll.c
window.c
xmalloc.c
120 lines
3.4 KiB
C
120 lines
3.4 KiB
C
/* $Id: array.h,v 1.7 2008-09-29 16:58:02 nicm Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 2006 Nicholas Marriott <nicm@users.sourceforge.net>
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
|
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#ifndef ARRAY_H
|
|
#define ARRAY_H
|
|
|
|
#define ARRAY_DECL(n, c) \
|
|
struct n { \
|
|
c *list; \
|
|
u_int num; \
|
|
size_t space; \
|
|
}
|
|
|
|
#define ARRAY_ITEM(a, i) ((a)->list[i])
|
|
#define ARRAY_ITEMSIZE(a) (sizeof *(a)->list)
|
|
#define ARRAY_INITIALSPACE(a) (10 * ARRAY_ITEMSIZE(a))
|
|
|
|
#define ARRAY_ENSURE(a, n) do { \
|
|
if (UINT_MAX - (n) < (a)->num) \
|
|
fatalx("number too big"); \
|
|
if (SIZE_MAX / ((a)->num + (n)) < ARRAY_ITEMSIZE(a)) \
|
|
fatalx("size too big"); \
|
|
if ((a)->space == 0) { \
|
|
(a)->space = ARRAY_INITIALSPACE(a); \
|
|
(a)->list = xrealloc((a)->list, 1, (a)->space); \
|
|
} \
|
|
while ((a)->space <= ((a)->num + (n)) * ARRAY_ITEMSIZE(a)) { \
|
|
(a)->list = xrealloc((a)->list, 2, (a)->space); \
|
|
(a)->space *= 2; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define ARRAY_EMPTY(a) ((a) == NULL || (a)->num == 0)
|
|
#define ARRAY_LENGTH(a) ((a)->num)
|
|
#define ARRAY_DATA(a) ((a)->list)
|
|
|
|
#define ARRAY_FIRST(a) ARRAY_ITEM(a, 0)
|
|
#define ARRAY_LAST(a) ARRAY_ITEM(a, (a)->num - 1)
|
|
|
|
#define ARRAY_INIT(a) do { \
|
|
(a)->num = 0; \
|
|
(a)->list = NULL; \
|
|
(a)->space = 0; \
|
|
} while (0)
|
|
#define ARRAY_CLEAR(a) do { \
|
|
(a)->num = 0; \
|
|
} while (0)
|
|
|
|
#define ARRAY_SET(a, i, s) do { \
|
|
(a)->list[i] = s; \
|
|
} while (0)
|
|
|
|
#define ARRAY_ADD(a, s) do { \
|
|
ARRAY_ENSURE(a, 1); \
|
|
(a)->list[(a)->num] = s; \
|
|
(a)->num++; \
|
|
} while (0)
|
|
#define ARRAY_INSERT(a, i, s) do { \
|
|
ARRAY_ENSURE(a, 1); \
|
|
if ((i) < (a)->num) { \
|
|
memmove((a)->list + (i) + 1, (a)->list + (i), \
|
|
ARRAY_ITEMSIZE(a) * ((a)->num - (i))); \
|
|
} \
|
|
(a)->list[i] = s; \
|
|
(a)->num++; \
|
|
} while (0)
|
|
#define ARRAY_REMOVE(a, i) do { \
|
|
if ((i) < (a)->num - 1) { \
|
|
memmove((a)->list + (i), (a)->list + (i) + 1, \
|
|
ARRAY_ITEMSIZE(a) * ((a)->num - (i) - 1)); \
|
|
} \
|
|
(a)->num--; \
|
|
if ((a)->num == 0) \
|
|
ARRAY_FREE(a); \
|
|
} while (0)
|
|
|
|
#define ARRAY_EXPAND(a, n) do { \
|
|
ARRAY_ENSURE(a, n); \
|
|
(a)->num += n; \
|
|
} while (0)
|
|
#define ARRAY_TRUNC(a, n) do { \
|
|
if ((a)->num > n) \
|
|
(a)->num -= n; \
|
|
else \
|
|
ARRAY_FREE(a); \
|
|
} while (0)
|
|
|
|
#define ARRAY_CONCAT(a, b) do { \
|
|
ARRAY_ENSURE(a, (b)->num); \
|
|
memcpy((a)->list + (a)->num, (b)->list, (b)->num * ARRAY_ITEMSIZE(a)) \
|
|
(a)->num += (b)->num; \
|
|
} while (0)
|
|
|
|
#define ARRAY_FREE(a) do { \
|
|
if ((a)->list != NULL) \
|
|
xfree((a)->list); \
|
|
ARRAY_INIT(a); \
|
|
} while (0)
|
|
#define ARRAY_FREEALL(a) do { \
|
|
ARRAY_FREE(a); \
|
|
xfree(a); \
|
|
} while (0)
|
|
|
|
#endif
|