xmpp/xode_str.c

Go to the documentation of this file.
00001 /*
00002  * $Id: xode_str.c 4494 2008-07-22 13:43:48Z henningw $
00003  *
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License
00015  *  along with this program; if not, write to the Free Software
00016  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017  *
00018  *  Jabber
00019  *  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
00020  */
00021 
00022 /*! \file
00023  * \ingroup xmpp
00024  */
00025 
00026 
00027 #include "xode.h"
00028 
00029 xode_pool xode_spool_getpool(const xode_spool s)
00030 {
00031     if(s == NULL)
00032         return NULL;
00033 
00034     return s->p;
00035 }
00036 
00037 int xode_spool_getlen(const xode_spool s)
00038 {
00039     if(s == NULL)
00040         return 0;
00041 
00042     return s->len;    
00043 }
00044 
00045 void xode_spool_free(xode_spool s)
00046 {
00047     xode_pool_free(xode_spool_getpool(s));
00048 }
00049 
00050 xode_spool xode_spool_newfrompool(xode_pool p)
00051 {
00052     xode_spool s;
00053 
00054     s = xode_pool_malloc(p, sizeof(struct xode_spool_struct));
00055     s->p = p;
00056     s->len = 0;
00057     s->last = NULL;
00058     s->first = NULL;
00059     return s;
00060 }
00061 
00062 xode_spool xode_spool_new(void)
00063 {
00064     return xode_spool_newfrompool(xode_pool_heap(512));
00065 }
00066 
00067 void xode_spool_add(xode_spool s, char *str)
00068 {
00069     struct xode_spool_node *sn;
00070     int len;
00071 
00072     if(str == NULL)
00073         return;
00074 
00075     len = strlen(str);
00076     if(len == 0)
00077         return;
00078 
00079     sn = xode_pool_malloc(s->p, sizeof(struct xode_spool_node));
00080     sn->c = xode_pool_strdup(s->p, str);
00081     sn->next = NULL;
00082 
00083     s->len += len;
00084     if(s->last != NULL)
00085         s->last->next = sn;
00086     s->last = sn;
00087     if(s->first == NULL)
00088         s->first = sn;
00089 }
00090 
00091 void xode_spooler(xode_spool s, ...)
00092 {
00093     va_list ap;
00094     char *arg = NULL;
00095 
00096     if(s == NULL)
00097         return;
00098 
00099     va_start(ap, s);
00100 
00101     /* loop till we hit our end flag, the first arg */
00102     while(1)
00103     {
00104         arg = va_arg(ap,char *);
00105         if((void*)arg == (void*)s || arg == NULL)
00106             break;
00107         else
00108             xode_spool_add(s, arg);
00109     }
00110 
00111     va_end(ap);
00112 }
00113 
00114 char *xode_spool_tostr(xode_spool s)
00115 {
00116     char *ret,*tmp;
00117     struct xode_spool_node *next;
00118 
00119     if(s == NULL || s->len == 0 || s->first == NULL)
00120         return NULL;
00121 
00122     ret = xode_pool_malloc(s->p, s->len + 1);
00123     *ret = '\0';
00124 
00125     next = s->first;
00126     tmp = ret;
00127     while(next != NULL)
00128     {
00129         tmp = strcat(tmp,next->c);
00130         next = next->next;
00131     }
00132 
00133     return ret;
00134 }
00135 
00136 /* convenience :) */
00137 char *xode_spool_str(xode_pool p, ...)
00138 {
00139     va_list ap;
00140     xode_spool s;
00141     char *arg = NULL;
00142 
00143     if(p == NULL)
00144         return NULL;
00145 
00146     s = xode_spool_newfrompool(p);
00147 
00148     va_start(ap, p);
00149 
00150     /* loop till we hit our end flag, the first arg */
00151     while(1)
00152     {
00153         arg = va_arg(ap,char *);
00154         if((void*)arg == (void*)p)
00155             break;
00156         else
00157             xode_spool_add(s, arg);
00158     }
00159 
00160     va_end(ap);
00161 
00162     return xode_spool_tostr(s);
00163 }
00164 
00165 
00166 char *xode_strunescape(xode_pool p, char *buf)
00167 {
00168     int i,j=0;
00169     char *temp;
00170 
00171     if (p == NULL || buf == NULL) return(NULL);
00172 
00173     if (strchr(buf,'&') == NULL) return(buf);
00174 
00175     temp = xode_pool_malloc(p,strlen(buf)+1);
00176 
00177     if (temp == NULL) return(NULL);
00178 
00179     for(i=0;i<strlen(buf);i++)
00180     {
00181         if (buf[i]=='&')
00182         {
00183             if (strncmp(&buf[i],"&amp;",5)==0)
00184             {
00185                 temp[j] = '&';
00186                 i += 4;
00187             } else if (strncmp(&buf[i],"&quot;",6)==0) {
00188                 temp[j] = '\"';
00189                 i += 5;
00190             } else if (strncmp(&buf[i],"&apos;",6)==0) {
00191                 temp[j] = '\'';
00192                 i += 5;
00193             } else if (strncmp(&buf[i],"&lt;",4)==0) {
00194                 temp[j] = '<';
00195                 i += 3;
00196             } else if (strncmp(&buf[i],"&gt;",4)==0) {
00197                 temp[j] = '>';
00198                 i += 3;
00199             }
00200         } else {
00201             temp[j]=buf[i];
00202         }
00203         j++;
00204     }
00205     temp[j]='\0';
00206     return(temp);
00207 }
00208 
00209 
00210 char *xode_strescape(xode_pool p, char *buf)
00211 {
00212     int i,j,oldlen,newlen;
00213     char *temp;
00214 
00215     if (p == NULL || buf == NULL) return(NULL);
00216 
00217     oldlen = newlen = strlen(buf);
00218     for(i=0;i<oldlen;i++)
00219     {
00220         switch(buf[i])
00221         {
00222         case '&':
00223             newlen+=5;
00224             break;
00225         case '\'':
00226             newlen+=6;
00227             break;
00228         case '\"':
00229             newlen+=6;
00230             break;
00231         case '<':
00232             newlen+=4;
00233             break;
00234         case '>':
00235             newlen+=4;
00236             break;
00237         }
00238     }
00239 
00240     if(oldlen == newlen) return buf;
00241 
00242     temp = xode_pool_malloc(p,newlen+1);
00243 
00244     if (temp==NULL) return(NULL);
00245 
00246     for(i=j=0;i<oldlen;i++)
00247     {
00248         switch(buf[i])
00249         {
00250         case '&':
00251             memcpy(&temp[j],"&amp;",5);
00252             j += 5;
00253             break;
00254         case '\'':
00255             memcpy(&temp[j],"&apos;",6);
00256             j += 6;
00257             break;
00258         case '\"':
00259             memcpy(&temp[j],"&quot;",6);
00260             j += 6;
00261             break;
00262         case '<':
00263             memcpy(&temp[j],"&lt;",4);
00264             j += 4;
00265             break;
00266         case '>':
00267             memcpy(&temp[j],"&gt;",4);
00268             j += 4;
00269             break;
00270         default:
00271             temp[j++] = buf[i];
00272         }
00273     }
00274     temp[j] = '\0';
00275     return temp;
00276 }

Generated on Fri May 25 00:00:35 2012 for Kamailio - The Open Source SIP Server by  doxygen 1.5.6