📄 dyna.h
字号:
/* * dyna.h -- 瓢弄に络きくなるバッファ * Copyright (C) 1991-1993 by candy * Thu Oct 31 10:13:53 JST 1996 * DYNA_IZ() 稍妥に * Sat May 3 00:27:48 JST 1997 * BOGUS_REALLOC *//* * $Id: dyna.h,v 3.6 1996/11/28 09:01:21 candy Exp $ */#ifndef __DYNA_H /* [ */#define __DYNA_H#ifdef BOGUS_REALLOC#undef realloc#define realloc(p,s) ((p)?((realloc)(p,s)):malloc(s))#endif/* * NAME * STRUCT_DYNA - 菇陇挛の离咐(の办婶——) * * SYNOPSIS * struct DYNA STRUCT_DYNA(TYPE); * * DESCRIPTION * TYPE 房を妥燎とする瓢弄に络きくなる芹误を胺う菇陇挛 * struct DYNA * を离咐します。 * * EXAPMLE * struct CHAR_BUF STRUCT_DYNA(char); 矢机バッファ * struct LIST_BUF STRUCT_DYNA(char *); 矢机误のリスト * のように离咐します。 * TYPE の今及には扩嘎があって、年盗 * TYPE * identifier; * において、identifier が TYPE へのポインタとなるようなものしか今けません。 * 毋えば * STRUCT_DYNA(char **) はいいけれど * STRUCT_DYNA(int (*)()) はだめです。 */#define STRUCT_DYNA(TYPE) \ { \ unsigned int more, size, used; \ TYPE *buf; \ TYPE *spare; \ }/* * NAME * DYNA_IZ - 菇陇挛の介袋步 * * SYNOPSIS * void DYNA_IZ(struct DYNA *dyna, unsigned int nmore); * * DESCRIPTION * 菇陇挛を介袋步します。 * dyna には STRUCT_DYNA で离咐した菇陇挛のアドレスを涂えます。 * nmore には办刨に笼裁する妥燎の眶を回年します。 * * EXAMPLE * struct LIST_BUF STRUCT_DYNA(char *) list_buf; * の箕、 * DYNA_IZ(&list_buf, 64); * のように介袋步します。 */#define DYNA_IZ(dyna, nmore) ((void)( \ (dyna)->more = (nmore), \ (dyna)->used = (dyna)->size = 0, \ (dyna)->buf = (void *)0 \ ))/* * NAME * DYNA_BRK - 芹误の橙络 * * SYNOPSIS * TYPE *DYNA_BRK(struct DYNA *dyna, unsigned int nmore); * * DESCRIPTION * 菇陇挛の芹误を nmore 改だけ橙络します。 * DYNA_NEXT() が极瓢弄に悸乖するので舍奶は簇犯ありません。 * 喇根なら NULL 笆嘲を手し、己窃なら NULL を手します。 * * EXAMPLE * struct LIST_BUF STRUCT_DYNA(char *) list_buf; * DYNA_IZ(&list_buf, 64); * の箕、 * if (DYNA_BRK(&list_buf, 16) == NULL) * goto no_memory; * などとします。 */#define DYNA_BRK(dyna, nmore) ( \ (dyna)->spare = (dyna)->buf, \ (dyna)->size += (nmore), \ (dyna)->buf = realloc((dyna)->buf, (dyna)->size * sizeof((dyna)->buf[0])), \ (((dyna)->buf != (void *)0) ? (dyna)->buf \ : ((dyna)->buf = (dyna)->spare, \ (dyna)->size -= (nmore), \ (void *)0)) \ )/* * NAME * DYNA_NEXT - バッファの橙络 * * SYNOPSIS * TYPE *DYNA_NEXT(struct DYNA *dyna); * * DESCRIPTION * 芹误の糠しい妥燎のアドレスを手します。 * 蝗脱挝拌が 1 笼えます。 * 颅りない眷圭は DYNA_BRK() を钙び叫します。 * 己窃なら NULL を手します。 * * EXAMPLE * struct LIST_BUF STRUCT_DYNA(char *)list_buf; * char **next; * DYNA_IZ(&list_buf, 64); * の箕、 * if ((next = DYNA_NEXT(&list_buf)) == NULL) * goto no_memory; * *next = malloc(256); * などとします。 */#define DYNA_NEXT(dyna) ( \ ((dyna)->used >= (dyna)->size && DYNA_BRK(dyna, \ ((dyna)->more ? (dyna)->more : 256)) == (void *)0) \ ? (void *)0 \ : (dyna)->buf + (dyna)->used++ \ )/* * NAME * DYNA_ALLOC - バッファの橙络 * * SYNOPSIS * TYPE *DYNA_ALLOC(struct DYNA *dyna, unsigned int n); * * DESCRIPTION * 芹误の面の糠しい n 改の息鲁した妥燎のアドレスを手します。 * 蝗脱挝拌が n 笼えます。 * 颅りない眷圭は DYNA_BRK() を钙び叫します。 * 己窃なら NULL を手します。 * * EXAMPLE * struct CHAR_BUF STRUCT_DYNA(char) char_buf; * char *next; * DYNA_IZ(&char_buf, 256); * の箕、 * if ((next = DYNA_ALLOC(&char_buf, strlen(s) + 1)) == NULL) * goto no_memory; * strcpy(next, s); * などとします。 */#define DYNA_ALLOC(dyna, nmore) ( \ ((dyna)->used + (nmore) > (dyna)->size && DYNA_BRK(dyna, (dyna)->more + (nmore)) == (void *)0) \ ? ((void *)0)\ : ((dyna)->used += (nmore), (dyna)->buf + (dyna)->used - (nmore))\ )/* * NAME * DYNA_RESET - バッファを鄂にする * * SYNOPSIS * void DYNA_RESET(struct DYNA *dyna) * * DESCRIPTION * バッファを鄂にします(蝗脱挝拌を 0 にします)。 * dyna には STRUCT_DYNA で离咐した菇陇挛のアドレスを涂えます。 */#define DYNA_RESET(dyna) ((void)((dyna)->used = 0))/* * NAME * DYNA_UNGROW - バッファの教井 * * SYNOPSIS * void DYNA_UNGROW(struct DYNA *dyna, unsigned int n); * * DESCRIPTION * バッファの络きさ(蝗脱挝拌)が 0 でなければ、n 妥燎尸教井します。 * */#define DYNA_UNGROW(dyna, n) ((void)((dyna)->used > (n) ? ((dyna)->used -= (n)) : ((dyna)->used = 0)))/* * NAME * DYNA_BUF - バッファのアドレス * * SYNOPSIS * TYPE *DYNA_BUF(struct DYNA *dyna); * * DESCRIPTION * バッファの呵介の妥燎のアドレスを手します。 * DYNA_BRK() や DYNA_NEXT() によって猛が恃步しますので、 * それらを钙び叫した稿は笆涟の猛は痰跟になります。 */#define DYNA_BUF(dyna) ((dyna)->buf)/* * NAME * DYNA_USED - バッファの络きさ * * SYNOPSIS * unsigned int DYNA_USED(struct DYNA *dyna); * * DESCRIPTION * バッファの络きさを手します。 * DYNA_IZ() 木稿は 0 で、 * DYNA_NEXT() する髓に + 1 します。 */#define DYNA_USED(dyna) ((dyna)->used)#endif /* ] !__DYNA_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -