Move str functions to c file to enable reuse

This commit is contained in:
Jeremy Lakeman 2012-08-06 12:25:45 +09:30
parent fc9a9b337e
commit 7705676a9e
5 changed files with 89 additions and 36 deletions

View File

@ -42,6 +42,7 @@ SERVALD_SRC_FILES = \
serval-dna/sha2.c \
serval-dna/simulate.c \
serval-dna/srandomdev.c \
serval-dna/str.c \
serval-dna/keyring.c \
serval-dna/vomp.c \
serval-dna/lsif.c \

View File

@ -53,6 +53,7 @@ SRCS= \
simulate.c \
sqlite3.c \
srandomdev.c \
str.c \
strbuf.c \
strbuf_helpers.c \
vomp.c \
@ -63,6 +64,7 @@ MONITORCLIENTSRCS=conf.c \
mkdir.c \
monitor-client.c \
net.c \
str.c \
strbuf.c \
strbuf_helpers.c

View File

@ -20,9 +20,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include <sys/types.h>
#include <sys/socket.h>
#include <signal.h>
#include <ctype.h>
#include "serval.h"
#include "str.h"
#include "rhizome.h"
typedef struct rhizome_http_request {
@ -501,41 +501,6 @@ int http_header_complete(const char *buf, size_t len, size_t tail)
return count == 2;
}
/* Check if a given string starts with a given sub-string. If so, return 1 and, if afterp is not
NULL, set *afterp to point to the character immediately following the substring. Otherwise
return 0.
This function is used to parse HTTP headers and responses, which are typically not
nul-terminated, but are held in a buffer which has an associated length. To avoid this function
running past the end of the buffer, the caller must ensure that the buffer contains a sub-string
that is not part of the sub-string being sought, eg, "\r\n\r\n" as detected by
http_header_complete(). This guarantees that this function will return nonzero before running
past the end of the buffer.
@author Andrew Bettison <andrew@servalproject.com>
*/
int str_startswith(char *str, const char *substring, char **afterp)
{
while (*substring && *substring == *str)
++substring, ++str;
if (*substring)
return 0;
if (afterp)
*afterp = str;
return 1;
}
/* Case-insensitive form of str_startswith().
*/
int strcase_startswith(char *str, const char *substring, char **afterp)
{
while (*substring && *str && toupper(*substring) == toupper(*str))
++substring, ++str;
if (*substring)
return 0;
if (afterp)
*afterp = str;
return 1;
}
static int rhizome_server_parse_http_request(rhizome_http_request *r)
{
/* Switching to writing, so update the call-back */

44
str.c Normal file
View File

@ -0,0 +1,44 @@
/*
Serval string primitives
Copyright (C) 2012 Serval Project Inc.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <ctype.h>
#include "str.h"
int str_startswith(char *str, const char *substring, char **afterp)
{
while (*substring && *substring == *str)
++substring, ++str;
if (*substring)
return 0;
if (afterp)
*afterp = str;
return 1;
}
int strcase_startswith(char *str, const char *substring, char **afterp)
{
while (*substring && *str && toupper(*substring) == toupper(*str))
++substring, ++str;
if (*substring)
return 0;
if (afterp)
*afterp = str;
return 1;
}

41
str.h Normal file
View File

@ -0,0 +1,41 @@
/*
Serval string primitives
Copyright (C) 2012 Serval Project Inc.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __STR_H__
#define __STR_H__
/* Check if a given string starts with a given sub-string. If so, return 1 and, if afterp is not
NULL, set *afterp to point to the character immediately following the substring. Otherwise
return 0.
This function is used to parse HTTP headers and responses, which are typically not
nul-terminated, but are held in a buffer which has an associated length. To avoid this function
running past the end of the buffer, the caller must ensure that the buffer contains a sub-string
that is not part of the sub-string being sought, eg, "\r\n\r\n" as detected by
http_header_complete(). This guarantees that this function will return nonzero before running
past the end of the buffer.
@author Andrew Bettison <andrew@servalproject.com>
*/
int str_startswith(char *str, const char *substring, char **afterp);
/* Case-insensitive form of str_startswith().
*/
int strcase_startswith(char *str, const char *substring, char **afterp);
#endif