aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/jabber/str.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/jabber/str.c')
-rw-r--r--protocols/jabber/str.c215
1 files changed, 215 insertions, 0 deletions
diff --git a/protocols/jabber/str.c b/protocols/jabber/str.c
new file mode 100644
index 00000000..a8454b44
--- /dev/null
+++ b/protocols/jabber/str.c
@@ -0,0 +1,215 @@
+/* --------------------------------------------------------------------------
+ *
+ * License
+ *
+ * The contents of this file are subject to the Jabber Open Source License
+ * Version 1.0 (the "JOSL"). You may not copy or use this file, in either
+ * source code or executable form, except in compliance with the JOSL. You
+ * may obtain a copy of the JOSL at http://www.jabber.org/ or at
+ * http://www.opensource.org/.
+ *
+ * Software distributed under the JOSL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the JOSL
+ * for the specific language governing rights and limitations under the
+ * JOSL.
+ *
+ * Copyrights
+ *
+ * Portions created by or assigned to Jabber.com, Inc. are
+ * Copyright (c) 1999-2002 Jabber.com, Inc. All Rights Reserved. Contact
+ * information for Jabber.com, Inc. is available at http://www.jabber.com/.
+ *
+ * Portions Copyright (c) 1998-1999 Jeremie Miller.
+ *
+ * Acknowledgements
+ *
+ * Special thanks to the Jabber Open Source Contributors for their
+ * suggestions and support of Jabber.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * GNU General Public License Version 2 or later (the "GPL"), in which case
+ * the provisions of the GPL are applicable instead of those above. If you
+ * wish to allow use of your version of this file only under the terms of the
+ * GPL and not to allow others to use your version of this file under the JOSL,
+ * indicate your decision by deleting the provisions above and replace them
+ * with the notice and other provisions required by the GPL. If you do not
+ * delete the provisions above, a recipient may use your version of this file
+ * under either the JOSL or the GPL.
+ *
+ *
+ * --------------------------------------------------------------------------*/
+
+#include "jabber.h"
+#include <glib.h>
+
+static char *j_strcat(char *dest, char *txt)
+{
+ if(!txt) return(dest);
+
+ while(*txt)
+ *dest++ = *txt++;
+ *dest = '\0';
+
+ return(dest);
+}
+
+int j_strcmp(const char *a, const char *b)
+{
+ if(a == NULL || b == NULL)
+ return -1;
+
+ while(*a == *b && *a != '\0' && *b != '\0'){ a++; b++; }
+
+ if(*a == *b) return 0;
+
+ return -1;
+}
+
+spool spool_new(pool p)
+{
+ spool s;
+
+ s = pmalloc(p, sizeof(struct spool_struct));
+ s->p = p;
+ s->len = 0;
+ s->last = NULL;
+ s->first = NULL;
+ return s;
+}
+
+void spool_add(spool s, char *str)
+{
+ struct spool_node *sn;
+ int len;
+
+ if(str == NULL)
+ return;
+
+ len = strlen(str);
+ if(len == 0)
+ return;
+
+ sn = pmalloc(s->p, sizeof(struct spool_node));
+ sn->c = pstrdup(s->p, str);
+ sn->next = NULL;
+
+ s->len += len;
+ if(s->last != NULL)
+ s->last->next = sn;
+ s->last = sn;
+ if(s->first == NULL)
+ s->first = sn;
+}
+
+void spooler(spool s, ...)
+{
+ va_list ap;
+ char *arg = NULL;
+
+ if(s == NULL)
+ return;
+
+ VA_START(s);
+
+ /* loop till we hfit our end flag, the first arg */
+ while(1)
+ {
+ arg = va_arg(ap,char *);
+ if((spool)arg == s)
+ break;
+ else
+ spool_add(s, arg);
+ }
+
+ va_end(ap);
+}
+
+char *spool_print(spool s)
+{
+ char *ret,*tmp;
+ struct spool_node *next;
+
+ if(s == NULL || s->len == 0 || s->first == NULL)
+ return NULL;
+
+ ret = pmalloc(s->p, s->len + 1);
+ *ret = '\0';
+
+ next = s->first;
+ tmp = ret;
+ while(next != NULL)
+ {
+ tmp = j_strcat(tmp,next->c);
+ next = next->next;
+ }
+
+ return ret;
+}
+
+char *strescape(pool p, char *buf)
+{
+ int i,j,oldlen,newlen;
+ char *temp;
+
+ if (p == NULL || buf == NULL) return(NULL);
+
+ oldlen = newlen = strlen(buf);
+ for(i=0;i<oldlen;i++)
+ {
+ switch(buf[i])
+ {
+ case '&':
+ newlen+=5;
+ break;
+ case '\'':
+ newlen+=6;
+ break;
+ case '\"':
+ newlen+=6;
+ break;
+ case '<':
+ newlen+=4;
+ break;
+ case '>':
+ newlen+=4;
+ break;
+ }
+ }
+
+ if(oldlen == newlen) return buf;
+
+ temp = pmalloc(p,newlen+1);
+
+ if (temp==NULL) return(NULL);
+
+ for(i=j=0;i<oldlen;i++)
+ {
+ switch(buf[i])
+ {
+ case '&':
+ memcpy(&temp[j],"&amp;",5);
+ j += 5;
+ break;
+ case '\'':
+ memcpy(&temp[j],"&apos;",6);
+ j += 6;
+ break;
+ case '\"':
+ memcpy(&temp[j],"&quot;",6);
+ j += 6;
+ break;
+ case '<':
+ memcpy(&temp[j],"&lt;",4);
+ j += 4;
+ break;
+ case '>':
+ memcpy(&temp[j],"&gt;",4);
+ j += 4;
+ break;
+ default:
+ temp[j++] = buf[i];
+ }
+ }
+ temp[j] = '\0';
+ return temp;
+}