Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - kcc-5/lib/string.c
There are 9 other files named string.c in the archive. Click here to see a list.
/* ---------------------------------------------------------------- */
/*      string - string manipulation routines for KCC runtimes      */
/*								    */
/*	references:	man 3 string				    */
/*			H&S I, 1984, section 11.2		    */
/*			H&S II, 1987, chapter 15		    */
/*								    */
/*         David Eppstein / Stanford University / 3-July-1984       */
/*	  Ken Harrenstien / SRI International / 30-Nov-1985	    */
/*		Ian Macky / SRI International / '87		    */
/* ---------------------------------------------------------------- */

#include "c-env.h"
#include "string.h"
#include "ctype.h"

/* -------------------------------------------------------------- */
/* STRCAT -  append strings, return ptr to null-terminated result */
/* -------------------------------------------------------------- */

char *strcat(s1, s2)
char *s1, *s2;
{
    char *s;

    if (*s2 == '\0')			/* make sure we have something to do */
	return s1;
    s = s1;				/* copy start pointer */
    if (*s1 != '\0')
	while (*++s1 != '\0') ;		/* skip to first null */
    *s1 = *s2;				/* copy first char */
    while ((*++s1 = *++s2) != '\0') ;	/* loop copying until null */
    return s;				/* return pointer to start of string */
}

/* ----------------------------------------------------------- */
/* STRNCAT -  append strings with limit on number to copy      */
/* ----------------------------------------------------------- */

char *strncat(s1, s2, n)
char *s1, *s2;
int n;
{
    char *s;

    if (*s2 == '\0' || n <= 0) 		/* make sure have something to do */
	return s1;
    s = s1;				/* copy start pointer */
    if (*s1 != '\0')
	while (*++s1 != '\0') ;		/* skip to first null */
        *s1 = *s2;				/* copy first char */
    while (--n > 0 && (*++s1 = *++s2) != '\0') ; /* loop copying until null */
    if (n == 0) *++s1 = '\0';		/* null-terminate */
    return s;				/* return pointer to start of string */
}
/* --------------------------------- */
/* STRCMP - compare two strings      */
/* --------------------------------- */

int strcmp(s1, s2)
char *s1, *s2;
{
    while (*s1 == *s2) {
	if (*s1++ == '\0') return 0;
	s2++;
    }
    return *s1 - *s2;
}

/* -------------------------------------------------- */
/* STRNCMP - like strcmp but look at at most n chars  */
/* -------------------------------------------------- */

int strncmp(s1, s2, n)
char *s1, *s2;
int n;
{
    if (n <= 0) return 0;
    while (--n > 0 && *s1 == *s2) {
	if (*s1++ == '\0') return 0;
	s2++;
    }
    return *s1 - *s2;	/* Counted out.  Return 0 if last chars match. */
}
/* ------------------------------------------- */
/* STRCPY -  copy one string over another      */
/* ------------------------------------------- */

char *strcpy(s1, s2)
char *s1, *s2;
{
    char *s;
    s = s1;

    if ((*s1 = *s2) != '\0')		/* if string isn't completely empty */
	while ((*++s1 = *++s2) != '\0') ; /* copy rest of it */
    return s;				/* return original pointer */
}

/* ------------------------------------------------------- */
/* STRNCPY -  like strcpy, but copy exact number of chars  */
/* ------------------------------------------------------- */

char *strncpy(s1, s2, n)
char *s1, *s2;
int n;
{
    char *s;
    s = s1;

    while (n-- > 0)
	if ((*s1++ = *s2) != '\0')
	    s2++;
    return s;
}
/* ----------------------------------------------------- */
/* STRLEN - find number of non-null chars in string      */
/* ----------------------------------------------------- */

int strlen(s)
char *s;
{
    int n;

    if (*s == '\0')
	return 0;
    n = 1;
    while (*++s != '\0')
	n++;
    return n;
}
/* ------------------------------------------------ */
/* STRCHR - find first occurrence of char in string */
/* INDEX - old BSD name of the same		    */
/* ------------------------------------------------ */

char *strchr(s, c)
char *s, c;
{
    while (*s != c) {
	if (*s == '\0') return NULL;	/* no occurrences */
	s++;				/* maybe more, go look */
    }
    return s;				/* found one, return it */
}

