b38fcdded3
The new tests are bss_e.c, structcopy_e.c. We do clear the BSS before calling _m_a_i_n, so fix the comments in the other tests.
114 lines
2.3 KiB
C
114 lines
2.3 KiB
C
#include "test.h"
|
|
|
|
/* ACK's C compiler uses EM's loi, sti, blm, or an inline loop to copy
|
|
* these structs. The compiler doesn't call memcpy() or other
|
|
* functions in libc, so this test passes without linking the CRT.
|
|
*/
|
|
|
|
struct c5 { /* not a whole number of words */
|
|
char one[5];
|
|
};
|
|
|
|
struct ii { /* two words */
|
|
int one;
|
|
int two;
|
|
};
|
|
|
|
struct iii { /* three words */
|
|
int one;
|
|
int two;
|
|
int three;
|
|
};
|
|
|
|
int equal5(char *a, char *b) { /* a, b must have 5 characters */
|
|
int i;
|
|
|
|
for (i = 0; i < 5; i++)
|
|
if (a[i] != b[i]) return 0;
|
|
return 1;
|
|
}
|
|
|
|
struct c5 make_c5(char *str) { /* str must have 5 characters */
|
|
struct c5 out;
|
|
int i;
|
|
|
|
for (i = 0; i < 5; i++)
|
|
out.one[i] = str[i];
|
|
return out;
|
|
}
|
|
|
|
struct ii make_ii(int i, int j) {
|
|
struct ii out;
|
|
|
|
out.one = i;
|
|
out.two = j;
|
|
return out;
|
|
}
|
|
|
|
struct iii make_iii(struct ii in, int k) {
|
|
struct iii out;
|
|
|
|
out.one = in.one;
|
|
out.two = in.two;
|
|
out.three = k;
|
|
return out;
|
|
}
|
|
|
|
struct c5 rotate_left_c5(struct c5 in) {
|
|
int i;
|
|
char c = in.one[0];
|
|
|
|
/* Modifies our copy of _in_, not caller's copy. */
|
|
for (i = 0; i < 4; i++)
|
|
in.one[i] = in.one[i + 1];
|
|
in.one[4] = c;
|
|
return in;
|
|
}
|
|
|
|
struct iii rotate_left_iii(struct iii in) {
|
|
int i = in.one;
|
|
|
|
/* Modifies our copy of _in_, not caller's copy. */
|
|
in.one = in.two;
|
|
in.two = in.three;
|
|
in.three = i;
|
|
return in;
|
|
}
|
|
|
|
/* Bypasses the CRT, so there's no stdio. */
|
|
void _m_a_i_n(void) {
|
|
struct c5 earth, heart, dup_heart, rol_heart;
|
|
struct ii pair, dup_pair;
|
|
struct iii triple, dup_triple, rol_triple;
|
|
|
|
earth = make_c5("earth");
|
|
heart = make_c5("heart");
|
|
dup_heart = heart;
|
|
rol_heart = rotate_left_c5(heart);
|
|
ASSERT(equal5(earth.one, "earth"));
|
|
ASSERT(equal5(heart.one, "heart"));
|
|
ASSERT(equal5(dup_heart.one, "heart"));
|
|
ASSERT(equal5(rol_heart.one, "earth"));
|
|
|
|
pair = make_ii(29, 31);
|
|
dup_pair = pair;
|
|
triple = make_iii(pair, -9);
|
|
dup_triple = triple;
|
|
rol_triple = rotate_left_iii(triple);
|
|
ASSERT(pair.one == 29);
|
|
ASSERT(pair.two == 31);
|
|
ASSERT(dup_pair.one == 29);
|
|
ASSERT(dup_pair.two == 31);
|
|
ASSERT(triple.one == 29);
|
|
ASSERT(triple.two == 31);
|
|
ASSERT(triple.three == -9);
|
|
ASSERT(dup_triple.one == 29);
|
|
ASSERT(dup_triple.two == 31);
|
|
ASSERT(dup_triple.three == -9);
|
|
ASSERT(rol_triple.one == 31);
|
|
ASSERT(rol_triple.two == -9);
|
|
ASSERT(rol_triple.three == 29);
|
|
|
|
finished();
|
|
}
|