summaryrefslogtreecommitdiff
path: root/ext/xmlrpc/libxmlrpc/simplestring.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/xmlrpc/libxmlrpc/simplestring.c')
-rw-r--r--ext/xmlrpc/libxmlrpc/simplestring.c248
1 files changed, 248 insertions, 0 deletions
diff --git a/ext/xmlrpc/libxmlrpc/simplestring.c b/ext/xmlrpc/libxmlrpc/simplestring.c
new file mode 100644
index 0000000..7211d2c
--- /dev/null
+++ b/ext/xmlrpc/libxmlrpc/simplestring.c
@@ -0,0 +1,248 @@
+/*
+ This file is part of libXMLRPC - a C library for xml-encoded function calls.
+
+ Author: Dan Libby (dan@libby.com)
+ Epinions.com may be contacted at feedback@epinions-inc.com
+*/
+
+/*
+ Copyright 2000 Epinions, Inc.
+
+ Subject to the following 3 conditions, Epinions, Inc. permits you, free
+ of charge, to (a) use, copy, distribute, modify, perform and display this
+ software and associated documentation files (the "Software"), and (b)
+ permit others to whom the Software is furnished to do so as well.
+
+ 1) The above copyright notice and this permission notice shall be included
+ without modification in all copies or substantial portions of the
+ Software.
+
+ 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
+ ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
+ IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE OR NONINFRINGEMENT.
+
+ 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
+ SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+ OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
+ NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH
+ DAMAGES.
+
+*/
+
+
+static const char rcsid[] = "#(@) $Id$";
+
+
+#define SIMPLESTRING_INCR 32
+
+/****h* ABOUT/simplestring
+ * NAME
+ * simplestring
+ * AUTHOR
+ * Dan Libby, aka danda (dan@libby.com)
+ * CREATION DATE
+ * 06/2000
+ * HISTORY
+ * $Log$
+ * Revision 1.3 2002/08/22 01:25:50 sniper
+ * kill some compile warnings
+ *
+ * Revision 1.2 2002/07/05 04:43:53 danda
+ * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51
+ *
+ * Revision 1.4 2002/02/13 20:58:50 danda
+ * patch to make source more windows friendly, contributed by Jeff Lawson
+ *
+ * Revision 1.3 2001/09/29 21:58:05 danda
+ * adding cvs log to history section
+ *
+ * 10/15/2000 -- danda -- adding robodoc documentation
+ * PORTABILITY
+ * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just
+ * about anything with minor mods.
+ * NOTES
+ * This code was written primarily for xmlrpc, but has found some other uses.
+ *
+ * simplestring is, as the name implies, a simple API for dealing with C strings.
+ * Why would I write yet another string API? Because I couldn't find any that were
+ * a) free / GPL, b) simple/lightweight, c) fast, not doing unneccesary strlens all
+ * over the place. So. It is simple, and it seems to work, and it is pretty fast.
+ *
+ * Oh, and it is also binary safe, ie it can handle strings with embedded NULLs,
+ * so long as the real length is passed in.
+ *
+ * And the masses rejoiced.
+ *
+ * BUGS
+ * there must be some.
+ ******/
+
+#include <stdlib.h>
+#include <string.h>
+#include "simplestring.h"
+
+#define my_free(thing) if(thing) {free(thing); thing = 0;}
+
+/*----------------------**
+* Begin String Functions *
+*-----------------------*/
+
+/****f* FUNC/simplestring_init
+ * NAME
+ * simplestring_init
+ * SYNOPSIS
+ * void simplestring_init(simplestring* string)
+ * FUNCTION
+ * initialize string
+ * INPUTS
+ * string - pointer to a simplestring struct that will be initialized
+ * RESULT
+ * void
+ * NOTES
+ * SEE ALSO
+ * simplestring_free ()
+ * simplestring_clear ()
+ * SOURCE
+ */
+void simplestring_init(simplestring* string) {
+ memset(string, 0, sizeof(simplestring));
+}
+/******/
+
+static void simplestring_init_str(simplestring* string) {
+ string->str = (char*)malloc(SIMPLESTRING_INCR);
+ if(string->str) {
+ string->str[0] = 0;
+ string->len = 0;
+ string->size = SIMPLESTRING_INCR;
+ }
+ else {
+ string->size = 0;
+ }
+}
+
+/****f* FUNC/simplestring_clear
+ * NAME
+ * simplestring_clear
+ * SYNOPSIS
+ * void simplestring_clear(simplestring* string)
+ * FUNCTION
+ * clears contents of a string
+ * INPUTS
+ * string - the string value to clear
+ * RESULT
+ * void
+ * NOTES
+ * This function is very fast as it does not de-allocate any memory.
+ * SEE ALSO
+ *
+ * SOURCE
+ */
+void simplestring_clear(simplestring* string) {
+ if(string->str) {
+ string->str[0] = 0;
+ }
+ string->len = 0;
+}
+/******/
+
+/****f* FUNC/simplestring_free
+ * NAME
+ * simplestring_free
+ * SYNOPSIS
+ * void simplestring_free(simplestring* string)
+ * FUNCTION
+ * frees contents of a string, if any. Does *not* free the simplestring struct itself.
+ * INPUTS
+ * string - value containing string to be free'd
+ * RESULT
+ * void
+ * NOTES
+ * caller is responsible for allocating and freeing simplestring* struct itself.
+ * SEE ALSO
+ * simplestring_init ()
+ * SOURCE
+ */
+void simplestring_free(simplestring* string) {
+ if(string && string->str) {
+ my_free(string->str);
+ string->len = 0;
+ }
+}
+/******/
+
+/****f* FUNC/simplestring_addn
+ * NAME
+ * simplestring_addn
+ * SYNOPSIS
+ * void simplestring_addn(simplestring* string, const char* add, int add_len)
+ * FUNCTION
+ * copies n characters from source to target string
+ * INPUTS
+ * target - target string
+ * source - source string
+ * add_len - number of characters to copy
+ * RESULT
+ * void
+ * NOTES
+ * SEE ALSO
+ * simplestring_add ()
+ * SOURCE
+ */
+void simplestring_addn(simplestring* target, const char* source, int add_len) {
+ if(target && source) {
+ if(!target->str) {
+ simplestring_init_str(target);
+ }
+ if(target->len + add_len + 1 > target->size) {
+ /* newsize is current length + new length */
+ int newsize = target->len + add_len + 1;
+ int incr = target->size * 2;
+
+ /* align to SIMPLESTRING_INCR increments */
+ newsize = newsize - (newsize % incr) + incr;
+ target->str = (char*)realloc(target->str, newsize);
+
+ target->size = target->str ? newsize : 0;
+ }
+
+ if(target->str) {
+ if(add_len) {
+ memcpy(target->str + target->len, source, add_len);
+ }
+ target->len += add_len;
+ target->str[target->len] = 0; /* null terminate */
+ }
+ }
+}
+/******/
+
+/****f* FUNC/simplestring_add
+ * NAME
+ * simplestring_add
+ * SYNOPSIS
+ * void simplestring_add(simplestring* string, const char* add)
+ * FUNCTION
+ * appends a string of unknown length from source to target
+ * INPUTS
+ * target - the target string to append to
+ * source - the source string of unknown length
+ * RESULT
+ * void
+ * NOTES
+ * SEE ALSO
+ * simplestring_addn ()
+ * SOURCE
+ */
+void simplestring_add(simplestring* target, const char* source) {
+ if(target && source) {
+ simplestring_addn(target, source, strlen(source));
+ }
+}
+/******/
+
+
+/*----------------------
+* End String Functions *
+*--------------------**/