This is strings.c in view mode; [Download] [Up]
/* * Miscellaneous string routines. */ #define STRSTR #include <stdio.h> #include "config.h" /* * Do a fancy string copy. If NULL, return null. If pointer to NULL, then * return the special "null_ptr" variable. If a normal copy, allocate * memory first. */ char * str_dup(str) char *str; { extern char *null_ptr; char *ret, *malloc(), *strcpy(); void error_win(); if (str == NULL) return(NULL); /* if pointer to null */ if (*str == '\0') return(null_ptr); if (!(ret = malloc((unsigned int) strlen(str)+1))) error_win(1, "Out of memory", ""); strcpy(ret, str); return(ret); } /* * Perform the free(2) function, but check for NULL and the special * "null_ptr" variable first. */ void free_ptr(str) char *str; { extern char *null_ptr; void free(); if (str != NULL && str != null_ptr) free(str); return; } /* * Replace a string. Follows the same convention as str_dup(), except * that realloc() is used instead of malloc(). Returns a pointer to * the new string (which may have moved). */ char * str_rep(s1, s2) char *s1, *s2; { extern char *null_ptr; void free_ptr(), error_win(); char *s, *malloc(), *realloc(), *strcpy(); /* copy null pointer ? */ if (s2 == NULL) { free_ptr(s1); return(NULL); } if (s2 == '\0') { free_ptr(s1); return(null_ptr); } /* use realloc()? */ if (s1 == NULL || s1 == null_ptr) { if (!(s = malloc((unsigned int) strlen(s2)+1))) error_win(1, "Out of memory", ""); } else { if (!(s = realloc(s1, (unsigned int) strlen(s2)+1))) error_win(1, "Out of memory", ""); } strcpy(s, s2); return(s); } /* * This routine is similar to strtok(3). But this version handles missing * tokens by returning a pointer to null. Also it takes a single separator * character as an argument. Returns a NULL on end of string or error. */ char * str_tok(str, c) char *str, c; { char *strchr(); static char *ptr, *sep; /* start at beginning */ if (str != NULL) ptr = str; else ptr = sep; /* at the end? */ if (*ptr == '\0') return(NULL); /* no separator? */ if (!(sep = strchr(ptr, c))) return(NULL); /* zap the sep, move past it */ *sep = '\0'; sep++; return(ptr); } #ifdef STRSTR /* * Return a pointer to the first occurrence of string str2 in str1. * Returns a NULL if str2 is not in str1. */ char * strstr(str1, str2) char *str1, *str2; { int len; len = strlen(str2); while (*str1) { if (*str2 == *str1) { if (!strncmp(str2, str1, len)) return(str1); } str1++; } return(NULL); } #endif /* STRSTR */ #ifdef BSD /* * Returns the length of the initial segment of string which consists * entirely of characters from charset. */ int strspn(string, charset) char *string; register char *charset; { register char *p, *q; for(q=string; *q != '\0'; ++q) { for(p=charset; *p != '\0' && *p != *q; ++p) ; if(*p == '\0') break; } return(q-string); } /* * Strtok considers string to consist of a sequence of zero or more * text tokens separated by spans of one or more characters from sepset. */ char * strtok(string, sepset) char *string, *sepset; { register char *p, *q, *r; static char *savept; char *strpbrk(); /*first or subsequent call*/ p = (string == NULL)? savept: string; if(p == 0) /* return if no tokens remaining */ return(NULL); q = p + strspn(p, sepset); /* skip leading separators */ if(*q == '\0') /* return if no tokens remaining */ return(NULL); if((r = strpbrk(q, sepset)) == NULL) /* move past token */ savept = 0; /* indicate this is last token */ else { *r = '\0'; savept = ++r; } return(q); } /* * Return ptr to first occurrence of any character from `brkset' * in the character string `string'; NULL if none exists. */ char * strpbrk(string, brkset) register char *string, *brkset; { register char *p; if(!string || !brkset) return(0); do { for(p=brkset; *p != '\0' && *p != *string; ++p) ; if(*p != '\0') return(string); } while(*string++); return(0); } /* * Copies the character c, n times to string s */ /* char * memset(s, c, n) char *s, c; int n; { char *s1 = s; while (n > 0) { --n; *s++ = c; } return(s1); } */ #endif /* BSD */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.