changeset 87:7fb62fc724dc

target-utils/libc: beginning of newlib-ectomy
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 28 Oct 2016 22:20:26 +0000
parents 684eddecbc62
children 4f3843165014
files target-utils/libc/Makefile target-utils/libc/atoi.c target-utils/libc/ctype_.c target-utils/libc/index.c target-utils/libc/rindex.c target-utils/libc/strcasecmp.c target-utils/libc/strcat.c target-utils/libc/strcmp.c target-utils/libc/strcpy.c target-utils/libc/strncat.c target-utils/libc/strncmp.c target-utils/libc/strncpy.c
diffstat 12 files changed, 259 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/Makefile	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,17 @@
+CC=	arm-elf-gcc
+CFLAGS=	-Os -fno-builtin
+CPPFLAGS=-I../include
+AR=	arm-elf-ar
+RANLIB=	arm-elf-ranlib
+
+OBJS=	atoi.o ctype_.o index.o rindex.o strcasecmp.o strcat.o strcmp.o \
+	strcpy.o strncat.o strncmp.o strncpy.o
+
+all:	libc.a
+
+libc.a:	${OBJS}
+	${AR} cru $@ ${OBJS}
+	${RANLIB} $@
+
+clean:
+	rm -f *.[oa] *errs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/atoi.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,24 @@
+atoi(p)
+	register char *p;
+{
+	register int n;
+	register int f;
+
+	n = 0;
+	f = 0;
+	for(;;p++) {
+		switch(*p) {
+		case ' ':
+		case '\t':
+			continue;
+		case '-':
+			f++;
+		case '+':
+			p++;
+		}
+		break;
+	}
+	while(*p >= '0' && *p <= '9')
+		n = n*10 + *p++ - '0';
+	return(f? -n: n);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/ctype_.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,21 @@
+#include <ctype.h>
+
+const char _ctype_[1 + 256] = {
+	0,
+	_C,	_C,	_C,	_C,	_C,	_C,	_C,	_C,
+	_C,	_C|_S,	_C|_S,	_C|_S,	_C|_S,	_C|_S,	_C,	_C,
+	_C,	_C,	_C,	_C,	_C,	_C,	_C,	_C,
+	_C,	_C,	_C,	_C,	_C,	_C,	_C,	_C,
+	_S|_B,	_P,	_P,	_P,	_P,	_P,	_P,	_P,
+	_P,	_P,	_P,	_P,	_P,	_P,	_P,	_P,
+	_N,	_N,	_N,	_N,	_N,	_N,	_N,	_N,
+	_N,	_N,	_P,	_P,	_P,	_P,	_P,	_P,
+	_P,	_U|_X,	_U|_X,	_U|_X,	_U|_X,	_U|_X,	_U|_X,	_U,
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U,
+	_U,	_U,	_U,	_U,	_U,	_U,	_U,	_U,
+	_U,	_U,	_U,	_P,	_P,	_P,	_P,	_P,
+	_P,	_L|_X,	_L|_X,	_L|_X,	_L|_X,	_L|_X,	_L|_X,	_L,
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L,
+	_L,	_L,	_L,	_L,	_L,	_L,	_L,	_L,
+	_L,	_L,	_L,	_P,	_P,	_P,	_P,	_C
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/index.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,12 @@
+char *
+index(p, ch)
+	register char *p, ch;
+{
+	for (;; ++p) {
+		if (*p == ch)
+			return(p);
+		if (!*p)
+			return((char *)0);
+	}
+	/* NOTREACHED */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/rindex.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,14 @@
+char *
+rindex(p, ch)
+	register char *p, ch;
+{
+	register char *save;
+
+	for (save = 0;; ++p) {
+		if (*p == ch)
+			save = p;
+		if (!*p)
+			return(save);
+	}
+	/* NOTREACHED */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strcasecmp.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,66 @@
+#include <sys/types.h>
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static const u_char charmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+strcasecmp(s1, s2)
+	const char *s1, *s2;
+{
+	register const u_char *us1 = (const u_char *)s1,
+			      *us2 = (const u_char *)s2;
+
+	while (charmap[*us1] == charmap[*us2++])
+		if (*us1++ == '\0')
+			return(0);
+	return(charmap[*us1] - charmap[*--us2]);
+}
+
+strncasecmp(s1, s2, n)
+	const char *s1, *s2;
+	register int n;
+{
+	register const u_char *us1 = (const u_char *)s1,
+			      *us2 = (const u_char *)s2;
+
+	while (--n >= 0 && charmap[*us1] == charmap[*us2++])
+		if (*us1++ == '\0')
+			return(0);
+	return(n < 0 ? 0 : charmap[*us1] - charmap[*--us2]);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strcat.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,19 @@
+/*
+ * Concatenate s2 on the end of s1.  S1's space must be large enough.
+ * Return s1.
+ */
+
+char *
+strcat(s1, s2)
+	register char *s1, *s2;
+{
+	register char *os1;
+
+	os1 = s1;
+	while (*s1++)
+		;
+	--s1;
+	while (*s1++ = *s2++)
+		;
+	return(os1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strcmp.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,12 @@
+/*
+ * Compare strings:  s1>s2: >0  s1==s2: 0  s1<s2: <0
+ */
+
+strcmp(s1, s2)
+	register char *s1, *s2;
+{
+	while (*s1 == *s2++)
+		if (*s1++=='\0')
+			return(0);
+	return(*s1 - *--s2);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strcpy.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,16 @@
+/*
+ * Copy string s2 to s1.  s1 must be large enough.
+ * return s1
+ */
+
+char *
+strcpy(s1, s2)
+	register char *s1, *s2;
+{
+	register char *os1;
+
+	os1 = s1;
+	while (*s1++ = *s2++)
+		;
+	return(os1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strncat.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,24 @@
+/*
+ * Concatenate s2 on the end of s1.  S1's space must be large enough.
+ * At most n characters are moved.
+ * Return s1.
+ */
+
+char *
+strncat(s1, s2, n)
+	register char *s1, *s2;
+	register n;
+{
+	register char *os1;
+
+	os1 = s1;
+	while (*s1++)
+		;
+	--s1;
+	while (*s1++ = *s2++)
+		if (--n < 0) {
+			*--s1 = '\0';
+			break;
+		}
+	return(os1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strncmp.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,13 @@
+/*
+ * Compare strings (at most n bytes):  s1>s2: >0  s1==s2: 0  s1<s2: <0
+ */
+
+strncmp(s1, s2, n)
+	register char *s1, *s2;
+	register n;
+{
+	while (--n >= 0 && *s1 == *s2++)
+		if (*s1++ == '\0')
+			return(0);
+	return(n<0 ? 0 : *s1 - *--s2);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/libc/strncpy.c	Fri Oct 28 22:20:26 2016 +0000
@@ -0,0 +1,21 @@
+/*
+ * Copy s2 to s1, truncating or null-padding to always copy n bytes
+ * return s1
+ */
+
+char *
+strncpy(s1, s2, n)
+	register char *s1, *s2;
+{
+	register i;
+	register char *os1;
+
+	os1 = s1;
+	for (i = 0; i < n; i++)
+		if ((*s1++ = *s2++) == '\0') {
+			while (++i < n)
+				*s1++ = '\0';
+			return(os1);
+		}
+	return(os1);
+}