string.c extension sources
John Antypas
jantypas at wolf.SNS
Sat May 3 07:23:21 AEST 1986
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# string.doc
# string2.c
# string2.h
# This archive created: Fri May 2 14:12:14 1986
export PATH; PATH=/bin:$PATH
if test -f 'string.doc'
then
echo shar: will not over-write existing file "'string.doc'"
else
cat << \SHAR_EOF > 'string.doc'
Strings2 - John Antypas
An Addition to the Strings(3) Package
The Unix environment provides most functions in standard libraries,
but more often not, a programmer will need a function NOT provided.
Such is the case with string(3). I find myself wanting an index() which
works with strings and not characters alone. I don't know why this was
left out, but it was. Also, a function to replace a pattern in a string
with another would be nice. So...
strindex(s,t) - Returns the point at which string t is located in string s.
If t is not in s, -1 is returned.
strreplace(s,p,r) - Replace first pattern (p) in string (s) with the pattern
(r). This can also be used as strdel() to delete patterns
bhaving r = NULL hence replace with nothing.
Pointers are not checked and disaster will result if bad pointers are passed.
SHAR_EOF
fi # end of overwriting check
if test -f 'string2.c'
then
echo shar: will not over-write existing file "'string2.c'"
else
cat << \SHAR_EOF > 'string2.c'
/*
Strings2 - Provides even more string functions for C.
I don't know why these weren't included in strings(3).
John Antypas -- ...!sdcsvax!jantypas
strword1(r,s,c,i) -- Returns 1st word in s to r. c is the character
which separates words.
strindex(s,t) -- returns first occurrence of t in s or -1.
strreplace(s,p,r) -- replace first pattern p with pattern r.
This can be used to strinsert and delete functions.
It returns a pointer to the new string s.
All parameters are character pointers.
*/
#define NULL 0
#include <string.h> /* Need strcat, strcpy */
int strindex(s,t)
char *s, *t;
{
int loop, n; /* Loop counter */
n = strlen(t);
for (loop=0;s+loop != '\0'; loop++)
if (strncmp(s+loop, t, n) == 0) { return(loop); }
return -1;
}
char *strreplace(s,p,r)
char *s, *p, *r;
{
int f, n;
char *m; /* Used for temporary */
m = malloc( strlen(s) + strlen(r) - strlen(p) );
/* Get enough memory for the new string */
/* If it doesn't work, die here */
if (m == NULL) return(m);
f = strindex(s,p);
strncpy(m,s,f); /* Copy up to p. */
strcat(m,r); /* Add in r. */
/* Now add the part after the replacement */
strcat(m,s+f+strlen(p));
/* Copy it back to s */
strcpy(s,m);
free(m);
return(s);
}
int strword(r,s,c,i)
char *s, *r, c;
int i;
/*
Function: Returns number of words/specific word in string s.
Returns in string r the word requested. If i<0;
returns # words in s, else reurns ith word in r.
c is the character used to mark separate words.
Usually is a space (32).
*/
{
int l;
l = strlen(s);
if (i<0) /* Count words */
{
int nw,j; /* # words and loop var */
for (j=0,nw=0; j<l; j++)
{
if (*(s+j) == c) nw++;
}
if (nw != 0) nw++;
return(nw);
}
else
{
char *sp,t[2];
int nw,m; /* Loops and length(s) */
t[0] = c; t[1] = 0;
/* Find begining of ith word */
nw = 0; sp = s;
while ((nw<i) && (*sp != NULL))
{
if ((*sp) == c) nw++;
sp++;
}
/* Now find end of that word */
m = strindex(sp,t);
if (m>0) { strncpy(r,sp,m); } else { strcpy(r,sp); }
return(0);
}
}
SHAR_EOF
fi # end of overwriting check
if test -f 'string2.h'
then
echo shar: will not over-write existing file "'string2.h'"
else
cat << \SHAR_EOF > 'string2.h'
/*
String2 -- String2 header file
Make sure to link with string2.o
strindex(s,t) -- Return index to pattern t in string s or -1
strreplace(s,p,r) -- Replace pattern p by pattern r in string s.
Return char pointer to s or NULL if error.
*/
extern int strword();
extern int strindex();
extern char *strreplace();
#define strdelete(s,p) strreplace(s,p,"");
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
More information about the Comp.sources.unix
mailing list