diff --git a/include/Makefile.am b/include/Makefile.am index 54d71c1..90681df 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -4,6 +4,7 @@ nobase_include_HEADERS = trbase.h \ tr/interface.h \ tr/memory.h \ tr/logger.h \ + tr/sized_data.h \ tr/tree_macros.h \ tr/interface/class.h \ tr/interface/indexable.h \ diff --git a/include/tr/class.h b/include/tr/class.h index f656da9..67912f1 100644 --- a/include/tr/class.h +++ b/include/tr/class.h @@ -75,6 +75,16 @@ #define TR_CLASSVARS_DECL(name) struct c_##name##_vars #define TR_CLASSVARS(name, class) ((struct c_##name##_vars *)(class)->vars) +#define TR_CLASSVARS_BY_NAME(name) \ + ((struct c_##name##_vars *)(TR_CLASS_BY_NAME(name))->vars) +#define TR_CLASSVARS_STATIC(name) \ + ((struct c_##name##_vars *)(TR_CLASS_BY_NAME_STATIC(name))->vars) + +#define TR_INHERIT_CLASSVARS(dest, src) \ + memcpy(&c_##dest##_vars, \ + TR_CLASSVARS_BY_NAME(src), \ + sizeof(TR_CLASSVAR_DECL(src))) + /** * Make the new class a child of an existing class. diff --git a/include/tr/sized_data.h b/include/tr/sized_data.h new file mode 100644 index 0000000..e0ee0ba --- /dev/null +++ b/include/tr/sized_data.h @@ -0,0 +1,42 @@ +/** + * \file + * Combines a char * with size_t to get a generic data structure. + * + * \author Georg Hopp + * + * \copyright + * Copyright © 2014 Georg Hopp + * + * This program 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 3 of the License, or + * (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __TR_SIZED_DATA_H__ +#define __TR_SIZED_DATA_H__ + +#include + +#include "trbase.h" + +TR_CLASS(TR_SizedData) { + char * data; + size_t size; +}; +TR_INSTANCE_INIT(TR_SizedData); +TR_CLASSVARS_DECL(TR_SizedData) {}; + +void TR_sizedDataSetData(TR_SizedData, const char *, size_t); + +#endif // __TR_SIZED_DATA_H__ + +// vim: set ts=4 sw=4: diff --git a/include/trbase.h b/include/trbase.h index 2eb0fee..42d41d0 100644 --- a/include/trbase.h +++ b/include/trbase.h @@ -5,6 +5,7 @@ #include "tr/memory.h" #include "tr/class.h" #include "tr/logger.h" +#include "tr/sized_data.h" #include "tr/interface.h" #include "tr/interface/class.h" #include "tr/interface/subject.h" diff --git a/src/Makefile.am b/src/Makefile.am index 2cf64ac..5b06a78 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,6 +8,8 @@ TR_CLASS = memory.c \ logger.c \ stderr.c \ syslog.c \ + sized_data.c \ + sized_data_set_data.c \ i_class.c \ i_subject.c \ i_observer.c \ diff --git a/src/sized_data.c b/src/sized_data.c new file mode 100644 index 0000000..7100969 --- /dev/null +++ b/src/sized_data.c @@ -0,0 +1,58 @@ +/** + * \file + * + * \author Georg Hopp + * + * \copyright + * Copyright © 2014 Georg Hopp + * + * This program 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 3 of the License, or + * (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +#include "trbase.h" + +#include "tr/sized_data.h" + +static +int +sizedDataCtor(void * _this, va_list * params) +{ + TR_SizedData this = _this; + char * data = va_arg(*params, char *); + + this->size = va_arg(*params, size_t); + + if (data != NULL) { + this->data = TR_malloc(this->size); + memcpy(this->data, data, this->size); + } + + return 0; +} + +static +void +sizedDataDtor(void * _this) +{ + TR_MEM_FREE(((TR_SizedData)_this)->data); +} + +TR_INIT_IFACE(TR_Class, sizedDataCtor, sizedDataDtor, NULL); +TR_CREATE_CLASS(TR_SizedData, NULL, NULL, TR_IF(TR_Class)); + +// vim: set ts=4 sw=4: diff --git a/src/sized_data_set_data.c b/src/sized_data_set_data.c new file mode 100644 index 0000000..e628651 --- /dev/null +++ b/src/sized_data_set_data.c @@ -0,0 +1,45 @@ +/** + * \file + * + * \author Georg Hopp + * + * \copyright + * Copyright © 2014 Georg Hopp + * + * This program 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 3 of the License, or + * (at your option) any later version. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include // for atoi() and exit() +#include // for errno +#include +#include + +#include "tr/sized_data.h" + +void +TR_sizedDataSetData(TR_SizedData this, const char * data, size_t size) +{ + if (this->data && TR_getSize(this->data) < size) { + TR_MEM_FREE(this->data); + } + + if (! this->data) { + this->data = TR_malloc(size); + } + + this->size = size; + memcpy(this->data, data, size); +} + +// vim: set ts=4 sw=4: