Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1881 → Rev 1882

/programs/develop/libraries/menuetlibc/src/libc/ansi/string/Makefile
0,0 → 1,6
THIS_SRCS = memchr.c memcmp.c memcpy.c memmove.s memset.s strcat.c \
strchr.c strcmp.c strcoll.c strcpy.c strcspn.c strerror.c \
strlen.c strncat.c strncmp.c strncpy.c strpbrk.c strrchr.c \
strspn.c strstr.c strtok.c strxfrm.c syserr1.c syserr2.c syserr3.c
 
include $(MENUET_LIBC_TOPDIR)/Make.rules
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/memchr.c
0,0 → 1,18
#include<string.h>
#include<libc/unconst.h>
#include<assert.h>
 
void * memchr(const void *s, int c, size_t n)
{
int d0;
register void * __res;
if (!n) return NULL;
__asm__ __volatile__(
"repne\n\t"
"scasb\n\t"
"je 1f\n\t"
"movl $1,%0\n"
"1:\tdecl %0"
:"=D" (__res), "=&c" (d0) : "a" (c),"0" (s),"1" (n));
return __res;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/memcmp.c
0,0 → 1,18
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
#include <assert.h>
 
int
memcmp(const void *s1, const void *s2, size_t n)
{
if (n != 0)
{
const unsigned char *p1 = s1, *p2 = s2;
 
do {
if (*p1++ != *p2++)
return (*--p1 - *--p2);
} while (--n != 0);
}
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/memcpy.c
0,0 → 1,23
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
void * memcpy(void * _dest, const void *_src, size_t _n)
{
int d0, d1, d2;
__asm__ __volatile__(
"jcxz 1f\n\t"
"rep ; movsl\n\t"
"1:\t"
"testb $2,%b4\n\t"
"je 1f\n\t"
"movsw\n"
"1:\ttestb $1,%b4\n\t"
"je 2f\n\t"
"movsb\n"
"2:"
: "=&c" (d0), "=&D" (d1), "=&S" (d2)
:"0" (_n/4), "q" (_n),"1" ((long)_dest),"2" ((long)_src)
: "memory");
return (_dest);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/memmove.s
0,0 → 1,33
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
.file "memmove.s"
#include<libc/asm.h>
MK_C_SYM(memmove)
pushl %ebp
movl %esp,%ebp
pushl %esi
pushl %edi
movl 8(%ebp),%edi
movl 12(%ebp),%esi
movl 16(%ebp),%ecx
jecxz L2
cld
cmpl %esi,%edi
jb L3
 
std
addl %ecx,%esi
addl %ecx,%edi
decl %esi
decl %edi
L3:
rep
movsb
 
L2:
cld
popl %edi
popl %esi
movl 8(%ebp),%eax
leave
ret
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/memset.s
0,0 → 1,51
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include<libc/asm.h>
.file "memset.s"
.text
.align 4
MK_C_SYM(memset)
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 8(%ebp),%edi
movl 12(%ebp),%eax
movl 16(%ebp),%ecx
cld
 
# We will handle memsets of <= 15 bytes one byte at a time.
# This avoids some extra overhead for small memsets, and
# knowing we are setting > 15 bytes eliminates some annoying
# checks in the "long move" case.
cmpl $15,%ecx
jle L3
 
# Otherwise, tile the byte value out into %eax.
# 0x41 -> 0x41414141, etc.
movb %al,%ah
movl %eax,%edx
sall $16,%eax
movw %dx,%ax
jmp L2
 
# Handle any cruft necessary to get %edi long-aligned.
L1: stosb
decl %ecx
L2: testl $3,%edi
jnz L1
 
# Now slam out all of the longs.
movl %ecx,%edx
shrl $2,%ecx
rep
stosl
 
# Finally, handle any trailing cruft. We know the high three bytes
# of %ecx must be zero, so just put the "slop count" in the low byte.
movb %dl,%cl
andb $3,%cl
L3: rep
stosb
popl %edi
movl 8(%ebp),%eax
leave
ret
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strcat.c
0,0 → 1,17
#include <string.h>
 
char * strcat(char *s, const char *append)
{
int d0, d1, d2, d3;
__asm__ __volatile__(
"repne\n\t"
"scasb\n\t"
"decl %1\n"
"1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
: "0" (append),"1"(s),"2"(0),"3" (0xffffffff):"memory");
return s;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strchr.c
0,0 → 1,20
#include <string.h>
#include <libc/unconst.h>
 
char * strchr(const char *s, int c)
{
int d0;
register char * __res;
__asm__ __volatile__(
"movb %%al,%%ah\n"
"1:\tlodsb\n\t"
"cmpb %%ah,%%al\n\t"
"je 2f\n\t"
"testb %%al,%%al\n\t"
"jne 1b\n\t"
"movl $1,%1\n"
"2:\tmovl %1,%0\n\t"
"decl %0"
:"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
return __res;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strcmp.c
0,0 → 1,21
#include <string.h>
 
int strcmp(const char *s1, const char *s2)
{
int d0, d1;
register int __res;
__asm__ __volatile__(
"1:\tlodsb\n\t"
"scasb\n\t"
"jne 2f\n\t"
"testb %%al,%%al\n\t"
"jne 1b\n\t"
"xorl %%eax,%%eax\n\t"
"jmp 3f\n"
"2:\tsbbl %%eax,%%eax\n\t"
"orb $1,%%al\n"
"3:"
:"=a" (__res), "=&S" (d0), "=&D" (d1)
:"1" (s1),"2" (s2));
return __res;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strcoll.c
0,0 → 1,8
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
int
strcoll(const char *s1, const char *s2)
{
return strcmp(s1, s2);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strcpy.c
0,0 → 1,15
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
char * strcpy(char *to, const char *from)
{
int d0, d1, d2;
__asm__ __volatile__(
"1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
:"0" (from),"1" (to) : "memory");
return to;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strcspn.c
0,0 → 1,20
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
size_t
strcspn(const char *s1, const char *s2)
{
const char *p, *spanp;
char c, sc;
 
for (p = s1;;)
{
c = *p++;
spanp = s2;
do {
if ((sc = *spanp++) == c)
return p - 1 - s1;
} while (sc != 0);
}
/* NOTREACHED */
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strerror.c
0,0 → 1,37
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <libc/unconst.h>
 
char *
strerror(int errnum)
{
static char ebuf[40]; /* 64-bit number + slop */
char *cp;
int v=1000000, lz=0;
 
if (errnum >= 0 && errnum < __sys_nerr)
return(unconst(__sys_errlist[errnum], char *));
 
strcpy(ebuf, "Unknown error: ");
cp = ebuf + 15;
if (errnum < 0)
{
*cp++ = '-';
errnum = -errnum;
}
while (v)
{
int d = errnum / v;
if (d || lz || (v == 1))
{
*cp++ = d+'0';
lz = 1;
}
errnum %= v;
v /= 10;
}
 
return ebuf;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strlen.c
0,0 → 1,15
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
size_t strlen(const char *str)
{
int d0;
register int __res;
__asm__ __volatile__(
"repne\n\t"
"scasb\n\t"
"notl %0\n\t"
"decl %0"
:"=c" (__res), "=&D" (d0) :"1" (str),"a" (0), "0" (0xffffffff));
return __res;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strncat.c
0,0 → 1,24
#include <string.h>
 
char *
strncat(char *dst, const char *src, size_t n)
{
int d0, d1, d2, d3;
__asm__ __volatile__(
"repne\n\t"
"scasb\n\t"
"decl %1\n\t"
"movl %8,%3\n"
"1:\tdecl %3\n\t"
"js 2f\n\t"
"lodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b\n"
"2:\txorl %2,%2\n\t"
"stosb"
: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
: "0" (src),"1" (dst),"2" (0),"3" (0xffffffff), "g" (n)
: "memory");
return dst;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strncmp.c
0,0 → 1,24
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
int strncmp(const char *s1, const char *s2, size_t n)
{
register int __res;
int d0, d1, d2;
__asm__ __volatile__(
"1:\tdecl %3\n\t"
"js 2f\n\t"
"lodsb\n\t"
"scasb\n\t"
"jne 3f\n\t"
"testb %%al,%%al\n\t"
"jne 1b\n"
"2:\txorl %%eax,%%eax\n\t"
"jmp 4f\n"
"3:\tsbbl %%eax,%%eax\n\t"
"orb $1,%%al\n"
"4:"
:"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
:"1" (s1),"2" (s2),"3" (n));
return __res;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strncpy.c
0,0 → 1,20
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
char * strncpy(char *dst, const char *src, size_t n)
{
int d0, d1, d2, d3;
__asm__ __volatile__(
"1:\tdecl %2\n\t"
"js 2f\n\t"
"lodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b\n\t"
"rep\n\t"
"stosb\n"
"2:"
: "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3)
:"0" (src),"1" (dst),"2" (n) : "memory");
return dst;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strpbrk.c
0,0 → 1,18
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
#include <libc/unconst.h>
 
char *
strpbrk(const char *s1, const char *s2)
{
const char *scanp;
int c, sc;
 
while ((c = *s1++) != 0)
{
for (scanp = s2; (sc = *scanp++) != 0;)
if (sc == c)
return unconst(s1 - 1, char *);
}
return 0;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strrchr.c
0,0 → 1,21
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
#include <libc/unconst.h>
 
char *
strrchr(const char *s, int c)
{
char cc = c;
const char *sp=(char *)0;
while (*s)
{
if (*s == cc)
sp = s;
s++;
}
if (cc == 0)
sp = s;
return unconst(sp, char *);
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strspn.c
0,0 → 1,16
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
size_t
strspn(const char *s1, const char *s2)
{
const char *p = s1, *spanp;
char c, sc;
 
cont:
c = *p++;
for (spanp = s2; (sc = *spanp++) != 0;)
if (sc == c)
goto cont;
return (p - 1 - s1);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strstr.c
0,0 → 1,23
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
#include <libc/unconst.h>
 
char *
strstr(const char *s, const char *find)
{
char c, sc;
size_t len;
 
if ((c = *find++) != 0)
{
len = strlen(find);
do {
do {
if ((sc = *s++) == 0)
return 0;
} while (sc != c);
} while (strncmp(s, find, len) != 0);
s--;
}
return unconst(s, char *);
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strtok.c
0,0 → 1,51
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
char *
strtok(char *s, const char *delim)
{
const char *spanp;
int c, sc;
char *tok;
static char *last;
 
 
if (s == NULL && (s = last) == NULL)
return (NULL);
 
/*
* Skip (span) leading delimiters (s += strspn(s, delim), sort of).
*/
cont:
c = *s++;
for (spanp = delim; (sc = *spanp++) != 0;) {
if (c == sc)
goto cont;
}
 
if (c == 0) { /* no non-delimiter characters */
last = NULL;
return (NULL);
}
tok = s - 1;
 
/*
* Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
* Note that delim must have one NUL; we stop if we see that, too.
*/
for (;;) {
c = *s++;
spanp = delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
last = s;
return (tok);
}
} while (sc != 0);
}
/* NOTREACHED */
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/strxfrm.c
0,0 → 1,28
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
 
size_t
strxfrm(dst, src, n)
char *dst;
const char *src;
size_t n;
{
size_t r = 0;
int c;
 
if (n != 0) {
while ((c = *src++) != 0)
{
r++;
if (--n == 0)
{
while (*src++ != 0)
r++;
break;
}
*dst++ = c;
}
*dst = 0;
}
return r;
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/syserr1.c
0,0 → 1,42
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include "syserr1.h"
 
char __syserr00[] = "No Error";
char __syserr01[] = "Input to function out of range (EDOM)";
char __syserr02[] = "Output of function out of range (ERANGE)";
char __syserr03[] = "Argument list too long (E2BIG)";
char __syserr04[] = "Permission denied (EACCES)";
char __syserr05[] = "Resource temporarily unavailable (EAGAIN)";
char __syserr06[] = "Bad file descriptor (EBADF)";
char __syserr07[] = "Resource busy (EBUSY)";
char __syserr08[] = "No child processes (ECHILD)";
char __syserr09[] = "Resource deadlock avoided (EDEADLK)";
char __syserr10[] = "File exists (EEXIST)";
char __syserr11[] = "Bad address (EFAULT)";
char __syserr12[] = "File too large (EFBIG)";
char __syserr13[] = "Interrupted system call (EINTR)";
char __syserr14[] = "Invalid argument (EINVAL)";
char __syserr15[] = "Input or output error (EIO)";
char __syserr16[] = "Is a directory (EISDIR)";
char __syserr17[] = "Too many open files (EMFILE)";
char __syserr18[] = "Too many links (EMLINK)";
char __syserr19[] = "File name too long (ENAMETOOLONG)";
char __syserr20[] = "Too many open files in system (ENFILE)";
char __syserr21[] = "No such device (ENODEV)";
char __syserr22[] = "No such file or directory (ENOENT)";
char __syserr23[] = "Unable to execute file (ENOEXEC)";
char __syserr24[] = "No locks available (ENOLCK)";
char __syserr25[] = "Not enough memory (ENOMEM)";
char __syserr26[] = "No space left on drive (ENOSPC)";
char __syserr27[] = "Function not implemented (ENOSYS)";
char __syserr28[] = "Not a directory (ENOTDIR)";
char __syserr29[] = "Directory not empty (ENOTEMPTY)";
char __syserr30[] = "Inappropriate I/O control operation (ENOTTY)";
char __syserr31[] = "No such device or address (ENXIO)";
char __syserr32[] = "Operation not permitted (EPERM)";
char __syserr33[] = "Broken pipe (EPIPE)";
char __syserr34[] = "Read-only file system (EROFS)";
char __syserr35[] = "Invalid seek (ESPIPE)";
char __syserr36[] = "No such process (ESRCH)";
char __syserr37[] = "Improper link (EXDEV)";
char __syserr38[] = "No more files (ENMFILE)";
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/syserr1.h
0,0 → 1,40
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
extern char __syserr00[];
extern char __syserr01[];
extern char __syserr02[];
extern char __syserr03[];
extern char __syserr04[];
extern char __syserr05[];
extern char __syserr06[];
extern char __syserr07[];
extern char __syserr08[];
extern char __syserr09[];
extern char __syserr10[];
extern char __syserr11[];
extern char __syserr12[];
extern char __syserr13[];
extern char __syserr14[];
extern char __syserr15[];
extern char __syserr16[];
extern char __syserr17[];
extern char __syserr18[];
extern char __syserr19[];
extern char __syserr20[];
extern char __syserr21[];
extern char __syserr22[];
extern char __syserr23[];
extern char __syserr24[];
extern char __syserr25[];
extern char __syserr26[];
extern char __syserr27[];
extern char __syserr28[];
extern char __syserr29[];
extern char __syserr30[];
extern char __syserr31[];
extern char __syserr32[];
extern char __syserr33[];
extern char __syserr34[];
extern char __syserr35[];
extern char __syserr36[];
extern char __syserr37[];
extern char __syserr38[];
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/syserr2.c
0,0 → 1,16
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <errno.h>
#include "syserr1.h"
 
const char *__sys_errlist[] = {
__syserr00, __syserr01, __syserr02, __syserr03, __syserr04,
__syserr05, __syserr06, __syserr07, __syserr08, __syserr09,
__syserr10, __syserr11, __syserr12, __syserr13, __syserr14,
__syserr15, __syserr16, __syserr17, __syserr18, __syserr19,
__syserr20, __syserr21, __syserr22, __syserr23, __syserr24,
__syserr25, __syserr26, __syserr27, __syserr28, __syserr29,
__syserr30, __syserr31, __syserr32, __syserr33, __syserr34,
__syserr35, __syserr36, __syserr37, __syserr38
};
 
int __sys_nerr = sizeof(__sys_errlist) / sizeof(__sys_errlist[0]);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/develop/libraries/menuetlibc/src/libc/ansi/string/syserr3.c
0,0 → 1,16
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <errno.h>
#include "syserr1.h"
 
char *sys_errlist[] = {
__syserr00, __syserr01, __syserr02, __syserr03, __syserr04,
__syserr05, __syserr06, __syserr07, __syserr08, __syserr09,
__syserr10, __syserr11, __syserr12, __syserr13, __syserr14,
__syserr15, __syserr16, __syserr17, __syserr18, __syserr19,
__syserr20, __syserr21, __syserr22, __syserr23, __syserr24,
__syserr25, __syserr26, __syserr27, __syserr28, __syserr29,
__syserr30, __syserr31, __syserr32, __syserr33, __syserr34,
__syserr35, __syserr36, __syserr37, __syserr38
};
 
int sys_nerr = sizeof(sys_errlist) / sizeof(sys_errlist[0]);
Property changes:
Added: svn:executable
+*
\ No newline at end of property