ObjectivelyMVC
Object oriented MVC framework for SDL3 and GNU C
Loading...
Searching...
No Matches
SelectorSequence.c File Reference
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <Objectively/Array.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 33 of file SelectorSequence.c.

Function Documentation

◆ _SelectorSequence()

Class * _SelectorSequence ( void  )

Definition at line 190 of file SelectorSequence.c.

190 {
191 static Class *clazz;
192 static Once once;
193
194 do_once(&once, {
195 clazz = _initialize(&(const ClassDef) {
196 .name = "SelectorSequence",
197 .superclass = _Object(),
198 .instanceSize = sizeof(SelectorSequence),
199 .interfaceOffset = offsetof(SelectorSequence, interface),
200 .interfaceSize = sizeof(SelectorSequenceInterface),
202 });
203 });
204
205 return clazz;
206}
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 40 of file SelectorSequence.c.

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

◆ description()

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

Definition at line 53 of file SelectorSequence.c.

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

◆ initialize()

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

Definition at line 176 of file SelectorSequence.c.

176 {
177
178 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
179 ((ObjectInterface *) clazz->interface)->description = description;
180
181 ((SelectorSequenceInterface *) clazz->interface)->initWithSequence = initWithSequence;
182 ((SelectorSequenceInterface *) clazz->interface)->matchesView = matchesView;
183 ((SelectorSequenceInterface *) clazz->interface)->parse = parse;
184}
static bool matchesView(const SelectorSequence *self, const View *view)
static Array * parse(const char *rule)
static String * description(const Object *self)
static SelectorSequence * initWithSequence(SelectorSequence *self, const char *sequence)
bool matchesView(const SelectorSequence *self, const View *view)

◆ initWithSequence()

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

Definition at line 66 of file SelectorSequence.c.

66 {
67
68 self = (SelectorSequence *) super(Object, self, init);
69 if (self) {
70
71 self->sequence = strtrim(sequence);
72 assert(self->sequence);
73
74 assert(strlen(self->sequence));
75
76 self->simpleSelectors = $$(SimpleSelector, parse, self->sequence);
77 assert(self->simpleSelectors->count);
78 }
79
80 return self;
81}
static View * init(View *self)
Definition Box.c:67
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 87 of file SelectorSequence.c.

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

◆ parse()

static Array * parse ( const char *  rule)
static

Definition at line 131 of file SelectorSequence.c.

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

◆ sequenceCombinator()

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

Definition at line 102 of file SelectorSequence.c.

102 {
103
105
106 while (isspace(*c)) {
107 combinator = SequenceCombinatorDescendent;
108 c++;
109 }
110
111 switch (*c) {
112 case '>':
114 case '~':
116 case '+':
118 case '\0':
120 default:
121 break;
122 }
123
124 return combinator;
125}
@ SequenceCombinatorTerminal
@ SequenceCombinatorAdjacent
@ SequenceCombinatorChild
@ SequenceCombinatorDescendent
@ SequenceCombinatorSibling