📄 mstring.c
字号:
/* $Id: mstring.c,v 1.5 2001/01/02 08:06:00 roesch Exp $ */
/*
** Copyright (C) 1998,1999,2000,2001 Martin Roesch <roesch@clark.net>
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/***************************************************************************
*
* File: MSTRING.C
*
* Purpose: Provide a variety of string functions not included in libc. Makes
* up for the fact that the libstdc++ is hard to get reference
* material on and I don't want to write any more non-portable c++
* code until I have solid references and libraries to use.
*
* History:
*
* Date: Author: Notes:
* ---------- ------- ----------------------------------------------
* 08/19/98 MFR Initial coding begun
* 03/06/99 MFR Added Boyer-Moore pattern match routine, don't use
* mContainsSubstr() any more if you don't have to
* 12/31/99 JGW Added a full Boyer-Moore implementation to increase
* performance. Added a case insensitive version of mSearch
*
**************************************************************************/
#include "mstring.h"
#ifdef TEST_MSTRING
int main()
{
char test[] = "\0\0\0\0\0\0\0\0\0CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\0\0";
char find[] = "CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\0\0";
/* char test[] = "\x90\x90\x90\x90\x90\x90\xe8\xc0\xff\xff\xff/bin/sh\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90";
char find[] = "\xe8\xc0\xff\xff\xff/bin/sh"; */
int i;
int toks;
int *shift;
int *skip;
/* shift=make_shift(find,sizeof(find)-1);
skip=make_skip(find,sizeof(find)-1); */
printf("%d\n",
mSarch(test, sizeof(test) - 1, find, sizeof(find) - 1, shift, skip));
return 0;
}
#endif
/****************************************************************
*
* Function: mSplit()
*
* Purpose: Splits a string into tokens non-destructively.
*
* Parameters:
* char *str => the string to be split
* char *sep => a string of token seperaters
* int max_strs => how many tokens should be returned
* int *toks => place to store the number of tokens found in str
* char meta => the "escape metacharacter", treat the character
* after this character as a literal and "escape" a
* seperator
*
* Returns:
* 2D char array with one token per "row" of the returned
* array.
*
****************************************************************/
char **mSplit(char *str, char *sep, int max_strs, int *toks, char meta)
{
char **retstr; /* 2D array which is returned to caller */
char *idx; /* index pointer into str */
char *end; /* ptr to end of str */
char *sep_end; /* ptr to end of seperator string */
char *sep_idx; /* index ptr into seperator string */
int len = 0; /* length of current token string */
int curr_str = 0; /* current index into the 2D return array */
int last_char = 0xFF;
#ifdef DEBUG
printf("[*] Splitting string: %s\n", str);
printf("curr_str = %d\n", curr_str);
#endif
/*
* find the ends of the respective passed strings so our while() loops
* know where to stop
*/
sep_end = sep + strlen(sep);
end = str + strlen(str);
/* remove trailing whitespace */
while(isspace((int) *(end - 1)) && ((end - 1) >= str))
*(--end) = '\0'; /* -1 because of NULL */
/* set our indexing pointers */
sep_idx = sep;
idx = str;
/*
* alloc space for the return string, this is where the pointers to the
* tokens will be stored
*/
retstr = (char **) malloc((sizeof(char **) * max_strs));
max_strs--;
#ifdef DEBUG
printf("max_strs = %d curr_str = %d\n", max_strs, curr_str);
#endif
/* loop thru each letter in the string being tokenized */
while(idx < end)
{
/* loop thru each seperator string char */
while(sep_idx < sep_end)
{
/*
* if the current string-indexed char matches the current
* seperator char...
*/
if((*idx == *sep_idx) && (last_char != meta))
{
/* if there's something to store... */
if(len > 0)
{
#ifdef DEBUG
printf("Allocating %d bytes for token ", len + 1);
fflush(stdout);
#endif
if(curr_str <= max_strs)
{
/* allocate space for the new token */
retstr[curr_str] = (char *) malloc((sizeof(char) * len) + 1);
/* make sure we got a good allocation */
if(retstr[curr_str] == NULL)
{
fprintf(stderr, "msplit() got NULL substring malloc!\n");
exit(1);
}
/* copy the token into the return string array */
memcpy(retstr[curr_str], (idx - len), len);
retstr[curr_str][len] = 0;
#ifdef DEBUG
printf("tok[%d]: %s\n", curr_str, retstr[curr_str]);
fflush(stdout);
#endif
/* twiddle the necessary pointers and vars */
len = 0;
curr_str++;
#ifdef DEBUG
printf("curr_str = %d\n", curr_str);
printf("max_strs = %d curr_str = %d\n", max_strs, curr_str);
#endif
last_char = *idx;
idx++;
}
#ifdef DEBUG
printf("Checking if curr_str (%d) >= max_strs (%d)\n", curr_str, max_strs);
#endif
/*
* if we've gotten all the tokens requested, return the
* list
*/
if(curr_str >= max_strs)
{
while(isspace((int) *idx))
idx++;
len = end - idx;
#ifdef DEBUG
printf("Finishing up...\n");
printf("Allocating %d bytes for last token ", len + 1);
fflush(stdout);
#endif
retstr[curr_str] = (char *) malloc((sizeof(char) * len) + 1);
if(retstr[curr_str] == NULL)
printf("Got NULL back from substr malloc\n");
memcpy(retstr[curr_str], idx, len);
retstr[curr_str][len] = 0;
#ifdef DEBUG
printf("tok[%d]: %s\n", curr_str, retstr[curr_str]);
fflush(stdout);
#endif
*toks = curr_str + 1;
#ifdef DEBUG
printf("max_strs = %d curr_str = %d\n", max_strs, curr_str);
printf("mSplit got %d tokens!\n", *toks);
fflush(stdout);
#endif
return retstr;
}
}
else
/*
* otherwise, the previous char was a seperator as well,
* and we should just continue
*/
{
last_char = *idx;
idx++;
/* make sure to reset this so we test all the sep. chars */
sep_idx = sep;
len = 0;
}
}
else
{
/* go to the next seperator */
sep_idx++;
}
}
sep_idx = sep;
len++;
last_char = *idx;
idx++;
}
/* put the last string into the list */
if(len > 0)
{
#ifdef DEBUG
printf("Allocating %d bytes for last token ", len + 1);
fflush(stdout);
#endif
retstr[curr_str] = (char *) malloc((sizeof(char) * len) + 1);
if(retstr[curr_str] == NULL)
printf("Got NULL back from substr malloc\n");
memcpy(retstr[curr_str], (idx - len), len);
retstr[curr_str][len] = 0;
#ifdef DEBUG
printf("tok[%d]: %s\n", curr_str, retstr[curr_str]);
fflush(stdout);
#endif
*toks = curr_str + 1;
}
#ifdef DEBUG
printf("mSplit got %d tokens!\n", *toks);
fflush(stdout);
#endif
/* return the token list */
return retstr;
}
/****************************************************************
*
* Function: mContainsSubstr(char *, int, char *, int)
*
* Purpose: Determines if a string contains a (non-regex)
* substring.
*
* Parameters:
* buf => data buffer we want to find the data in
* b_len => data buffer length
* pat => pattern to find
* p_len => length of the data in the pattern buffer
*
* Returns:
* Integer value, 1 on success (str constains substr), 0 on
* failure (substr not in str)
*
****************************************************************/
int mContainsSubstr(char *buf, int b_len, char *pat, int p_len)
{
char *b_idx; /* index ptr into the data buffer */
char *p_idx; /* index ptr into the pattern buffer */
char *b_end; /* ptr to the end of the data buffer */
int m_cnt = 0; /* number of pattern matches so far... */
#ifdef DEBUG
unsigned long loopcnt = 0;
#endif
/* mark the end of the strs */
b_end = (char *) (buf + b_len);
/* init the index ptrs */
b_idx = buf;
p_idx = pat;
do
{
#ifdef DEBUG
loopcnt++;
#endif
if(*p_idx == *b_idx)
{
if(m_cnt == (p_len - 1))
{
#ifdef DEBUG
printf("\n%ld compares for match\n", loopcnt);
#endif
return 1;
}
m_cnt++;
b_idx++;
p_idx++;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -