# String library.

# Configuration settings:  how should "size_t", "void *", "const" be written?
# "size_t" is what's needed to hold the result of sizeof; beware of problems
# with compatibility here, because X3J11 uses this for e.g. the third
# argument of strncpy() as well.  You may need to make it "int" even if
# this is a lie.  "void *" is the generic pointer type, "char *" in most
# existing implementations.  "const" is the keyword marking read-only
# variables and parameters, unimplemented in most existing implementations.
# These things need to be defined this way because they must be fitted into
# both the .h files and the .c files; see the make instructions for string.h
# farther down.
SIZET = int
VOIDSTAR = char *
LVOIDSTAR = char*	# Lint shell file has problems with * alone.  Barf.
CONST = 

CONF = -DSIZET=$(SIZET) -DVOIDSTAR='$(VOIDSTAR)' -DCONST='$(CONST)'
LCONF = -DSIZET=$(SIZET) -DVOIDSTAR='$(LVOIDSTAR)' -DCONST='$(CONST)'

# Things you might want to put in CFLAGS or LINTFLAGS.
# -DCHARBITS=0377		Required if compiler lacks "unsigned char".
# -Dvoid=int			Required if compiler lacks "void".
# -DUNIXERR			Unix-like errno stuff, can test strerror().
# -DBERKERR			Like UNIXERR but for Berklix (4BSD).
# -I.				string.h from here, not /usr/include.

CFLAGS = -O $(CONF) -DUNIXERR -I.
LINTFLAGS = -hpan $(LCONF) -DUNIXERR -Dvoid=int -DCHARBITS=0377 -I.
LDFLAGS = -i

# Name lists.
STRING = index.o rindex.o strcat.o strchr.o strcmp.o strcpy.o strcspn.o \
	strlen.o strncat.o strncmp.o strncpy.o strpbrk.o strrchr.o strspn.o \
	strtok.o strstr.o memcpy.o memccpy.o memcmp.o memchr.o memset.o \
	bcopy.o bcmp.o bzero.o strerror.o
CSTRING = index.c rindex.c strcat.c strchr.c strcmp.c strcpy.c strcspn.c \
	strlen.c strncat.c strncmp.c strncpy.c strpbrk.c strrchr.c strspn.c \
	strtok.c strstr.c memcpy.c memccpy.c memcmp.c memchr.c memset.c \
	bcopy.c bcmp.c bzero.c strerror.c
DTR = README Makefile $(CSTRING) tester.c string.proto

# Locations, for installation (somewhat system-dependent).
DEST=..

tester.o:	string.h

mv:	$(STRING)
	mv $(STRING) $(DEST)

r:	tester
	@echo 'No news is good news.  Note: strerror() test is VERY system-dependent.'
	tester

tester:	tester.o $(STRING)
	cc $(LDFLAGS) tester.o $(STRING) -o tester

string.h:	string.proto
	sed 's/SIZET/$(SIZET)/g;s/VOIDSTAR /$(VOIDSTAR)/g' string.proto >string.h

memory.h:	string.h
	egrep mem string.h >memory.h

lint:	string.h
	lint $(LINTFLAGS) tester.c $(CSTRING)

clean:
	rm -f tester a.out *.o string.h memory.h dtr

dtr:	$(DTR)
	makedtr $(DTR) >dtr
