/*
Core - core memory operations.
- 'ATP' 'At This Point' in the code. Used in comments to state assertions.
- by definition an 'extent' is one less than a 'size'.
+ 'ATP' Used in comments. 'At This Point' in the code.
'Area' refers to an area (in contrast to a point) in the address space.
+ A non-exist array is said to be non-existent.
+ An array with zero elements has 'length == 0' or is 'empty'.
+
+ In contrast, an allocation does not exist if it has zero bytes.
+
+
*/
#define Core路DEBUG
#include <stdint.h>
#include <stddef.h>
- #define extentof(x) (sizeof(x) - 1)
+ #define extentof(x)(sizeof(x) - 1)
#define extent_t size_t
- typedef struct{
- void *read0; // read0 = NULL means no buffer or empty buffer
- extent_t read_extent;
- void *write0; // write0 = NULL means no buffer or empty buffer.
- extent_t write_extent;
- bool reverse_byte_order;
- } Core路AreaPairinng;
+ typedef struct Core路Area;
- typedef enum{
- Core路AreaPairing路Status路valid = 0
- ,Core路AreaPairing路Status路null = 1
- ,Core路AreaPairing路Status路overlap = 2
- ,Core路AreaPairing路Status路empty_read_buffer = 4
- ,Core路AreaPairing路Status路empty_write_buffer = 8
- } Core路AreaPairing路Status;
+ typedef uint8_t (*ReadFn8)(Area * ,uint8_t *);
+ typedef uint64_t (*ReadFn64)(Area * ,uint64_t *);
+ typedef struct {
+ Core路Area *read;
+ Core路Area *write;
+ ReadFn8 read_fn_8;
+ ReadFn64 read_fn_64;
+ uint8_t *read_pt;
+ uint8_t *write_pt;
+ Core路Step路Status status;
+ } Core路TableauFace;
+
+ extern __thread Core路TableauFace tl;
typedef enum{
Core路Step路perfect_fit = 0
typedef Core路Step路Fn (*Core路Step路Fn)();
- typedef struct{
+ typdef struct Core路Area;
- // Area predicates
- bool Area路encloses_pt(void *pt ,void *pt0 ,extent_t e);
- bool Area路encloses_pt_strictly(void *pt ,void *pt0 ,extent_t e);
- bool Area路encloses_area(void *pt00 ,extent_t e0 ,void *pt10 ,extent_t e1);
- bool Area路encloses_area_strictly(void *pt00 ,extent_t e0 ,void *pt10 ,extent_t e1);
- bool Area路overlap(void *pt00 ,extent_t s0 ,void *pt10 ,extent_t e1);
+ typedef struct{
- // 64 bit word operations
+ void *offset_8(void *p ,size_t 螖);
+ void *offset_64(void *p ,size_t 螖);
bool is_aligned_64(void *p);
void *floor_64(void *p);
void *ceiling_64(void *p);
- uint64_t *greatest_full_64(void *p0 ,void *p1);
- uint64_t *least_full_64(void *p0 ,void *p1);
- void *inc_64(void *p ,size_t 螖);
- Core路AreaPairing路Status wellformed_it(Core路AreaPairing *ap);
-
- Core路Step路Status Core路step(Core路Step路Fn fn ,Core路AreaPairing *ap);
- Core路Step路Fn copy_8;
- Core路Step路Fn copy_16;
+ void Core路Area路init_pe(Core路Area *area ,void *position ,extent_t extent);
+ void Core路Area路init_pp(Core路Area *area ,void *position_left ,void *position_right);
+ void Core路Area路set_position(Core路Area *area ,uint8_t *new_position);
+ void Core路Area路set_position_left(Core路Area *area ,uint8_t *new_position);
+ extent_t Core路Area路set_extent(Core路Area *area);
+ void Core路Area路set_position_right(Core路Area *area ,uint8_t *new_position_right);
+
+ uint8_t *Core路Area路position(Core路Area *area);
+ uint8_t *Core路Area路position_left(Core路Area *area);
+ uint8_t *Core路Area路position_right(Core路Area *area);
+ extent_t Core路Area路extent(Core路Area *area);
+ uint8_t Core路Area路length_Kung(Core路Area *area); // saturates at 3
+
+ bool Core路Area路encloses_pt(uint8_t *pt ,Core路Area *area);
+ bool Core路Area路encloses_pt_strictly(uint8_t *pt ,Core路Area *area);
+ bool Core路Area路encloses_area(Core路Area *outer ,Core路Area *inner);
+ bool Core路Area路encloses_area_strictly(Core路Area *outer ,Core路Area *inner);
+ bool Core路Area路overlap(Core路Area *a ,Core路Area *b);
+ bool Core路Area路nonexistent(Core路Area *area);
+ void Area路largest_aligned_64(Core路Area *outer ,Core路Area *inner_64);
+ uint8_t *Area路complement(Core路Area *area ,uint8_t *r);
+
+
+ Core路Step路Status Core路step(Core路Step路Fn fn ,Core路TableauFace *ap);
+ Core路Step路Fn Step路copy_8;
+ Core路Step路Fn Step路copy_16;
Core路Step路Fn Step路write_hex;
Core路Step路Fn Step路read_hex;
} Core路M;
+ Core路M m; // initialized in the implementation;
+
+
#endif
//--------------------------------------------------------------------------------
#include <stdio.h>
#endif
- typedef uint8_t (*ReadFn8)(uint8_t *, uint8_t *, uint8_t *);
- typedef uint64_t (*ReadFn64)(uint64_t *, uint64_t *, uint64_t *);
+ typedef struct{
+ uint8_t *position;
+ extent_t extent;
+ } Core路Area
typedef struct {
- Core路Step路Status status;
- Core路AreaPairing *ap;
- struct {
- ReadFn8 read_fn;
- } copy_8;
union {
+ struct {
+ ReadFn8 read_fn;
+ } copy_8;
struct {
ReadFn64 read_fn;
- uint64_t *r0_64;
- uint64_t *r1_64;
+ Area *area_64;
} copy_64;
struct {
- union {
- uint16_t (*byte_to_hex)(uint8_t);
- uint8_t (*hex_to_byte)(uint16_t);
- } convert;
- } hex;
+ uint8_t (*hex_to_byte)(uint16_t);
+ } read_hex;
+ struct {
+ uint16_t (*byte_to_hex)(uint8_t);
+ } write_hex;
};
- } Core路Tableau;
-
- extern __thread Core路Tableau tableau
+ } Core路TableauLocal;
// this part goes into Copylib.a
- // yes this is empty, so there is no Copylib.a
+ // yes this is empty ,so there is no Copylib.a
#ifndef LOCAL
- __thread Core路Tableau tableau
+ __thread Core路TableauFace tf;
+ __thread Core路TableauLocal tl;
#endif
#ifdef LOCAL
+ extern __thread Core路TableauLocal tl;
//----------------------------------------
- // Area predicates
+ // Position/Pointer/Address whatever you want to call it
- Local bool Core路Area路encloses_pt(void *pt ,void *pt0 ,extent_t e){
- return (pt >= pt0) && (pt <= pt0 + e); // Inclusive bounds
- }
- Local bool Core路Area路encloses_pt_strictly(void *pt ,void *pt0 ,extent_t e){
- return (pt > pt0) && (pt < pt0 + e); // Strictly inside
- }
- // Area 0 encloses Area 1
- Local bool Core路Area路encloses_area(
- void *pt0 ,extent_t e0 ,void *pt1 ,extent_t e1
- ){
- return (pt1 >= pt0) && (pt1 + e1 <= pt0 + e0);
- }
- // Area 0 strictly encloses Area 1
- Local bool Core路Area路encloses_area_strictly(
- void *pt0 ,extent_t e0 ,void *pt1 ,extent_t e1
- ){
- return (pt1 > pt0) && (pt1 + e1 < pt0 + e0);
+ // point to the next uint64_t in an array of uint64_t
+ // the increment can be negative
+ Local void *Core路offset_8(void *p ,size_t 螖){
+ return (void *)((uint8_t *)p) + 螖;
}
-
- // Possible cases of overlap, including just touching
- // 1. interval 0 to the right of interval 1, just touching p00 == p11
- // 2. interval 0 to the left of interval 1, just touching p01 == p10
- // 3. interval 0 wholly contained in interval 1
- // 4. interval 0 wholly contains interval 1
- Local bool Core路Area路overlap(void *pt0 ,extent_t e0 ,void *pt1 ,extent_t e1){
- return pt1 <= pt0 + e0 && pt0 <= pt1 + e1;
+ Local void *Core路offset_64(void *p ,size_t 螖){
+ return (void *)((uint64_t *)p) + 螖;
}
- //----------------------------------------
- // support for aligned uint64_t in a world of bytes
-
Local bool Core路is_aligned_64(void *p){
return ((uintptr_t)p & 0x7) == 0;
}
+
// find the lowest address in an 8 byte aligned window
// returns the byte pointer to the least address byte in the window
Local void *Core路floor_64(void *p){
return (uintptr_t)p | 0x7;
}
- // consider that a maximally sized interval of uint64_t is in a byte interval
- // this returns the inclusive upper bound address pointing to aligned uint64_t
- // by contract, p1 must be >= p0
- Local uint64_t *Core路greatest_full_64(void *p0 ,void *p1){
- // If p1 - 0x7 moves into a prior word while p0 does not, a prefetch hazard can occur.
- // If p1 and p0 are more than 0x7 apart, they cannot be in the same word,
- // but this does not guarantee a full 64-bit word exists in the range.
- if((uintptr_t)p1 < (uintptr_t)p0 + 0x7) return NULL;
+ //----------------------------------------
+ // Area
- // Compute the last fully aligned word at or before p1.
- uint64_t *p1_64 = (void *)( ((uintptr_t)p1 - 0x7) & ~(uintptr_t)0x7 );
+ Local void Core路Area路set_position(Core路Area *area ,void *new_position){
+ area->position = new_position;
+ }
+ Local void Core路Area路set_position_left(Core路Area *area ,void *new_position){
+ area->position = new_position;
+ }
+ Local extent_t Core路Area路set_extent(Core路Area *area ,exent_t extent){
+ return area->extent = extent;
+ }
+ Local void Core路Area路set_position_right(Core路Area *area ,void *new_position_right){
+ Core路Area路set_extent(new_position_right - area->position);
+ }
+ Local void Core路Area路init_pe(Core路Area *area ,uint8_t *position ,extent_t extent){
+ Core路Area路set_position(position);
+ Core路Area路set_extent(extent);
+ }
+ Local void Core路Area路init_pp(Core路Area *area ,void *position_left ,void *position_right){
+ Core路Area路set_position_left(position_left);
+ Core路Area路set_position_right(position_right);
+ }
- // If alignment rounds p1_64 below p0, there is no full word available.
- if(p1_64 < p0) return NULL;
+ Local uint8_t *Core路Area路position(Core路Area *area){
+ #ifdef Core路Debug
+ if(!area){
+ fprintf(stderr,"Core路Area路position:: given NULL area);
+ return NULL;
+ }
+ #endif
+ return area->position;
+ }
+ Local uint8_t *Core路Area路position_left(Core路Area *area){
+ #ifdef Core路Debug
+ if(!area){
+ fprintf(stderr,"Core路Area路position_left:: given NULL area);
+ return NULL;
+ }
+ #endif
+ return area->position;
+ }
+ Local uint8_t *Core路Area路position_right(Core路Area *area){
+ #ifdef Core路Debug
+ if(!area){
+ fprintf(stderr,"Core路Area路position_right:: given NULL area);
+ return NULL;
+ }
+ #endif
+ return area->position + area->extent;
+ }
+ Local extent_t Core路Area路extent(Core路Area *area){
+ #ifdef Core路Debug
+ if(!area){
+ fprintf(stderr,"Core路Area路extent:: given NULL area);
+ return 0;
+ }
+ #endif
+ return area->extent;
+ }
+ Local uint8_t Core路Area路length_Kung(Core路Area *area){
+ if(!Core路Area路position_left(area)) return 0;
+ if(Core路Area路extent(area) >= 2) return 3;
+ return Core路Area路extent(area) + 1;
+ }
- return p1_64;
+ Local bool Core路Area路encloses_pt(Core路Area *area ,uint8_t *pt){
+ return
+ (pt >= Core路Area路position_left(area))
+ && (pt <= Core路Area路position_right(area));
+ }
+ Local bool Core路Area路encloses_pt_strictly(Core路Area *area ,uint8_t *pt){
+ return
+ (pt > Core路Area路position_left(area))
+ && (pt < Core路Area路position_right(area));
+ }
+ Local bool Core路Area路encloses_area(Core路Area *outer ,Core路Area *inner){
+ return
+ (Core路Area路position_left(inner) >= Core路Area路position_left(outer))
+ && (Core路Area路position_right(inner) <= Core路Area路position_right(outer));
+ }
+ Local bool Core路Area路encloses_area_strictly(Core路Area *outer ,Core路Area *inner){
+ return
+ (Core路Area路position_left(inner) > Core路Area路position_left(outer))
+ && (Core路Area路position_right(inner) < Core路Area路position_right(outer));
}
- // consider that a maximally sized interval of uint64_t is in a byte interval
- // this returns the inclusive lower bound address pointing to aligned uint64_t
- // by contract, p1 must be >= p0
- Local uint64_t *Core路least_full_64(void *p0 ,void *p1){
+ // Possible cases of overlap ,including just touching
+ // 1. interval 0 to the right of interval 1 ,just touching p00 == p11
+ // 2. interval 0 to the left of interval 1 ,just touching p01 == p10
+ // 3. interval 0 wholly contained in interval 1
+ // 4. interval 0 wholly contains interval 1
+ Local bool Core路Area路overlap(Core路Area *area0 ,Core路Area *area1){
+ return
+ Core路Area路position_right(area0) >= (Core路Area路position_left(area1)
+ && Core路Area路position_left(area0) <= Core路Area路position_right(area1);
+ }
- // If p0 + 0x7 moves into the next word while p1 does not, a prefetch hazard can occur.
- // If p1 and p0 are more than 0x7 apart, they cannot be in the same word,
- // but this does not guarantee a full 64-bit word exists in the range.
- if(p1 - p0 < 0x7) return NULL;
+ Local bool Core路Area路nonexistent(Core路Area *area){
+ return !!Core路Area路position_left(area);
+ }
- // Compute the first fully aligned word at or after p0.
- uint64_t *p0_64 = (void *)( ((uintptr_t)p0 + 0x7) & ~(uintptr_t)0x7 );
+ // find the largest contained interval aligned on 64 bit boundaries
+ static void Core路Area路largest_aligned_64(Core路Area *outer ,Core路Area *inner_64){
+ uintptr_t p0 = (uintptr_t)Core路Area路position_left(outer);
+ uintptr_t p1 = (uintptr_t)Core路Area路position_right(outer);
- // If alignment rounds p0_64 beyond p1, there is no full word available.
- if(p0_64 > p1) return NULL;
+ uint8_t *p0_64 = (uint8_t *)( (p0 + 0x7) & ~(uintptr_t)0x7 );
+ uint8_t *p1_64 = (uint8_t *)( (p1 - 0x7) & ~(uintptr_t)0x7 );
- return p0_64;
+ if(p1_64 < p0_64){
+ Core路Area路set_position(inner_64 ,NULL);
+ }else{
+ Core路Area路init_pp(inner_64 ,p0_64 ,p1_64);
+ }
}
- // point to the next uint64_t in an array of uint64_t
- // the increment can be negative
- Local void *Core路inc_64(void *p ,size_t 螖){
- return (void *)((uint64_t *)p) + 螖;
+ // complement against the extent of the area (reverse direction)
+ // works for byte pointer
+ // works for aligned word pointer
+ Local uint8_t *Core路Area路complement(Core路Area *area ,uint8_t *r){
+ return Core路Area路position_left(area) + (Core路Area路position_right(area) - r);
}
- Local uint8_t Core路read_8_fwd(void *r0 ,void *r1 ,void *r){
- return *(uint8_t *)r;
- }
+ //----------------------------------------
+ // step-able functions
- Local uint8_t Core路read_8_rev(void *r0 ,void *r1 ,void *r){
- return *((uint8_t *)r0 + ((uint8_t *)r1 - (uint8_t *)r));
+ Local uint8_t Core路Area路read_8_fwd(Core路Area *area ,void *r){
+ #ifdef Core路Debug
+ if(!area || !r){
+ fprintf(stderr,"Core路Area路read_8_fwd:: area r: %p %p\n" ,area ,r);
+ return 0;
+ }
+ if( !Core路Area路enclose_pt(area ,r) ){
+ fprintf(stderr,"Core路Area路read_8_fwd:: out of interval read\n");
+ }
+ #endif
+ return *(uint8_t *)r;
}
// Given a pointer to the least address byte of a uint64_t, return the value
- Local uint64_t Core路read_64_fwd(void *r){
+ Local uint64_t Core路Area路read_64_fwd(Core路Area *area ,void *r){
+ #ifdef Core路Debug
+ if(!area || !r){
+ fprintf(stderr,"Core路Area路read_8_fwd:: area r: %p %p\n" ,area ,r);
+ return 0;
+ }
+ if(!Core路Area路enclose_pt(area ,r) ){
+ fprintf(stderr,"Core路Area路read_8_fwd:: out of interval read\n");
+ }
+ #endif
return *(uint64_t *)r;
}
- // Given a pointer to the greatest address byte of a uint64_t, return the value
- Local uint64_t Core路read_64_rev(void *r0 ,void *r1 ,void *r){
- return __builtin_bswap64(
- *(uint64_t *)Core路floor_64( (uint8_t *)r0 + ((uint8_t *)r1 - (uint8_t *)r) )
- );
- }
-
- //----------------------------------------
- // AreaPairing
-
- Local Core路AreaPairing路Status Core路AreaPairing路wellformed(Core路AreaPairing *ap){
-
- bool print = false;
- #ifdef Core路DEBUG
- print = true;
- #endif
-
- char *this_name = "Core路AreaPairing路wellformed";
- Copy路WFIt路Status status = Copy路WFIt路Status路valid;
-
- if(it == NULL){
- if(print) fprintf( stderr ,"%s: NULL read pointer\n" ,this_name );
- return Core路AreaPairing路Status路null;
+ Local uint8_t Core路Area路read_8_rev(Core路Area *area ,uint8_t *r){
+ #ifdef Core路Debug
+ if(!area || !r){
+ fprintf(stderr,"Core路Area路read_8_fwd:: area r: %p %p\n" ,area ,r);
+ return 0;
}
-
- if(ap->read0 == NULL){
- if(print) fprintf( stderr ,"%s: empty read buffer\n" ,this_name );
- status |= Copy路WFIt路Status路empty_read_buffer;
+ if(!Core路Area路enclose_pt(area ,r) ){
+ fprintf(stderr,"Core路Area路read_8_rev:: out of interval read\n");
}
- if(ap->write0 == NULL){
- if(print) fprintf( stderr ,"%s: empty write buffer\n" ,this_name );
- status |= Copy路WFIt路Status路empty_write_buffer;
+ #endif
+ return *(Core路complement(area ,r));
+ }
+
+ Local uint64_t Core路Area路read_64_rev(Core路Area *area_64 ,uint8_t *r){
+ #ifdef Core路Debug
+ if(!area || !r){
+ fprintf(stderr,"Core路Area路read_8_fwd:: area r: %p %p\n" ,area ,r);
+ return 0;
}
- if( Copy路overlap_size_interval(ap->read0 ,ap->read_size ,ap->write0 ,ap->write_size) ){
- if(print) fprintf( stderr ,"%s: Read and write buffers overlap!\n" ,this_name );
- status |= Copy路WFIt路Status路overlap;
+ if(!Core路Area路enclose_pt(area ,r) ){
+ fprintf(stderr,"Core路Area路read_64_rev:: out of interval read\n");
}
- return status;
-
+ #endif
+ return __builtin_bswap64( *(uint64_t *)Core路floor_64(Core路complement(area_64 ,r)) );
}
-
//----------------------------------------
// Step
- // Function pointer type
- typedef Core路Step路Fn (*Core路Step路Fn)();
-
// Step function using trampoline execution model
- Local Core路Step路Status Core路step(Core路Step路Fn fn ,Core路AreaPairing *ap){
+ Local Core路Step路Status Core路step(Core路Step路Fn fn){
+ #ifdef Core路Debug
+ if(!fn || !ap){
+ fprintf(stderr,"Core路step:: fn ap: %p %p\n" ,fn ,ap);
+ return Core路Step路argument_guard
+ }
if(
- fn != Core路copy_64 && fn != Core路copy_8
- ||
- Core路AreaPairing路wellformed(it) != Core路AreaPairing路Status路valid
+ fn != Core路copy_8_fwd
+ && fn != Core路copy_8_rev
+ && fn != Core路copy_64_fwd
+ && fn != Core路copy_64_rev
+ ){
+ fprintf(stderr,"Core路step:: unrecognized step-able function\n");
+ return Core路Step路argument_guard
)
- return Core路Step路argument_guard;
+ #endif
- Core路tableau.it = it;
while(fn) fn = fn();
return tableau->status;
}
//----------------------------------------
// step copy_8
- Core路Step路Fn Core路copy_8;;
- Core路Step路Fn Core路Copy8路bulk;
+ Core路Step路Fn Core路Step路copy_8;;
+ Core路Step路Fn Core路Step路Copy8路bulk;
Local Core路Step路Fn Core路copy_8(){
uint8_t *w = (uint8_t *) Core路tableau.ap->write0;
do{
- *w = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0, r1, r);
+ *w = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0 ,r1 ,r);
if(r == r1) break;
r++;
w++;
uint8_t *w = (uint8_t *) Core路tableau.ap->write0;
do{
- *w = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0, r1, r);
+ *w = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0 ,r1 ,r);
if(r == r1) break;
r++;
w++;
uint8_t *w1 = (uint8_t *) (w + Core路tableau.ap->write_extent);
do{
- *w = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0, r1, r);
+ *w = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0 ,r1 ,r);
if(w == w1) break;
r++;
w++;
//----------------------------------------
// step copy_64
- // 64-bit copy function with updated AreaPairing terminology
+ // 64-bit copy function with updated TableauFace terminology
Core路Step路Fn Core路copy_64;
Core路Step路Fn Core路Copy64路leadin;
Core路Step路Fn Core路Copy64路bulk;
// Determine aligned 64-bit word boundaries
Core路tableau.copy_64.r0_64 = Core路least_full_64(
- Core路tableau.ap->read0, Core路tableau.ap->read0 + Core路tableau.ap->read_extent
+ Core路tableau.ap->read0 ,Core路tableau.ap->read0 + Core路tableau.ap->read_extent
);
Core路tableau.copy_64.r1_64 = Core路greatest_full_64(
- Core路tableau.ap->read0, Core路tableau.ap->read0 + Core路tableau.ap->read_extent
+ Core路tableau.ap->read0 ,Core路tableau.ap->read0 + Core路tableau.ap->read_extent
);
// Choose the correct function based on alignment
uint8_t *r0_64 = (uint8_t *) Core路tableau.copy_64.r0_64;
do{
- *w++ = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0, r0_64, r);
+ *w++ = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0 ,r0_64 ,r);
if(r == r0_64) break;
r++;
}while(1);
do{
*w64++ = Core路tableau.copy_64.read_fn(
- Core路tableau.copy_64.r0_64, Core路tableau.copy_64.r1_64, r64
+ Core路tableau.copy_64.r0_64 ,Core路tableau.copy_64.r1_64 ,r64
);
if(r64 == r1_64) break;
r64++;
uint8_t *r1 = (uint8_t *) Core路tableau.copy_64.r1_64;
do{
- *w++ = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0, r1, r);
+ *w++ = Core路tableau.copy_8.read_fn(Core路tableau.ap->read0 ,r1 ,r);
if(r == r1) break;
r++;
}while(1);
uint8_t *w = (uint8_t *)Core路tableau.area_pairing->write0;
do {
- *(uint16_t *)w = Core路tableau.hex.convert.byte_to_hex(*r);
+ *(uint16_t *)w = Core路tableau.write_hex.byte_to_hex(*r);
if(r == r1) break;
r++;
w += 2;
uint8_t *r1 = r + limit;
do {
- *(uint16_t *)w = Core路tableau.hex.convert.byte_to_hex(*r);
+ *(uint16_t *)w = Core路tableau.write_hex.byte_to_hex(*r);
if(r == r1) break;
r++;
w += 2;
uint8_t *r1 = r + limit;
do {
- *(uint16_t *)w = Core路tableau.hex.convert.byte_to_hex(*r);
+ *(uint16_t *)w = Core路tableau.write_hex.byte_to_hex(*r);
if(r == r1) break;
r++;
w += 2;
uint8_t *w = (uint8_t *)Core路tableau.area_pairing->write0;
do {
- *w = Core路tableau.hex.convert.hex_to_byte(*(uint16_t *)r);
+ *w = Core路tableau.read_hex.hex_to_byte(*(uint16_t *)r);
if(r == r1) break;
r += 2;
w++;
uint8_t *r1 = r + (limit << 1);
do {
- *w = Core路tableau.hex.convert.hex_to_byte(*(uint16_t *)r);
+ *w = Core路tableau.read_hex.hex_to_byte(*(uint16_t *)r);
if(r == r1) break;
r += 2;
w++;
uint8_t *r1 = r + (limit << 1);
do {
- *w = Core路tableau.hex.convert.hex_to_byte(*(uint16_t *)r);
+ *w = Core路tableau.read_hex.hex_to_byte(*(uint16_t *)r);
if(r == r1) break;
r += 2;
w++;
return NULL;
}
+ Core路M m = {
+ .Area路init_pe = Core路Area路init_pe
+ ,.Area路init_pp = Core路Area路init_pp
+ ,.Area路position = Core路Area路position
+ ,.Area路position_left = Core路Area路position_left
+ ,.Area路position_right = Core路Area路position_right
+ ,.Area路set_position = Core路Area路set_position
+ ,.Area路extent = Core路Area路extent
+ ,.Area路set_extent = Core路Area路set_extent
+ ,.Area路set_position = Core路Area路set_exent
+ ,.Area路length_Kung = Core路Area路length_Kung
+
+ .Area路encloses_pt = Core路Area路encloses_pt
+ ,.Area路encloses_pt_strictly = Core路Area路encloses_pt_strictly
+ ,.Area路encloses_area = Core路Area路encloses_area
+ ,.Area路encloses_area_strictly = Core路Area路encloses_area_strictly
+ ,.Area路overlap = Core路Area路overlap
+ ,.Core路Area路nonexistent = Core路Area路nonexistent
+ ,.Core路Area路length_Kung = Core路Area路length_Kung
+
+ ,.is_aligned_64 = Core路is_aligned_64
+ ,.floor_64 = Core路floor_64
+ ,.ceiling_64 = Core路ceiling_64
+ ,.greatest_full_64 = Core路greatest_full_64
+ ,.least_full_64 = Core路least_full_64
+ ,.offset_8 = Core路offset_8
+ ,.offset_64 = Core路offset_64
+
+ ,.Core路step = Core路step
+
+ ,.copy_8 = Core路copy_8
+ ,.copy_16 = Core路copy_16
+ ,.Step路write_hex = Core路Step路write_hex
+ ,.Step路read_hex = Core路Step路read_hex
+ };
+
#endif // LOCAL
#endif // IMPLEMENTATION