char *index(s, c)
char *s, c;
{
    return strchr(s, c);
}

/* ------------------------------------------------------------ */
/* STRPOS - find position of first occurrence of char in string */
/* ------------------------------------------------------------ */

int strpos(s,c)
char *s, c;
{
    register int i;

    for (i = 0; *s != c; ++s, ++i)
	if (*s == '\0')
	    return -1;
    return i;
}

/* ----------------------------------------------- */
/* STRRCHR, find last occurrence of char in string */
/* RINDEX - old BSD name of the same		   */
/* ----------------------------------------------- */

char *strrchr(s, c)
char *s, c;
{
    char *r;

    r = NULL;
    do
	if (*s == c) r = s;	/* remember last pointer to char */
    while (*s++);
    return r;			/* return the last one we found */
}

char *rindex(s, c)
char *s, c;
{
    return strrchr(s, c);
}

/* -------------------------------------------------------- */
/* STRRPOS - find pos of last occurrence of char in string  */
/* -------------------------------------------------------- */

int strrpos(s, c)
char *s, c;
{
    char *r;

    return ((r = strrchr(s,c)) == NULL) ? -1 : r - s;
}
/* ------------------------------------------------------------ */
/* STRSPN - find pos of first occurrence of char NOT in set     */
/* ------------------------------------------------------------ */

int strspn(s, set)
char *s, *set;
{
    register int i;
    register char *cp;

    if (*set == '\0') return 0;
    for (i = 0; *s != '\0'; ++s, ++i) {
	cp = set;
	while (*cp)
	    if (*s == *cp++)
		goto kludge;
	return i;
kludge: ;
    }
    return i;
}

/* ----------------------------------------------------- */
/* STRCSPN - search for 1st char in set			 */
/* ----------------------------------------------------- */

int strcspn(s, set)
char *s, *set;
{
    register int i;
    register char *cp;

    for (i = 0; *s != '\0'; ++s, ++i) {
	cp = set;
	while (*cp)
	    if (*s == *cp++) return i;
    }
    return i;
}

/* ----------------------------------------------------- */
/* STRPBRK - find first occurrence of set in string      */
/* ----------------------------------------------------- */

char *strpbrk(s,set)
char *s, *set;
{
    register int i;
    register char *cp;

    for (i = 0; *s != '\0'; ++s, ++i) {
	cp = set;
	while (*cp)
	    if (*s == *cp++)
		return s;
    }
    return NULL;
}

/* -------------------------------------------------*/
/* STRRPBRK - find last occurrence of set in string */
/* -------------------------------------------------*/

char *strrpbrk(s,set)
char *s, *set;
{
    int i;
    char *r, *r2;

    r = NULL;
    while ((s = strpbrk(s,set)) != NULL)
	r = s++;
    return r;
}
/*
 *	STRSTR - find first occurance of substring within string
 */

char *strstr(src, sub)
char *src, *sub;
{
    int n, c;
    char *p;

    n = strlen(sub);			/* get length of substring */
    if (!n)				/* a null substring is always found */
	return src;			/* at the head of the target string */
    c = *sub;				/* first char of substring */
    for (p = strchr(src, c); p; p = strchr(++src, c))
	if (!strncmp(p, sub, n))	/* search for 1st char of substring, */
	    return p;			/* then see if there's a match for */
    return NULL;			/* the rest... */
}

/*
 *	STRTOK - separate a string into tokens
 */

static char *_tokptr = NULL;		/* internal state pointer */

char *strtok(str, set)
char *str, *set;
{
    char *source, *p, *start;

    source = (str) ? str : _tokptr;	/* new string or next part of old */
    p = source + strspn(source, set);	/* skip leading chars in set */
    if (!p || !*p)			/* nothing but separators? */
	return _tokptr = NULL;		/* fraid so, so done with string */
    start = p;				/* save start of token */
    if (p = strpbrk(start, set)) {	/* look for end of token now */
	*p = '\0';			/* found it, clobber terminator */
	_tokptr = ++p;			/* and point to after that char */
    } else				/* hit end of string, so no more */
	_tokptr = NULL;			/* next time. */
    return start;			/* return start of token */
}