github.com/ebitengine/purego@v0.8.0-alpha.2.0.20240512170805-6cd12240d332/testdata/structtest/structreturn_test.c (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: 2024 The Ebitengine Authors 3 4 #include <stdint.h> 5 6 struct Empty{}; 7 8 struct Empty ReturnEmpty() { 9 struct Empty e = {}; 10 return e; 11 } 12 13 struct StructInStruct{ 14 struct{ int16_t a; } a; 15 struct{ int16_t b; } b; 16 struct{ int16_t c; } c; 17 }; 18 19 struct StructInStruct ReturnStructInStruct(int16_t a, int16_t b, int16_t c) { 20 struct StructInStruct e = {{a}, {b}, {c}}; 21 return e; 22 } 23 24 struct ThreeShorts{ 25 int16_t a, b, c; 26 }; 27 28 struct ThreeShorts ReturnThreeShorts(int16_t a, int16_t b, int16_t c) { 29 struct ThreeShorts e = {a, b, c}; 30 return e; 31 } 32 33 struct FourShorts{ 34 int16_t a, b, c, d; 35 }; 36 37 struct FourShorts ReturnFourShorts(int16_t a, int16_t b, int16_t c, int16_t d) { 38 struct FourShorts e = {a, b, c, d}; 39 return e; 40 } 41 42 struct OneLong{ 43 int64_t a; 44 }; 45 46 struct OneLong ReturnOneLong(int64_t a) { 47 struct OneLong e = {a}; 48 return e; 49 } 50 51 struct TwoLongs{ 52 int64_t a, b; 53 }; 54 55 struct TwoLongs ReturnTwoLongs(int64_t a, int64_t b) { 56 struct TwoLongs e = {a, b}; 57 return e; 58 } 59 60 struct ThreeLongs{ 61 int64_t a, b, c; 62 }; 63 64 struct ThreeLongs ReturnThreeLongs(int64_t a, int64_t b, int64_t c) { 65 struct ThreeLongs e = {a, b, c}; 66 return e; 67 } 68 69 struct OneFloat{ 70 float a; 71 }; 72 73 struct TwoFloats{ 74 float a, b; 75 }; 76 77 struct TwoFloats ReturnTwoFloats(float a, float b) { 78 struct TwoFloats e = {a-b, a*b}; 79 return e; 80 } 81 82 struct ThreeFloats{ 83 float a, b, c; 84 }; 85 86 struct ThreeFloats ReturnThreeFloats(float a, float b, float c) { 87 struct ThreeFloats e = {a, b, c}; 88 return e; 89 } 90 91 struct OneFloat ReturnOneFloat(float a) { 92 struct OneFloat e = {a}; 93 return e; 94 } 95 96 struct OneDouble{ 97 double a; 98 }; 99 100 struct OneDouble ReturnOneDouble(double a) { 101 struct OneDouble e = {a}; 102 return e; 103 } 104 105 struct TwoDoubles{ 106 double a, b; 107 }; 108 109 struct TwoDoubles ReturnTwoDoubles(double a, double b) { 110 struct TwoDoubles e = {a, b}; 111 return e; 112 } 113 114 struct ThreeDoubles{ 115 double a, b, c; 116 }; 117 118 struct ThreeDoubles ReturnThreeDoubles(double a, double b, double c) { 119 struct ThreeDoubles e = {a, b, c}; 120 return e; 121 } 122 123 struct FourDoubles{ 124 double a, b, c, d; 125 }; 126 127 struct FourDoubles ReturnFourDoubles(double a, double b, double c, double d) { 128 struct FourDoubles e = {a, b, c, d}; 129 return e; 130 } 131 132 struct FourDoublesInternal{ 133 struct { 134 double a, b; 135 } f; 136 struct { 137 double c, d; 138 } g; 139 }; 140 141 struct FourDoublesInternal ReturnFourDoublesInternal(double a, double b, double c, double d) { 142 struct FourDoublesInternal e = { {a, b}, {c, d} }; 143 return e; 144 } 145 146 struct FiveDoubles{ 147 double a, b, c, d, e; 148 }; 149 150 struct FiveDoubles ReturnFiveDoubles(double a, double b, double c, double d, double e) { 151 struct FiveDoubles s = {a, b, c, d, e}; 152 return s; 153 } 154 155 struct OneFloatOneDouble{ 156 float a; 157 double b; 158 }; 159 160 struct OneFloatOneDouble ReturnOneFloatOneDouble(float a, double b) { 161 struct OneFloatOneDouble e = {a, b}; 162 return e; 163 } 164 165 struct OneDoubleOneFloat{ 166 double a; 167 float b; 168 }; 169 170 struct OneDoubleOneFloat ReturnOneDoubleOneFloat(double a, float b) { 171 struct OneDoubleOneFloat e = {a, b}; 172 return e; 173 } 174 175 struct Unaligned1{ 176 int8_t a; 177 int16_t b; 178 int64_t c; 179 }; 180 181 struct Unaligned1 ReturnUnaligned1(int8_t a, int16_t b, int64_t c) { 182 struct Unaligned1 e = {a, b, c}; 183 return e; 184 } 185 186 struct Mixed1{ 187 float a; 188 int32_t b; 189 }; 190 191 struct Mixed1 ReturnMixed1(float a, int32_t b) { 192 struct Mixed1 e = {a, b}; 193 return e; 194 } 195 196 struct Mixed2{ 197 float a; 198 int32_t b; 199 float c; 200 int32_t d; 201 }; 202 203 struct Mixed2 ReturnMixed2(float a, int32_t b, float c, int32_t d) { 204 struct Mixed2 e = {a, b, c, d}; 205 return e; 206 } 207 208 struct Mixed3{ 209 float a; 210 uint32_t b; 211 double c; 212 }; 213 214 struct Mixed3 ReturnMixed3(float a, uint32_t b, double c) { 215 struct Mixed3 s = {a, b, c}; 216 return s; 217 } 218 219 struct Mixed4{ 220 double a; 221 uint32_t b; 222 float c; 223 }; 224 225 struct Mixed4 ReturnMixed4(double a, uint32_t b, float c) { 226 struct Mixed4 s = {a, b, c}; 227 return s; 228 } 229 230 struct Ptr1{ 231 int64_t *a; 232 void *b; 233 }; 234 235 struct Ptr1 ReturnPtr1(int64_t *a, void *b) { 236 struct Ptr1 s = {a, b}; 237 return s; 238 }