Objectively 1.0.0
Ultra-lightweight object oriented framework for GNU C.
Macros | Functions | Variables
Resource.c File Reference
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include "MutableArray.h"
#include "Resource.h"
#include "Value.h"

Go to the source code of this file.

Macros

#define _Class   _Resource
 

Functions

Class_Resource (void)
 
static void addResourcePath (const char *path)
 
static void addResourceProvider (ResourceProvider provider)
 
static void dealloc (Object *self)
 
static void destroy (Class *clazz)
 
static void initialize (Class *clazz)
 
static ResourceinitWithBytes (Resource *self, const uint8_t *bytes, size_t length, const char *name)
 
static ResourceinitWithData (Resource *self, Data *data, const char *name)
 
static ResourceinitWithName (Resource *self, const char *name)
 
static void removeResourcePath (const char *path)
 
static void removeResourceProvider (ResourceProvider provider)
 
static ResourceresourceWithName (const char *name)
 

Variables

static MutableArray_resourcePaths
 
static MutableArray_resourceProviders
 

Macro Definition Documentation

◆ _Class

#define _Class   _Resource

Definition at line 34 of file Resource.c.

Function Documentation

◆ _Resource()

Class * _Resource ( void  )

Definition at line 241 of file Resource.c.

241 {
242 static Class *clazz;
243 static Once once;
244
245 do_once(&once, {
246 clazz = _initialize(&(const ClassDef) {
247 .name = "Resource",
248 .superclass = _Object(),
249 .instanceSize = sizeof(Resource),
250 .interfaceOffset = offsetof(Resource, interface),
251 .interfaceSize = sizeof(ResourceInterface),
253 .destroy = destroy,
254 });
255 });
256
257 return clazz;
258}
Class * _initialize(const ClassDef *def)
Initializes the given Class.
Definition: Class.c:91
static void destroy(Class *clazz)
Definition: Resource.c:232
static void initialize(Class *clazz)
Definition: Resource.c:193
long Once
The Once type.
Definition: Once.h:37
#define do_once(once, block)
Executes the given block at most one time.
Definition: Once.h:43
ClassDefs are passed to _initialize via an archetype to initialize a Class.
Definition: Class.h:41
The runtime representation of a Class.
Definition: Class.h:95
Class * _Object(void)
The Object archetype.
Definition: Object.c:136
Resources provide an abstraction for file and stream resources.
Definition: Resource.h:53

◆ addResourcePath()

static void addResourcePath ( const char *  path)
static

Definition at line 61 of file Resource.c.

61 {
62
63 assert(path);
64 String *string = str(path);
65
66 $(_resourcePaths, addObject, string);
67 release(string);
68}
ident release(ident obj)
Atomically decrement the given Object's reference count. If the resulting reference count is 0,...
Definition: Class.c:196
static MutableArray * _resourcePaths
Definition: Resource.c:36
void addObject(MutableArray *self, const ident obj)
Adds the specified Object to this MutableArray.
Definition: MutableArray.c:99
Immutable UTF-8 strings.
Definition: String.h:69
OBJECTIVELY_EXPORT String * str(const char *fmt,...)
A convenience function for instantiating Strings.
Definition: String.c:739

◆ addResourceProvider()

static void addResourceProvider ( ResourceProvider  provider)
static

Definition at line 74 of file Resource.c.

74 {
75
76 assert(provider);
77 Value *value = $(alloc(Value), initWithValue, provider);
78
80 release(value);
81}
#define alloc(type)
Allocate and initialize and instance of type.
Definition: Class.h:159
static MutableArray * _resourceProviders
Definition: Resource.c:37
Number * initWithValue(Number *self, double value)
Initializes this Number with the specified value.
Definition: Number.c:137
Values provide Object encapsulation for C types.
Definition: Value.h:45

◆ dealloc()

static void dealloc ( Object self)
static
See also
Object::dealloc(Object *)

Definition at line 44 of file Resource.c.

44 {
45
46 Resource *this = (Resource *) self;
47
48 release(this->data);
49
50 free(this->name);
51
52 super(Object, self, dealloc);
53}
#define super(type, obj, method,...)
MutableData * data(void)
Returns a new MutableData.
Definition: MutableData.c:75
Object is the root Class of The Objectively Class hierarchy.
Definition: Object.h:46
void dealloc(Object *self)
Frees all resources held by this Object.
Definition: Array.c:50

◆ destroy()

static void destroy ( Class clazz)
static
See also
Class::destroy(Class *)

Definition at line 232 of file Resource.c.

◆ initialize()

static void initialize ( Class clazz)
static
See also
Class::initialize(Class *)

Definition at line 193 of file Resource.c.

