Skip to content

Commit 8e07fda

Browse files
authored
Merge pull request #216 from DrXiao/libc/memset
Implement memset
2 parents 515e944 + 3189378 commit 8e07fda

File tree

6 files changed

+54
-20
lines changed

6 files changed

+54
-20
lines changed

lib/c.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,23 @@ char *memcpy(char *dest, char *src, int count)
140140
return dest;
141141
}
142142

143+
void *memset(void *s, int c, int n)
144+
{
145+
int i = 0;
146+
char *ptr = s;
147+
for (; i + 4 <= n; i += 4) {
148+
ptr[i] = c;
149+
ptr[i + 1] = c;
150+
ptr[i + 2] = c;
151+
ptr[i + 3] = c;
152+
}
153+
154+
for (; i < n; i++)
155+
ptr[i] = c;
156+
157+
return s;
158+
}
159+
143160
/* set 10 digits (32bit) without div
144161
*
145162
* This function converts a given integer value to its string representation
@@ -683,22 +700,7 @@ void *calloc(int n, int size)
683700
if (!p)
684701
return NULL;
685702

686-
/* TODO: Replace the byte buffer clearing algorithm with memset once
687-
* implemented.
688-
*/
689-
690-
/* Currently malloc uses mmap(2) to request allocation, which guarantees
691-
* memory to be page-aligned
692-
*/
693-
int *pi = p, num_words = total >> 2, offset = num_words << 2;
694-
695-
for (int i = 0; i < num_words; i++)
696-
pi[i] = 0;
697-
698-
while (offset < total)
699-
p[offset++] = 0;
700-
701-
return p;
703+
return memset(p, 0, total);
702704
}
703705

704706
void __rfree(void *ptr, int size)

tests/driver.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,4 +1823,36 @@ int main()
18231823
}
18241824
EOF
18251825

1826+
# Test memset()
1827+
ans=" 7d 7d 7d 7d 7d 7d 7d 7d 7d 7d 7d 00 00 00 00 00
1828+
00 00 00 00 00 00 7d 7d 7d 7d 7d 00 00 00 00 00
1829+
3a 3a 3a 3a 3a 3a 3a 3a 3a 3a 3a 3a 3a 3a 3a 3a"
1830+
try_output 0 "$ans" << EOF
1831+
void print_array(char *ptr, int sz)
1832+
{
1833+
for (int i = 0; i < sz; i++)
1834+
printf(" %02x", ptr[i]);
1835+
printf("\n");
1836+
}
1837+
1838+
int main(void)
1839+
{
1840+
int sz = sizeof(char) * 16;
1841+
char *ptr = malloc(sz);
1842+
1843+
if (ptr != memset(ptr, 0x7D, sizeof(char) * 11))
1844+
exit(1);
1845+
print_array(ptr, sz);
1846+
if (ptr != memset(ptr, 0, sizeof(char) * 6))
1847+
exit(1);
1848+
print_array(ptr, sz);
1849+
if (ptr != memset(ptr, 0x3A, sz))
1850+
exit(1);
1851+
print_array(ptr, sz);
1852+
1853+
free(ptr);
1854+
return 0;
1855+
}
1856+
EOF
1857+
18261858
echo OK

tests/snapshots/fib-arm.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

tests/snapshots/fib-riscv.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

tests/snapshots/hello-arm.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

tests/snapshots/hello-riscv.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)