+void CodeGenHelper::update_intervals(output_struct* const output) {
+ if(instance->split_mode != SPLIT_TO_SLICES) return;
+
+ size_t tmp;
+
+ // 1. check if some characters are added to the charstring
+ // 2. increment size variable
+ // 3. if size is bigger than the array's size, then double the array size
+ // 4. store new end position
+
+ // class_defs are not counted as they will be in the header
+ tmp = mstrlen(output->source.function_bodies);
+ if (output->intervals.function_bodies[output->intervals.function_bodies_size] < tmp) {
+ output->intervals.function_bodies_size++;
+ if (output->intervals.function_bodies_size > output->intervals.function_bodies_max_size) {
+ output->intervals.function_bodies_max_size *= 2;
+ output->intervals.function_bodies = (size_t*)Realloc(output->intervals.function_bodies, output->intervals.function_bodies_max_size * sizeof(size_t));
+ }
+ output->intervals.function_bodies[output->intervals.function_bodies_size] = tmp;
+ }
+ tmp = mstrlen(output->source.methods);
+ if (output->intervals.methods[output->intervals.methods_size] < tmp) {
+ output->intervals.methods_size++;
+ if (output->intervals.methods_size > output->intervals.methods_max_size) {
+ output->intervals.methods_max_size *= 2;
+ output->intervals.methods = (size_t*)Realloc(output->intervals.methods, output->intervals.methods_max_size * sizeof(size_t));
+ }
+ output->intervals.methods[output->intervals.methods_size] = tmp;
+ }
+ tmp = mstrlen(output->source.static_conversion_function_bodies);
+ if (output->intervals.static_conversion_function_bodies[output->intervals.static_conversion_function_bodies_size] < tmp) {
+ output->intervals.static_conversion_function_bodies_size++;
+ if (output->intervals.static_conversion_function_bodies_size > output->intervals.static_conversion_function_bodies_max_size) {
+ output->intervals.static_conversion_function_bodies_max_size *= 2;
+ output->intervals.static_conversion_function_bodies = (size_t*)Realloc(output->intervals.static_conversion_function_bodies, output->intervals.static_conversion_function_bodies_max_size * sizeof(size_t));
+ }
+ output->intervals.static_conversion_function_bodies[output->intervals.static_conversion_function_bodies_size] = tmp;
+ }
+ tmp = mstrlen(output->source.static_function_bodies);
+ if (output->intervals.static_function_bodies[output->intervals.static_function_bodies_size] < tmp) {
+ output->intervals.static_function_bodies_size++;
+ if (output->intervals.static_function_bodies_size > output->intervals.static_function_bodies_max_size) {
+ output->intervals.static_function_bodies_max_size *= 2;
+ output->intervals.static_function_bodies = (size_t*)Realloc(output->intervals.static_function_bodies, output->intervals.static_function_bodies_max_size * sizeof(size_t));
+ }
+ output->intervals.static_function_bodies[output->intervals.static_function_bodies_size] = tmp;
+ }
+}
+//Advised to call update_intervals before this
+size_t CodeGenHelper::size_of_sources(output_struct * const output) {
+ size_t size = 0;
+ // Calculate global var and string literals size
+ output->intervals.pre_things_size = mstrlen(output->source.global_vars) + mstrlen(output->source.string_literals);
+
+ // Class_defs, static_conversion_function_prototypes, static_function_prototypes are in the header,
+ // and includes are not counted
+ size = output->intervals.pre_things_size +
+ output->intervals.function_bodies[output->intervals.function_bodies_size] +
+ output->intervals.methods[output->intervals.methods_size] +
+ output->intervals.static_conversion_function_bodies[output->intervals.static_conversion_function_bodies_size] +
+ output->intervals.static_function_bodies[output->intervals.static_function_bodies_size];
+ return size;
+}
+
+size_t CodeGenHelper::get_next_chunk_pos(const output_struct * const from, output_struct * const to, const size_t base_pos, const size_t chunk_size) {
+ size_t pos = 0; // Holds the position from the beginning
+
+ pos += from->intervals.pre_things_size;
+
+ if (pos > base_pos) {
+ to->source.global_vars = mputstr(to->source.global_vars, from->source.global_vars);
+ to->source.string_literals = mputstr(to->source.string_literals, from->source.string_literals);
+ }
+
+ get_chunk_from_poslist(from->source.methods, to->source.methods, from->intervals.methods, from->intervals.methods_size, base_pos, chunk_size, pos);
+ get_chunk_from_poslist(from->source.function_bodies, to->source.function_bodies, from->intervals.function_bodies, from->intervals.function_bodies_size, base_pos, chunk_size, pos);
+ get_chunk_from_poslist(from->source.static_function_bodies, to->source.static_function_bodies, from->intervals.static_function_bodies, from->intervals.static_function_bodies_size, base_pos, chunk_size, pos);
+ get_chunk_from_poslist(from->source.static_conversion_function_bodies, to->source.static_conversion_function_bodies, from->intervals.static_conversion_function_bodies, from->intervals.static_conversion_function_bodies_size, base_pos, chunk_size, pos);
+
+ return pos;
+}
+//if from null return.
+void CodeGenHelper::get_chunk_from_poslist(const char* from, char *& to, const size_t interval_array[], const size_t interval_array_size, const size_t base_pos, const size_t chunk_size, size_t& pos) {
+ if (from == NULL) return;
+ // If we have enough to form a chunk
+
+ // pos is unsigned so it can't be negative
+ if (pos > base_pos && pos - base_pos >= chunk_size) return;
+
+ size_t tmp = pos;
+
+ pos += interval_array[interval_array_size];
+
+ if (pos > base_pos) { // If we haven't finished with this interval_array
+ if (pos - base_pos >= chunk_size) { // It is a good chunk, but make it more precise because it may be too big
+ int ind = 0;
+ for (int i = 0; i <= interval_array_size; i++) {
+ if (tmp + interval_array[i] <= base_pos) { // Find the pos where we left off
+ ind = i;
+ } else if (tmp + interval_array[i] - base_pos >= chunk_size) {
+ // Found the first optimal position that is a good chunk
+ to = mputstrn(to, from + interval_array[ind], interval_array[i] - interval_array[ind]);
+ pos = tmp + interval_array[i];
+ return;
+ }
+ }
+ } else { // We can't form a new chunk from the remaining characters
+ int ind = 0;
+ for (int i = 0; i <= interval_array_size; i++) {
+ if (tmp + interval_array[i] <= base_pos) {
+ ind = i;
+ } else {
+ break;
+ }
+ }
+ // Put the remaining characters
+ to = mputstrn(to, from + interval_array[ind], interval_array[interval_array_size] - interval_array[ind]);
+ pos = tmp + interval_array[interval_array_size];
+ }
+ }
+}
+