193 {
194
195 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
196
197 ((ResourceInterface *) clazz->interface)->addResourcePath = addResourcePath;
198 ((ResourceInterface *) clazz->interface)->addResourceProvider = addResourceProvider;
199 ((ResourceInterface *) clazz->interface)->initWithBytes = initWithBytes;
200 ((ResourceInterface *) clazz->interface)->initWithData = initWithData;
201 ((ResourceInterface *) clazz->interface)->initWithName = initWithName;
202 ((ResourceInterface *) clazz->interface)->removeResourcePath = removeResourcePath;
203 ((ResourceInterface *) clazz->interface)->removeResourceProvider = removeResourceProvider;
204 ((ResourceInterface *) clazz->interface)->resourceWithName = resourceWithName;
205
207 assert(_resourcePaths);
208
209 const char *env = getenv("OBJECTIVELY_RESOURCE_PATH");
210 if (env) {
211
212 String *string = $$(String, stringWithCharacters, env);
214
215 for (size_t i = 0; i < paths->count; i++) {
216 addResourcePath(((String *) $(paths, objectAtIndex, i))->chars);
217 }
218
219 release(paths);
220 release(string);
221 }
222
223 addResourcePath(".");
224
226 assert(_resourceProviders);
227}
#define PATH_DELIM
Definition: Resource.h:32
Immutable arrays.
Definition: Array.h:56
ident objectAtIndex(const Array *self, int index)
size_t count
The count of elements.
Definition: Array.h:72
ident interface
The interface of the Class.
Definition: Class.h:105
Condition * init(Condition *self)
Initializes this Condition.
Definition: Condition.c:67
Data * initWithBytes(Data *self, const uint8_t *bytes, size_t length)
Initializes this Data by copying length of bytes.
Definition: Data.c:145
Log * initWithName(Log *self, const char *name)
Initializes this Log with the specified name.
Definition: Log.c:141
Mutable arrays.
Definition: MutableArray.h:40
MutableData * initWithData(MutableData *self, const Data *data)
Initializes this Data with the contents of data.
Definition: MutableData.c:124
void removeResourceProvider(ResourceProvider provider)
Removes the specified ResourceProvider.
Definition: Resource.c:171
Resource * resourceWithName(const char *name)
Returns a new Resource with the specified name.
Definition: Resource.c:184
void addResourceProvider(ResourceProvider provider)
Adds the specified ResourceProvider.
Definition: Resource.c:74
void removeResourcePath(const char *path)
Removes the specified Resource path.
Definition: Resource.c:158
void addResourcePath(const char *path)
Adds the specified Resource path.
Definition: Resource.c:61
Array * componentsSeparatedByCharacters(const String *self, const char *chars)
Returns the components of this String that were separated by chars.
Definition: String.c:184
String * stringWithCharacters(const char *chars)
Returns a new String by copying chars.
Definition: String.c:487

◆ initWithBytes()

static Resource * initWithBytes ( Resource self,
const uint8_t *  bytes,
size_t  length,
const char *  name 
)
static

Definition at line 87 of file Resource.c.

87 {
88
89 Data *data = $$(Data, dataWithBytes, bytes, length);
90 self = $(self, initWithData, data, name);
91
93 return self;
94}
Immutable data buffers.
Definition: Data.h:50
Data * dataWithBytes(const uint8_t *bytes, size_t length)
Returns a new Data by copying length of bytes.
Definition: Data.c:109

◆ initWithData()

static Resource * initWithData ( Resource self,
Data data,
const char *  name 
)
static

Definition at line 100 of file Resource.c.

100 {
101
102 self = (Resource *) super(Object, self, init);
103 if (self) {
104 assert(data);
105 self->data = retain(data);
106
107 assert(name);
108 self->name = strdup(name);
109 }
110
111 return self;
112}
ident retain(ident obj)
Atomically increment the given Object's reference count.
Definition: Class.c:211
Data * data
The resource data.
Definition: Resource.h:69
char * name
The resource name.
Definition: Resource.h:74

◆ initWithName()

static Resource * initWithName ( Resource self,
const char *  name 
)
static

Definition at line 118 of file Resource.c.

118 {
119
120 Data *data = NULL;
121
122 const Array *resourceProviders = (Array *) _resourceProviders;
123 for (size_t i = 0; i < resourceProviders->count && data == NULL; i++) {
124
125 const Value *value = $(resourceProviders, objectAtIndex, i);
126 data = ((ResourceProvider) (value->value))(name);
127 }
128
129 const Array *resourcePaths = (Array *) _resourcePaths;
130 for (size_t i = 0; i < resourcePaths->count && data == NULL; i++) {
131
132 const String *resourcePath = $(resourcePaths, objectAtIndex, i);
133 String *path = str("%s%s%s", resourcePath->chars, PATH_SEPAR, name);
134
135 struct stat s;
136 if (stat(path->chars, &s) == 0 && S_ISREG(s.st_mode)) {
138 }
139
140 release(path);
141 }
142
143 if (data) {
144 self = $(self, initWithData, data, name);
145 } else {
146 self = release(self);
147 }
148
149 release(data);
150
151 return self;
152}
Data *(* ResourceProvider)(const char *name)
Applications may specify a provider function for loading via file system abstractions.
Definition: Resource.h:47
#define PATH_SEPAR
Definition: Resource.h:33
Data * dataWithContentsOfFile(const char *path)
Returns a new Data with the contents of the file at path.
Definition: Data.c:127
char * chars
The backing null-terminated UTF-8 encoded character array.
Definition: String.h:85
ident value
The backing value.
Definition: Value.h:61

◆ removeResourcePath()

static void removeResourcePath ( const char *  path)
static

Definition at line 158 of file Resource.c.

158 {
159
160 String *string = $$(String, stringWithCharacters, path);
161
162 $(_resourcePaths, removeObject, string);
163
164 release(string);
165}
void removeObject(MutableArray *self, const ident obj)
Removes the specified Object from this MutableArray.
Definition: MutableArray.c:270

◆ removeResourceProvider()

static void removeResourceProvider ( ResourceProvider  provider)
static

Definition at line 171 of file Resource.c.

171 {
172
173 Value *value = $(alloc(Value), initWithValue, provider);
174
176
177 release(value);
178}

◆ resourceWithName()

static Resource * resourceWithName ( const char *  name)
static

Definition at line 184 of file Resource.c.

184 {
185 return $(alloc(Resource), initWithName, name);
186}

Variable Documentation

◆ _resourcePaths

MutableArray* _resourcePaths
static

Definition at line 36 of file Resource.c.

◆ _resourceProviders

MutableArray* _resourceProviders
static

Definition at line 37 of file Resource.c.