56 lines
1.5 KiB
C
56 lines
1.5 KiB
C
#ifndef COSMOPOLITAN_LIBC_NEXGEN32E_TINYSTRLEN_H_
|
|
#define COSMOPOLITAN_LIBC_NEXGEN32E_TINYSTRLEN_H_
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
#if !defined(__GNUC__) || defined(__STRICT_ANSI__)
|
|
|
|
int tinystrlen(const char *);
|
|
int tinystrnlen(const char *, size_t);
|
|
int tinystrlen16(const char16_t *);
|
|
int tinystrnlen16(const char16_t *, size_t);
|
|
int tinywcslen(const wchar_t *);
|
|
int tinywcsnlen(const wchar_t *, size_t);
|
|
|
|
#else
|
|
|
|
forceinline int tinystrlen(const char *s) {
|
|
unsigned ax;
|
|
asm("call\ttinystrlen" : "=a"(ax) : "D"(s), "m"(*(char(*)[PAGESIZE])s));
|
|
return ax;
|
|
}
|
|
|
|
forceinline int tinystrnlen(const char *s, size_t n) {
|
|
unsigned ax;
|
|
asm("call\ttinystrnlen" : "=a"(ax) : "D"(s), "S"(n), "m"(*(char(*)[n])s));
|
|
return ax;
|
|
}
|
|
|
|
forceinline int tinystrlen16(const char16_t *s) {
|
|
unsigned ax;
|
|
asm("call\ttinystrlen16" : "=a"(ax) : "D"(s), "m"(*(char16_t(*)[PAGESIZE])s));
|
|
return ax;
|
|
}
|
|
|
|
forceinline int tinystrnlen16(const char16_t *s, size_t n) {
|
|
unsigned ax;
|
|
asm("call\ttinystrnlen16"
|
|
: "=a"(ax)
|
|
: "D"(s), "S"(n), "m"(*(char16_t(*)[n])s));
|
|
return ax;
|
|
}
|
|
|
|
forceinline int tinywcslen(const wchar_t *s) {
|
|
unsigned ax;
|
|
asm("call\ttinywcslen" : "=a"(ax) : "D"(s), "m"(*(wchar_t(*)[PAGESIZE])s));
|
|
return ax;
|
|
}
|
|
|
|
forceinline int tinywcsnlen(const wchar_t *s, size_t n) {
|
|
unsigned ax;
|
|
asm("call\ttinywcsnlen" : "=a"(ax) : "D"(s), "S"(n), "m"(*(wchar_t(*)[n])s));
|
|
return ax;
|
|
}
|
|
|
|
#endif
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_LIBC_NEXGEN32E_TINYSTRLEN_H_ */
|