📄 string.c
字号:
/* * (c) Copyright 1990 Conor P. Cahill (uunet!virtech!cpcahil). * You may copy, distribute, and use this software as long as this * copyright statement is not removed. */#include <stdio.h>#include <string.h>#include <sys/types.h>#include "malloc.h"#ifndef lintstaticchar rcs_hdr[] = "$Id: string.c,v 1.5 90/06/10 14:59:49 cpcahil Exp $";#endifint malloc_checking = 0;char *strcat(str1,str2) register char * str1; register char * str2;{ char * rtn; int len; /* * check pointers agains malloc region. The malloc* functions * will properly handle the case where a pointer does not * point into malloc space. */ malloc_checking = 1; len = strlen(str2); malloc_check_str("strcat", str2); len += strlen(str1) + 1; malloc_checking = 0; malloc_check_data("strcat", str1, len); rtn = str1; while( *str1 ) { str1++; } while( (*str1 = *str2) != '\0' ) { str1++; str2++; } return(rtn);}char *strdup(str1) register char * str1;{ char * malloc(); char * rtn; register char * str2; malloc_check_str("strdup", str1); rtn = str2 = malloc((unsigned)strlen(str1)+1); if( rtn != (char *) 0) { while( (*str2 = *str1) != '\0' ) { str1++; str2++; } } return(rtn);}char *strncat(str1,str2,len) register char * str1; register char * str2; register int len;{ int len1; int len2; char * rtn; malloc_checking = 1; len2 = strlen(str2) + 1; len1 = strlen(str1); malloc_checking = 0; malloc_check_data("strncat", str2,len2); if( (len+1) < len2 ) { len1 += len + 1; } else { len1 += len2; } malloc_check_data("strncat", str1, len1); rtn = str1; while( *str1 ) { str1++; } while( len-- && ((*str1++ = *str2++) != '\0') ) { } if( ! len ) { *str1 = '\0'; } return(rtn);}intstrcmp(str1,str2) register char * str1; register char * str2;{ malloc_check_str("strcmp", str1); malloc_check_str("strcmp", str2); while( *str1 && (*str1 == *str2) ) { str1++; str2++; } return( *str1 - *str2 );}intstrncmp(str1,str2,len) register char * str1; register char * str2; register int len;{ malloc_check_str("strncmp", str1); malloc_check_str("strncmp", str2); while( --len && *str1 && (*str1 == *str2) ) { str1++; str2++; } return( *str1 - *str2 );}char *strcpy(str1,str2) register char * str1; register char * str2;{ char * rtn; int len; malloc_checking = 1; len = strlen(str2) + 1; malloc_checking = 0; malloc_check_data("strcpy", str1, len); malloc_check_data("strcpy", str2, len); rtn = str1; while( (*str1++ = *str2++) != '\0') { } return(rtn);}char *strncpy(str1,str2,len) register char * str1; register char * str2; register int len;{ int i; extern int malloc_checking; char * rtn; malloc_check_data("strncpy", str1, len); malloc_checking = 1; i = strlen(str2); malloc_checking = 0; if( i > len ) { i = len; } malloc_check_data("strncpy", str2, i); rtn = str1; while((len-- > 0) && (*str1++ = *str2++) != '\0') { } while( (len-- > 0) ) { *str1++ = '\0'; } return(rtn);}intstrlen(str1) register char * str1;{ register char * s; if(! malloc_checking ) { malloc_check_str("strlen", str1); } for( s = str1; *s; s++) { } return( s - str1 );}char *strchr(str1,c) register char * str1; register int c;{ malloc_check_str("strchr", str1); while( *str1 && (*str1 != (char) c) ) { str1++; } if(! *str1 ) { str1 = (char *) 0; } return(str1);}char *strrchr(str1,c) register char * str1; register int c;{ register char * rtn = (char *) 0; malloc_check_str("strrchr", str1); while( *str1 ) { if(*str1 == (char) c ) { rtn = str1; } str1++; } return(rtn);}char *index(str1,c) char * str1; char c;{ return( strchr(str1,c) );}char *rindex(str1,c) char * str1; char c;{ return( strrchr(str1,c) );}char *strpbrk(str1,str2) register char * str1; register char * str2;{ register char * tmp; malloc_check_str("strpbrk", str1); malloc_check_str("strpbrk", str2); while(*str1) { for( tmp=str2; *tmp && *tmp != *str1; tmp++) { } if( *tmp ) { break; } str1++; } if( ! *str1 ) { str1 = (char *) 0; } return(str1);}intstrspn(str1,str2) register char * str1; register char * str2;{ register char * tmp; char * orig = str1; malloc_check_str("strspn", str1); malloc_check_str("strspn", str2); while(*str1) { for( tmp=str2; *tmp && *tmp != *str1; tmp++) { } if(! *tmp ) { break; } str1++; } return( (int) (str1 - orig) );}intstrcspn(str1,str2) register char * str1; register char * str2;{ register char * tmp; char * orig = str1; malloc_check_str("strcspn", str1); malloc_check_str("strcspn", str2); while(*str1) { for( tmp=str2; *tmp && *tmp != *str1; tmp++) { } if( *tmp ) { break; } str1++; } return( (int) (str1 - orig) );}/* * strtok() source taken from that posted to comp.lang.c by Chris Torek * in Jan 1990. *//* * Copyright (c) 1989 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *//* * Get next token from string s (NULL on 2nd, 3rd, etc. calls), * where tokens are nonempty strings separated by runs of * chars from delim. Writes NULs into s to end tokens. delim need not * remain constant from call to call. * * Modified by cpc: changed variable names to conform with naming * conventions used in rest of code. Added malloc pointer * check calls. */char *strtok(str1, str2) char * str1; char * str2;{ static char * last; char * strtoken(); if( str1 ) { malloc_check_str("strtok", str1); last = str1; } malloc_check_str("strtok", str2); return (strtoken(&last, str2, 1));}/* * Get next token from string *stringp, where tokens are (possibly empty) * strings separated by characters from delim. Tokens are separated * by exactly one delimiter iff the skip parameter is false; otherwise * they are separated by runs of characters from delim, because we * skip over any initial `delim' characters. * * Writes NULs into the string at *stringp to end tokens. * delim will usually, but need not, remain constant from call to call. * On return, *stringp points past the last NUL written (if there might * be further tokens), or is NULL (if there are definitely no more tokens). * * If *stringp is NULL, strtoken returns NULL. */char *strtoken(stringp, delim, skip) register char **stringp; register char *delim; int skip;{ register char *s; register char *spanp; register int c, sc; char *tok; if ((s = *stringp) == NULL) return (NULL); if (skip) { /* * Skip (span) leading delimiters (s += strspn(s, delim)). */ cont: c = *s; for (spanp = delim; (sc = *spanp++) != 0;) { if (c == sc) { s++; goto cont; } } if (c == 0) { /* no token found */ *stringp = NULL; return (NULL); } } /* * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). * Note that delim must have one NUL; we stop if we see that, too. */ for (tok = s;;) { c = *s++; spanp = delim; do { if ((sc = *spanp++) == c) { if (c == 0) s = NULL; else s[-1] = 0; *stringp = s; return (tok); } } while (sc != 0); } /* NOTREACHED */}/* * $Log: string.c,v $ * Revision 1.5 90/06/10 14:59:49 cpcahil * Fixed a couple of bugs in strncpy & strdup * * Revision 1.4 90/05/11 00:13:10 cpcahil * added copyright statment * * Revision 1.3 90/02/24 21:50:32 cpcahil * lots of lint fixes * * Revision 1.2 90/02/24 17:29:40 cpcahil * changed $Header to $Id so full path wouldnt be included as part of rcs * id string * * Revision 1.1 90/02/22 23:17:44 cpcahil * Initial revision * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -