-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmem-mask.cx
More file actions
executable file
·86 lines (86 loc) · 2.46 KB
/
Copy pathmem-mask.cx
File metadata and controls
executable file
·86 lines (86 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//-*-C-*-
/*******************************************************************************
* ___ publicplace
* ¦OUX¦ C+
* ¦/C+¦ OUX/C+ OS
* --- kernel
* variable length mask
* ©overcq on ‟Gentoo Linux 23.0” “x86_64” 2024‒11‒13 L
*******************************************************************************/
_export
Pc
E_mem_Q_mask_M( N length
){ N bytes = length / 8 + ( length % 8 ? 1 : 0 );
Pc mask = M(bytes);
if( !mask )
return mask;
_0( mask, bytes );
return mask;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_export
B
E_mem_Q_mask_R( Pc mask
, N bit
){ N byte = bit / 8;
bit %= 8;
return mask[byte] & ( 1 << bit );
}
_export
N
E_mem_Q_mask_R_first_clear( Pc mask
, N length
){ N bytes = length / 8 + ( length % 8 ? 1 : 0 );
for( N byte_i = 0; byte_i != bytes - 1; byte_i++ )
for( N bit_i = 0; bit_i != 8; bit_i++ )
if( !( mask[ byte_i ] & ( 1 << bit_i )))
return byte_i * 8 + bit_i;
for( N bit_i = 0; bit_i != length; bit_i++ )
if( !( mask[ bytes - 1 ] & ( 1 << bit_i )))
return ( bytes - 1 ) * 8 + bit_i;
return ~0;
}
//------------------------------------------------------------------------------
_export
void
E_mem_Q_mask_P_set( Pc mask
, N bit
){ N byte = bit / 8;
bit %= 8;
mask[byte] |= 1 << bit;
}
_export
void
E_mem_Q_mask_P_clear( Pc mask
, N bit
){ N byte = bit / 8;
bit %= 8;
mask[byte] &= ~( 1 << bit );
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_export
N
E_mem_Q_mask_I_resize( Pc *mask
, N length_old
, N length_new
){ N bytes_old = length_old / 8 + ( length_old % 8 ? 1 : 0 );
N bytes_new = length_new / 8 + ( length_new % 8 ? 1 : 0 );
if( bytes_old == bytes_new )
{ N length_new_1 = length_new % 8 ? length_new % 8 : 8;
if( length_old % 8 < length_new_1 )
for( N bit_i = length_old % 8; bit_i != length_new_1; bit_i++ )
(*mask)[ bytes_new - 1 ] &= ~( 1 << bit_i );
return 0;
}
if( bytes_old < bytes_new )
{ Pc p = E_mem_Q_blk_I_append( mask, bytes_new - bytes_old );
Kp(p)
return ~0;
_0( p, bytes_new - bytes_old );
}else
{ Kp( E_mem_Q_blk_I_remove( mask, bytes_new, bytes_old - bytes_new ))
return ~0;
}
return 0;
}
/******************************************************************************/