mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 22:02:27 +00:00
Add minor improvements and cleanup
This commit is contained in:
parent
9e3e985ae5
commit
feed0d2b0e
163 changed files with 2286 additions and 2245 deletions
|
@ -17,20 +17,45 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/intrin/pcmpeqb.h"
|
||||
#include "libc/intrin/pmovmskb.h"
|
||||
#include "libc/str/str.h"
|
||||
|
||||
/**
|
||||
* Copies string and advances destination pointer.
|
||||
* Copies bytes from 𝑠 to 𝑑 until a NUL is encountered.
|
||||
*
|
||||
* @param 𝑑 is destination memory
|
||||
* @param 𝑠 is a NUL-terminated string
|
||||
* @note 𝑑 and 𝑠 can't overlap
|
||||
* @return pointer to nul byte
|
||||
* @see strcpy(), memccpy()
|
||||
* @asyncsignalsafe
|
||||
*/
|
||||
char *stpcpy(char *dst, const char *src) {
|
||||
char c;
|
||||
for (;;) {
|
||||
c = *src;
|
||||
*dst = c;
|
||||
if (!c) break;
|
||||
++src;
|
||||
++dst;
|
||||
char *stpcpy(char *d, const char *s) {
|
||||
size_t i;
|
||||
uint8_t v1[16], v2[16], vz[16];
|
||||
i = 0;
|
||||
while (((uintptr_t)(s + i) & 15)) {
|
||||
if (!(d[i] = s[i])) {
|
||||
return d + i;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
for (;;) {
|
||||
memset(vz, 0, 16);
|
||||
memcpy(v1, s + i, 16);
|
||||
pcmpeqb(v2, v1, vz);
|
||||
if (!pmovmskb(v2)) {
|
||||
memcpy(d + i, v1, 16);
|
||||
i += 16;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (;;) {
|
||||
if (!(d[i] = s[i])) {
|
||||
return d + i;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue