Skip to content

Commit 570a83a

Browse files
authored
add bit offset support (#10)
* add bit offset support * demonstrate different display modes * add right and left buffer shifts * update bindings * add viewport destroy
1 parent 6172d73 commit 570a83a

File tree

6 files changed

+483
-39
lines changed

6 files changed

+483
-39
lines changed

.gitignore

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
# generate files
1+
# generated files
22
node_modules/
33
build/
4-
cmake-build-debug/
4+
cmake-build-*/
55

66
# log files
7-
*.log
7+
*.log
8+
9+
# IDE files
10+
.idea/

omega_edit/omega_edit.cpp

+77-14
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ struct viewport_t {
8181
on_change_cbk cbk{};
8282
void *user_data_ptr{};
8383
vector<uint8_t> data;
84+
uint8_t bit_offset{};
8485
};
8586

8687
const author_t *get_viewport_author(const viewport_t *viewport_ptr) {
@@ -107,20 +108,62 @@ void *get_viewport_user_data(const viewport_t *viewport_ptr) {
107108
return viewport_ptr->user_data_ptr;
108109
}
109110

111+
uint8_t get_viewport_bit_offset(const viewport_t *viewport_ptr) {
112+
return viewport_ptr->bit_offset;
113+
}
114+
115+
typedef vector<shared_ptr<author_t> > author_vector_t;
116+
typedef vector<shared_ptr<viewport_t> > viewport_vector_t;
117+
typedef vector<change_t> change_vector_t;
118+
110119
struct session_t {
111120
FILE *file_ptr{};
112121
int64_t serial{};
113122
int64_t computed_file_size{};
114-
vector<shared_ptr<author_t> > authors;
115-
vector<shared_ptr<viewport_t> > viewports;
116-
vector<change_t> changes;
123+
author_vector_t authors;
124+
viewport_vector_t viewports;
125+
change_vector_t changes;
117126
vector<int64_t> changes_by_offset;
118127
};
119128

120129
//
121130
// FUNCTIONS
122131
//
123132

133+
int left_shift_buffer(uint8_t *array, int64_t len, uint8_t shift_left) {
134+
int rc = -1;
135+
if (shift_left > 0 && shift_left < 8) {
136+
uint8_t shift_right = 8 - shift_left;
137+
uint8_t mask = ((1 << shift_left) - 1) << shift_right;
138+
uint8_t bits1 = 0;
139+
for (auto i = len - 1; i >= 0; --i) {
140+
auto bits2 = array[i] & mask;
141+
array[i] <<= shift_left;
142+
array[i] |= bits1 >> shift_right;
143+
bits1 = bits2;
144+
}
145+
rc = 0;
146+
}
147+
return rc;
148+
}
149+
150+
int right_shift_buffer(uint8_t *array, int64_t len, uint8_t shift_right) {
151+
int rc = -1;
152+
if (shift_right > 0 && shift_right < 8) {
153+
uint8_t shift_left = 8 - shift_right;
154+
uint8_t mask = (1 << shift_right) - 1;
155+
uint8_t bits1 = 0;
156+
for (auto i = len - 1; i >= 0; --i) {
157+
auto bits2 = array[i] & mask;
158+
array[i] >>= shift_right;
159+
array[i] |= bits1 << shift_left;
160+
bits1 = bits2;
161+
}
162+
rc = 0;
163+
}
164+
return rc;
165+
}
166+
124167
session_t *create_session(FILE *file_ptr) {
125168
fseek(file_ptr, 0L, SEEK_END);
126169
auto *session_ptr = new session_t;
@@ -147,7 +190,8 @@ session_t *get_author_session(const author_t *author_ptr) {
147190
}
148191

149192
viewport_t *
150-
add_viewport(const author_t *author_ptr, int64_t offset, int32_t capacity, on_change_cbk cbk, void *user_data_ptr) {
193+
add_viewport(const author_t *author_ptr, int64_t offset, int32_t capacity, on_change_cbk cbk, void *user_data_ptr,
194+
uint8_t bit_offset) {
151195
auto viewport_ptr = shared_ptr<viewport_t>(new viewport_t);
152196
viewport_ptr->author_ptr = author_ptr;
153197
viewport_ptr->computed_offset = offset;
@@ -156,31 +200,52 @@ add_viewport(const author_t *author_ptr, int64_t offset, int32_t capacity, on_ch
156200
viewport_ptr->data.reserve(capacity);
157201
viewport_ptr->cbk = cbk;
158202
viewport_ptr->user_data_ptr = user_data_ptr;
203+
viewport_ptr->bit_offset = bit_offset;
159204
author_ptr->session_ptr->viewports.push_back(viewport_ptr);
160205
// TODO: populate the viewport and call the on change callback
161206
read_segment(author_ptr->session_ptr->file_ptr, offset, author_ptr->session_ptr->computed_file_size,
162207
viewport_ptr->data.data(), viewport_ptr->capacity,
163-
&viewport_ptr->length);
208+
&viewport_ptr->length, viewport_ptr->bit_offset);
164209
(*viewport_ptr->cbk)(viewport_ptr.get(), nullptr);
165210
return viewport_ptr.get();
166211
}
167212

168-
int set_viewport(viewport_t *viewport_ptr, int64_t offset, int32_t capacity) {
213+
int destroy_viewport(const viewport_t *viewport_ptr) {
214+
int rc = -1;
215+
viewport_vector_t *session_viewport_ptr = &viewport_ptr->author_ptr->session_ptr->viewports;
216+
for (auto iter = session_viewport_ptr->begin(); iter != session_viewport_ptr->end(); ++iter) {
217+
if (viewport_ptr == iter->get()) {
218+
session_viewport_ptr->erase(iter);
219+
rc = 0;
220+
break;
221+
}
222+
}
223+
return rc;
224+
}
225+
226+
int set_viewport(viewport_t *viewport_ptr, int64_t offset, int32_t capacity, uint8_t bit_offset) {
169227
// only change settings if they are different
170-
if (viewport_ptr->computed_offset != offset || viewport_ptr->capacity != capacity) {
228+
if (viewport_ptr->computed_offset != offset || viewport_ptr->capacity != capacity ||
229+
viewport_ptr->bit_offset != bit_offset) {
171230
viewport_ptr->computed_offset = offset;
172231
viewport_ptr->capacity = capacity;
173232
viewport_ptr->data.reserve(capacity);
233+
viewport_ptr->bit_offset = bit_offset;
174234
// TODO: update viewport and call the on change callback
175235
read_segment(viewport_ptr->author_ptr->session_ptr->file_ptr, offset,
176236
viewport_ptr->author_ptr->session_ptr->computed_file_size, viewport_ptr->data.data(),
177237
viewport_ptr->capacity,
178-
&viewport_ptr->length);
238+
&viewport_ptr->length,
239+
viewport_ptr->bit_offset);
179240
(*viewport_ptr->cbk)(viewport_ptr, nullptr);
180241
}
181242
return 0;
182243
}
183244

245+
size_t num_viewports(const session_t *session_ptr) {
246+
return session_ptr->viewports.size();
247+
}
248+
184249
// Internal function to add a change to the given session
185250
int add_change_(const change_t *change_ptr) {
186251
auto session_ptr = change_ptr->author_ptr->session_ptr;
@@ -286,12 +351,15 @@ size_t num_changes_by_author(const author_t *author_ptr) {
286351
}
287352

288353
int read_segment(FILE *from_file_ptr, int64_t offset, int64_t file_size, uint8_t *buffer, int64_t capacity,
289-
int64_t *length) {
354+
int64_t *length, uint8_t bit_offset) {
290355
auto len = file_size - offset;
291356
if (len > 0) {
292357
*length = (len < capacity) ? len : capacity;
293358
fseek(from_file_ptr, offset, SEEK_SET);
294359
fread(buffer, 1, *length, from_file_ptr);
360+
if (bit_offset > 0) {
361+
left_shift_buffer(buffer, *length, bit_offset);
362+
}
295363
}
296364
return 0;
297365
}
@@ -368,11 +436,6 @@ int save(const author_t *author_ptr, FILE *file_ptr) {
368436
return 0;
369437
}
370438

371-
viewport_t *add_viewport(const author_t *author_ptr, int32_t capacity, on_change_cbk cbk, void *user_data_ptr) {
372-
// TODO: Implement
373-
return nullptr;
374-
}
375-
376439
// returns 1 if a change was found and undone and 0 if no change was found
377440
int undo(const author_t *author_ptr) {
378441
int rc = 0;

omega_edit/omega_edit.h

+15-3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ const uint8_t *get_viewport_data(const viewport_t *viewport_ptr);
5050

5151
void *get_viewport_user_data(const viewport_t *viewport_ptr);
5252

53+
uint8_t get_viewport_bit_offset(const viewport_t *viewport_ptr);
54+
5355
// Returns the author's name from the given author structure
5456
const char *get_author_name(const author_t *author_ptr);
5557

@@ -63,7 +65,10 @@ const author_t *add_author(session_t *session_ptr, const char *author_name);
6365

6466
// Add a viewport to the given session
6567
viewport_t *
66-
add_viewport(const author_t *author_ptr, int64_t offset, int32_t capacity, on_change_cbk cbk, void *user_data_ptr);
68+
add_viewport(const author_t *author_ptr, int64_t offset, int32_t capacity, on_change_cbk cbk, void *user_data_ptr,
69+
uint8_t bit_offset);
70+
71+
int destroy_viewport(const viewport_t *viewport_ptr);
6772

6873
// Destroy the given session
6974
void destroy_session(session_t *session_ptr);
@@ -86,7 +91,10 @@ int64_t offset_to_computed_offset(const session_t *session_ptr, int64_t offset);
8691
int64_t computed_offset_to_offset(const session_t *session_ptr, int64_t offset);
8792

8893
// Set viewport at the given offset (return 0 on success, non-zero otherwise)
89-
int set_viewport(viewport_t *viewport_ptr, int64_t offset, int32_t capacity);
94+
int set_viewport(viewport_t *viewport_ptr, int64_t offset, int32_t capacity, uint8_t bit_offset);
95+
96+
// Number of active viewports in this given session
97+
size_t num_viewports(const session_t *session_ptr);
9098

9199
// Undo the last change for this author from the given session (return 0 on success, non-zero otherwise)
92100
int undo(const author_t *author_ptr);
@@ -95,8 +103,12 @@ int undo(const author_t *author_ptr);
95103
int save(const author_t *author_ptr, FILE *file_ptr);
96104

97105
int read_segment(FILE *from_file_ptr, int64_t offset, int64_t file_size, uint8_t *buffer, int64_t capacity,
98-
int64_t *length);
106+
int64_t *length, uint8_t bit_offset);
99107

100108
int write_segment(FILE *from_file_ptr, int64_t offset, int64_t byte_count, FILE *to_file_ptr);
101109

110+
int left_shift_buffer(uint8_t *array, int64_t len, uint8_t shift_left);
111+
112+
int right_shift_buffer(uint8_t *array, int64_t len, uint8_t shift_right);
113+
102114
#endif //OMEGA_OMEGA_EDIT_H

0 commit comments

Comments
 (0)