Files
Jonas Volman 709bfc3a3c Reconcile approved frontier ownership and admission packets
Import only independently reviewed production changes. Preserve canonical physics and virtual-keyboard repairs; keep B3 and all unresolved holds out.

Record exactly four approved canary debits (6987 meaningful bytes), six Halo admissions and two revocations. Keep vendor ioinit/storage work separate. Full build, 8252-row sweep, 1318 tests, park/admission/fake audits and 621-object binding pass within approved debit bounds.

Do not publish donor research dumps or private assets. README and unrelated user research remain untouched. See frontier_publication_reconciliation_20260927.md for complete evidence limits and accounting.
2026-09-27 17:12:48 -07:00

484 lines
10 KiB
C

/*
ARRAY.C
symbols in this file:
00107340 0070:
_dynamic_array_new (0000)
001073B0 0160:
_dynamic_array_resize (0000)
00107510 00b0:
_dynamic_array_delete (0000)
001075C0 0140:
_dynamic_array_add_element (0000)
00107700 0110:
_dynamic_array_get_element (0000)
00107810 01a0:
_dynamic_array_delete_element (0000)
001079B0 00d0:
_static_array_new (0000)
00107A80 0110:
_static_array_resize (0000)
00107B90 00f0:
_static_array_add_element (0000)
00107C80 00c0:
_static_array_get_element (0000)
00107D40 0100:
_static_array_delete_element (0000)
0027CE78 0024:
??_C@_0CE@KCKHAMIF@memory_dynamic_array_delete_elem@ (0000)
0027CE9C 0021:
??_C@_0CB@NKFOJKLF@memory_dynamic_array_add_element@ (0000)
0027CEC0 001c:
??_C@_0BM@IGGAIAHM@memory_dynamic_array_resize?$AA@ (0000)
0027CEDC 000f:
??_C@_0P@CJCKPFMH@element_size?$DO0?$AA@ (0000)
0027CEEC 0006:
??_C@_05HIFJDKLD@array?$AA@ (0000)
0027CEF4 001e:
??_C@_0BO@EGDDFGGJ@c?3?2halo?2SOURCE?2memory?2array?4c?$AA@ (0000)
0027CF14 002b:
??_C@_0CL@PCJNGNEA@?$CIarray?9?$DOcount?$CB?$DN0?$CJ?$DN?$DN?$CIarray?9?$DOeleme@ (0000)
0027CF40 0010:
??_C@_0BA@HPNKGLPB@array?9?$DOcount?$DO?$DN0?$AA@ (0000)
0027CF50 0016:
??_C@_0BG@KKKOHAGJ@array?9?$DOelement_size?$DO0?$AA@ (0000)
0027CF68 001f:
??_C@_0BP@JEHOMNNO@index?$DO?$DN0?5?$CG?$CG?5index?$DMarray?9?$DOcount?$AA@ (0000)
0027CF88 0022:
??_C@_0CC@JPIBLJKM@array?9?$DOelement_size?$DN?$DNelement_siz@ (0000)
0027CFAC 0021:
??_C@_0CB@JIEOIIBG@maximum_count?$DM?$DNUNSIGNED_CHAR_MAX@ (0000)
0027CFD0 0009:
??_C@_08DIGDHHDM@elements?$AA@ (0000)
0027CFDC 0006:
??_C@_05IOMEMJEC@count?$AA@ (0000)
0027CFE4 0013:
??_C@_0BD@BKIDJHK@count?5?$CG?$CG?5?$CKcount?$DO?$DN0?$AA@ (0000)
0027CFF8 0018:
??_C@_0BI@BFNCGHOC@index?$DO?$DN0?5?$CG?$CG?5index?$DMcount?$AA@ (0000)
0027D010 0019:
??_C@_0BJ@BPOKGEAL@index?$DO?$DN0?5?$CG?$CG?5index?$DM?$CKcount?$AA@ (0000)
0027D02C 0012:
??_C@_0BC@OADPDCKA@count?5?$CG?$CG?5?$CKcount?$DO0?$AA@ (0000)
00308BC0 11e8:
_data_00308bc0 (0000)
*/
/* ---------- headers */
#include "cseries/cseries.h"
#include "cseries/profile.h"
#include "array.h"
/* ---------- constants */
/* ---------- macros */
/* ---------- structures */
/* ---------- prototypes */
/* ---------- globals */
static struct profile_section data_00308bc0[3] =
{
{ "memory_dynamic_array_resize", NONE, TRUE },
{ "memory_dynamic_array_add_element", NONE, TRUE },
{ "memory_dynamic_array_delete_element", NONE, TRUE },
};
/* ---------- public code */
void dynamic_array_new(
struct dynamic_array *array,
long element_size)
{
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x10,
array);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x11,
element_size>0);
array->element_size = element_size;
array->count = 0;
array->elements = NULL;
return;
}
boolean dynamic_array_resize(
struct dynamic_array *array,
long count)
{
boolean result = FALSE;
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x21,
array);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x22,
array->element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x23,
array->count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x24,
(array->count!=0)==(array->elements!=NULL));
profile_enter(data_00308bc0[0]);
if (count>=0 && count<=LONG_MAX)
{
if (count == array->count)
{
result = TRUE;
}
else
{
void *elements = debug_realloc(
array->elements,
count * array->element_size,
"c:\\halo\\SOURCE\\memory\\array.c",
0x2C);
if ((count!=0)==(elements!=NULL))
{
if (count > array->count)
{
csmemset(
(char *)elements + array->count * array->element_size,
0,
(count - array->count) * array->element_size);
}
array->count = count;
array->elements = elements;
result = TRUE;
}
}
}
profile_exit(data_00308bc0[0]);
return result;
}
void dynamic_array_delete(
struct dynamic_array *array)
{
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x49,
array);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x4A,
array->count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x4B,
(array->count!=0)==(array->elements!=NULL));
array->element_size = NONE;
array->count = NONE;
if (array->elements)
{
array->elements = debug_realloc(
array->elements,
0,
"c:\\halo\\SOURCE\\memory\\array.c",
0x50);
}
return;
}
long dynamic_array_add_element(
struct dynamic_array *array)
{
long index = NONE;
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x5D,
array);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x5E,
array->element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x5F,
array->count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x60,
(array->count!=0)==(array->elements!=NULL));
profile_enter(data_00308bc0[1]);
if (array->count < LONG_MAX)
{
long new_count = array->count + 1;
void *elements = debug_realloc(
array->elements,
new_count * array->element_size,
"c:\\halo\\SOURCE\\memory\\array.c",
0x67);
if (elements)
{
index = array->count;
csmemset(
(char *)elements + index * array->element_size,
0,
array->element_size);
array->count = new_count;
array->elements = elements;
}
}
profile_exit(data_00308bc0[1]);
return index;
}
void *dynamic_array_get_element(
struct dynamic_array *array,
long index,
long element_size)
{
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x7D,
array);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x7E,
array->element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x7F,
array->element_size==element_size);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x80,
array->count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x81,
(array->count!=0)==(array->elements!=NULL));
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0x82,
index>=0 && index<array->count);
return (char *)array->elements + index * array->element_size;
}
void dynamic_array_delete_element(
struct dynamic_array *array,
long index)
{
char *element;
void *elements;
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 139, array);
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 140, array->element_size>0);
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 141, array->count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
142,
(array->count!=0)==(array->elements!=NULL));
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 143, index>=0 && index<array->count);
profile_enter(data_00308bc0[2]);
array->count--;
if (index<array->count)
{
element = (char *)array->elements+index*array->element_size;
csmemmove(
element,
element+array->element_size,
(array->count-index)*array->element_size);
}
elements = debug_realloc(
array->elements,
array->count*array->element_size,
"c:\\halo\\SOURCE\\memory\\array.c",
156);
array->elements = elements;
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
158,
(array->count!=0)==(array->elements!=NULL));
profile_exit(data_00308bc0[2]);
return;
}
void static_array_new(
unsigned char *count,
void *elements,
short element_size,
short maximum_count)
{
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xAB,
count);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xAC,
elements);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xAD,
element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xAE,
maximum_count<=UNSIGNED_CHAR_MAX);
*count = 0;
csmemset(elements, NONE, element_size * maximum_count);
return;
}
boolean static_array_resize(
unsigned char *count,
void *elements,
short element_size,
short maximum_count,
short new_count)
{
boolean result = FALSE;
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xBF,
count && *count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xC0,
elements);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xC1,
element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xC2,
maximum_count<=UNSIGNED_CHAR_MAX);
if (new_count>=0 && new_count<maximum_count)
{
if (*count != new_count)
{
char *old_end = (char *)elements + *count * element_size;
char *new_end = (char *)elements + new_count * element_size;
if (new_end > old_end)
csmemset(old_end, 0, new_end - old_end);
else
csmemset(new_end, NONE, old_end - new_end);
*count = (unsigned char)new_count;
}
result = TRUE;
}
return result;
}
short static_array_add_element(
unsigned char *count,
void *elements,
short element_size,
short maximum_count)
{
short index = NONE;
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xE6,
count && *count>=0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xE7,
elements);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xE8,
element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xE9,
maximum_count<=UNSIGNED_CHAR_MAX);
if (*count < maximum_count)
{
index = *count;
(*count)++;
csmemset((char *)elements + index * element_size, 0, element_size);
}
return index;
}
void *static_array_get_element(
unsigned char count,
void *elements,
short element_size,
short index)
{
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xFB,
count>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xFC,
elements);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xFD,
element_size>0);
match_assert(
"c:\\halo\\SOURCE\\memory\\array.c",
0xFE,
index>=0 && index<count);
return (char *)elements + index * element_size;
}
void static_array_delete_element(
unsigned char *count,
void *elements,
short element_size,
short index)
{
char *element;
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 265, count && *count>0);
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 266, elements);
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 267, element_size>0);
match_assert("c:\\halo\\SOURCE\\memory\\array.c", 268, index>=0 && index<*count);
(*count)--;
if (index<*count)
{
element = (char *)elements+index*element_size;
csmemmove(
element,
element+element_size,
(*count-index)*element_size);
}
csmemset((char *)elements+*count*element_size, NONE, element_size);
return;
}
/* ---------- private code */