|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 3140 (0xc44) Types: TextFile Names: »dys.h«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦2fafebccf⟧ »EurOpenD3/mail/smail3.1.19.tar.Z« └─⟦bcd2bc73f⟧ └─⟦this⟧ »src/dys.h«
/* @(#)dys.h 3.7 8/18/88 01:46:12 */ /* * Copyright (C) 1987, 1988 Ronald S. Karr and Landon Curt Noll * * See the file COPYING, distributed with smail, for restriction * and warranty information. * * namei master id: @(#)dys.h 3.7 8/18/88 01:46:12 */ /* * dys.h: * macros for dynamic string region functions. * * The macros in this file provide a simple method of * building strings in an environment where the final * length requirements are not known. Thus, these * macros automatically support growing of strings * with xrealloc() when the current allocation is deemed * insufficient. * * All the macros take, as the first three arguments, * a character pointer, an index and an allocation size. * The index is an offset from the character pointer * to the current location being copied into and the * allocation size is the current limit for the index, * beyond which a call to xrealloc() is required. * The specific macros are described when they are * defined */ /* type for a dynamic string region */ struct str { char *p; /* xmalloc'd text region */ unsigned int i; /* index into text region */ unsigned int a; /* current allocation size */ }; /* STR_CHECK - call X_CHECK (from alloc.h) for a string */ #define STR_CHECK(sp) X_CHECK((sp)->p) /* STR_BUMP - the basic quantum of allocation space */ #define STR_BUMP 64 /* * STR_INIT - initialize the variables for a dynamic string region * this macro should be called with the variables to be passed to * other macros in this package before those other macros are used */ #define STR_INIT(sp) \ (((sp)->a = STR_BUMP - sizeof(long)), \ ((sp)->i = 0), \ ((sp)->p = xmalloc((sp)->a))) /* * STR_NEXT - allow access to the next character in a dynamic string * region, growing the region if no successor character currently * is allocated. This can be used in the form: * * STR_NEXT(p, character expression); * * to load successive characters into the string. */ #define STR_NEXT(sp, c) \ { \ if ((sp)->i >= (sp)->a) { \ (sp)->a += STR_BUMP; \ (sp)->p = xrealloc((sp)->p, (sp)->a); \ } \ (sp)->p[(sp)->i++] = (c); \ } /* * STR_CAT - concatenate a string onto the end of a dynamic string * region, growing as necessary. * * This is now implemented as a function in string.c. */ #define STR_CAT(sp, s) str_cat((sp), (s)) /* * STR_DONE - finish building a dynamic string region. This is not * required, though it will xrealloc a region to minimum length, which * may be useful if xmalloc and xrealloc call something besides the * stock malloc and realloc functions. */ #define STR_DONE(sp) ((sp)->p = xrealloc((sp)->p, (sp)->i), \ (sp)->a = (sp)->i) /* * STR_FREE - free a region, returning its storage to the free pool */ #define STR_FREE(sp) (xfree((sp)->p)) /* * STR_ALIGN - if region index is not aligned add bytes to align it. */ #define STR_ALIGN(sp) { while ((sp)->i%BYTES_PER_ALIGN) STR_NEXT(sp, 0); } /* * COPY_STRING - copy a C-style string to a new xmalloc'd region */ #define COPY_STRING(s) (strcpy(xmalloc(strlen(s) + 1), s))