summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Mubashshir <ahmubashshir@gmail.com>2025-05-22 22:59:39 +0600
committerLibravatar Mubashshir <ahmubashshir@gmail.com>2025-05-22 23:01:28 +0600
commit29b8e5efb43bdb71737f1b417fedb3b1558bb9af (patch)
tree79eaca3ba73974af3c4d6989e3ebbb006b2404c5
parentcefb440148fd80cac7537b3743dd0e018df3a797 (diff)
downloadc-obp-example-29b8e5efb43bdb71737f1b417fedb3b1558bb9af.tar.gz
c-obp-example-29b8e5efb43bdb71737f1b417fedb3b1558bb9af.zip
Clean up and fix warnings
Signed-off-by: Mubashshir <ahmubashshir@gmail.com>
-rw-r--r--src/cobj.h121
-rw-r--r--src/main.c5
-rw-r--r--src/teams.c84
-rw-r--r--src/teams.h5
4 files changed, 120 insertions, 95 deletions
diff --git a/src/cobj.h b/src/cobj.h
index c12181b..1e5c75e 100644
--- a/src/cobj.h
+++ b/src/cobj.h
@@ -1,56 +1,43 @@
-#ifndef __COBJ_IMPLS_H__
-# define __COBJ_IMPLS_H__
+#if defined(__COBJ_PUB__) && defined(__COBJ_DECL__) || defined(__COBJ_IMPL__) && defined(__COBJ_H__)
+# undef Atom
+# undef Attr
+# undef Call
+# undef Class
+# undef DefaultDelete
+# undef Define
+# undef Del
+# undef DelF
+# undef Func
+# undef GET
+# undef Get
+# undef List
+# undef New
+# undef Prop
+# undef Self
+# undef Set
+# undef TYPE
+# undef UNUSED
+# undef __COBJ_DECL__
+# undef __COBJ_PUB__
+#endif
+
+
+#if ! defined(__COBJ_H__) && ! defined(__COBJ_IMPL__) && ! defined(__COBJ_DECL__)
# define Get(instance, field, ...) \
(instance)->get_##field(instance, ## __VA_ARGS__)
# define Set(instance, field, ...) \
(instance)->set_##field(instance, ## __VA_ARGS__)
# define Call(instance, fun, ...) \
(instance)->fun(instance, ## __VA_ARGS__)
-# define New(klass, ...) klass##_new(__VA_ARGS__)
-# define Del(klass, ...) klass##_del(__VA_ARGS__)
-#endif /* __COBJ_IMPLS_H__ */
-
-#if defined(__USE_C_OBJSYS__)
-# undef New
-# undef Del
-# undef __USE_C_OBJSYS__
-#elif defined(__COBJ_PRIV_IMPLS_H__)
-# define UNUSED(arg) while(0 && (arg))
-# define TYPE(klass) \
- struct __ ## klass ## _impl
-# define GETTER(klass, field, type, body, ...) \
- type klass##_get_##field(klass self, ## __VA_ARGS__) \
- body
-# define SETTER(klass, field, type, body, ...) \
- bool klass##_set_##field(klass self, ## __VA_ARGS__, type value) \
- body
-# define DEFINE(klass, name, type, body, ...) \
- type klass##_##name(klass self, ## __VA_ARGS__) \
- body
-# define NEW(klass, body, ...) \
- klass klass ## _new(__VA_ARGS__) \
- body
-# define DEL(klass, body, ...) \
- void klass ## _del(klass self, ## __VA_ARGS__) \
- body
-
-# define Property(klass, name) \
- (self->get_ ## name) = (& klass ## _ ## get_ ## name), \
- (self->set_ ## name) = (& klass ## _ ## set_ ## name)
-
-# define Callable(klass, name) \
- (self->name) = (& klass ## _ ## name)
-
-# define SELF(name) \
- self->_property_ ## name
-# define GET(obj, name) \
- (obj)->_property_ ## name
-
-#else
+# define New(klass, ...) \
+ klass##_new(__VA_ARGS__)
+# define Del(instance) \
+ (instance)->destroy((instance)), instance = NULL
+#elif defined(__COBJ_DECL__)
# define Class(klass, data, ...) \
typedef struct __##klass##_impl * klass; \
klass klass ## _new(__VA_ARGS__); \
- void klass ## _delete(); \
+ void klass ## _delete(klass); \
struct __##klass##_impl data
# define List(klass, field, type, dim, ...) \
@@ -65,7 +52,49 @@
# define Func(klass, name, type, ...) \
type (*name)(klass, ## __VA_ARGS__)
-# define Del (klass) \
+
+# define Del(klass) \
void (*destroy)(klass)
-# define __USE_C_OBJSYS__
+#elif defined(__COBJ_IMPL__)
+# define UNUSED(arg) while(0 && (arg))
+# define TYPE(klass) \
+ struct __ ## klass ## _impl
+# define Get(klass, field, type, body, ...) \
+ type klass##_get_##field(klass self, ## __VA_ARGS__) \
+ body
+# define Set(klass, field, type, body, ...) \
+ bool klass##_set_##field(klass self, ## __VA_ARGS__, type value) \
+ body
+# define Def(klass, name, type, body, ...) \
+ type klass##_##name(klass self, ## __VA_ARGS__) \
+ body
+# define New(klass, body, ...) \
+ klass klass ## _new(__VA_ARGS__) { \
+ klass self = (klass)malloc(sizeof(TYPE(klass))); \
+ if(self != NULL) body; \
+ return self; \
+ }
+
+# define Del(klass, body, ...) \
+ void klass ## _delete(klass self, ## __VA_ARGS__) \
+ body
+
+# define Prop(klass, name) \
+ (self->get_ ## name) = (& klass ## _ ## get_ ## name), \
+ (self->set_ ## name) = (& klass ## _ ## set_ ## name)
+
+# define Func(klass, name) \
+ (self->name) = (& klass ## _ ## name)
+# define DelF(klass) \
+ (self->destroy) = (&klass ## _delete)
+
+# define Self(name) \
+ self->_property_ ## name
+# define Attr(instance, name) \
+ (instance)->_property_ ## name
+# define Call(instance, fun, ...) \
+ (instance)->fun(instance, ## __VA_ARGS__)
+# define DefaultDelete { \
+ if(self != NULL) free(self); \
+ }
#endif
diff --git a/src/main.c b/src/main.c
index ecb1e65..06e2cdd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,8 +2,9 @@
#include <string.h>
#include <stdlib.h>
-#include "teams.h"
#include "common.h"
+#include "teams.h"
+
// ref(type) -> const ref to const data
// mut(type) -> const ref to mut data
@@ -59,7 +60,7 @@ int main()
team champion = Call(dref(teams), find_champion, teams, num);
Call(champion, printf);
- while(num --) Del(team, teams[num]);
+ while(num --) Del(teams[num]);
free(teams);
return 0;
diff --git a/src/teams.c b/src/teams.c
index bebb786..b0233f5 100644
--- a/src/teams.c
+++ b/src/teams.c
@@ -2,61 +2,60 @@
#include <stdlib.h>
#include <string.h>
+#define __COBJ_IMPL__
#include "teams.h"
-#define __COBJ_PRIV_IMPLS_H__
-#include "cobj.h"
// Setter definitions
// @set char[]: TEAM.name -> bool
-Setter(team, name, ref(char), {
- return !(strncpy(SELF(name), value, 255) == NULL);
+Set(team, name, ref(char), {
+ return !(strncpy(Self(name), value, 255) == NULL);
})
// @set char[]: TEAM.institution -> bool
-Setter(team, institution, ref(char), {
- return !(strncpy(SELF(institution), value, 255) == NULL);
+Set(team, institution, ref(char), {
+ return !(strncpy(Self(institution), value, 255) == NULL);
})
// @set char[]: TEAM.member_name, int: id -> bool
-Setter(team, member_name, ref(char), {
- return (id > 0 && id < 4 && !(strncpy(SELF(member_name)[id-1], value, 255) == NULL));
+Set(team, member_name, ref(char), {
+ return (id > 0 && id < 4 && !(strncpy(Self(member_name)[id-1], value, 255) == NULL));
}, int id)
// @set int: TEAM.solved -> bool
-Setter(team, solved, uint8_t, {
+Set(team, solved, uint8_t, {
if (value <= 10)
- SELF(solved) = value;
+ Self(solved) = value;
return (value <= 10);
})
// Getter definitions
// @get TEAM.name -> char[]
-Getter(team, name, ptr(char), {
- return SELF(name);
+Get(team, name, ptr(char), {
+ return Self(name);
})
// @get TEAM.institution -> char[]
-Getter(team, institution, ptr(char), {
- return SELF(institution);
+Get(team, institution, ptr(char), {
+ return Self(institution);
})
// @get TEAM.solved -> int
-Getter(team, solved, uint8_t, {
- return SELF(solved);
+Get(team, solved, uint8_t, {
+ return Self(solved);
})
-static char* const _id_error = (char *)"(incorrect id)"; // C++ fix
// @get TEAM.member_name, id -> char[]
-Getter(team, member_name, ptr(char), {
- return (id > 0 && id < 4)? SELF(member_name)[id - 1] : _id_error;
+static char* const _id_error = (char *)"(incorrect id)"; // C++ fix
+Get(team, member_name, ptr(char), {
+ return (id > 0 && id < 4)? Self(member_name)[id - 1] : _id_error;
}, int id)
-Define(team, printf, int, {
- return call(self, fprintf, stdout);
+Def(team, printf, int, {
+ return Call(self, fprintf, stdout);
})
-Define(team, fprintf, int, {
+Def(team, fprintf, int, {
return fprintf(file,
"Team name : %s\n"
"Institution: %s\n"
@@ -64,41 +63,34 @@ Define(team, fprintf, int, {
" Member 1: %s\n"
" Member 2: %s\n"
" Member 3: %s\n",
- SELF(name),
- SELF(institution),
- SELF(solved),
- SELF(member_name)[0],
- SELF(member_name)[1],
- SELF(member_name)[2]);
+ Self(name),
+ Self(institution),
+ Self(solved),
+ Self(member_name)[0],
+ Self(member_name)[1],
+ Self(member_name)[2]);
}, ptr(FILE) file)
-Define(team, find_champion, team, {
+Def(team, find_champion, team, {
UNUSED(self);
team champion = teams[num - 1];
while(num --)
- if (GET(teams[num], solved) > GET(champion, solved) )
+ if (Attr(teams[num], solved) > Attr(champion, solved) )
champion = teams[num];
return champion;
}, ptr(team) teams, size_t num)
+Del(team, DefaultDelete)
// base functions
New(team, {
- team self = (team)malloc(sizeof(TYPE(team)));
- if (self)
- {
- PROPERTY(team, name);
- PROPERTY(team, member_name);
- PROPERTY(team, institution);
- PROPERTY(team, solved);
- CALLABLE(team, printf);
- CALLABLE(team, fprintf);
- CALLABLE(team, find_champion);
- }
- return self;
-})
-
-Del(team, {
- if(self) free(self);
+ Prop(team, name);
+ Prop(team, member_name);
+ Prop(team, institution);
+ Prop(team, solved);
+ Func(team, printf);
+ Func(team, fprintf);
+ Func(team, find_champion);
+ DelF(team);
})
diff --git a/src/teams.h b/src/teams.h
index 98fb6f3..62ca7f2 100644
--- a/src/teams.h
+++ b/src/teams.h
@@ -2,9 +2,10 @@
# define __TEAMS_H__
# include <stdint.h>
# include <stdbool.h>
-# include "cobj.h"
# include "common.h"
+# define __COBJ_DECL__
+# include "cobj.h"
// Type definition
Class(team, {
List(team, name, char, [255]);
@@ -16,6 +17,8 @@ Class(team, {
Func(team, find_champion, team, ptr(team), size_t);
Del (team);
});
+
+# define __COBJ_PUB__
# include "cobj.h"
#endif /* __TEAMS_H__ */
/* vim: ts=8 */