/* File : strings.h Author : Richard A. O'Keefe. Updated: 1 June 1984 Purpose: Header file for the "string(3C)" package. All the routines in this package are the original work of R.A.O'Keefe. Any resemblance between them and any routines in licensed software is due entirely to these routines having been written using the "man 3 string" UNIX manual page, or in some cases the "man 1 sort" manual page as a specification. See the READ-ME to find the conditions under which these routines may be used & copied. */ #ifndef NullS #define NullS (char*)0 #define NUL '\0' /* MAKE SURE THE RIGHT VERSION OF THE FOLLOWING MACRO IS INSTALLED! */ #if vax | pdp11 | m68000 | perq #define CharsAreSigned 1 /* default is unsigned */ #endif vax | pdp11 | m68000 | perq #if CharsAreSigned #define int2char(i) (((i)<<((sizeof (int) -1)*8))>>((sizeof (int) -1)*8)) #else !CharsAreSigned #define int2char(i) ((i)&255) #endif CharsAreSigned /* If characters are signed, but the above doesn't work, try ((127-(255&~(i)))^(-128)) */ #ifndef _AlphabetSize #define _AlphabetSize 128 #endif #if _AlphabetSize == 128 typedef char _char_; #endif #if _AlphabetSize == 256 typedef unsigned char _char_; #endif /* NullS is the "nil" character pointer. NULL would work in most cases, but in some C compilers pointers and integers may be of different sizes, so it is handy to have a nil pointer that one can pass to a function as well as compare pointers against. NUL is the ASCII name for the character with code 0. Its use to end strings is a convention of the C programming language. There are in fact three different end of string conventions supported by routines in this package: str : end at the first NUL character strn : end at the first NUL character, or when the extra "len" parameter runs out. mem,b : length determined solely by "len" parameter. Unfortunately, the VAX hardware only supports the last convention, a pity really. Fortran 77 users BEWARE: Fortran 77's convention is an entirely different one, and there are NO routines in this package as yet which support it. (But see section 3F of the 4.2 BSD manual.) The routines which move characters around don't care whether they are signed or unsigned. But the routines which compare a character in a string with an argument, or use a character from a string as an index into an array, do care. I have assumed that _AlphabetSize = 128 => only 0..127 appear in strings _AlphabetSize = 256 => only 0..255 appear in strings The files _str2set.c and _str2map.c declare character vectors using this size. If you don't have unsigned char, your machine may treat char as unsigned anyway. Some string operations (*cmp, *chr) are explicitly defined in various UNIX manuals to use "native" comparison, so I have not used _char_ in them. This package is meant to be compatible, not rational! */ extern char *strcat(/*char^,char^*/); extern char *strncat(/*char^,char^,int*/); extern int strcmp(/*char^,char^*/); extern int strncmp(/*char^,char^,int*/); #define streql !strcmp #define strneql !strncmp /* (str-N)-eql not str-(neq-l)! */ extern char *strcpy(/*char^,char^*/); extern char *strncpy(/*char^,char^,int*/); extern int strlen(/*char^*/); extern int strnlen(/*char^,int*/); extern char *strchr(/*char^,_char_*/); extern char *strrchr(/*char^,_char_*/); #define index strchr #define rindex strrchr extern char *strmov(/*char^,char^*/); extern char *strnmov(/*char^,char^,int*/); extern void strrev(/*char^,char^*/); extern void strnrev(/*char^,char^,int*/); extern char *strend(/*char^*/); extern char *strnend(/*char^*/); extern char *strpbrk(/*char^,char^*/); extern char *strcpbrk(/*char^,char^*/); extern int strspn(/*char^,char^*/); extern int strcspn(/*char^,char^*/); extern char *strtok(/*char^,char^*/); extern void istrtok(/*char^,char^*/); extern char *strpack(/*_char_^,_char_^,char^,int*/); extern char *strcpack(/*_char_^,_char_^,char^,int*/); extern int strrpt(/*char^,char^,int*/); extern int strnrpt(/*char^,int,char^,int*/); extern void strtrans(/*_char_^,_char_^,_char_^,_char_^*/); extern void strntrans(/*_char_^,_char_^,int,_char_^,_char_^*/); extern char *strtrim(/*char^,char^,char^,int*/); extern char *strctrim(/*char^,char^,char^,int*/); extern char *strfield(/*char^,int,int,int,int*/); extern char *strkey(/*char^,char^,char^,char^*/); extern char *strfind(/*char^,char^*/); extern char *strrepl(/*char^,char^,char^,char^*/); extern void bcopy(/*char^,char^,int*/); extern void bmove(/*char^,char^,int*/); extern void bfill(/*char^,int,char*/); extern void bzero(/*char^,int*/); extern int bcmp(/*char^,char^,int*/); #define beql !bcmp extern int ffs(/*int*/); extern int ffc(/*int*/); extern char *substr(/*char^,char^,int,int*/); extern char *strxcat(/*VARARGS*/); extern char *strxcpy(/*VARARGS*/); extern char *strxmov(/*VARARGS*/); extern char *strxncat(/*VARARGS*/); extern char *strxncpy(/*VARARGS*/); extern char *strxnmov(/*VARARGS*/); #endif NullS #ifndef memeql #include "memory.h" #endif memeql