X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/6a590fd098f39b15d359a2320bcee03439f7d594..a142609c5dc2a7c3df02497235881beaf47088bf:/lib/sod.c diff --git a/lib/sod.c b/lib/sod.c index 1f6ef2e..aee28d5 100644 --- a/lib/sod.c +++ b/lib/sod.c @@ -7,21 +7,22 @@ /*----- Licensing notice --------------------------------------------------* * - * This file is part of the Sensble Object Design, an object system for C. + * This file is part of the Sensible Object Design, an object system for C. * - * SOD is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * The SOD Runtime Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. * - * SOD is distributed in the hope that it will be useful, + * The SOD Runtime is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * GNU Library General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with SOD; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU Library General Public + * License along with SOD; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. */ /*----- Header files ------------------------------------------------------*/ @@ -119,4 +120,43 @@ void *sod_convert(const SodClass *cls, const void *obj) return ((char *)obj - vt->_base + chain->off_ichain); } +/* --- @sod_init@, @sod_initv@ --- * + * + * Arguments: @const SodClass *cls@ = class object for new instance + * @void *p@ = pointer to storage for new instance + * @va_list ap, ...@ = initialization keyword arguments + * + * Returns: Pointer to the initialized instance. + * + * Use: Initializes an instance in pre-allocated storage, and returns + * a pointer to it. + * + * This function will imprint the storage, and then send an + * `initialize' message to the fresh instance containing the + * provided keyword arguments. + * + * It's usually convenient to use the macro @SOD_INIT@ rather + * than calling @sod_init@ directly. + */ + +void *sod_init(const SodClass *cls, void *p, ...) +{ + va_list ap; + + va_start(ap, p); + sod_initv(cls, p, ap); + va_end(ap); + return (p); +} + +void *sod_initv(const SodClass *cls, void *p, va_list ap) +{ + SodObject *obj; + + cls->cls.imprint(p); + obj = SOD_CONVERT(SodObject, p); + SodObject_init__v(obj, ap); + return (p); +} + /*----- That's all, folks -------------------------------------------------*/