ObjectivelyMVC 0.1.0
Object oriented MVC framework for OpenGL, SDL2 and GNU C
Macros | Functions
SelectorSequence.c File Reference
#include <assert.h>
#include <string.h>
#include <Objectively/MutableArray.h>
#include "SelectorSequence.h"
#include "View.h"

Go to the source code of this file.

Macros

#define _Class   _SelectorSequence
 

Functions

Class * _SelectorSequence (void)
 
static void dealloc (Object *self)
 
static String * description (const Object *self)
 
static void initialize (Class *clazz)
 
static SelectorSequenceinitWithSequence (SelectorSequence *self, const char *sequence)
 
static _Bool matchesView (const SelectorSequence *self, const View *view)
 
static Array * parse (const char *rule)
 
static SequenceCombinator sequenceCombinator (const char *c)
 

Macro Definition Documentation

◆ _Class

#define _Class   _SelectorSequence

Definition at line 32 of file SelectorSequence.c.

Function Documentation

◆ _SelectorSequence()

Class * _SelectorSequence ( void  )

Definition at line 189 of file SelectorSequence.c.

189 {
190 static Class *clazz;
191 static Once once;
192
193 do_once(&once, {
194 clazz = _initialize(&(const ClassDef) {
195 .name = "SelectorSequence",
196 .superclass = _Object(),
197 .instanceSize = sizeof(SelectorSequence),
198 .interfaceOffset = offsetof(SelectorSequence, interface),
199 .interfaceSize = sizeof(SelectorSequenceInterface),
201 });
202 });
203
204 return clazz;
205}
static void initialize(Class *clazz)
SelectorSequences are comprised of one or more SimpleSelectors.

◆ dealloc()

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

Definition at line 39 of file SelectorSequence.c.

39 {
40
41 SelectorSequence *this = (SelectorSequence *) self;
42
43 free(this->sequence);
44 release(this->simpleSelectors);
45
46 super(Object, self, dealloc);
47}
static void dealloc(Object *self)

◆ description()

static String * description ( const Object *  self)
static
See also
Object::description(const Object *)

Definition at line 52 of file SelectorSequence.c.

52 {
53
54 const SelectorSequence *this = (SelectorSequence *) self;
55
56 return str(this->sequence);
57}

◆ initialize()

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

Definition at line 175 of file SelectorSequence.c.

175 {
176
177 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
178 ((ObjectInterface *) clazz->interface)->description = description;
179
180 ((SelectorSequenceInterface *) clazz->interface)->initWithSequence = initWithSequence;
181 ((SelectorSequenceInterface *) clazz->interface)->matchesView = matchesView;
182 ((SelectorSequenceInterface *) clazz->interface)->parse = parse;
183}
static String * description(const Object *self)
_Bool matchesView(const Selector *self, View *view)
Array * parse(const char *rules)
Parses the null-terminated C string of Selector rules into an Array of Selectors.
Definition: Selector.c:274
_Bool matchesView(const SelectorSequence *self, const View *view)
SelectorSequence * initWithSequence(SelectorSequence *self, const char *sequence)
Initializes this SelectorSequence with the given sequence.

◆ initWithSequence()

static SelectorSequence * initWithSequence ( SelectorSequence self,
const char *  sequence 
)
static

Definition at line 65 of file SelectorSequence.c.

65 {
66
67 self = (SelectorSequence *) super(Object, self, init);
68 if (self) {
69
70 self->sequence = strtrim(sequence);
71 assert(self->sequence);
72
73 assert(strlen(self->sequence));
74
75 self->simpleSelectors = $$(SimpleSelector, parse, self->sequence);
76 assert(self->simpleSelectors->count);
77 }
78
79 return self;
80}
CollectionView * init(CollectionView *self, const SDL_Rect *frame)
Initializes this CollectionView with the specified frame and style.
char * sequence
The sequence, as provided by the user.
Array * simpleSelectors
The SimpleSelectors comprising this SelectorSequence.
The SimpleSelector type.

◆ matchesView()

static _Bool matchesView ( const SelectorSequence self,
const View view 
)
static

Definition at line 86 of file SelectorSequence.c.

86 {
87
88 for (size_t i = 0; i < self->simpleSelectors->count; i++) {
89 const SimpleSelector *simpleSelector = $(self->simpleSelectors, objectAtIndex, i);
90 if ($(view, matchesSelector, simpleSelector) == false) {
91 return false;
92 }
93 }
94
95 return true;
96}
_Bool matchesSelector(const View *self, const SimpleSelector *simpleSelector)

◆ parse()

static Array * parse ( const char *  rule)
static

Definition at line 130 of file SelectorSequence.c.

130 {
131
132 assert(rule);
133
134 MutableArray *selectorSequences = $$(MutableArray, arrayWithCapacity, 8);
135 assert(selectorSequences);
136
138
139 const char *c = rule;
140 while (*c) {
141 const size_t size = strcspn(c, " \n\t>+~");
142 if (size) {
143 char *sequence = calloc(1, size + 1);
144 assert(sequence);
145
146 strncpy(sequence, c, size);
147
148 SelectorSequence *selectorSequence = $(alloc(SelectorSequence), initWithSequence, sequence);
149 assert(selectorSequence);
150
151 selectorSequence->right = sequenceCombinator(c + size);
152 assert(selectorSequence->right);
153
154 selectorSequence->left = left;
155 left = selectorSequence->right;
156
157 $(selectorSequences, addObject, selectorSequence);
158
159 release(selectorSequence);
160 free(sequence);
161 }
162
163 c += size;
164 c += strspn(c, " \n\t>+~");
165 }
166
167 return (Array *) selectorSequences;
168}
static SequenceCombinator sequenceCombinator(const char *c)
SequenceCombinator
Combinators are operators for chaining SelectorSequences.
@ SequenceCombinatorNone
SDL_Size size(const Image *self)
Definition: Image.c:181
SequenceCombinator right
SequenceCombinator left
The combinators.

◆ sequenceCombinator()

static SequenceCombinator sequenceCombinator ( const char *  c)
static
Returns
The SequenceCombinator for the given character.

Definition at line 101 of file SelectorSequence.c.

101 {
102
104
105 while (isspace(*c)) {
106 combinator = SequenceCombinatorDescendent;
107 c++;
108 }
109
110 switch (*c) {
111 case '>':
113 case '~':
115 case '+':
117 case '\0':
119 default:
120 break;
121 }
122
123 return combinator;
124}
@ SequenceCombinatorTerminal
@ SequenceCombinatorAdjacent
@ SequenceCombinatorChild
@ SequenceCombinatorDescendent
@ SequenceCombinatorSibling