@@ -3,6 +3,8 @@ module payload_m
3
3
private
4
4
public :: payload_t, empty_payload
5
5
6
+ integer , parameter :: MAX_PAYLOAD_SIZE = 20002
7
+
6
8
type :: payload_t
7
9
! ! A raw buffer to facilitate data transfer between images
8
10
! !
@@ -11,7 +13,8 @@ module payload_m
11
13
! ! * produce a string representation of the data, and then parse that string to recover the original data
12
14
! ! * use the `transfer` function to copy the raw bytes of the data
13
15
private
14
- integer , public , allocatable :: payload_(:)
16
+ integer , public :: payload_(MAX_PAYLOAD_SIZE)
17
+ integer :: payload_size = 0
15
18
contains
16
19
private
17
20
procedure , public :: raw_payload
@@ -29,42 +32,58 @@ pure function from_raw(payload) result(new_payload)
29
32
integer , intent (in ) :: payload(:)
30
33
type (payload_t) :: new_payload
31
34
32
- allocate (new_payload% payload_, source = payload)
35
+ integer :: incoming_payload_size
36
+
37
+ incoming_payload_size = size (payload)
38
+ if (incoming_payload_size > MAX_PAYLOAD_SIZE) then
39
+ new_payload% payload_size = MAX_PAYLOAD_SIZE
40
+ new_payload% payload_ = payload(1 :MAX_PAYLOAD_SIZE)
41
+ else
42
+ new_payload% payload_size = incoming_payload_size
43
+ new_payload% payload_(1 :incoming_payload_size) = payload
44
+ end if
33
45
end function
34
46
35
47
pure function from_string (payload ) result(new_payload)
36
48
implicit none
37
49
character (len=* ), intent (in ) :: payload
38
50
type (payload_t) :: new_payload
39
51
40
- new_payload = payload_t([len (payload), transfer (payload, new_payload% payload_)])
52
+ new_payload% payload_(1 ) = len (payload)
53
+ associate(string_as_integers = > transfer (payload, new_payload% payload_))
54
+ if (size (string_as_integers) > MAX_PAYLOAD_SIZE-1 ) then
55
+ new_payload% payload_size = MAX_PAYLOAD_SIZE
56
+ new_payload% payload_(2 :MAX_PAYLOAD_SIZE) = string_as_integers(1 :MAX_PAYLOAD_SIZE-1 )
57
+ else
58
+ new_payload% payload_size = size (string_as_integers) + 1
59
+ new_payload% payload_(2 :new_payload% payload_size) = string_as_integers
60
+ end if
61
+ end associate
41
62
end function
42
63
43
64
pure function empty_payload ()
44
65
implicit none
45
66
type (payload_t) :: empty_payload
46
-
47
- allocate (empty_payload% payload_(0 ))
48
67
end function
49
68
50
69
pure function raw_payload (self )
51
70
implicit none
52
71
class(payload_t), intent (in ) :: self
53
72
integer , allocatable :: raw_payload(:)
54
73
55
- raw_payload = self% payload_
74
+ raw_payload = self% payload_( 1 :self % payload_size)
56
75
end function
57
76
58
77
pure function string_payload (self )
59
78
implicit none
60
79
class(payload_t), intent (in ) :: self
61
80
character (len= :), allocatable :: string_payload
62
81
63
- if (size ( self% payload_) > 0 ) then
82
+ if (self% payload_size > 0 ) then
64
83
allocate (character (len= self% payload_(1 )) :: string_payload)
65
84
if (self% payload_(1 ) > 0 ) &
66
85
string_payload = transfer ( &
67
- self% payload_(2 :), string_payload)
86
+ self% payload_(2 :self % payload_size ), string_payload)
68
87
else
69
88
allocate (character (len= 0 ) :: string_payload)
70
89
end if
0 commit comments